nsarchive 3.0.0a2__py3-none-any.whl → 3.0.0a4__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 CHANGED
@@ -1,7 +1,7 @@
1
1
  """
2
2
  nsarchive - API-wrapper pour récupérer des données liées à Nation.
3
3
 
4
- Version: 3.0.0a2
4
+ Version: 3.0.0a4
5
5
  License: GPL-3.0
6
6
  Auteur : happex <110610727+okayhappex@users.noreply.github.com>
7
7
 
nsarchive/cls/entities.py CHANGED
@@ -1,7 +1,8 @@
1
1
  import requests
2
2
  import time
3
3
  import typing
4
- import urllib.parse
4
+ import urllib
5
+ import warnings
5
6
 
6
7
  from .base import NSID
7
8
 
@@ -37,6 +38,7 @@ class PositionPermissions:
37
38
  self.items = Permission("---r") # APPEND = vendre, MANAGE = gérer des items dont on n'est pas propriétaire (hors marketplace), EDIT = gérer des items dont on n'est pas propriétaire (dans le marketplace), READ = accéder au marketplace
38
39
  self.laws = Permission() # APPEND = proposer un texte de loi, MANAGE = accepter ou refuser une proposition, EDIT = modifier un texte, READ = /
39
40
  self.members = Permission("---r") # APPEND = créer des entités, MANAGE = modérer des entités (hors Discord), EDIT = modifier des entités, READ = voir le profil des entités
41
+ self.money = Permission("---r") # APPEND = créer des entités, MANAGE = modérer des entités (hors Discord), EDIT = modifier des entités, READ = voir le profil des entités
40
42
  self.national_channel = Permission() # APPEND = prendre la parole sur la chaîne nationale, MANAGE = voir qui peut prendre la parole, EDIT = modifier le planning de la chaîne nationale, READ = /
41
43
  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
42
44
  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
@@ -69,10 +71,28 @@ class Position:
69
71
  self.name: str = "Inconnue"
70
72
  self.id = id
71
73
  self.permissions: PositionPermissions = PositionPermissions()
74
+ self.manager_permissions: PositionPermissions = PositionPermissions()
75
+
76
+ self._url: str = ""
72
77
 
73
78
  def __repr__(self):
74
79
  return self.id
75
80
 
81
+ def update_permisions(self, **permissions: str):
82
+ query = "&".join(f"{k}={ urllib.parse.quote(v) }" for k, v in permissions.items())
83
+
84
+ res = requests.post(f"{self._url}/update_permissions?{query}", headers = default_headers)
85
+
86
+ if res.status_code == 200:
87
+ self.permissions.merge(permissions)
88
+ else:
89
+ res.raise_for_status()
90
+
91
+ def _load(self, _data: dict):
92
+ self.name = _data['name']
93
+ self.permissions.merge(_data['permissions'])
94
+ self.manager_permissions.merge(_data['manager_permissions'])
95
+
76
96
  class Entity:
77
97
  """
78
98
  Classe de référence pour les entités
@@ -170,7 +190,13 @@ class User(Entity):
170
190
 
171
191
  self.xp: int = 0
172
192
  self.boosts: dict[str, int] = {}
173
- self.groups: list[NSID] = []
193
+ self.votes: list[NSID] = []
194
+
195
+ def _load(self, _data: dict):
196
+ self.xp = _data['xp']
197
+ self.boosts = _data['boosts']
198
+
199
+ self.votes = [ NSID(vote) for vote in _data['votes'] ]
174
200
 
175
201
  def get_level(self) -> None:
176
202
  i = 0
@@ -255,37 +281,6 @@ class GroupInvite:
255
281
  self.level: str = 0
256
282
  self._expires: int = round(time.time()) + 604800
257
283
 
258
- class Share:
259
- """
260
- Action d'une entreprise
261
-
262
- ## Attributs
263
- - owner: `NSID`\n
264
- Identifiant du titulaire de l'action
265
- - price: `int`\n
266
- Prix de l'action
267
- """
268
-
269
- def __getstate__(self) -> dict:
270
- return {
271
- "owner": self.owner,
272
- "price": self.price
273
- }
274
-
275
- def __setstate__(self, state: dict):
276
- self.owner: NSID = state['owner']
277
- self.price: int = state['price']
278
-
279
- def __init__(self, owner: NSID = NSID(0x0), price: int = 10):
280
- self.owner: NSID = owner
281
- self.price: int = price
282
-
283
- def assign_owner(self, owner: NSID):
284
- self.owner = owner
285
-
286
- def set_price(self, price: int):
287
- self.price = price
288
-
289
284
  class Organization(Entity):
290
285
  """
291
286
  Entité collective
@@ -308,13 +303,22 @@ class Organization(Entity):
308
303
  super().__init__(NSID(id))
309
304
 
310
305
  self.owner: Entity = User(NSID(0x0))
311
- self.avatar: bytes = utils.open_asset('default_avatar.png')
306
+ self.avatar_url: str = self._url + '/avatar'
312
307
 
313
308
  self.certifications: dict = {}
314
309
  self.members: list[GroupMember] = []
315
310
  self.invites: dict[GroupInvite] = []
316
311
 
317
- self.parts: list[Share] = 50 * [ Share(self.owner.id, 0) ]
312
+ def _load(self, _data: dict):
313
+ self.avatar_url = self._url + '/avatar'
314
+
315
+ for _member in _data['members']:
316
+ member = GroupMember(_member['id'])
317
+ member.permission_level = _member['level']
318
+
319
+ self.members.append(member)
320
+
321
+ self.certifications = _data['certifications']
318
322
 
319
323
  def add_certification(self, certification: str, __expires: int = 2419200) -> None:
320
324
  res = requests.post(f"{self._url}/add_certification?name={certification}&duration={__expires}", headers = default_headers)
@@ -364,29 +368,5 @@ class Organization(Entity):
364
368
  def get_members_by_attr(self, attribute: str = "id") -> list[str]:
365
369
  return [ member.__getattribute__(attribute) for member in self.members ]
366
370
 
367
- def get_shares(self, include_worth: bool = False) -> dict[str, int] | dict[str, dict[str, int]]:
368
- shares = {}
369
-
370
- for share in self.parts:
371
- if include_worth:
372
- if share.owner in shares.keys():
373
- shares[share.owner]['count'] += 1
374
- shares[share.owner]['worth'] += share.price
375
- else:
376
- shares[share.owner] = {
377
- 'count': 1,
378
- 'worth': share.price
379
- }
380
- else:
381
- if share.owner in shares.keys():
382
- shares[share.owner] += 1
383
- else:
384
- shares[share.owner] = 1
385
-
386
- return shares
387
-
388
371
  def save_avatar(self, data: bytes = None):
389
- if not data:
390
- return
391
-
392
- self.avatar = data
372
+ pass
@@ -51,53 +51,34 @@ class EntityInstance(Instance):
51
51
 
52
52
  if _data is None: # ID inexistant chez les entités
53
53
  return None
54
- elif "xp" in _data.keys():
55
- _data['_type'] = 'user'
56
- elif "parts" in _data.keys():
57
- _data['_type'] = 'organization'
58
- else:
59
- _data['_type'] = 'entity'
60
54
 
61
- if _data['_type'] == 'user':
55
+ if _data['_class'] == 'user':
62
56
  entity = User(id)
63
57
  entity._url = f"{self.url}/model/individuals/{id}"
64
58
 
65
- entity.xp = _data['xp']
66
- entity.boosts = _data['boosts']
67
-
68
- entity.votes = [ NSID(vote) for vote in _data['votes'] ]
69
- entity.groups = [ NSID(group) for group in _data['groups'] ]
70
- elif _data['_type'] == 'organization':
59
+ entity._load(_data)
60
+ elif _data['_class'] == 'organization':
71
61
  entity = Organization(id)
72
62
  entity._url = f"{self.url}/model/organizations/{id}"
73
63
 
74
- res = requests.get(f"{entity._url}/avatar")
64
+ _owner = _data['owner']
75
65
 
76
- if res.status_code == 200:
77
- entity.avatar = res.content
66
+ if _owner['_class'] == 'individuals':
67
+ entity.owner = User(_owner['id'])
68
+ entity.owner._load(_owner)
69
+ elif _owner['class'] == 'organizations':
70
+ entity.owner = Organization(_owner['id'])
71
+ entity.owner._load(_owner)
78
72
  else:
79
- warnings.warn(f"Failed to get avatar for {id}")
80
-
81
- entity.owner = self.get_entity(NSID(_data['owner_id']))
82
-
83
- for _member in _data['members']:
84
- member = GroupMember(_member['id'])
85
- member.permission_level = _member['level']
86
-
87
- entity.append(member)
88
-
89
- entity.parts = []
90
-
91
- for attrs in _data['parts']:
92
- owner = attrs["owner"]
93
- entity.parts.extend(attrs['count'] * [ Share(NSID(owner), attrs['worth'] // attrs['count']) ])
73
+ entity.owner = self.get_entity(0x0)
94
74
 
95
- entity.certifications = _data['certifications']
75
+ entity._load(_data)
96
76
  else:
97
77
  entity = Entity(id)
78
+ entity._url = f"{self.url}/model/entities/{id}"
98
79
 
99
80
  entity.name = _data['name']
100
- entity.position = self.get_position(_data['position']) # Métier si c'est un utilisateur, domaine professionnel si c'est un collectif
81
+ entity.position._load(_data['position']) # Métier si c'est un utilisateur, domaine professionnel si c'est un collectif
101
82
  entity.registerDate = _data['register_date']
102
83
 
103
84
  for key, value in _data.get('additional', {}).items():
@@ -106,8 +87,20 @@ class EntityInstance(Instance):
106
87
  else:
107
88
  entity.additional[key] = value
108
89
 
90
+ entity.position._url = f"{self.url}/positions/{id}"
91
+
109
92
  return entity
110
93
 
94
+ def get_entity_groups(self, entity: User) -> list[Organization]:
95
+ print(entity._url)
96
+ res = requests.get(f"{entity._url}/groups", headers = self.default_headers)
97
+
98
+ if res.status_code == 200:
99
+ return res.json()
100
+ else:
101
+ res.raise_for_status()
102
+ return []
103
+
111
104
  def save_entity(self, entity: Entity):
112
105
  """
113
106
  Fonction permettant de créer ou modifier une entité.
@@ -137,7 +130,6 @@ class EntityInstance(Instance):
137
130
  _data['owner_id'] = NSID(entity.owner.id) if entity.owner else NSID("0")
138
131
  _data['members'] = []
139
132
  _data['certifications'] = entity.certifications
140
- _data['parts'] = entity.get_shares(True)
141
133
 
142
134
  for member in entity.members:
143
135
  _member = {
@@ -151,7 +143,7 @@ class EntityInstance(Instance):
151
143
  elif type(entity) == User:
152
144
  _data['xp'] = entity.xp
153
145
  _data['boosts'] = entity.boosts
154
- # _data['votes'] = [ NSID(vote) for vote in entity.votes]
146
+ _data['votes'] = [ NSID(vote) for vote in entity.votes]
155
147
  else:
156
148
  return
157
149
 
@@ -191,20 +183,65 @@ class EntityInstance(Instance):
191
183
  - `list[.Entity | .User | .Organization]`
192
184
  """
193
185
 
194
- if "_type" in query.keys():
195
- if query["_type"] == "individual":
196
- del query["_type"]
186
+ if "_class" in query.keys():
187
+ if query["_class"] == "individuals":
188
+ del query["_class"]
197
189
  _res = self.fetch('individuals', **query)
198
- elif query["_type"] == "organization":
199
- del query["_type"]
190
+ elif query["_class"] == "organizations":
191
+ del query["_class"]
200
192
  _res = self.fetch('organizations', **query)
201
193
  else:
202
- del query["_type"]
194
+ del query["_class"]
203
195
  _res = self.fetch('entities', **query)
204
196
  else:
205
197
  _res = self.fetch('entities', **query)
206
198
 
207
- return [ self.get_entity(NSID(entity['id'])) for entity in _res if entity is not None ]
199
+ res = []
200
+
201
+ for _entity in _res:
202
+ if _entity is None: continue
203
+
204
+ if _entity['_class'] == 'individuals':
205
+ entity = User(_entity["id"])
206
+ entity._url = f"{self.url}/model/individuals/{_entity['id']}"
207
+
208
+ entity._load(_entity)
209
+ elif _entity['_class'] == 'organizations':
210
+ entity = Organization(_entity["id"])
211
+ entity._url = f"{self.url}/model/organizations/{_entity['id']}"
212
+
213
+ _owner = _entity['owner']
214
+ if _owner['_class'] == 'individuals':
215
+ entity.owner = User(_owner['id'])
216
+ entity.owner._load(_owner)
217
+ elif _owner['class'] == 'organizations':
218
+ entity.owner = Organization(_owner['id'])
219
+ entity.owner._load(_owner)
220
+ else:
221
+ entity.owner = self.get_entity(0x0)
222
+
223
+ entity._load(_entity)
224
+ else:
225
+ entity = Entity(_entity["id"])
226
+ entity._url = f"{self.url}/model/organizations/{_entity['id']}"
227
+
228
+ entity.name = _entity['name']
229
+ entity.position._load(_entity['position'])
230
+ entity.registerDate = _entity['register_date']
231
+
232
+ for key, value in _entity.get('additional', {}).items():
233
+ if isinstance(value, str) and value.startswith('\n'):
234
+ entity.additional[key] = int(value[1:])
235
+ else:
236
+ entity.additional[key] = value
237
+
238
+ entity.position._url = f"{self.url}/positions/{_entity['id']}"
239
+
240
+ res.append(entity)
241
+
242
+ return res
243
+
244
+
208
245
 
209
246
  def get_position(self, id: str) -> Position:
210
247
  """
@@ -224,7 +261,9 @@ class EntityInstance(Instance):
224
261
  return None
225
262
 
226
263
  position = Position(id)
264
+ position._url = f"{self.url}/positions/{id}"
227
265
  position.name = _data['name']
228
266
  position.permissions.merge(_data['permissions'])
267
+ position.manager_permissions.merge(_data['manager_permissions'])
229
268
 
230
269
  return position
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: nsarchive
3
- Version: 3.0.0a2
3
+ Version: 3.0.0a4
4
4
  Summary: API-wrapper pour récupérer des données liées à Nation
5
5
  License: GPL-3.0
6
6
  Author: happex
@@ -1,15 +1,15 @@
1
- nsarchive/__init__.py,sha256=01mYNtrFbmeU_GUIfDd21iWBJSGF650KAUvYphaXc6k,656
1
+ nsarchive/__init__.py,sha256=_IK4p7rSwTN9GahaxnL4gkgXOCCkT0vMgBXbJY_MXVA,656
2
2
  nsarchive/assets/default_avatar.png,sha256=n-4vG_WPke8LvbY3ZU6oA-H-OtRoIu7woKnRq9DCIlI,51764
3
3
  nsarchive/cls/archives.py,sha256=3vyGOBZUE-B-G_QMJXRIPD0d-1O5z4wqv-2MRf5AQdA,2506
4
4
  nsarchive/cls/base.py,sha256=R6ZD2_DVOvjTO6VZ0HteFWVmdW9fieyIpGF9P0PqYk4,7424
5
5
  nsarchive/cls/economy.py,sha256=soe3ATrtQem-u80vz8nXfsn_3TqMdhpolyTxRenH2C0,2742
6
- nsarchive/cls/entities.py,sha256=M2R55pP7j9_dl1RFMR9DouRabl9VzEVGmq4uIOcojPg,14303
6
+ nsarchive/cls/entities.py,sha256=cc76FSkigUm_ryT_tzLNIDj-TDIAOLtleXy9xutLvnc,14072
7
7
  nsarchive/cls/republic.py,sha256=16NFNCkJxOeVRd6BoJ68AlrTESQgRfZ5FSFlNWTEdK0,4103
8
8
  nsarchive/instances/_economy.py,sha256=kVIbsCIrctV5yA3nlnSEYkJ8Cuh74YnQKtntIXTqOY0,8892
9
- nsarchive/instances/_entities.py,sha256=3AYJAARXYhxsEEQaahBvJyT0iOsR1KhUDXOBeAvax4w,7923
9
+ nsarchive/instances/_entities.py,sha256=6diGZVdtCBgw3ybnx09nBMfLrA1zpNM0DZT7grxKHCo,9319
10
10
  nsarchive/instances/_republic.py,sha256=M8k2rZJvQGzOyZlmqRDiB-d615hZOqD3kuRrgYP4JqA,12004
11
11
  nsarchive/utils.py,sha256=qpQCZLlbVApOLtCI2ml54QwUld6K8fDxyBfwzofqXzw,610
12
- nsarchive-3.0.0a2.dist-info/LICENSE,sha256=aFLFZg6LEJFpTlNQ8su3__jw4GfV-xWBmC1cePkKZVw,35802
13
- nsarchive-3.0.0a2.dist-info/METADATA,sha256=N5tE2JUA7T-612kyRTjfKeLwZmz3Cd6i6fO98M9UXPQ,657
14
- nsarchive-3.0.0a2.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
15
- nsarchive-3.0.0a2.dist-info/RECORD,,
12
+ nsarchive-3.0.0a4.dist-info/LICENSE,sha256=aFLFZg6LEJFpTlNQ8su3__jw4GfV-xWBmC1cePkKZVw,35802
13
+ nsarchive-3.0.0a4.dist-info/METADATA,sha256=nRgP7-B_I5F4wKUuh5-hWhiBh2euagI7ATpr7T3_NDY,657
14
+ nsarchive-3.0.0a4.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
15
+ nsarchive-3.0.0a4.dist-info/RECORD,,