nsarchive 3.0.0a6__py3-none-any.whl → 3.0.0a8__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -4,7 +4,6 @@ import urllib
4
4
 
5
5
  from .base import NSID
6
6
 
7
- default_headers = {}
8
7
 
9
8
  class BankAccount:
10
9
  """
@@ -27,6 +26,7 @@ class BankAccount:
27
26
 
28
27
  def __init__(self, owner_id: NSID) -> None:
29
28
  self._url: str = ""
29
+ self._headers: dict = {}
30
30
 
31
31
  self.id: NSID = NSID(owner_id)
32
32
  self.owner_id: NSID = NSID(owner_id)
@@ -40,7 +40,12 @@ class BankAccount:
40
40
  self.frozen: bool = False
41
41
  self.flagged: bool = False
42
42
 
43
- def _load(self, _data: dict):
43
+ def _load(self, _data: dict, url: str, headers: dict) -> None:
44
+ self._url = url + '/bank/accounts/' + _data['id']
45
+ self._headers = headers
46
+
47
+ self.id = NSID(_data['id'])
48
+
44
49
  self.owner_id = NSID(_data['owner_id'])
45
50
  self.register_date = _data['register_date']
46
51
  self.tag = _data['tag']
@@ -53,7 +58,7 @@ class BankAccount:
53
58
  self.flagged = _data['flagged']
54
59
 
55
60
  def freeze(self, frozen: bool = True, reason: str = None) -> None:
56
- res = requests.post(f"{self._url}/freeze?frozen={str(frozen).lower()}", headers = default_headers, json = {
61
+ res = requests.post(f"{self._url}/freeze?frozen={str(frozen).lower()}", headers = self._headers, json = {
57
62
  "reason": reason
58
63
  })
59
64
 
@@ -64,7 +69,7 @@ class BankAccount:
64
69
  res.raise_for_status()
65
70
 
66
71
  def flag(self, flagged: bool = True, reason: str = None) -> None:
67
- res = requests.post(f"{self._url}/flag?flagged={str(flagged).lower()}", headers = default_headers, json = {
72
+ res = requests.post(f"{self._url}/flag?flagged={str(flagged).lower()}", headers = self._headers, json = {
68
73
  "reason": reason
69
74
  })
70
75
 
@@ -77,7 +82,7 @@ class BankAccount:
77
82
  _target_query = f"&target={target}"
78
83
  _loan_query = f"&loan_id={loan}"
79
84
 
80
- res = requests.post(f"{self._url}/debit?amount={amount}{_target_query if target else ''}{_loan_query if loan else ''}", headers = default_headers, json = {
85
+ res = requests.post(f"{self._url}/debit?amount={amount}{_target_query if target else ''}{_loan_query if loan else ''}", headers = self._headers, json = {
81
86
  "reason": reason,
82
87
  "digicode": digicode
83
88
  })
@@ -88,7 +93,7 @@ class BankAccount:
88
93
  res.raise_for_status()
89
94
 
90
95
  def deposit(self, amount: int, reason: str = None) -> None:
91
- res = requests.post(f"{self._url}/deposit?amount={amount}", headers = default_headers, json = {
96
+ res = requests.post(f"{self._url}/deposit?amount={amount}", headers = self._headers, json = {
92
97
  "reason": reason,
93
98
  })
94
99
 
@@ -111,20 +116,28 @@ class Item:
111
116
  """
112
117
 
113
118
  def __init__(self) -> None:
119
+ self._url: str = ""
120
+ self._headers: dict = {}
121
+
114
122
  self.id: NSID = NSID(round(time.time()))
115
123
  self.name: str = "Unknown Object"
116
124
  self.emoji: str = ":light_bulb:"
117
125
  self.category: str = "common"
118
126
  self.craft: dict = {}
119
127
 
120
- def _load(self, _data: dict):
128
+ def _load(self, _data: dict, url: str, headers: dict) -> None:
129
+ self._url = url + '/marketplace/items/' + _data['id']
130
+ self._headers = headers
131
+
132
+ self.id = NSID(_data['id'])
133
+
121
134
  self.name = _data['name']
122
135
  self.emoji = _data['emoji']
123
136
  self.category = _data['category']
124
137
  self.craft = _data['craft']
125
138
 
126
139
  def rename(self, new_name: str):
127
- res = requests.post(f"{self._url}/rename?name={new_name}", headers = default_headers)
140
+ res = requests.post(f"{self._url}/rename?name={new_name}", headers = self._headers)
128
141
 
129
142
  if res.status_code == 200:
130
143
  self.name = new_name
@@ -150,6 +163,7 @@ class Sale:
150
163
 
151
164
  def __init__(self, item: Item) -> None:
152
165
  self._url: str = ""
166
+ self._headers: dict = {}
153
167
 
154
168
  self.id: NSID = NSID(round(time.time()))
155
169
  self.open: bool = True
@@ -159,8 +173,11 @@ class Sale:
159
173
  self.quantity: int = 1
160
174
  self.price: int = 0
161
175
 
162
- def _load(self, _data: dict):
163
- self.id = _data['json']
176
+ def _load(self, _data: dict, url: str, headers: dict) -> None:
177
+ self._url = url + '/marketplace/sales/' + _data['id']
178
+ self._headers = headers
179
+
180
+ self.id = _data['id']
164
181
  self.open = _data['open']
165
182
  self.seller_id = NSID(_data['seller_id'])
166
183
 
@@ -187,6 +204,7 @@ class Inventory:
187
204
 
188
205
  def __init__(self, owner_id: NSID) -> None:
189
206
  self._url: str = ""
207
+ self._headers: dict = {}
190
208
 
191
209
  self.id: NSID = NSID(owner_id)
192
210
  self.owner_id: NSID = NSID(owner_id)
@@ -196,7 +214,10 @@ class Inventory:
196
214
 
197
215
  self.items: dict[NSID, int] = {}
198
216
 
199
- def _load(self, _data: dict):
217
+ def _load(self, _data: dict, url: str, headers: dict):
218
+ self._url = url + '/bank/inventories/' + _data['id']
219
+ self._headers = headers
220
+
200
221
  self.id = NSID(_data['id'])
201
222
  self.owner_id = NSID(_data['owner_id'])
202
223
 
@@ -206,7 +227,7 @@ class Inventory:
206
227
  self.items = _data['items']
207
228
 
208
229
  def deposit_item(self, item: Item, giver: NSID = None, quantity: int = 1, digicode: str = None):
209
- res = requests.post(f"{self._url}/deposit?item={item.id}&amount={quantity}", headers = default_headers, json = {
230
+ res = requests.post(f"{self._url}/deposit?item={item.id}&amount={quantity}", headers = self._headers, json = {
210
231
  "giver": giver,
211
232
  "digicode": digicode
212
233
  })
@@ -220,7 +241,7 @@ class Inventory:
220
241
  res.raise_for_status()
221
242
 
222
243
  def sell_item(self, item: Item, price: int, quantity: int = 1, digicode: str = None) -> NSID:
223
- res = requests.post(f"{self._url}/sell_item?item={item.id}&quantity={quantity}&price={price}", headers = default_headers, json = {
244
+ res = requests.post(f"{self._url}/sell_item?item={item.id}&quantity={quantity}&price={price}", headers = self._headers, json = {
224
245
  "digicode": digicode
225
246
  })
226
247
 
@@ -8,8 +8,6 @@ from .base import NSID
8
8
 
9
9
  from .. import utils
10
10
 
11
- default_headers = {}
12
-
13
11
  class Permission:
14
12
  def __init__(self, initial: str = "----"):
15
13
  self.append: bool
@@ -31,7 +29,9 @@ class PositionPermissions:
31
29
  """
32
30
 
33
31
  def __init__(self) -> None:
32
+ self.aliases = Permission() # APPEND = faire une requête au nom d'une autre entité, MANAGE = /, EDIT = /, READ = /
34
33
  self.bots = Permission() # APPEND = /, MANAGE = proposer d'héberger un bot, EDIT = changer les paramètres d'un bot, READ = /
34
+ self.candidacies = Permission() # APPEND = se présenter à une élection, MANAGE = gérer les candidatures d'une élection, EDIT = modifier une candidature, READ = /
35
35
  self.constitution = Permission() # APPEND = /, MANAGE = /, EDIT = modifier la constitution, READ = /
36
36
  self.database = Permission() # APPEND = créer des sous-bases de données, MANAGE = gérer la base de données, EDIT = modifier les éléments, READ = avoir accès à toutes les données sans exception
37
37
  self.inventories = Permission("a---") # APPEND = ouvrir un ou plusieurs comptes/inventaires, MANAGE = voir les infos globales concernant les comptes en banque ou inventaires, EDIT = gérer des comptes en banque (ou inventaires), READ = voir les infos d'un compte en banque ou inventaire
@@ -45,6 +45,7 @@ class PositionPermissions:
45
45
  self.organizations = Permission("---r") # APPEND = créer une nouvelle organisation, MANAGE = exécuter des actions administratives sur les organisations, EDIT = modifier des organisations, READ = voir le profil de n'importe quelle organisation
46
46
  self.reports = Permission() # APPEND = déposer plainte, MANAGE = accépter ou refuser une plainte, EDIT = /, READ = accéder à des infos supplémentaires pour une plainte
47
47
  self.sales = Permission("---r") # APPEND = vendre, MANAGE = gérer les ventes, EDIT = modifier des ventes, READ = accéder au marketplace
48
+ self.sanctions = Permission() # APPEND = sanctionner un membre, MANAGE = gérer les sanctions d'un membre, EDIT = modifier une sanction, READ = accéder au casier d'un membre
48
49
  self.state_budgets = Permission() # APPEND = débloquer un nouveau budget, MANAGE = gérer les budjets, EDIT = gérer les sommes pour chaque budjet, READ = accéder aux infos concernant les budgets
49
50
  self.votes = Permission() # APPEND = déclencher un vote, MANAGE = fermer un vote, EDIT = /, READ = lire les propriétés d'un vote avant sa fermeture
50
51
 
@@ -62,21 +63,28 @@ class Position:
62
63
  Position légale d'une entité
63
64
 
64
65
  ## Attributs
65
- - name: `str`\n
66
- Titre de la position
67
66
  - id: `str`\n
68
67
  Identifiant de la position
68
+ - name: `str`\n
69
+ Titre de la position
70
+ - is_global_scope: `str`\n
71
+ Permet de savoir si la position a des permissions en dehors de sa zone
69
72
  - permissions: `.PositionPermissions`\n
70
73
  Permissions accordées à l'utilisateur
74
+ - manager_permissions: `.PositionPermissions`\n
75
+ Permissions nécessaires pour gérer la position
71
76
  """
72
77
 
73
- def __init__(self, id: str = 'inconnu') -> None:
74
- self.name: str = "Inconnue"
78
+ def __init__(self, id: str = 'member') -> None:
79
+ self._url: str = ""
80
+ self._headers: dict = {}
81
+
75
82
  self.id = id
83
+ self.name: str = "Membre"
84
+ self.is_global_scope: bool = True
76
85
  self.permissions: PositionPermissions = PositionPermissions()
77
86
  self.manager_permissions: PositionPermissions = PositionPermissions()
78
87
 
79
- self._url: str = ""
80
88
 
81
89
  def __repr__(self):
82
90
  return self.id
@@ -84,16 +92,20 @@ class Position:
84
92
  def update_permisions(self, **permissions: str):
85
93
  query = "&".join(f"{k}={ urllib.parse.quote(v) }" for k, v in permissions.items())
86
94
 
87
- res = requests.post(f"{self._url}/update_permissions?{query}", headers = default_headers)
95
+ res = requests.post(f"{self._url}/update_permissions?{query}", headers = self._headers)
88
96
 
89
97
  if res.status_code == 200:
90
98
  self.permissions.merge(permissions)
91
99
  else:
92
100
  res.raise_for_status()
93
101
 
94
- def _load(self, _data: dict):
102
+ def _load(self, _data: dict, url: str, headers: dict) -> None:
103
+ self._url = url + '/model/positions/' + _data['id']
104
+ self._headers = headers
105
+
95
106
  self.id = _data['id']
96
107
  self.name = _data['name']
108
+ self.is_global_scope = _data['is_global_scope']
97
109
  self.permissions.merge(_data['permissions'])
98
110
  self.manager_permissions.merge(_data['manager_permissions'])
99
111
 
@@ -103,31 +115,51 @@ class Entity:
103
115
 
104
116
  ## Attributs
105
117
  - id: `NSID`\n
106
- Identifiant de l'entité
118
+ Identifiant NSID
107
119
  - name: `str`\n
108
- Nom d'usage de l'entité
109
- - registerDate: `int`\n
110
- Date d'enregistrement de l'entité
120
+ Nom d'usage
121
+ - register_date: `int`\n
122
+ Date d'enregistrement
123
+ - zone: `int`:\n
124
+ Zone civile
111
125
  - position: `.Position`\n
112
- Position légale de l'entité
126
+ Position civile
113
127
  - additional: `dict`\n
114
- Infos supplémentaires exploitables par les bots
128
+ Infos supplémentaires exploitables par différents services
115
129
  """
116
130
 
117
131
  def __init__(self, id: NSID) -> None:
118
- self._url = "" # URL de l'entité pour une requête GET
132
+ self._url: str = "" # URL de l'entité pour une requête
133
+ self._headers: dict = {}
119
134
 
120
135
  self.id: NSID = NSID(id) # ID hexadécimal de l'entité
121
136
  self.name: str = "Entité Inconnue"
122
- self.registerDate: int = 0
137
+ self.register_date: int = 0
138
+ self.zone: int = 20 # 10 = Serveur test, 20 = Serveur principal, 30 = Serveur de patientage
123
139
  self.position: Position = Position()
124
140
  self.additional: dict = {}
125
141
 
142
+ def _load(self, _data: dict, url: str, headers: dict):
143
+ self._url = url + '/model/' + _data['_class'] + '/' + _data['id']
144
+ self._headers = headers
145
+
146
+ self.id = NSID(_data['id'])
147
+ self.name = _data['name']
148
+ self.register_date = _data['register_date']
149
+ self.zone = _data['zone']
150
+ self.position._load(_data['position'], url, headers)
151
+
152
+ for key, value in _data.get('additional', {}).items():
153
+ if isinstance(value, str) and value.startswith('\n'):
154
+ self.additional[key] = int(value[1:])
155
+ else:
156
+ self.additional[key] = value
157
+
126
158
  def set_name(self, new_name: str) -> None:
127
159
  if len(new_name) > 32:
128
160
  raise ValueError(f"Name length mustn't exceed 32 characters.")
129
161
 
130
- res = requests.post(f"{self._url}/rename?name={new_name}", headers = default_headers)
162
+ res = requests.post(f"{self._url}/rename?name={new_name}", headers = self._headers)
131
163
 
132
164
  if res.status_code == 200:
133
165
  self.name = new_name
@@ -135,7 +167,7 @@ class Entity:
135
167
  res.raise_for_status()
136
168
 
137
169
  def set_position(self, position: Position) -> None:
138
- res = requests.post(f"{self._url}/change_position?position={position.id}", headers = default_headers)
170
+ res = requests.post(f"{self._url}/change_position?position={position.id}", headers = self._headers)
139
171
 
140
172
  if res.status_code == 200:
141
173
  self.position = position
@@ -158,7 +190,7 @@ class Entity:
158
190
 
159
191
  query = "&".join(f"{k}={ urllib.parse.quote(v) }" for k, v in params.items())
160
192
 
161
- res = requests.post(f"{self._url}/add_link?{query}", headers = default_headers)
193
+ res = requests.post(f"{self._url}/add_link?{query}", headers = self._headers)
162
194
 
163
195
  if res.status_code == 200:
164
196
  self.additional[key] = value
@@ -167,7 +199,7 @@ class Entity:
167
199
  res.raise_for_status()
168
200
 
169
201
  def unlink(self, key: str) -> None:
170
- res = requests.post(f"{self._url}/remove_link?link={urllib.parse.quote(key)}", headers = default_headers)
202
+ res = requests.post(f"{self._url}/remove_link?link={urllib.parse.quote(key)}", headers = self._headers)
171
203
 
172
204
  if res.status_code == 200:
173
205
  del self.additional[key]
@@ -195,7 +227,22 @@ class User(Entity):
195
227
  self.boosts: dict[str, int] = {}
196
228
  self.votes: list[NSID] = []
197
229
 
198
- def _load(self, _data: dict):
230
+ def _load(self, _data: dict, url: str, headers: dict):
231
+ self._url = url + '/model/individuals/' + _data['id']
232
+ self._headers = headers
233
+
234
+ self.id = NSID(_data['id'])
235
+ self.name = _data['name']
236
+ self.register_date = _data['register_date']
237
+ self.zone = _data['zone']
238
+ self.position._load(_data['position'], url, headers)
239
+
240
+ for key, value in _data.get('additional', {}).items():
241
+ if isinstance(value, str) and value.startswith('\n'):
242
+ self.additional[key] = int(value[1:])
243
+ else:
244
+ self.additional[key] = value
245
+
199
246
  self.xp = _data['xp']
200
247
  self.boosts = _data['boosts']
201
248
 
@@ -210,7 +257,7 @@ class User(Entity):
210
257
 
211
258
  def add_xp(self, amount: int) -> None:
212
259
  boost = 0 if 0 in self.boosts.values() or amount <= 0 else max(list(self.boosts.values()) + [ 1 ])
213
- res = requests.post(f"{self._url}/add_xp?amount={amount * boost}", headers = default_headers)
260
+ res = requests.post(f"{self._url}/add_xp?amount={amount * boost}", headers = self._headers)
214
261
 
215
262
  if res.status_code == 200:
216
263
  self.xp += amount * boost
@@ -218,7 +265,7 @@ class User(Entity):
218
265
  res.raise_for_status()
219
266
 
220
267
  def edit_boost(self, name: str, multiplier: int = -1) -> None:
221
- res = requests.post(f"{self._url}/edit_boost?boost={name}&multiplier={multiplier}", headers = default_headers)
268
+ res = requests.post(f"{self._url}/edit_boost?boost={name}&multiplier={multiplier}", headers = self._headers)
222
269
 
223
270
  if res.status_code == 200:
224
271
  if multiplier >= 0:
@@ -228,14 +275,32 @@ class User(Entity):
228
275
  else:
229
276
  res.raise_for_status()
230
277
 
231
- class MemberPermissions:
278
+ def get_groups(self) -> list[Entity]:
279
+ res = requests.get(f"{self._url}/groups", headers = self._headers)
280
+
281
+ if res.status_code == 200:
282
+ data = res.json()
283
+ groups = []
284
+
285
+ for grp in data:
286
+ if grp is None: continue
287
+
288
+ group = Organization(grp["id"])
289
+ group._load(grp, self.url, self._headers)
290
+
291
+ groups.append(group)
292
+
293
+ return groups
294
+ else:
295
+ return []
296
+
297
+ class GroupPermissions:
232
298
  """
233
- Permissions d'un utilisateur à l'échelle d'un groupe
299
+ Permissions d'un membre à l'échelle d'un groupe
234
300
  """
235
301
 
236
302
  def __init__(self) -> None:
237
303
  self.manage_organization = False # Renommer l'organisation, changer le logo
238
- self.manage_shares = False # Revaloriser les actions
239
304
  self.manage_roles = False # Changer les rôles des membres
240
305
  self.manage_members = False # Virer quelqu'un d'une entreprise, l'y inviter
241
306
 
@@ -248,41 +313,13 @@ class GroupMember:
248
313
  Membre au sein d'une entité collective
249
314
 
250
315
  ## Attributs
251
- - permission_level: `dict[str, int]`\n
252
- Niveau d'accréditation du membre (0 = salarié, 4 = administrateur)
316
+ - permissions: `.GroupPermissions`\n
317
+ Permissions du membre au sein du groupe
253
318
  """
254
319
 
255
320
  def __init__(self, id: NSID) -> None:
256
321
  self.id = id
257
- self.permission_level: dict = { # Échelle de permissions selon le groupe de travail
258
- "general": 0
259
- }
260
-
261
- def group_permissions(self, team: str = "general") -> MemberPermissions:
262
- p = MemberPermissions()
263
- team_perms = self.permission_level[team]
264
-
265
- if team_perms >= 1: # Responsable
266
- p.manage_members = True
267
-
268
- if team_perms >= 2: # Superviseur
269
- p.manage_roles = True
270
-
271
- if team_perms >= 3: # Chef d'équipe
272
- pass
273
-
274
- if team_perms >= 4: # Directeur
275
- p.manage_shares = True
276
- p.manage_organization = True
277
-
278
- return p
279
-
280
- class GroupInvite:
281
- def __init__(self, id: NSID):
282
- self.id: NSID = id
283
- self.team: str = "general"
284
- self.level: str = 0
285
- self._expires: int = round(time.time()) + 604800
322
+ self.permissions: GroupPermissions = GroupPermissions()
286
323
 
287
324
  class Organization(Entity):
288
325
  """
@@ -310,10 +347,33 @@ class Organization(Entity):
310
347
 
311
348
  self.certifications: dict = {}
312
349
  self.members: list[GroupMember] = []
313
- self.invites: dict[GroupInvite] = []
314
350
 
315
- def _load(self, _data: dict):
316
- self.avatar_url = self._url + '/avatar'
351
+ def _load(self, _data: dict, url: str, headers: dict):
352
+ self._url = url + '/model/organizations/' + _data['id']
353
+ self._headers = headers
354
+
355
+ self.id = NSID(_data['id'])
356
+ self.name = _data['name']
357
+ self.register_date = _data['register_date']
358
+ self.zone = _data['zone']
359
+ self.position._load(_data['position'], url, headers)
360
+
361
+ for key, value in _data.get('additional', {}).items():
362
+ if isinstance(value, str) and value.startswith('\n'):
363
+ self.additional[key] = int(value[1:])
364
+ else:
365
+ self.additional[key] = value
366
+
367
+ _owner = _data['owner']
368
+
369
+ if _owner['_class'] == 'individuals':
370
+ self.owner = User(_owner['id'])
371
+ elif _owner['_class'] == 'organizations':
372
+ self.owner = Organization(_owner['id'])
373
+ else:
374
+ self.owner = Entity(_owner['id'])
375
+
376
+ self.owner._load(_owner, url, headers)
317
377
 
318
378
  for _member in _data['members']:
319
379
  member = GroupMember(_member['id'])
@@ -324,7 +384,7 @@ class Organization(Entity):
324
384
  self.certifications = _data['certifications']
325
385
 
326
386
  def add_certification(self, certification: str, __expires: int = 2419200) -> None:
327
- res = requests.post(f"{self._url}/add_certification?name={certification}&duration={__expires}", headers = default_headers)
387
+ res = requests.post(f"{self._url}/add_certification?name={certification}&duration={__expires}", headers = self._headers)
328
388
 
329
389
  if res.status_code == 200:
330
390
  self.certifications[certification] = int(round(time.time()) + __expires)
@@ -335,39 +395,46 @@ class Organization(Entity):
335
395
  return certification in self.certifications.keys()
336
396
 
337
397
  def remove_certification(self, certification: str) -> None:
338
- res = requests.post(f"{self._url}/remove_certification?name={certification}", headers = default_headers)
398
+ res = requests.post(f"{self._url}/remove_certification?name={certification}", headers = self._headers)
339
399
 
340
400
  if res.status_code == 200:
341
401
  del self.certifications[certification]
342
402
  else:
343
403
  res.raise_for_status()
344
404
 
345
- def invite_member(self, member: NSID, level: int = 0, team: str = "general") -> None:
405
+ def add_member(self, member: NSID, permissions: GroupPermissions = GroupPermissions()) -> None:
346
406
  if not isinstance(member, NSID):
347
407
  raise TypeError("L'entrée membre doit être de type NSID")
348
408
 
349
- res = requests.post(f"{self._url}/invite_member?id={member}&level={level}&team={team}", headers = default_headers)
409
+ res = requests.post(f"{self._url}/add_member?id={member}", headers = self._headers, json = {
410
+ "permissions": permissions.__dict__
411
+ })
350
412
 
351
413
  if res.status_code == 200:
352
- invite = GroupInvite(member)
353
- invite.team = team
354
- invite.level = level
414
+ member = GroupMember(member)
415
+ member.permissions = permissions
355
416
 
356
- self.invites.append(invite)
417
+ self.members.append(member)
357
418
  else:
358
419
  res.raise_for_status()
359
420
 
360
421
  def remove_member(self, member: GroupMember) -> None:
422
+ requests.post(f"{self._url}/remove_member?id={member.id}", headers = self._headers)
423
+
361
424
  for _member in self.members:
362
425
  if _member.id == member.id:
363
426
  self.members.remove(_member)
364
427
 
365
- def remove(self, member: GroupMember) -> None:
366
- self.remove_member(member)
367
-
368
428
  def set_owner(self, member: User) -> None:
369
429
  self.owner = member
370
430
 
431
+ def get_member(self, id: NSID) -> GroupMember:
432
+ for member in self.members:
433
+ if member.id == id:
434
+ return member
435
+ else:
436
+ return
437
+
371
438
  def get_members_by_attr(self, attribute: str = "id") -> list[str]:
372
439
  return [ member.__getattribute__(attribute) for member in self.members ]
373
440
 
@@ -0,0 +1,108 @@
1
+ import requests
2
+ import time
3
+
4
+ from .base import NSID
5
+
6
+ class Report:
7
+ def __init__(self, id: NSID):
8
+ self._url: str = ""
9
+ self._headers: dict = {}
10
+
11
+ self.id: NSID = id
12
+ self.author: NSID = NSID('0')
13
+ self.target: NSID = NSID('0')
14
+ self.date: int = round(time.time())
15
+ self.status: int = 0 # 0: En attente, 1: Accepté, 2: Rejeté
16
+ self.reason: str = None # Raison proposée par le bot
17
+ self.details:str = None # Description des faits
18
+
19
+ def _load(self, _data: dict, url: str, headers: str) -> None:
20
+ self._url = url
21
+ self._headers = headers
22
+
23
+ self.id = NSID(_data['id'])
24
+ self.author = NSID(_data['author'])
25
+ self.target = NSID(_data['target'])
26
+ self.date = _data['date']
27
+ self.status = _data['status']
28
+ self.reason = _data.get('reason', None)
29
+ self.details = _data.get('details', None)
30
+
31
+ def update(self, status: str | int):
32
+ __statuses = [
33
+ 'pending',
34
+ 'accepted',
35
+ 'rejected'
36
+ ]
37
+
38
+ if status not in __statuses:
39
+ if isinstance(status, int) and 0 <= status <= 2:
40
+ status = __statuses[status]
41
+
42
+ else:
43
+ raise ValueError(f"Invalid status: {status}. Must be one of {__statuses} or an integer between 0 and 2.")
44
+
45
+ res = requests.post(f"{self._url}/update?status={status}", headers = self._headers)
46
+
47
+ if res.status_code == 200:
48
+ self.status = status
49
+ else:
50
+ res.raise_for_status()
51
+
52
+ class Sanction:
53
+ def __init__(self, id: NSID):
54
+ self._url: str = ""
55
+ self._headers: dict = {}
56
+
57
+ self.id: NSID = id
58
+ self.target: NSID = NSID('0')
59
+ self.type: str = None
60
+ self.date: int = round(time.time())
61
+ self.duration: int = 0
62
+ self.title: str = None
63
+ self.case: NSID = NSID('0')
64
+
65
+ def _load(self, _data: dict, url: str, headers: dict) -> None:
66
+ self._url = url
67
+ self._headers = headers
68
+
69
+ self.id = NSID(_data['id'])
70
+ self.target = NSID(_data['target'])
71
+ self.type = _data['type']
72
+ self.date = _data['date']
73
+ self.duration = _data['duration']
74
+ self.title = _data['title']
75
+ self.case = NSID(_data['case'])
76
+
77
+ class Lawsuit:
78
+ def __init__(self, id: NSID):
79
+ self._url: str = ""
80
+ self._headers: dict = {}
81
+
82
+ self.id: NSID = id
83
+ self.target: NSID = NSID('0')
84
+ self.judge: NSID = NSID('0')
85
+ self.title: str = None
86
+ self.date: int = round(time.time())
87
+ self.report: NSID = NSID('0')
88
+ self.is_private: bool = False
89
+ self.is_open: bool = False
90
+
91
+ def _load(self, _data: dict, url: str, headers: dict) -> None:
92
+ self._url = url
93
+ self._headers = headers
94
+
95
+ self._url = url
96
+ self._headers = headers
97
+
98
+ self.id = NSID(_data['id'])
99
+ self.target = NSID(_data['target'])
100
+ self.judge = NSID(_data['judge'])
101
+ self.title = _data.get('title')
102
+ self.date = _data.get('date', round(time.time()))
103
+
104
+ report = _data.get('report')
105
+ self.report = NSID(report) if report else NSID('0')
106
+
107
+ self.is_private = bool(_data.get('private', 0))
108
+ self.is_open = _data.get('status', 0) == 0