nsarchive 3.0.0a8__py3-none-any.whl → 3.0.0b2__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/models/base.py CHANGED
@@ -2,7 +2,7 @@ import json
2
2
  import requests
3
3
  import typing
4
4
 
5
- from .. import utils
5
+ from .. import utils, errors
6
6
 
7
7
  VERSION = 300
8
8
 
@@ -12,27 +12,25 @@ class NSID(str):
12
12
 
13
13
  ID unique et universel pour l'ensemble des entités et évènements. Il prend les `int`, les `str` et les autres instances `NSID` pour les convertir en un identifiant hexadécimal.
14
14
  """
15
+
15
16
  unknown = "0"
17
+
16
18
  admin = "1"
17
19
  gov = "2"
18
20
  court = "3"
19
21
  assembly = "4"
20
- office = "5"
21
- hexabank = "6"
22
- archives = "7"
23
22
 
24
- maintenance_com = "101"
25
- audiovisual_dept = "102"
26
- interior_dept = "103"
27
- justice_dept = "104"
28
- egalitary_com = "105"
29
- antifraud_dept = "106"
23
+ tresor_public = "A"
24
+ office = "B"
25
+ hexabank = "C"
30
26
 
31
27
  def __new__(cls, value):
32
28
  if type(value) == int:
33
29
  value = hex(value)
34
30
  elif type(value) in (str, NSID):
35
31
  value = hex(int(value, 16))
32
+ elif value is None:
33
+ value = hex(int(cls.unknown, 16))
36
34
  else:
37
35
  raise TypeError(f"<{value}> is not NSID serializable")
38
36
 
@@ -57,6 +55,10 @@ class Interface:
57
55
  "Content-Type": "application/json",
58
56
  }
59
57
 
58
+ return
59
+
60
+ # Vérification (ralentit considérablement les requêtes)*
61
+
60
62
  try:
61
63
  test_res = requests.get(f'{self.url}/ping')
62
64
 
@@ -95,30 +97,36 @@ class Interface:
95
97
  "password": password
96
98
  })
97
99
 
98
- if res.status_code == 200:
99
- return res.json()["token"]
100
- elif res.status_code in (401, 403):
101
- raise PermissionError(res.json()['message'])
102
- else:
103
- raise Exception(f"Error {res.status_code}: {res.json()['message']}")
104
100
 
105
- def _get_item(self, endpoint: str, body: dict = None, headers: dict = None) -> dict:
106
- """
107
- Récupère des données JSON depuis l'API
101
+ if 500 <= res.status_code < 600:
102
+ raise errors.globals.ServerDownError()
108
103
 
109
- ## Paramètres
110
- endpoint: `str`:
111
- Endpoint de l'URL
112
- headers: `dict` (optional)
113
- Headers à envoyer
114
- body: `dict` (optional)
115
- Données à envoyer
104
+ _data = res.json()
116
105
 
117
- ## Renvoie
118
- - `list` de tous les élements correspondants
119
- - `None` si aucune donnée n'est trouvée
106
+ if res.status_code == 400:
107
+ if _data['message'] == "MissingParam":
108
+ raise errors.globals.MissingParamError(f"Missing parameter '{_data['param']}'.")
109
+ elif _data['message'] == "InvalidParam":
110
+ raise errors.globals.InvalidParamError(f"Invalid parameter '{_data['param']}'.")
111
+ elif _data['message'] == "InvalidToken":
112
+ raise errors.globals.AuthError("Token is not valid.")
113
+
114
+ elif res.status_code == 401:
115
+ raise errors.globals.AuthError(_data['message'])
116
+
117
+ elif res.status_code == 403:
118
+ raise errors.globals.PermissionError(_data['message'])
119
+
120
+
121
+ return _data['token']
122
+
123
+ def _get_item(self, endpoint: str, body: dict = None, headers: dict = None) -> dict:
124
+ """
125
+ Obsolète.
120
126
  """
121
127
 
128
+ utils.warn("La fonction 'Interface._get_item' est obsolète et sera supprimée dans la version 3.0.0 de NSArchive.")
129
+
122
130
  if not headers:
123
131
  headers = self.default_headers
124
132
 
@@ -138,19 +146,14 @@ class Interface:
138
146
 
139
147
  return _data
140
148
 
141
- def _put_in_db(self, endpoint: str, body: dict, headers: dict = None, use_PUT: bool = False) -> None:
149
+ def _put_in_db(self, endpoint: str, body: dict = {}, headers: dict = None, use_PUT: bool = False) -> None:
142
150
  """
143
- Publie des données JSON dans une table nation-db.
144
-
145
- ## Paramètres
146
- endpoint: `str`
147
- Endpoint de l'URL
148
- body: `dict`
149
- Données à envoyer
150
- headers: `dict` (optionnel)
151
- Headers à envoyer
151
+ Obsolète
152
152
  """
153
153
 
154
+ utils.warn("La fonction 'Interface._put_in_db' est obsolète et sera supprimée dans la version 3.0.0 de NSArchive.")
155
+
156
+
154
157
  if not headers:
155
158
  headers = headers
156
159
 
@@ -162,20 +165,15 @@ class Interface:
162
165
  if 200 <= res.status_code < 300:
163
166
  return res.json()
164
167
  else:
165
- print(res.text)
166
168
  res.raise_for_status()
167
169
 
168
170
  def _delete(self, _class: str, ids: list[NSID]) -> None:
169
171
  """
170
- Supprime des données JSON dans une table nation-db.
171
-
172
- ## Paramètres
173
- _class: `str`
174
- Classe des entités à supprimer
175
- ids: `list[NSID]`
176
- ID des entités à supprimer
172
+ Obsolète
177
173
  """
178
174
 
175
+ utils.warn("La fonction 'Interface._delete' est obsolète et sera supprimée dans la version 3.0.0 de NSArchive.")
176
+
179
177
  res = requests.post(f"{self.url}/delete_{_class}", json = { "ids": ids })
180
178
 
181
179
  if 200 <= res.status_code < 300:
@@ -185,21 +183,33 @@ class Interface:
185
183
  else:
186
184
  raise Exception(f"Error {res.status_code}: {res.json()['message']}")
187
185
 
188
- def _delete_by_ID(self, _class: str, id: NSID):
189
- utils.warn("Method '_delete_by_id' is deprecated. Use '_delete' instead.")
190
- self._delete(_class, id)
191
-
192
186
  def fetch(self, _class: str, **query: typing.Any) -> list:
193
187
  res = requests.get(f"{self.url}/fetch/{_class}", params = query)
194
188
 
195
- if res.status_code == 200:
196
- matches = res.json()
197
- elif res.status_code in (401, 403):
198
- matches = []
199
- else:
200
- res.raise_for_status()
189
+ if 500 <= res.status_code < 600:
190
+ raise errors.globals.ServerDownError()
191
+
192
+ _data = res.json()
193
+
194
+ if res.status_code == 400:
195
+ if _data['message'] == "MissingParam":
196
+ raise errors.globals.MissingParamError(f"Missing parameter '{_data['param']}'.")
197
+ elif _data['message'] == "InvalidParam":
198
+ raise errors.globals.InvalidParamError(f"Invalid parameter '{_data['param']}'.")
199
+ elif _data['message'] == "InvalidToken":
200
+ raise errors.globals.AuthError("Token is not valid.")
201
+
202
+ elif res.status_code == 401:
203
+ raise errors.globals.AuthError(_data['message'])
204
+
205
+ elif res.status_code == 403:
206
+ raise errors.globals.PermissionError(_data['message'])
207
+
208
+ elif res.status_code == 404:
209
+ return []
210
+
201
211
 
202
- return matches
212
+ return res.json()
203
213
 
204
214
 
205
215
  def _upload_file(self, bucket: str, name: str, data: bytes, overwrite: bool = False, headers: dict = None) -> dict:
@@ -236,14 +246,28 @@ class Interface:
236
246
 
237
247
  res = requests.put(f"{self.url}/upload_file/{bucket}", headers = headers, json = body, files = [ file ])
238
248
 
239
- if res.status_code == 200:
240
- return res.json()
241
- elif res.status_code in (403, 401):
242
- raise PermissionError(res.json()['message'])
249
+
250
+ if 500 <= res.status_code < 600:
251
+ raise errors.globals.ServerDownError()
252
+
253
+ _data = res.json()
254
+
255
+ if res.status_code == 400:
256
+ if _data['message'] == "MissingParam":
257
+ raise errors.globals.MissingParamError(f"Missing parameter '{_data['param']}'.")
258
+ elif _data['message'] == "InvalidParam":
259
+ raise errors.globals.InvalidParamError(f"Invalid parameter '{_data['param']}'.")
260
+ elif _data['message'] == "InvalidToken":
261
+ raise errors.globals.AuthError("Token is not valid.")
262
+
263
+ elif res.status_code == 401:
264
+ raise errors.globals.AuthError(_data['message'])
265
+
266
+ elif res.status_code == 403:
267
+ raise errors.globals.PermissionError(_data['message'])
268
+
243
269
  elif res.status_code == 409:
244
- raise FileExistsError(res.json()['message'])
245
- else:
246
- raise Exception(f"Error {res.status_code}: {res.json()['message']}")
270
+ raise errors.globals.ConflictError(_data['message'])
247
271
 
248
272
  def _download_from_storage(self, bucket: str, path: str, headers: dict = None) -> bytes:
249
273
  """
@@ -264,9 +288,27 @@ class Interface:
264
288
 
265
289
  res = requests.get(f"{self.url}/drive/{bucket}/{path}", headers = headers)
266
290
 
267
- if res.status_code == 200:
268
- return res.json()
269
- elif res.status_code in (403, 401):
270
- raise PermissionError(res.json()['message'])
271
- else:
272
- raise Exception(f"Error {res.status_code}: {res.json()['message']}")
291
+
292
+ if 500 <= res.status_code < 600:
293
+ raise errors.globals.ServerDownError()
294
+
295
+ _data = res.json()
296
+
297
+ if res.status_code == 400:
298
+ if _data['message'] == "MissingParam":
299
+ raise errors.globals.MissingParamError(f"Missing parameter '{_data['param']}'.")
300
+ elif _data['message'] == "InvalidParam":
301
+ raise errors.globals.InvalidParamError(f"Invalid parameter '{_data['param']}'.")
302
+ elif _data['message'] == "InvalidToken":
303
+ raise errors.globals.AuthError("Token is not valid.")
304
+
305
+ elif res.status_code == 401:
306
+ raise errors.globals.AuthError(_data['message'])
307
+
308
+ elif res.status_code == 403:
309
+ raise errors.globals.PermissionError(_data['message'])
310
+
311
+ elif res.status_code == 404:
312
+ return
313
+
314
+ return _data
@@ -3,6 +3,7 @@ import time
3
3
  import urllib
4
4
 
5
5
  from .base import NSID
6
+ from .. import errors
6
7
 
7
8
 
8
9
  class BankAccount:
@@ -64,9 +65,27 @@ class BankAccount:
64
65
 
65
66
  if res.status_code == 200:
66
67
  self.frozen = frozen
67
- else:
68
- print(res.text)
69
- res.raise_for_status()
68
+ elif 500 <= res.status_code < 600:
69
+ raise errors.globals.ServerDownError()
70
+
71
+ _data = res.json()
72
+
73
+ if res.status_code == 400:
74
+ if _data['message'] == "MissingParam":
75
+ raise errors.globals.MissingParamError(f"Missing parameter '{_data['param']}'.")
76
+ elif _data['message'] == "InvalidParam":
77
+ raise errors.globals.InvalidParamError(f"Invalid parameter '{_data['param']}'.")
78
+ elif _data['message'] == "InvalidToken":
79
+ raise errors.globals.AuthError("Token is not valid.")
80
+
81
+ elif res.status_code == 401:
82
+ raise errors.globals.AuthError(_data['message'])
83
+
84
+ elif res.status_code == 403:
85
+ raise errors.globals.PermissionError(_data['message'])
86
+
87
+ elif res.status_code == 404:
88
+ raise errors.globals.NotFoundError(_data['message'])
70
89
 
71
90
  def flag(self, flagged: bool = True, reason: str = None) -> None:
72
91
  res = requests.post(f"{self._url}/flag?flagged={str(flagged).lower()}", headers = self._headers, json = {
@@ -75,8 +94,27 @@ class BankAccount:
75
94
 
76
95
  if res.status_code == 200:
77
96
  self.flagged = flagged
78
- else:
79
- res.raise_for_status()
97
+ elif 500 <= res.status_code < 600:
98
+ raise errors.globals.ServerDownError()
99
+
100
+ _data = res.json()
101
+
102
+ if res.status_code == 400:
103
+ if _data['message'] == "MissingParam":
104
+ raise errors.globals.MissingParamError(f"Missing parameter '{_data['param']}'.")
105
+ elif _data['message'] == "InvalidParam":
106
+ raise errors.globals.InvalidParamError(f"Invalid parameter '{_data['param']}'.")
107
+ elif _data['message'] == "InvalidToken":
108
+ raise errors.globals.AuthError("Token is not valid.")
109
+
110
+ elif res.status_code == 401:
111
+ raise errors.globals.AuthError(_data['message'])
112
+
113
+ elif res.status_code == 403:
114
+ raise errors.globals.PermissionError(_data['message'])
115
+
116
+ elif res.status_code == 404:
117
+ raise errors.globals.NotFoundError(_data['message'])
80
118
 
81
119
  def debit(self, amount: int, reason: str = None, target: NSID = None, loan: NSID = None, digicode: str = None) -> None:
82
120
  _target_query = f"&target={target}"
@@ -89,163 +127,53 @@ class BankAccount:
89
127
 
90
128
  if res.status_code == 200:
91
129
  self.amount -= amount
92
- else:
93
- res.raise_for_status()
94
-
95
- def deposit(self, amount: int, reason: str = None) -> None:
96
- res = requests.post(f"{self._url}/deposit?amount={amount}", headers = self._headers, json = {
97
- "reason": reason,
98
- })
99
-
100
- if res.status_code == 200:
101
- self.amount -= amount
102
- else:
103
- res.raise_for_status()
104
-
105
- class Item:
106
- """
107
- Article d'inventaire qui peut circuler sur le serveur
130
+ elif 500 <= res.status_code < 600:
131
+ raise errors.globals.ServerDownError()
108
132
 
109
- ## Attributs
110
- - id: `NSID`\n
111
- Identifiant de l'objet
112
- - name: `str`\n
113
- Nom de l'objet
114
- - emoji: `str`\n
115
- Emoji lié à l'objet
116
- """
117
-
118
- def __init__(self) -> None:
119
- self._url: str = ""
120
- self._headers: dict = {}
133
+ _data = res.json()
121
134
 
122
- self.id: NSID = NSID(round(time.time()))
123
- self.name: str = "Unknown Object"
124
- self.emoji: str = ":light_bulb:"
125
- self.category: str = "common"
126
- self.craft: dict = {}
135
+ if res.status_code == 400:
136
+ if _data['message'] == "MissingParam":
137
+ raise errors.globals.MissingParamError(f"Missing parameter '{_data['param']}'.")
138
+ elif _data['message'] == "InvalidParam":
139
+ raise errors.globals.InvalidParamError(f"Invalid parameter '{_data['param']}'.")
140
+ elif _data['message'] == "InvalidToken":
141
+ raise errors.globals.AuthError("Token is not valid.")
127
142
 
128
- def _load(self, _data: dict, url: str, headers: dict) -> None:
129
- self._url = url + '/marketplace/items/' + _data['id']
130
- self._headers = headers
143
+ elif res.status_code == 401:
144
+ raise errors.globals.AuthError(_data['message'])
131
145
 
132
- self.id = NSID(_data['id'])
146
+ elif res.status_code == 403:
147
+ raise errors.globals.PermissionError(_data['message'])
133
148
 
134
- self.name = _data['name']
135
- self.emoji = _data['emoji']
136
- self.category = _data['category']
137
- self.craft = _data['craft']
149
+ elif res.status_code == 404:
150
+ raise errors.globals.NotFoundError(_data['message'])
138
151
 
139
- def rename(self, new_name: str):
140
- res = requests.post(f"{self._url}/rename?name={new_name}", headers = self._headers)
152
+ def deposit(self, amount: int, reason: str = None) -> None:
153
+ res = requests.post(f"{self._url}/deposit?amount={amount}", headers = self._headers, json = {
154
+ "reason": reason,
155
+ })
141
156
 
142
157
  if res.status_code == 200:
143
- self.name = new_name
144
- else:
145
- res.raise_for_status()
146
-
147
- class Sale:
148
- """
149
- Vente mettant en jeu un objet
150
-
151
- ## Attributs
152
- - id: `NSID`\n
153
- Identifiant de la vente
154
- - item: `NSID`\n
155
- Identifiant de l'objet mis en vente
156
- - quantity: `int`\n
157
- Quantité d'objets mis en vente
158
- - price: `int`\n
159
- Prix total du lot
160
- - seller_id: `NSID`\n
161
- Identifiant du vendeur
162
- """
163
-
164
- def __init__(self, item: Item) -> None:
165
- self._url: str = ""
166
- self._headers: dict = {}
167
-
168
- self.id: NSID = NSID(round(time.time()))
169
- self.open: bool = True
170
- self.seller_id: NSID = NSID('0')
171
-
172
- self.item_id: NSID = NSID(item.id)
173
- self.quantity: int = 1
174
- self.price: int = 0
175
-
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']
181
- self.open = _data['open']
182
- self.seller_id = NSID(_data['seller_id'])
183
-
184
- self.item_id = NSID(_data['item_id'])
185
- self.quantity = _data['quantity']
186
- self.price = _data['price']
187
-
188
- class Inventory:
189
- """
190
- Inventaire d'un membre
191
-
192
- ## Attributs
193
- - id: `NSID`\n
194
- ID de l'inventaire
195
- - owner_id: `NSID`\n
196
- ID du propriétaire de l'inventaire
197
- - tag: `str`\n
198
- Étiquette de l'inventaire
199
- - register_date: `int`\n
200
- Date (timestamp) de création de l'inventaire
201
- - items: `dict[NSID, int]`\n
202
- Collection d'objets et leur quantité
203
- """
204
-
205
- def __init__(self, owner_id: NSID) -> None:
206
- self._url: str = ""
207
- self._headers: dict = {}
208
-
209
- self.id: NSID = NSID(owner_id)
210
- self.owner_id: NSID = NSID(owner_id)
211
-
212
- self.tag: str = "inconnu"
213
- self.register_date: int = 0
214
-
215
- self.items: dict[NSID, int] = {}
216
-
217
- def _load(self, _data: dict, url: str, headers: dict):
218
- self._url = url + '/bank/inventories/' + _data['id']
219
- self._headers = headers
220
-
221
- self.id = NSID(_data['id'])
222
- self.owner_id = NSID(_data['owner_id'])
158
+ self.amount -= amount
159
+ elif 500 <= res.status_code < 600:
160
+ raise errors.globals.ServerDownError()
223
161
 
224
- self.tag = _data['tag']
225
- self.register_date = _data['register_date']
162
+ _data = res.json()
226
163
 
227
- self.items = _data['items']
164
+ if res.status_code == 400:
165
+ if _data['message'] == "MissingParam":
166
+ raise errors.globals.MissingParamError(f"Missing parameter '{_data['param']}'.")
167
+ elif _data['message'] == "InvalidParam":
168
+ raise errors.globals.InvalidParamError(f"Invalid parameter '{_data['param']}'.")
169
+ elif _data['message'] == "InvalidToken":
170
+ raise errors.globals.AuthError("Token is not valid.")
228
171
 
229
- def deposit_item(self, item: Item, giver: NSID = None, quantity: int = 1, digicode: str = None):
230
- res = requests.post(f"{self._url}/deposit?item={item.id}&amount={quantity}", headers = self._headers, json = {
231
- "giver": giver,
232
- "digicode": digicode
233
- })
172
+ elif res.status_code == 401:
173
+ raise errors.globals.AuthError(_data['message'])
234
174
 
235
- if res.status_code == 200:
236
- if self.objects[item.id] > quantity:
237
- self.objects[item.id] -= quantity
238
- else:
239
- self.objects[item.id] = 0
240
- else:
241
- res.raise_for_status()
242
-
243
- def sell_item(self, item: Item, price: int, quantity: int = 1, digicode: str = None) -> NSID:
244
- res = requests.post(f"{self._url}/sell_item?item={item.id}&quantity={quantity}&price={price}", headers = self._headers, json = {
245
- "digicode": digicode
246
- })
175
+ elif res.status_code == 403:
176
+ raise errors.globals.PermissionError(_data['message'])
247
177
 
248
- if res.status_code == 200:
249
- return NSID(res.json()['sale_id'])
250
- else:
251
- res.raise_for_status()
178
+ elif res.status_code == 404:
179
+ raise errors.globals.NotFoundError(_data['message'])