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/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 ..utils import assets
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.values():
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
- def __init__(self, id: str | NSID) -> None:
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.legalPosition: Position = Position()
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: str) -> None:
56
- self.legalPosition = position
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
- def __init__(self, id: str | NSID) -> None:
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: str | NSID):
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 ou changer le logo
95
- self.manage_members = False # Virer quelqu'un d'une entreprise, l'y inviter, changer ses rôles
96
- self.manage_roles = False # Promouvoir ou rétrograder les membres
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
- def __init__(self, id: str | NSID) -> None:
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.group_permissions: MemberPermissions = MemberPermissions()
107
- self.group_position: str = 'membre'
169
+ self.permission_level: int = 0
108
170
 
109
- class Official:
110
- def __init__(self, id: str | NSID) -> None:
111
- self.id: NSID = NSID(id)
171
+ def group_permissions(self) -> MemberPermissions:
172
+ p = MemberPermissions()
112
173
 
113
- self.mandates: int = {
114
- 'PRE_REP': 0, # Président de la République
115
- 'MIN': 0, # Différents ministres
116
- 'PRE_AS': 0, # Président de l'Assemblée Nationale
117
- 'JUDGE': 0, # Juge
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.contributions: dict = {
122
- 'project': 0,
123
- 'approved_project': 0,
124
- 'admin_action': 0,
125
- 'law_vote': 0
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
- def __init__(self, id: str | NSID) -> None:
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
- def add_certification(self, certif: str) -> None:
138
- self.certifications[certif] = round(time.time())
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 get_member_id(self) -> list[str]:
161
- return [ member.id for member in self.members ]
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.entities import NSID
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
- def __init__(self, id: str | NSID, title: str, choices: tuple[str]) -> None:
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 = { choice : 0 for choice in choices }
11
- self.author: str = '0'
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
- class ClosedVote(Vote): # Meilleur nom pour cette classe en v2
16
- def __init__(self, id: str | NSID, title: str) -> None:
17
- super().__init__(id, title, ('yes', 'no', 'blank'))
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
- def __init__(self, id: str | NSID, title: str) -> None:
21
- super().__init__(id, title, ('innocent', 'guilty', 'blank'))
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 Assembly:
127
+ class Court:
43
128
  def __init__(self) -> None:
44
129
  self.president: Official
45
- self.members: list[Official]
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 Court:
133
+ class Assembly:
48
134
  def __init__(self) -> None:
49
135
  self.president: Official
50
- # On discutera de la mise en place d'un potentiel président. Pour l'instant c'est le Ministre de la Justice
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 Institutions:
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