nsarchive 1.3.0__py3-none-any.whl → 2.0.0__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 +20 -806
- nsarchive/cls/archives.py +58 -35
- nsarchive/cls/base.py +174 -14
- nsarchive/cls/economy.py +71 -13
- nsarchive/cls/entities.py +176 -38
- nsarchive/cls/republic.py +104 -20
- nsarchive/instances/_economy.py +313 -0
- nsarchive/instances/_entities.py +321 -0
- nsarchive/instances/_republic.py +313 -0
- nsarchive/utils.py +26 -0
- nsarchive-2.0.0.dist-info/METADATA +20 -0
- nsarchive-2.0.0.dist-info/RECORD +16 -0
- nsarchive/utils/assets.py +0 -15
- nsarchive-1.3.0.dist-info/METADATA +0 -177
- nsarchive-1.3.0.dist-info/RECORD +0 -13
- {nsarchive-1.3.0.dist-info → nsarchive-2.0.0.dist-info}/LICENSE +0 -0
- {nsarchive-1.3.0.dist-info → nsarchive-2.0.0.dist-info}/WHEEL +0 -0
nsarchive/cls/entities.py
CHANGED
@@ -1,10 +1,9 @@
|
|
1
|
-
import io
|
2
1
|
import time
|
3
2
|
|
4
3
|
from .exceptions import *
|
5
|
-
from .base import
|
4
|
+
from .base import NSID
|
6
5
|
|
7
|
-
from ..
|
6
|
+
from .. import utils
|
8
7
|
|
9
8
|
class PositionPermissions:
|
10
9
|
"""
|
@@ -30,21 +29,53 @@ class PositionPermissions:
|
|
30
29
|
self.vote_representatives = False # Participer aux élections législatives
|
31
30
|
|
32
31
|
def edit(self, **permissions: bool) -> None:
|
33
|
-
for perm in permissions.
|
32
|
+
for perm in permissions.items():
|
34
33
|
self.__setattr__(*perm)
|
35
34
|
|
36
35
|
class Position:
|
36
|
+
"""
|
37
|
+
Position légale d'une entité
|
38
|
+
|
39
|
+
## Attributs
|
40
|
+
- name: `str`\n
|
41
|
+
Titre de la position
|
42
|
+
- id: `str`\n
|
43
|
+
Identifiant de la position
|
44
|
+
- permissions: `.PositionPermissions`\n
|
45
|
+
Permissions accordées à l'utilisateur
|
46
|
+
"""
|
47
|
+
|
37
48
|
def __init__(self, id: str = 'inconnu') -> None:
|
38
49
|
self.name: str = "Inconnue"
|
39
50
|
self.id = id
|
40
51
|
self.permissions: PositionPermissions = PositionPermissions()
|
41
52
|
|
53
|
+
def __repr__(self):
|
54
|
+
return self.id
|
55
|
+
|
42
56
|
class Entity:
|
43
|
-
|
57
|
+
"""
|
58
|
+
Classe de référence pour les entités
|
59
|
+
|
60
|
+
## Attributs
|
61
|
+
- id: `NSID`\n
|
62
|
+
Identifiant de l'entité
|
63
|
+
- name: `str`\n
|
64
|
+
Nom d'usage de l'entité
|
65
|
+
- registerDate: `int`\n
|
66
|
+
Date d'enregistrement de l'entité
|
67
|
+
- position: `.Position`\n
|
68
|
+
Position légale de l'entité
|
69
|
+
- additional: `dict`\n
|
70
|
+
Infos supplémentaires exploitables par les bots
|
71
|
+
"""
|
72
|
+
|
73
|
+
def __init__(self, id: NSID) -> None:
|
44
74
|
self.id: NSID = NSID(id) # ID hexadécimal de l'entité (ou nom dans le cas de l'entreprise)
|
45
75
|
self.name: str = "Entité Inconnue"
|
46
76
|
self.registerDate: int = 0
|
47
|
-
self.
|
77
|
+
self.position: Position = Position()
|
78
|
+
self.additional: dict = {}
|
48
79
|
|
49
80
|
def set_name(self, new_name: str) -> None:
|
50
81
|
if len(new_name) > 32:
|
@@ -52,11 +83,33 @@ class Entity:
|
|
52
83
|
|
53
84
|
self.name = new_name
|
54
85
|
|
55
|
-
def set_position(self, position:
|
56
|
-
self.
|
86
|
+
def set_position(self, position: Position) -> None:
|
87
|
+
self.position = position
|
88
|
+
|
89
|
+
def add_link(self, key: str, value: str | int) -> None:
|
90
|
+
if isinstance(value, str) or isinstance(value, int):
|
91
|
+
self.additional[key] = value
|
92
|
+
|
93
|
+
def unlink(self, key: str) -> None:
|
94
|
+
del self.additional[key]
|
57
95
|
|
58
96
|
class User(Entity):
|
59
|
-
|
97
|
+
"""
|
98
|
+
Entité individuelle
|
99
|
+
|
100
|
+
## Attributs
|
101
|
+
- Tous les attributs de la classe `.Entity`
|
102
|
+
- xp: `int`\n
|
103
|
+
Points d'expérience de l'entité
|
104
|
+
- boosts: `dict[str, int]`\n
|
105
|
+
Ensemble des boosts dont bénéficie l'entité
|
106
|
+
- permissions: `.PositionPermissions`\n
|
107
|
+
Fusion des permissions offertes par la position et les groupes
|
108
|
+
- votes: `list[NSID]`\n
|
109
|
+
Liste des votes auxquels a participé l'entité
|
110
|
+
"""
|
111
|
+
|
112
|
+
def __init__(self, id: NSID) -> None:
|
60
113
|
super().__init__(NSID(id))
|
61
114
|
|
62
115
|
self.xp: int = 0
|
@@ -64,7 +117,7 @@ class User(Entity):
|
|
64
117
|
self.permissions: PositionPermissions = PositionPermissions() # Elles seront définies en récupérant les permissions de sa position
|
65
118
|
self.votes: list[str] = []
|
66
119
|
|
67
|
-
def add_vote(self, id:
|
120
|
+
def add_vote(self, id: NSID):
|
68
121
|
self.votes.append(NSID(id))
|
69
122
|
|
70
123
|
def get_level(self) -> None:
|
@@ -91,51 +144,115 @@ class MemberPermissions:
|
|
91
144
|
"""
|
92
145
|
|
93
146
|
def __init__(self) -> None:
|
94
|
-
self.manage_organization = False # Renommer
|
95
|
-
self.
|
96
|
-
self.
|
147
|
+
self.manage_organization = False # Renommer l'organisation, changer le logo
|
148
|
+
self.manage_roles = False # Changer les rôles des membres
|
149
|
+
self.manage_shares = False # Revaloriser les actions
|
150
|
+
self.manage_members = False # Virer quelqu'un d'une entreprise, l'y inviter
|
97
151
|
|
98
152
|
def edit(self, **permissions: bool) -> None:
|
99
153
|
for perm in permissions.values():
|
100
154
|
self.__setattr__(*perm)
|
101
155
|
|
102
156
|
class GroupMember(User):
|
103
|
-
|
157
|
+
"""
|
158
|
+
Membre au sein d'une entité collective
|
159
|
+
|
160
|
+
## Attributs
|
161
|
+
- Tous les attributs de la classe `.User`
|
162
|
+
- permission_level: `int`\n
|
163
|
+
Niveau d'accréditation du membre (0 = salarié, 4 = administrateur)
|
164
|
+
"""
|
165
|
+
|
166
|
+
def __init__(self, id: NSID) -> None:
|
104
167
|
super().__init__(id)
|
105
168
|
|
106
|
-
self.
|
107
|
-
self.group_position: str = 'membre'
|
169
|
+
self.permission_level: int = 0
|
108
170
|
|
109
|
-
|
110
|
-
|
111
|
-
self.id: NSID = NSID(id)
|
171
|
+
def group_permissions(self) -> MemberPermissions:
|
172
|
+
p = MemberPermissions()
|
112
173
|
|
113
|
-
self.
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
'REPR': 0 # Député
|
119
|
-
}
|
174
|
+
if self.permission_level >= 1:
|
175
|
+
p.manage_members = True
|
176
|
+
|
177
|
+
if self.permission_level >= 2:
|
178
|
+
p.manage_shares = True
|
120
179
|
|
121
|
-
self.
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
180
|
+
if self.permission_level >= 3:
|
181
|
+
p.manage_roles = True
|
182
|
+
|
183
|
+
if self.permission_level >= 4:
|
184
|
+
p.manage_organization = True
|
185
|
+
|
186
|
+
return p
|
187
|
+
|
188
|
+
class Share:
|
189
|
+
"""
|
190
|
+
Action d'une entreprise
|
191
|
+
|
192
|
+
## Attributs
|
193
|
+
- owner: `NSID`\n
|
194
|
+
Identifiant du titulaire de l'action
|
195
|
+
- price: `int`\n
|
196
|
+
Prix de l'action
|
197
|
+
"""
|
198
|
+
|
199
|
+
def __getstate__(self) -> dict:
|
200
|
+
return {
|
201
|
+
"owner": self.owner,
|
202
|
+
"price": self.price
|
126
203
|
}
|
127
204
|
|
205
|
+
def __setstate__(self, state: dict):
|
206
|
+
self.owner: NSID = state['owner']
|
207
|
+
self.price: int = state['price']
|
208
|
+
|
209
|
+
def __init__(self, owner: NSID = NSID(0x0), price: int = 10):
|
210
|
+
self.owner: NSID = owner
|
211
|
+
self.price: int = price
|
212
|
+
|
213
|
+
def assign_owner(self, owner: NSID):
|
214
|
+
self.owner = owner
|
215
|
+
|
216
|
+
def set_price(self, price: int):
|
217
|
+
self.price = price
|
218
|
+
|
128
219
|
class Organization(Entity):
|
129
|
-
|
220
|
+
"""
|
221
|
+
Entité collective
|
222
|
+
|
223
|
+
## Attributs
|
224
|
+
- Tous les attributs de la classe `.Entity`
|
225
|
+
- owner: `.Entity`\n
|
226
|
+
Utilisateur ou entreprise propriétaire de l'entité collective
|
227
|
+
- avatar: `bytes`\n
|
228
|
+
Avatar/logo de l'entité collective
|
229
|
+
- certifications: `dict[str, int]`\n
|
230
|
+
Liste des certifications et de leur date d'ajout
|
231
|
+
- members: `list[.GroupMember]`\n
|
232
|
+
Liste des membres de l'entreprise
|
233
|
+
- parts: `list[.Share]`\n
|
234
|
+
Liste des actions émises par l'entreprise
|
235
|
+
"""
|
236
|
+
|
237
|
+
def __init__(self, id: NSID) -> None:
|
130
238
|
super().__init__(NSID(id))
|
131
239
|
|
132
|
-
self.owner: Entity
|
240
|
+
self.owner: Entity = User(NSID(0x0))
|
241
|
+
self.avatar: bytes = utils.open_asset('default_avatar.png')
|
242
|
+
|
133
243
|
self.certifications: dict = {}
|
134
244
|
self.members: list[GroupMember] = []
|
135
|
-
self.avatar: bytes = assets.open('default_avatar.png')
|
136
245
|
|
137
|
-
|
138
|
-
|
246
|
+
self.parts: list[Share] = 50 * [ Share(self.owner.id, 0) ]
|
247
|
+
|
248
|
+
def add_certification(self, certification: str) -> None:
|
249
|
+
self.certifications[certification] = round(time.time())
|
250
|
+
|
251
|
+
def has_certification(self, certification: str) -> bool:
|
252
|
+
return certification in self.certifications.keys()
|
253
|
+
|
254
|
+
def remove_certification(self, certification: str) -> None:
|
255
|
+
del self.certifications[certification]
|
139
256
|
|
140
257
|
def add_member(self, member: GroupMember) -> None:
|
141
258
|
if not isinstance(member, GroupMember):
|
@@ -157,5 +274,26 @@ class Organization(Entity):
|
|
157
274
|
def set_owner(self, member: User) -> None:
|
158
275
|
self.owner = member
|
159
276
|
|
160
|
-
def
|
161
|
-
return [ member.
|
277
|
+
def get_members_by_attr(self, attribute: str = "id") -> list[str]:
|
278
|
+
return [ member.__getattribute__(attribute) for member in self.members ]
|
279
|
+
|
280
|
+
def get_shares(self, include_worth: bool = False) -> dict[str, int] | dict[str, dict[str, int]]:
|
281
|
+
shares = {}
|
282
|
+
|
283
|
+
for share in self.parts:
|
284
|
+
if include_worth:
|
285
|
+
if share.owner in shares.keys():
|
286
|
+
shares[share.owner]['count'] += 1
|
287
|
+
shares[share.owner]['worth'] += share.price
|
288
|
+
else:
|
289
|
+
shares[share.owner] = {
|
290
|
+
'count': 1,
|
291
|
+
'worth': share.price
|
292
|
+
}
|
293
|
+
else:
|
294
|
+
if share.owner in shares.keys():
|
295
|
+
shares[share.owner] += 1
|
296
|
+
else:
|
297
|
+
shares[share.owner] = 1
|
298
|
+
|
299
|
+
return shares
|
nsarchive/cls/republic.py
CHANGED
@@ -1,32 +1,117 @@
|
|
1
|
-
from nsarchive.cls.
|
2
|
-
from .entities import *
|
1
|
+
from nsarchive.cls.base import NSID
|
3
2
|
|
4
3
|
# Votes
|
5
4
|
|
5
|
+
class VoteOption:
|
6
|
+
"""
|
7
|
+
Option disponible lors d'un vote
|
8
|
+
|
9
|
+
## Attributs
|
10
|
+
- id: `str`\n
|
11
|
+
Identifiant de l'option
|
12
|
+
- title: `str`\n
|
13
|
+
Label de l'option
|
14
|
+
- count: `int`\n
|
15
|
+
Nombre de sympathisants pour cette option
|
16
|
+
"""
|
17
|
+
|
18
|
+
def __init__(self, id: str, title: str = None, count: int = 0):
|
19
|
+
self.id = id
|
20
|
+
self.title = title if title else id
|
21
|
+
self.count = count
|
22
|
+
|
6
23
|
class Vote:
|
7
|
-
|
24
|
+
"""
|
25
|
+
Classe de référence pour les différents votes du serveur
|
26
|
+
|
27
|
+
## Attributs
|
28
|
+
- id: `NSID`\n
|
29
|
+
Identifiant du vote
|
30
|
+
- title: `str`\n
|
31
|
+
Titre du vote
|
32
|
+
- choices: list[.VoteOption]\n
|
33
|
+
Liste des choix disponibles
|
34
|
+
- author: `NSID`\n
|
35
|
+
Identifiant de l'auteur du vote
|
36
|
+
- startDate: `int`\n
|
37
|
+
Date de début du vote
|
38
|
+
- endDate: `int`\n
|
39
|
+
Date limite pour voter
|
40
|
+
"""
|
41
|
+
|
42
|
+
def __init__(self, id: NSID, title: str) -> None:
|
8
43
|
self.id: NSID = NSID(id)
|
9
44
|
self.title: str = title
|
10
|
-
self.choices
|
11
|
-
self.author:
|
45
|
+
self.choices: list[VoteOption] = []
|
46
|
+
self.author: NSID = NSID("0")
|
12
47
|
self.startDate: int = 0
|
13
48
|
self.endDate: int = 0
|
14
49
|
|
15
|
-
|
16
|
-
|
17
|
-
|
50
|
+
def by_id(self, id: str) -> VoteOption:
|
51
|
+
for opt in self.choices:
|
52
|
+
if opt.id == id:
|
53
|
+
return opt
|
54
|
+
|
55
|
+
def sorted(self, titles_only: bool = False) -> list[VoteOption] | list[str]:
|
56
|
+
sorted_list: list[VoteOption] = sorted(self.choices, lambda opt : opt.count)
|
57
|
+
|
58
|
+
if titles_only:
|
59
|
+
return [ opt.id for opt in sorted_list ]
|
60
|
+
else:
|
61
|
+
return sorted_list
|
62
|
+
|
63
|
+
class Referendum(Vote):
|
64
|
+
"""
|
65
|
+
Vote à trois positions
|
66
|
+
"""
|
67
|
+
|
68
|
+
def __init__(self, id: NSID, title: str) -> None:
|
69
|
+
super().__init__(id, title)
|
70
|
+
|
71
|
+
self.choices = [
|
72
|
+
VoteOption('yes', 'Oui'),
|
73
|
+
VoteOption('no', 'Non'),
|
74
|
+
VoteOption('blank', 'Pas d\'avis'),
|
75
|
+
]
|
18
76
|
|
19
77
|
class Lawsuit(Vote):
|
20
|
-
|
21
|
-
|
78
|
+
"""
|
79
|
+
Vote à trois positions pour un procès
|
80
|
+
"""
|
81
|
+
|
82
|
+
def __init__(self, id: NSID, title: str) -> None:
|
83
|
+
super().__init__(id, title)
|
84
|
+
|
85
|
+
self.choices = [
|
86
|
+
VoteOption('guilty', 'Coupable'),
|
87
|
+
VoteOption('innocent', 'Innocent'),
|
88
|
+
VoteOption('blank', 'Pas d\'avis'),
|
89
|
+
]
|
22
90
|
|
23
91
|
|
24
92
|
# Institutions (defs)
|
25
93
|
|
94
|
+
class Official:
|
95
|
+
def __init__(self, id: NSID) -> None:
|
96
|
+
self.id: NSID = NSID(id)
|
97
|
+
|
98
|
+
self.mandates: int = {
|
99
|
+
'PRE_REP': 0, # Président de la République
|
100
|
+
'MIN': 0, # Différents ministres
|
101
|
+
'PRE_AS': 0, # Président de l'Assemblée Nationale
|
102
|
+
'REPR': 0 # Député
|
103
|
+
}
|
104
|
+
|
105
|
+
self.contributions: dict = {
|
106
|
+
'propose_project': 0,
|
107
|
+
'success_project': 0,
|
108
|
+
'vote_law': 0
|
109
|
+
}
|
110
|
+
|
26
111
|
class Administration:
|
27
112
|
def __init__(self) -> None:
|
28
113
|
self.president: Official
|
29
|
-
self.members: list[Official]
|
114
|
+
self.members: list[Official] = []
|
30
115
|
|
31
116
|
class Government:
|
32
117
|
def __init__(self, president: Official) -> None:
|
@@ -39,27 +124,26 @@ class Government:
|
|
39
124
|
self.press_minister: Official
|
40
125
|
self.outer_minister: Official
|
41
126
|
|
42
|
-
class
|
127
|
+
class Court:
|
43
128
|
def __init__(self) -> None:
|
44
129
|
self.president: Official
|
45
|
-
|
130
|
+
# On discutera de la mise en place d'un potentiel président. Pour l'instant c'est le Ministre de la Justice
|
131
|
+
self.members: list[Official] = []
|
46
132
|
|
47
|
-
class
|
133
|
+
class Assembly:
|
48
134
|
def __init__(self) -> None:
|
49
135
|
self.president: Official
|
50
|
-
|
51
|
-
self.members: list[Official]
|
136
|
+
self.members: list[Official] = []
|
52
137
|
|
53
138
|
class PoliceForces:
|
54
139
|
def __init__(self) -> None:
|
55
140
|
self.president: Official
|
56
|
-
self.members: list[Official]
|
141
|
+
self.members: list[Official] = []
|
57
142
|
|
58
|
-
class
|
143
|
+
class State:
|
59
144
|
def __init__(self) -> None:
|
60
145
|
self.administration: Administration
|
61
146
|
self.government: Government
|
62
147
|
self.court: Court
|
63
148
|
self.assembly: Assembly
|
64
|
-
self.police: PoliceForces
|
65
|
-
|
149
|
+
self.police: PoliceForces
|