nsarchive 3.0.0a7__py3-none-any.whl → 3.0.0b1__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.
- nsarchive/__init__.py +17 -10
- nsarchive/{instances → interfaces}/_economy.py +15 -30
- nsarchive/interfaces/_entities.py +206 -0
- nsarchive/interfaces/_justice.py +122 -0
- nsarchive/interfaces/_state.py +196 -0
- nsarchive/mandate.py +50 -0
- nsarchive/{cls → models}/base.py +28 -7
- nsarchive/{cls → models}/economy.py +34 -14
- nsarchive/{cls → models}/entities.py +143 -77
- nsarchive/models/justice.py +108 -0
- nsarchive/models/republic.py +128 -0
- nsarchive/models/scale.py +23 -0
- nsarchive/models/state.py +75 -0
- {nsarchive-3.0.0a7.dist-info → nsarchive-3.0.0b1.dist-info}/METADATA +3 -2
- nsarchive-3.0.0b1.dist-info/RECORD +19 -0
- {nsarchive-3.0.0a7.dist-info → nsarchive-3.0.0b1.dist-info}/WHEEL +1 -1
- nsarchive/cls/archives.py +0 -93
- nsarchive/cls/republic.py +0 -149
- nsarchive/instances/_entities.py +0 -281
- nsarchive/instances/_republic.py +0 -339
- nsarchive-3.0.0a7.dist-info/RECORD +0 -15
- {nsarchive-3.0.0a7.dist-info → nsarchive-3.0.0b1.dist-info}/LICENSE +0 -0
@@ -8,14 +8,12 @@ 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
|
-
self.append: bool
|
16
|
-
self.manage: bool
|
17
|
-
self.edit: bool
|
18
|
-
self.read: bool
|
13
|
+
self.append: bool = False
|
14
|
+
self.manage: bool = False
|
15
|
+
self.edit: bool = False
|
16
|
+
self.read: bool = False
|
19
17
|
|
20
18
|
self.load(initial)
|
21
19
|
|
@@ -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 = '
|
74
|
-
self.
|
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 =
|
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
|
118
|
+
Identifiant NSID
|
107
119
|
- name: `str`\n
|
108
|
-
Nom d'usage
|
109
|
-
-
|
110
|
-
Date d'enregistrement
|
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
|
126
|
+
Position civile
|
113
127
|
- additional: `dict`\n
|
114
|
-
Infos supplémentaires exploitables par
|
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
|
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.
|
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 =
|
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 =
|
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,16 +190,15 @@ 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 =
|
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
|
165
197
|
else:
|
166
|
-
print(res.text)
|
167
198
|
res.raise_for_status()
|
168
199
|
|
169
200
|
def unlink(self, key: str) -> None:
|
170
|
-
res = requests.post(f"{self._url}/remove_link?link={urllib.parse.quote(key)}", headers =
|
201
|
+
res = requests.post(f"{self._url}/remove_link?link={urllib.parse.quote(key)}", headers = self._headers)
|
171
202
|
|
172
203
|
if res.status_code == 200:
|
173
204
|
del self.additional[key]
|
@@ -195,7 +226,22 @@ class User(Entity):
|
|
195
226
|
self.boosts: dict[str, int] = {}
|
196
227
|
self.votes: list[NSID] = []
|
197
228
|
|
198
|
-
def _load(self, _data: dict):
|
229
|
+
def _load(self, _data: dict, url: str, headers: dict):
|
230
|
+
self._url = url + '/model/individuals/' + _data['id']
|
231
|
+
self._headers = headers
|
232
|
+
|
233
|
+
self.id = NSID(_data['id'])
|
234
|
+
self.name = _data['name']
|
235
|
+
self.register_date = _data['register_date']
|
236
|
+
self.zone = _data['zone']
|
237
|
+
self.position._load(_data['position'], url, headers)
|
238
|
+
|
239
|
+
for key, value in _data.get('additional', {}).items():
|
240
|
+
if isinstance(value, str) and value.startswith('\n'):
|
241
|
+
self.additional[key] = int(value[1:])
|
242
|
+
else:
|
243
|
+
self.additional[key] = value
|
244
|
+
|
199
245
|
self.xp = _data['xp']
|
200
246
|
self.boosts = _data['boosts']
|
201
247
|
|
@@ -210,7 +256,7 @@ class User(Entity):
|
|
210
256
|
|
211
257
|
def add_xp(self, amount: int) -> None:
|
212
258
|
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 =
|
259
|
+
res = requests.post(f"{self._url}/add_xp?amount={amount * boost}", headers = self._headers)
|
214
260
|
|
215
261
|
if res.status_code == 200:
|
216
262
|
self.xp += amount * boost
|
@@ -218,7 +264,7 @@ class User(Entity):
|
|
218
264
|
res.raise_for_status()
|
219
265
|
|
220
266
|
def edit_boost(self, name: str, multiplier: int = -1) -> None:
|
221
|
-
res = requests.post(f"{self._url}/edit_boost?boost={name}&multiplier={multiplier}", headers =
|
267
|
+
res = requests.post(f"{self._url}/edit_boost?boost={name}&multiplier={multiplier}", headers = self._headers)
|
222
268
|
|
223
269
|
if res.status_code == 200:
|
224
270
|
if multiplier >= 0:
|
@@ -228,14 +274,32 @@ class User(Entity):
|
|
228
274
|
else:
|
229
275
|
res.raise_for_status()
|
230
276
|
|
231
|
-
|
277
|
+
def get_groups(self) -> list[Entity]:
|
278
|
+
res = requests.get(f"{self._url}/groups", headers = self._headers)
|
279
|
+
|
280
|
+
if res.status_code == 200:
|
281
|
+
data = res.json()
|
282
|
+
groups = []
|
283
|
+
|
284
|
+
for grp in data:
|
285
|
+
if grp is None: continue
|
286
|
+
|
287
|
+
group = Organization(grp["id"])
|
288
|
+
group._load(grp, self.url, self._headers)
|
289
|
+
|
290
|
+
groups.append(group)
|
291
|
+
|
292
|
+
return groups
|
293
|
+
else:
|
294
|
+
return []
|
295
|
+
|
296
|
+
class GroupPermissions:
|
232
297
|
"""
|
233
|
-
Permissions d'un
|
298
|
+
Permissions d'un membre à l'échelle d'un groupe
|
234
299
|
"""
|
235
300
|
|
236
301
|
def __init__(self) -> None:
|
237
302
|
self.manage_organization = False # Renommer l'organisation, changer le logo
|
238
|
-
self.manage_shares = False # Revaloriser les actions
|
239
303
|
self.manage_roles = False # Changer les rôles des membres
|
240
304
|
self.manage_members = False # Virer quelqu'un d'une entreprise, l'y inviter
|
241
305
|
|
@@ -248,41 +312,13 @@ class GroupMember:
|
|
248
312
|
Membre au sein d'une entité collective
|
249
313
|
|
250
314
|
## Attributs
|
251
|
-
-
|
252
|
-
|
315
|
+
- permissions: `.GroupPermissions`\n
|
316
|
+
Permissions du membre au sein du groupe
|
253
317
|
"""
|
254
318
|
|
255
319
|
def __init__(self, id: NSID) -> None:
|
256
320
|
self.id = id
|
257
|
-
self.
|
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
|
321
|
+
self.permissions: GroupPermissions = GroupPermissions()
|
286
322
|
|
287
323
|
class Organization(Entity):
|
288
324
|
"""
|
@@ -310,10 +346,33 @@ class Organization(Entity):
|
|
310
346
|
|
311
347
|
self.certifications: dict = {}
|
312
348
|
self.members: list[GroupMember] = []
|
313
|
-
self.invites: dict[GroupInvite] = []
|
314
349
|
|
315
|
-
def _load(self, _data: dict):
|
316
|
-
self.
|
350
|
+
def _load(self, _data: dict, url: str, headers: dict):
|
351
|
+
self._url = url + '/model/organizations/' + _data['id']
|
352
|
+
self._headers = headers
|
353
|
+
|
354
|
+
self.id = NSID(_data['id'])
|
355
|
+
self.name = _data['name']
|
356
|
+
self.register_date = _data['register_date']
|
357
|
+
self.zone = _data['zone']
|
358
|
+
self.position._load(_data['position'], url, headers)
|
359
|
+
|
360
|
+
for key, value in _data.get('additional', {}).items():
|
361
|
+
if isinstance(value, str) and value.startswith('\n'):
|
362
|
+
self.additional[key] = int(value[1:])
|
363
|
+
else:
|
364
|
+
self.additional[key] = value
|
365
|
+
|
366
|
+
_owner = _data['owner']
|
367
|
+
|
368
|
+
if _owner['_class'] == 'individuals':
|
369
|
+
self.owner = User(_owner['id'])
|
370
|
+
elif _owner['_class'] == 'organizations':
|
371
|
+
self.owner = Organization(_owner['id'])
|
372
|
+
else:
|
373
|
+
self.owner = Entity(_owner['id'])
|
374
|
+
|
375
|
+
self.owner._load(_owner, url, headers)
|
317
376
|
|
318
377
|
for _member in _data['members']:
|
319
378
|
member = GroupMember(_member['id'])
|
@@ -324,7 +383,7 @@ class Organization(Entity):
|
|
324
383
|
self.certifications = _data['certifications']
|
325
384
|
|
326
385
|
def add_certification(self, certification: str, __expires: int = 2419200) -> None:
|
327
|
-
res = requests.post(f"{self._url}/add_certification?name={certification}&duration={__expires}", headers =
|
386
|
+
res = requests.post(f"{self._url}/add_certification?name={certification}&duration={__expires}", headers = self._headers)
|
328
387
|
|
329
388
|
if res.status_code == 200:
|
330
389
|
self.certifications[certification] = int(round(time.time()) + __expires)
|
@@ -335,39 +394,46 @@ class Organization(Entity):
|
|
335
394
|
return certification in self.certifications.keys()
|
336
395
|
|
337
396
|
def remove_certification(self, certification: str) -> None:
|
338
|
-
res = requests.post(f"{self._url}/remove_certification?name={certification}", headers =
|
397
|
+
res = requests.post(f"{self._url}/remove_certification?name={certification}", headers = self._headers)
|
339
398
|
|
340
399
|
if res.status_code == 200:
|
341
400
|
del self.certifications[certification]
|
342
401
|
else:
|
343
402
|
res.raise_for_status()
|
344
403
|
|
345
|
-
def
|
404
|
+
def add_member(self, member: NSID, permissions: GroupPermissions = GroupPermissions()) -> None:
|
346
405
|
if not isinstance(member, NSID):
|
347
406
|
raise TypeError("L'entrée membre doit être de type NSID")
|
348
407
|
|
349
|
-
res = requests.post(f"{self._url}/
|
408
|
+
res = requests.post(f"{self._url}/add_member?id={member}", headers = self._headers, json = {
|
409
|
+
"permissions": permissions.__dict__
|
410
|
+
})
|
350
411
|
|
351
412
|
if res.status_code == 200:
|
352
|
-
|
353
|
-
|
354
|
-
invite.level = level
|
413
|
+
member = GroupMember(member)
|
414
|
+
member.permissions = permissions
|
355
415
|
|
356
|
-
self.
|
416
|
+
self.members.append(member)
|
357
417
|
else:
|
358
418
|
res.raise_for_status()
|
359
419
|
|
360
420
|
def remove_member(self, member: GroupMember) -> None:
|
421
|
+
requests.post(f"{self._url}/remove_member?id={member.id}", headers = self._headers)
|
422
|
+
|
361
423
|
for _member in self.members:
|
362
424
|
if _member.id == member.id:
|
363
425
|
self.members.remove(_member)
|
364
426
|
|
365
|
-
def remove(self, member: GroupMember) -> None:
|
366
|
-
self.remove_member(member)
|
367
|
-
|
368
427
|
def set_owner(self, member: User) -> None:
|
369
428
|
self.owner = member
|
370
429
|
|
430
|
+
def get_member(self, id: NSID) -> GroupMember:
|
431
|
+
for member in self.members:
|
432
|
+
if member.id == id:
|
433
|
+
return member
|
434
|
+
else:
|
435
|
+
return
|
436
|
+
|
371
437
|
def get_members_by_attr(self, attribute: str = "id") -> list[str]:
|
372
438
|
return [ member.__getattribute__(attribute) for member in self.members ]
|
373
439
|
|
@@ -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.lawsuit: 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.lawsuit = NSID(_data['lawsuit'])
|
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
|
@@ -0,0 +1,128 @@
|
|
1
|
+
import json
|
2
|
+
import requests
|
3
|
+
import time
|
4
|
+
|
5
|
+
from .base import NSID
|
6
|
+
|
7
|
+
# Votes
|
8
|
+
|
9
|
+
class VoteOption:
|
10
|
+
"""
|
11
|
+
Option disponible lors d'un vote
|
12
|
+
|
13
|
+
## Attributs
|
14
|
+
- id: `str`\n
|
15
|
+
Identifiant de l'option
|
16
|
+
- title: `str`\n
|
17
|
+
Label de l'option
|
18
|
+
- count: `int`\n
|
19
|
+
Nombre de sympathisants pour cette option
|
20
|
+
"""
|
21
|
+
|
22
|
+
def __init__(self, title: str, count: int = 0):
|
23
|
+
self.title: str = title
|
24
|
+
self.count: int = count
|
25
|
+
|
26
|
+
def __repr__(self) -> dict:
|
27
|
+
return json.dumps({
|
28
|
+
'title': self.title,
|
29
|
+
'count': self.count
|
30
|
+
})
|
31
|
+
|
32
|
+
def _load(self, _data: dict):
|
33
|
+
self.title = str(_data['title'])
|
34
|
+
self.count = int(_data['count'])
|
35
|
+
|
36
|
+
class Vote:
|
37
|
+
"""
|
38
|
+
Classe de référence pour les différents votes du serveur
|
39
|
+
|
40
|
+
## Attributs
|
41
|
+
- id: `NSID`\n
|
42
|
+
Identifiant du vote
|
43
|
+
- title: `str`\n
|
44
|
+
Titre du vote
|
45
|
+
- options: dict[str, .VoteOption]\n
|
46
|
+
Liste des choix disponibles
|
47
|
+
- author: `NSID`\n
|
48
|
+
Identifiant de l'auteur du vote
|
49
|
+
- startDate: `int`\n
|
50
|
+
Date de début du vote
|
51
|
+
- endDate: `int`\n
|
52
|
+
Date limite pour voter
|
53
|
+
"""
|
54
|
+
|
55
|
+
def __init__(self, id: NSID = None) -> None:
|
56
|
+
self._url: str
|
57
|
+
self._headers: dict
|
58
|
+
|
59
|
+
self.id: NSID = id if id else NSID(0)
|
60
|
+
self.title: str = ''
|
61
|
+
self.author: NSID = NSID(0)
|
62
|
+
|
63
|
+
self.startDate: int = round(time.time())
|
64
|
+
self.endDate: int = 0
|
65
|
+
|
66
|
+
self.options: dict[str, VoteOption] = {}
|
67
|
+
|
68
|
+
def _load(self, _data: dict, url: str, headers: dict) -> None:
|
69
|
+
self._url = url
|
70
|
+
self._headers = headers
|
71
|
+
|
72
|
+
self.id = NSID(_data['id'])
|
73
|
+
self.title = _data['title']
|
74
|
+
self.author = _data['author']
|
75
|
+
|
76
|
+
self.startDate = _data['start']
|
77
|
+
self.endDate = _data['end']
|
78
|
+
|
79
|
+
self.options = {}
|
80
|
+
|
81
|
+
for _opt_id, opt in _data['options'].items():
|
82
|
+
option = VoteOption(*tuple(opt.values()))
|
83
|
+
|
84
|
+
self.options[_opt_id] = option
|
85
|
+
|
86
|
+
def get(self, id: str) -> VoteOption:
|
87
|
+
if id in self.options.keys():
|
88
|
+
return self.options[id]
|
89
|
+
else:
|
90
|
+
raise ValueError(f"Option {id} not found in vote {self.id}")
|
91
|
+
|
92
|
+
def add_vote(self, id: str):
|
93
|
+
"""
|
94
|
+
Ajoute un vote à l'option spécifiée
|
95
|
+
"""
|
96
|
+
|
97
|
+
res = requests.post(f"{self._url}/vote?option={id}", headers = self._headers)
|
98
|
+
|
99
|
+
if res.status_code == 200:
|
100
|
+
self.get(id).count += 1
|
101
|
+
else:
|
102
|
+
res.raise_for_status()
|
103
|
+
|
104
|
+
def close(self):
|
105
|
+
"""
|
106
|
+
Ferme le vote
|
107
|
+
"""
|
108
|
+
|
109
|
+
res = requests.post(f"{self._url}/close", headers = self._headers)
|
110
|
+
|
111
|
+
if res.status_code == 200:
|
112
|
+
self.endDate = round(time.time())
|
113
|
+
else:
|
114
|
+
res.raise_for_status()
|
115
|
+
|
116
|
+
class LawsuitVote(Vote):
|
117
|
+
"""
|
118
|
+
Vote à trois positions pour un procès
|
119
|
+
"""
|
120
|
+
|
121
|
+
def __init__(self, id: NSID, title: str) -> None:
|
122
|
+
super().__init__(id, title)
|
123
|
+
|
124
|
+
self.options = [
|
125
|
+
VoteOption('guilty', 'Coupable'),
|
126
|
+
VoteOption('innocent', 'Innocent'),
|
127
|
+
VoteOption('blank', 'Pas d\'avis'),
|
128
|
+
]
|
@@ -0,0 +1,23 @@
|
|
1
|
+
class Scale:
|
2
|
+
def __init__(self):
|
3
|
+
self.democratie: float = 0.0
|
4
|
+
self.coertition: float = 0.0
|
5
|
+
self.liberte: float = 0.0
|
6
|
+
self.integration: float = 0.0
|
7
|
+
self.revolution: float = 0.0
|
8
|
+
|
9
|
+
def _load(self, _data: dict):
|
10
|
+
self.democratie = _data.get('DEM', 0.0)
|
11
|
+
self.coertition = _data.get('SRV', 0.0)
|
12
|
+
self.liberte = _data.get('LIB', 0.0)
|
13
|
+
self.integration = _data.get('INT', 0.0)
|
14
|
+
self.revolution = _data.get('REV', 0.0)
|
15
|
+
|
16
|
+
def _to_dict(self) -> dict:
|
17
|
+
return {
|
18
|
+
'DEM': self.democratie,
|
19
|
+
'SRV': self.coertition,
|
20
|
+
'LIB': self.liberte,
|
21
|
+
'INT': self.integration,
|
22
|
+
'REV': self.revolution
|
23
|
+
}
|