nsarchive 3.0.0a4__py3-none-any.whl → 3.0.0a5__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.0a4
4
+ Version: 3.0.0a5
5
5
  License: GPL-3.0
6
6
  Auteur : happex <110610727+okayhappex@users.noreply.github.com>
7
7
 
nsarchive/cls/base.py CHANGED
@@ -2,7 +2,10 @@ import io
2
2
  import json
3
3
  import requests
4
4
  import typing
5
- import warnings
5
+
6
+ from .. import utils
7
+
8
+ VERSION = 300
6
9
 
7
10
  class NSID(str):
8
11
  """
@@ -54,6 +57,20 @@ class Instance:
54
57
  "Content-Type": "application/json",
55
58
  }
56
59
 
60
+ try:
61
+ test_res = requests.get(f'{self.url}/ping')
62
+
63
+ if test_res.status_code == 200:
64
+ ndb_ver = test_res.json()['_version']
65
+ _litt = lambda x: '.'.join((str(x // 100), str(x % 100)))
66
+
67
+ if ndb_ver != VERSION:
68
+ utils.warn(f"NationDB (v{_litt(ndb_ver)}) and NSArchive (v{_litt(VERSION)}) versions do not match. Some bugs may appear.")
69
+ else:
70
+ utils.warn("Something went wrong with the server.")
71
+ except:
72
+ utils.warn("NationDB is not responding.")
73
+
57
74
  def request_token(self, username: str, password: str) -> str | None:
58
75
  res = requests.post(f"{self.url}/auth/login", json = {
59
76
  "username": username,
@@ -151,7 +168,7 @@ class Instance:
151
168
  raise Exception(f"Error {res.status_code}: {res.json()['message']}")
152
169
 
153
170
  def _delete_by_ID(self, _class: str, id: NSID):
154
- warnings.showwarning("Method '_delete_by_id' is deprecated. Use '_delete' instead.")
171
+ utils.warn("Method '_delete_by_id' is deprecated. Use '_delete' instead.")
155
172
  self._delete(_class, id)
156
173
 
157
174
  def fetch(self, _class: str, **query: typing.Any) -> list:
nsarchive/cls/economy.py CHANGED
@@ -1,5 +1,11 @@
1
+ import requests
2
+ import time
3
+ import urllib
4
+
1
5
  from .base import NSID
2
6
 
7
+ default_headers = {}
8
+
3
9
  class BankAccount:
4
10
  """
5
11
  Compte en banque d'une entité, individuelle ou collective.
@@ -19,14 +25,77 @@ class BankAccount:
19
25
  Somme entrante sur le compte depuis la dernière réinitialisation (tous les ~ 28 jours)
20
26
  """
21
27
 
22
- def __init__(self, id: NSID) -> None:
23
- self.id: NSID = NSID(id)
24
- self.owner: NSID = NSID(0)
28
+ def __init__(self, owner_id: NSID) -> None:
29
+ self._url: str = ""
30
+
31
+ self.id: NSID = NSID(owner_id)
32
+ self.owner_id: NSID = NSID(owner_id)
33
+ self.register_date: int = round(time.time())
34
+ self.tag: str = "inconnu"
35
+ self.bank: str = "HexaBank"
36
+
25
37
  self.amount: int = 0
38
+ self.income: int = 0
39
+
26
40
  self.frozen: bool = False
27
- self.bank: NSID = NSID("6")
41
+ self.flagged: bool = False
28
42
 
29
- self.income: int = 0
43
+ def _load(self, _data: dict):
44
+ self.owner_id = NSID(_data['owner_id'])
45
+ self.register_date = _data['register_date']
46
+ self.tag = _data['tag']
47
+ self.bank = _data['bank']
48
+
49
+ self.amount = _data['amount']
50
+ self.income = _data['income']
51
+
52
+ self.frozen = _data['frozen']
53
+ self.flagged = _data['flagged']
54
+
55
+ def freeze(self, frozen: bool = True, reason: str = None) -> None:
56
+ res = requests.post(f"{self._url}/freeze?frozen={str(frozen).lower()}", headers = default_headers, json = {
57
+ "reason": reason
58
+ })
59
+
60
+ if res.status_code == 200:
61
+ self.frozen = frozen
62
+ else:
63
+ print(res.text)
64
+ res.raise_for_status()
65
+
66
+ def flag(self, flagged: bool = True, reason: str = None) -> None:
67
+ res = requests.post(f"{self._url}/flag?flagged={str(flagged).lower()}", headers = default_headers, json = {
68
+ "reason": reason
69
+ })
70
+
71
+ if res.status_code == 200:
72
+ self.flagged = flagged
73
+ else:
74
+ res.raise_for_status()
75
+
76
+ def debit(self, amount: int, reason: str = None, target: NSID = None, loan: NSID = None, digicode: str = None) -> None:
77
+ _target_query = f"&target={target}"
78
+ _loan_query = f"&loan_id={loan}"
79
+
80
+ res = requests.post(f"{self._url}/debit?amount={amount}{_target_query if target else ''}{_loan_query if loan else ''}", headers = default_headers, json = {
81
+ "reason": reason,
82
+ "digicode": digicode
83
+ })
84
+
85
+ if res.status_code == 200:
86
+ self.amount -= amount
87
+ else:
88
+ res.raise_for_status()
89
+
90
+ def deposit(self, amount: int, reason: str = None) -> None:
91
+ res = requests.post(f"{self._url}/deposit?amount={amount}", headers = default_headers, json = {
92
+ "reason": reason,
93
+ })
94
+
95
+ if res.status_code == 200:
96
+ self.amount -= amount
97
+ else:
98
+ res.raise_for_status()
30
99
 
31
100
  class Item:
32
101
  """
@@ -35,44 +104,32 @@ class Item:
35
104
  ## Attributs
36
105
  - id: `NSID`\n
37
106
  Identifiant de l'objet
38
- - title: `str`\n
107
+ - name: `str`\n
39
108
  Nom de l'objet
40
109
  - emoji: `str`\n
41
110
  Emoji lié à l'objet
42
111
  """
43
112
 
44
- def __init__(self, id: NSID) -> None:
45
- self.id: NSID = NSID(id)
46
- self.title: str = "Unknown Object"
113
+ def __init__(self) -> None:
114
+ self.id: NSID = NSID(round(time.time()))
115
+ self.name: str = "Unknown Object"
47
116
  self.emoji: str = ":light_bulb:"
117
+ self.category: str = "common"
118
+ self.craft: dict = {}
48
119
 
49
- class Inventory:
50
- """
51
- Inventaire d'un membre
120
+ def _load(self, _data: dict):
121
+ self.name = _data['name']
122
+ self.emoji = _data['emoji']
123
+ self.category = _data['category']
124
+ self.craft = _data['craft']
52
125
 
53
- ## Attributs
54
- - owner_id: `NSID`\n
55
- ID du propriétaire de l'inventaire
56
- - objects: `dict[str, NSID]`\n
57
- Collection d'objets et leur quantité
58
- """
126
+ def rename(self, new_name: str):
127
+ res = requests.post(f"{self._url}/rename?name={new_name}", headers = default_headers)
59
128
 
60
- def __init__(self, owner_id: NSID) -> None:
61
- self.owner_id: NSID = NSID(owner_id)
62
- self.objects: dict[str, NSID] = {}
63
-
64
- def append(self, item: Item, quantity: int = 1):
65
- if item.id in self.objects.keys():
66
- self.objects[item.id] += quantity
129
+ if res.status_code == 200:
130
+ self.name = new_name
67
131
  else:
68
- self.objects[item.id] = quantity
69
-
70
- def throw(self, item: Item, quantity: int = 1):
71
- if item.id in self.objects.keys():
72
- if self.objects[item.id] > quantity:
73
- self.objects[item.id] -= quantity
74
- else:
75
- self.objects[item.id] = 0
132
+ res.raise_for_status()
76
133
 
77
134
  class Sale:
78
135
  """
@@ -91,10 +148,83 @@ class Sale:
91
148
  Identifiant du vendeur
92
149
  """
93
150
 
94
- def __init__(self, id: NSID, item: Item) -> None:
95
- self.id: NSID = NSID(id)
96
- self.item: NSID = NSID(item.id)
97
- self.quantity: int = 1
151
+ def __init__(self, item: Item) -> None:
152
+ self._url: str = ""
98
153
 
154
+ self.id: NSID = NSID(round(time.time()))
155
+ self.open: bool = True
156
+ self.seller_id: NSID = NSID('0')
157
+
158
+ self.item_id: NSID = NSID(item.id)
159
+ self.quantity: int = 1
99
160
  self.price: int = 0
100
- self.seller_id: NSID = NSID('0')
161
+
162
+ def _load(self, _data: dict):
163
+ self.id = _data['json']
164
+ self.open = _data['open']
165
+ self.seller_id = NSID(_data['seller_id'])
166
+
167
+ self.item_id = NSID(_data['item_id'])
168
+ self.quantity = _data['quantity']
169
+ self.price = _data['price']
170
+
171
+ class Inventory:
172
+ """
173
+ Inventaire d'un membre
174
+
175
+ ## Attributs
176
+ - id: `NSID`\n
177
+ ID de l'inventaire
178
+ - owner_id: `NSID`\n
179
+ ID du propriétaire de l'inventaire
180
+ - tag: `str`\n
181
+ Étiquette de l'inventaire
182
+ - register_date: `int`\n
183
+ Date (timestamp) de création de l'inventaire
184
+ - items: `dict[NSID, int]`\n
185
+ Collection d'objets et leur quantité
186
+ """
187
+
188
+ def __init__(self, owner_id: NSID) -> None:
189
+ self._url: str = ""
190
+
191
+ self.id: NSID = NSID(owner_id)
192
+ self.owner_id: NSID = NSID(owner_id)
193
+
194
+ self.tag: str = "inconnu"
195
+ self.register_date: int = 0
196
+
197
+ self.items: dict[NSID, int] = {}
198
+
199
+ def _load(self, _data: dict):
200
+ self.id = NSID(_data['id'])
201
+ self.owner_id = NSID(_data['owner_id'])
202
+
203
+ self.tag = _data['tag']
204
+ self.register_date = _data['register_date']
205
+
206
+ self.items = _data['items']
207
+
208
+ def deposit_item(self, item: Item, giver: NSID = None, quantity: int = 1, digicode: str = None):
209
+ res = requests.post(f"{self._url}/deposit?item={item.id}&amount={quantity}", headers = default_headers, json = {
210
+ "giver": giver,
211
+ "digicode": digicode
212
+ })
213
+
214
+ if res.status_code == 200:
215
+ if self.objects[item.id] > quantity:
216
+ self.objects[item.id] -= quantity
217
+ else:
218
+ self.objects[item.id] = 0
219
+ else:
220
+ res.raise_for_status()
221
+
222
+ def sell_item(self, item: Item, price: int, quantity: int = 1, digicode: str = None) -> NSID:
223
+ res = requests.post(f"{self._url}/sell_item?item={item.id}&quantity={quantity}&price={price}", headers = default_headers, json = {
224
+ "digicode": digicode
225
+ })
226
+
227
+ if res.status_code == 200:
228
+ return NSID(res.json()['sale_id'])
229
+ else:
230
+ res.raise_for_status()
nsarchive/cls/entities.py CHANGED
@@ -31,17 +31,20 @@ class PositionPermissions:
31
31
  """
32
32
 
33
33
  def __init__(self) -> None:
34
- self.bank_accounts = Permission("a---") # APPEND = ouvrir un ou plusieurs comptes, MANAGE = voir les infos globales concernant les comptes en banque, EDIT = gérer des comptes en banque, READ = voir les infos d'un compte en banque individuel
35
- self.bots = Permission() # APPEND = publier un message sous l'identité d'un bot, MANAGE = proposer d'héberger un bot, EDIT = changer les paramètres d'un bot, READ = /
36
- self.constitution = Permission() # APPEND = laws.append, MANAGE = laws.manage, EDIT = modifier la constitution, READ = /
37
- self.database = Permission() # APPEND = créer des sous-bases de données, MANAGE = gérer la abse de données, EDIT = modifier les éléments, READ = avoir accès à toutes les données sans exception
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
34
+ self.bots = Permission() # APPEND = /, MANAGE = proposer d'héberger un bot, EDIT = changer les paramètres d'un bot, READ = /
35
+ self.constitution = Permission() # APPEND = /, MANAGE = /, EDIT = modifier la constitution, READ = /
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
+ 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
38
+ self.items = Permission("---r") # APPEND = créer un item, MANAGE = gérer les items, EDIT = modifier des items, READ = voir tous les items
39
39
  self.laws = Permission() # APPEND = proposer un texte de loi, MANAGE = accepter ou refuser une proposition, EDIT = modifier un texte, READ = /
40
+ self.loans = Permission() # APPEND = prélever de l'argent sur un compte, MANAGE = gérer les prêts/prélèvements, EDIT = modifier les prêts, READ = voir tous les prêts
40
41
  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
42
+ self.mines = Permission("----") # APPEND = générer des matières premières, MANAGE = gérer les accès aux réservoirs, EDIT = créer un nouveau réservoir, READ = récupérer des matières premières
43
+ self.money = Permission("----") # APPEND = générer ou supprimer de la monnaie, MANAGE = /, EDIT = /, READ = /
42
44
  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 = /
43
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
44
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
+ self.sales = Permission("---r") # APPEND = vendre, MANAGE = gérer les ventes, EDIT = modifier des ventes, READ = accéder au marketplace
45
48
  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
46
49
  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
47
50
 
@@ -128,7 +131,6 @@ class Entity:
128
131
  if res.status_code == 200:
129
132
  self.name = new_name
130
133
  else:
131
- print(res.status_code)
132
134
  res.raise_for_status()
133
135
 
134
136
  def set_position(self, position: Position) -> None:
@@ -4,19 +4,22 @@ from ..cls.base import *
4
4
  from ..cls.archives import *
5
5
  from ..cls.economy import *
6
6
 
7
+ from ..cls import economy # Pour les default_headers
8
+
7
9
  class EconomyInstance(Instance):
8
10
  """Indisponible dans cette version."""
9
11
 
10
12
  def __init__(self, url: str, token: str) -> None:
11
13
  super().__init__(url, token)
12
14
 
15
+ economy.default_headers = self.default_headers
16
+
13
17
  """
14
18
  ---- COMPTES EN BANQUE ----
15
19
  """
16
20
 
17
21
  def get_account(self, id: NSID) -> BankAccount:
18
22
  """
19
- *INDISPONIBLE DANS CETTE VERSION.*\n
20
23
  Récupère les informations d'un compte bancaire.
21
24
 
22
25
  ## Paramètres
@@ -27,26 +30,27 @@ class EconomyInstance(Instance):
27
30
  - `.BankAccount`
28
31
  """
29
32
 
30
- return BankAccount(NSID(id)) # Provisoire
31
-
32
33
  id = NSID(id)
33
- _data = self._get_by_ID('accounts', id)
34
+ res = requests.get(f"{self.url}/bank/accounts/{id}", headers = self.default_headers)
35
+
36
+ if res.status_code == 200:
37
+ _data = res.json()
38
+ else:
39
+ res.raise_for_status()
40
+ return
34
41
 
35
42
  if _data is None:
36
43
  return None
37
44
 
38
45
  account = BankAccount(id)
39
- account.amount = _data['amount']
40
- account.frozen = _data['frozen']
41
- account.owner = NSID(_data['owner_id'])
42
- account.bank = _data['bank']
43
- account.income = _data['income']
46
+ account._url = f"{self.url}/bank/accounts/{account.id}"
47
+
48
+ account._load(_data)
44
49
 
45
50
  return account
46
51
 
47
- def save_account(self, account: BankAccount):
52
+ def save_account(self, account: BankAccount) -> str:
48
53
  """
49
- *INDISPONIBLE DANS CETTE VERSION.*\n
50
54
  Sauvegarde un compte bancaire dans la base de données.
51
55
 
52
56
  ## Paramètres
@@ -54,303 +58,321 @@ class EconomyInstance(Instance):
54
58
  Compte à sauvegarder
55
59
  """
56
60
 
57
- return # Provisoire
58
-
59
61
  _data = {
60
62
  'id': NSID(account.id),
61
63
  'amount': account.amount,
62
64
  'frozen': account.frozen,
63
- 'owner_id': account.owner,
65
+ 'owner_id': account.owner_id,
64
66
  'bank': account.bank,
65
67
  'income': account.income
66
68
  }
67
69
 
68
- self._put_in_db('accounts', _data)
69
-
70
- def freeze_account(self, account: BankAccount):
71
- """
72
- *INDISPONIBLE DANS CETTE VERSION.*\n
73
- Gèle un compte bancaire pour empêcher toute transaction.
74
-
75
- ## Paramètres
76
- - account: `.BankAccount`\n
77
- Compte à geler
78
- """
79
-
80
- return # Provisoire
70
+ res = requests.put(f"{self.url}/bank/register_account?owner={_data['owner_id']}", headers = self.default_headers, json = _data)
81
71
 
82
- account.id = NSID(account.id)
83
- account.frozen = True
72
+ if res.status_code == 200:
73
+ account._url = f"{self.url}/bank/accounts/{account.id}"
74
+ account.id = res.json()['id']
84
75
 
85
- self.save_account(account)
86
-
87
- """
88
- ---- OBJETS & VENTES ----
89
- """
76
+ return res.json()['digicode']
77
+ else:
78
+ res.raise_for_status()
90
79
 
91
- def save_item(self, item: Item):
80
+ def fetch_accounts(self, **query: typing.Any) -> list[BankAccount]:
92
81
  """
93
- *INDISPONIBLE DANS CETTE VERSION.*\n
94
- Sauvegarde des infos à propos d'un item.
82
+ Récupère une liste de comptes en banque en fonction d'une requête.
95
83
 
96
84
  ## Paramètres
97
- item: `.Item`\n
98
- Article à sauvegarder
99
- """
100
-
101
- return # Provisoire
85
+ query: `**dict`\n
86
+ La requête pour filtrer les comptes.
102
87
 
103
- _item = item.__dict__
104
- self._put_in_db('items', _item)
105
-
106
- def get_item(self, id: NSID) -> Item | None:
88
+ ## Renvoie
89
+ - `list[.BankAccount]`
107
90
  """
108
- *INDISPONIBLE DANS CETTE VERSION.*\n
109
- Récupère des informations à propos d'un item.
110
91
 
111
- ## Paramètres
112
- id: `NSID`\n
113
- ID de l'item
92
+ query = "&".join(f"{k}={ urllib.parse.quote(v) }" for k, v in query.items())
114
93
 
115
- ## Retourne
116
- - `.Item` si quelque chose est trouvé, sinon
117
- - `None`
118
- """
94
+ _res = requests.get(f"{self.url}/fetch/accounts?{query}", headers = self.default_headers)
119
95
 
120
- return Item(NSID(id)) # Provisoire
96
+ if _res.status_code == 200:
97
+ _data = _res.json()
98
+ else:
99
+ _res.raise_for_status()
100
+ return []
121
101
 
122
- _item = self._get_by_ID('items', id)
102
+ res = []
123
103
 
124
- if _item is None:
125
- return
104
+ for _acc in _data:
105
+ if not _acc: continue
126
106
 
127
- item = Item(id)
128
- item.title = _item['title']
129
- item.emoji = _item['emoji']
107
+ account = BankAccount(_acc["owner_id"])
130
108
 
131
- return item
109
+ account.id = NSID(_acc['id'])
110
+ account._url = f"{self.url}/bank/accounts/{account.id}"
132
111
 
133
- def delete_item(self, item: Item):
134
- """
135
- *INDISPONIBLE DANS CETTE VERSION.*\n
136
- Annule le référencement d'un item.
112
+ account._load(_acc)
137
113
 
138
- ## Paramètres
139
- item: `.Item`\n
140
- Item à supprimer
141
- """
114
+ res.append(account)
142
115
 
143
- return # Provisoire
116
+ return res
144
117
 
145
- self._delete_by_ID('items', item.id)
118
+ """
119
+ ---- INVENTAIRES ----
120
+ """
146
121
 
147
- def get_sale(self, id: NSID) -> Sale | None:
122
+ def get_inventory(self, id: NSID) -> Inventory:
148
123
  """
149
- *INDISPONIBLE DANS CETTE VERSION.*\n
150
- Récupère une vente disponible sur le marketplace.
124
+ Récupère les informations d'un inventaire.
151
125
 
152
126
  ## Paramètres
153
127
  id: `NSID`\n
154
- ID de la vente.
128
+ ID de l'inventaire.
155
129
 
156
130
  ## Renvoie
157
- - `.Sale | None`: Le résultat de la vente
131
+ - `.Inventory`
158
132
  """
159
133
 
160
- return Sale(NSID(id), Item(NSID(id))) # Provisoire
161
-
162
134
  id = NSID(id)
135
+ res = requests.get(f"{self.url}/bank/inventories/{id}", headers = self.default_headers)
163
136
 
164
- _data = self._get_by_ID('market', id)
137
+ if res.status_code == 200:
138
+ _data = res.json()
139
+ else:
140
+ res.raise_for_status()
141
+ return
165
142
 
166
143
  if _data is None:
167
144
  return None
168
145
 
169
- item = self.get_item(_data['id'])
146
+ inventory = Inventory(id)
147
+ inventory._url = f"{self.url}/bank/inventories/{inventory.id}"
170
148
 
171
- sale = Sale(NSID(id), Item(_data['id']) if item is None else item)
172
- sale.__dict__ = _data
149
+ inventory._load(_data)
173
150
 
174
- return sale
151
+ return inventory
175
152
 
176
- def sell_item(self, item: Item, quantity: int, price: int, seller: NSID):
153
+ def save_inventory(self, inventory: Inventory) -> str:
177
154
  """
178
- *INDISPONIBLE DANS CETTE VERSION.*\n
179
- Vend un item sur le marché.
155
+ Sauvegarde un inventaire dans la base de données.
180
156
 
181
157
  ## Paramètres
182
- item: `.Item`\n
183
- Item à vendre
184
- quantity: `int`\n
185
- Nombre d'items à vendre
186
- price: `int`\n
187
- Prix à l'unité de chaque objet
188
- seller: `NSID`\n
189
- ID de l'auteur de la vente
158
+ - inventory: `.Inventory`\n
159
+ Inventaire à sauvegarder
190
160
  """
191
161
 
192
- return # Provisoire
162
+ _data = inventory.__dict__
193
163
 
194
- sale = Sale(NSID(round(time.time()) * 16 ** 3), item)
195
- sale.quantity = quantity
196
- sale.price = price
197
- sale.seller_id = seller
164
+ res = requests.put(f"{self.url}/bank/register_inventory?owner={_data['owner_id']}", headers = self.default_headers, json = _data)
198
165
 
199
- _data = sale.__dict__.copy()
166
+ if res.status_code == 200:
167
+ inventory._url = f"{self.url}/bank/inventories/{inventory.id}"
168
+ inventory.id = res.json()['id']
200
169
 
201
- self._put_in_db('market', _data)
170
+ return res.json()['digicode']
171
+ else:
172
+ res.raise_for_status()
202
173
 
203
- def delete_sale(self, sale: Sale) -> None:
174
+ def fetch_inventories(self, **query: typing.Any) -> list[Inventory]:
204
175
  """
205
- *INDISPONIBLE DANS CETTE VERSION.*\n
206
- Annule une vente sur le marketplace.
176
+ Récupère une liste d'inventaires en fonction d'une requête.
177
+
178
+ ## Paramètres
179
+ query: `**dict`\n
180
+ La requête pour filtrer les inventaires.
181
+
182
+ ## Renvoie
183
+ - `list[.Inventory]`
207
184
  """
208
185
 
209
- return # Provisoire
186
+ query = "&".join(f"{k}={ urllib.parse.quote(v) }" for k, v in query.items())
210
187
 
211
- sale.id = NSID(sale.id)
212
- self._delete_by_ID('market', NSID(sale.id))
188
+ _res = requests.get(f"{self.url}/fetch/inventories?{query}", headers = self.default_headers)
189
+
190
+ if _res.status_code == 200:
191
+ _data = _res.json()
192
+ else:
193
+ _res.raise_for_status()
194
+ return []
195
+
196
+ res = []
197
+
198
+ for _inv in _data:
199
+ if not _inv: continue
200
+
201
+ inventory = Inventory(_inv["owner_id"])
202
+
203
+ inventory.id = NSID(_inv['id'])
204
+ inventory._url = f"{self.url}/bank/inventories/{inventory.id}"
205
+
206
+ inventory._load(_inv)
207
+
208
+ res.append(inventory)
209
+
210
+ return res
213
211
 
214
212
  """
215
- ---- INVENTAIRES ----
213
+ ---- ITEMS ----
216
214
  """
217
215
 
218
- def get_inventory(self, id: NSID) -> Inventory | None:
216
+ def get_item(self, id: NSID) -> Item:
219
217
  """
220
- *INDISPONIBLE DANS CETTE VERSION.*\n
221
- Récupérer un inventaire dans la base des inventaires.
218
+ Récupère les informations d'un item.
222
219
 
223
220
  ## Paramètres
224
221
  id: `NSID`\n
225
- ID du propriétaire de l'inventaire
222
+ ID de l'item.
226
223
 
227
- ## Retourne
228
- - `.Inventory | None`: L'inventaire s'il a été trouvé
224
+ ## Renvoie
225
+ - `.Item`
229
226
  """
230
227
 
231
- return Inventory(NSID(id)) # Provisoire
228
+ id = NSID(id)
229
+ res = requests.get(f"{self.url}/marketplace/items/{id}", headers = self.default_headers)
232
230
 
233
- _data = self._get_by_ID('inventories', id)
231
+ if res.status_code == 200:
232
+ _data = res.json()
233
+ else:
234
+ res.raise_for_status()
235
+ return
234
236
 
235
237
  if _data is None:
236
238
  return None
237
239
 
238
- inventory = Inventory(id)
239
-
240
- for _item in _data['objects']:
241
- item = self.get_item(_item)
240
+ item = Item()
241
+ item.id = id
242
+ item._url = f"{self.url}/marketplace/items/{item.id}"
242
243
 
243
- inventory.objects.append(item)
244
+ item._load(_data)
244
245
 
245
- return inventory
246
+ return item
246
247
 
247
- def save_inventory(self, inventory: Inventory):
248
+ def save_item(self, item: Item) -> None:
248
249
  """
249
- *INDISPONIBLE DANS CETTE VERSION.*\n
250
- Sauvegarder un inventaire
250
+ Sauvegarde un item dans le marketplace.
251
251
 
252
252
  ## Paramètres
253
- inventory: `.Inventory`\n
254
- Inventaire à sauvegarder
253
+ - item: `.Item`\n
254
+ Item à sauvegarder
255
255
  """
256
256
 
257
- return # Provisoire
257
+ _data = item.__dict__
258
258
 
259
- _data = inventory.__dict__
259
+ res = requests.put(f"{self.url}/marketplace/register_item", headers = self.default_headers, json = _data)
260
260
 
261
- self._put_in_db('inventories', _data)
261
+ if res.status_code == 200:
262
+ item._url = f"{self.url}/bank/inventories/{item.id}"
263
+ item.id = res.json()['id']
264
+ else:
265
+ res.raise_for_status()
262
266
 
263
- def delete_inventory(self, inventory: Inventory):
267
+ def fetch_items(self, **query: typing.Any) -> list[Item]:
264
268
  """
265
- *INDISPONIBLE DANS CETTE VERSION.*\n
266
- Supprime un inventaire
269
+ Récupère une liste d'items en fonction d'une requête.
267
270
 
268
271
  ## Paramètres
269
- inventory: `.Inventory`
270
- Inventaire à supprimer
272
+ query: `**dict`\n
273
+ La requête pour filtrer les items.
274
+
275
+ ## Renvoie
276
+ - `list[.Item]`
271
277
  """
272
278
 
273
- return # Provisoire
279
+ query = "&".join(f"{k}={ urllib.parse.quote(v) }" for k, v in query.items())
274
280
 
275
- self._delete_by_ID('inventories', inventory.owner_id)
281
+ _res = requests.get(f"{self.url}/fetch/items?{query}", headers = self.default_headers)
276
282
 
277
- """
278
- ---- ARCHIVES ----
279
- """
283
+ if _res.status_code == 200:
284
+ _data = _res.json()
285
+ else:
286
+ _res.raise_for_status()
287
+ return []
280
288
 
281
- def _add_archive(self, archive: Archive):
282
- """
283
- *INDISPONIBLE DANS CETTE VERSION.*\n
284
- Ajoute une archive d'une transaction ou d'une vente dans la base de données.
289
+ res = []
285
290
 
286
- ## Paramètres
287
- - archive: `.Archive`\n
288
- Archive à ajouter
289
- """
291
+ for _item in _data:
292
+ if not _item: continue
290
293
 
291
- return # Provisoire
294
+ item = Item()
292
295
 
293
- archive.id = NSID(archive.id)
294
- archive.author = NSID(archive.author)
295
- archive.target = NSID(archive.target)
296
+ item.id = NSID(_item['id'])
297
+ item._url = f"{self.url}/marketplace/items/{item.id}"
296
298
 
297
- _data = archive.__dict__.copy()
299
+ item._load(_item)
298
300
 
299
- if type(archive) == Transaction:
300
- _data['_type'] = "transaction"
301
- else:
302
- _data['_type'] = "action"
301
+ res.append(item)
303
302
 
304
- self._put_in_db('archives', _data)
303
+ return res
305
304
 
306
- def _get_archive(self, id: NSID) -> Archive | Transaction:
305
+
306
+ """
307
+ ---- VENTES ----
308
+ """
309
+
310
+ def get_sale(self, id: NSID) -> Sale:
307
311
  """
308
- *INDISPONIBLE DANS CETTE VERSION.*\n
309
- Récupère une archive spécifique.
312
+ Récupère les informations d'une annonce.
310
313
 
311
314
  ## Paramètres
312
315
  id: `NSID`\n
313
- ID de l'archive.
316
+ ID de la annonce.
314
317
 
315
318
  ## Renvoie
316
- - `.Archive | .Transaction`
319
+ - `.Sale`
317
320
  """
318
321
 
319
- return Archive() # Provisoire
320
-
321
322
  id = NSID(id)
322
- _data = self._get_by_ID('archives', id)
323
+ res = requests.get(f"{self.url}/marketplace/sales/{id}", headers = self.default_headers)
324
+
325
+ if res.status_code == 200:
326
+ _data = res.json()
327
+ else:
328
+ res.raise_for_status()
329
+ return
323
330
 
324
331
  if _data is None:
325
332
  return None
326
333
 
327
- if _data['_type'] == "transaction":
328
- archive = Transaction(_data['author'], _data['target'])
329
- else:
330
- archive = Archive(_data['author'], _data['target'])
334
+ sale = Sale()
335
+ sale.id = id
336
+ sale._url = f"{self.url}/marketplace/sales/{sale.id}"
331
337
 
332
- archive.id = id
333
- archive.action = _data['action']
334
- archive.date = _data['date']
335
- archive.details = _data['details']
338
+ sale._load(_data)
336
339
 
337
- return archive
340
+ return sale
338
341
 
339
- def _fetch_archives(self, **query) -> list[ Archive | Transaction ]:
342
+ def fetch_sales(self, **query: typing.Any) -> list[Sale]:
340
343
  """
341
- *INDISPONIBLE DANS CETTE VERSION.*\n
342
- Récupère une liste d'archives correspondant à la requête.
344
+ Récupère une liste d'annonces en fonction d'une requête.
343
345
 
344
346
  ## Paramètres
345
- query: `dict`\n
346
- Requête pour filtrer les archives.
347
+ query: `**dict`\n
348
+ La requête pour filtrer les annonces.
347
349
 
348
350
  ## Renvoie
349
- - `list[.Archive | .Transaction]`
351
+ - `list[.Sale]`
350
352
  """
351
353
 
352
- return [] # Provisoire
354
+ query = "&".join(f"{k}={ urllib.parse.quote(v) }" for k, v in query.items())
355
+
356
+ _res = requests.get(f"{self.url}/fetch/sales?{query}", headers = self.default_headers)
357
+
358
+ if _res.status_code == 200:
359
+ _data = _res.json()
360
+ else:
361
+ _res.raise_for_status()
362
+ return []
363
+
364
+ res = []
365
+
366
+ for _sale in _data:
367
+ if not _sale: continue
368
+
369
+ sale = Sale()
370
+
371
+ sale.id = NSID(_sale['id'])
372
+ sale._url = f"{self.url}/marketplace/sales/{sale.id}"
373
+
374
+ sale._load(_sale)
353
375
 
354
- _res = self.fetch('archives', **query)
376
+ res.append(sale)
355
377
 
356
- return [ self._get_archive(archive['id']) for archive in _res ]
378
+ return res
nsarchive/utils.py CHANGED
@@ -23,4 +23,7 @@ def compress_image(data: bytes, _max: int = 1000 ** 2) -> bytes:
23
23
  val = io.BytesIO()
24
24
  img.save(val)
25
25
 
26
- return val.getvalue()
26
+ return val.getvalue()
27
+
28
+ def warn(prompt: str):
29
+ print("\033[1;33mWarning:\033[0m", prompt)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: nsarchive
3
- Version: 3.0.0a4
3
+ Version: 3.0.0a5
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
@@ -0,0 +1,15 @@
1
+ nsarchive/__init__.py,sha256=5ZPH_bKziBRrkxCn_q7j8ZD2I-wDUE2mRKuM5g5ojug,656
2
+ nsarchive/assets/default_avatar.png,sha256=n-4vG_WPke8LvbY3ZU6oA-H-OtRoIu7woKnRq9DCIlI,51764
3
+ nsarchive/cls/archives.py,sha256=3vyGOBZUE-B-G_QMJXRIPD0d-1O5z4wqv-2MRf5AQdA,2506
4
+ nsarchive/cls/base.py,sha256=ley35D1i0RTfX_lmPoyC_PICG40UQtLj5zizRWjUwpM,8034
5
+ nsarchive/cls/economy.py,sha256=Ap6nhnArieHroHi9zTHUKQgYscLhByNcI74QQ1Fno9c,6992
6
+ nsarchive/cls/entities.py,sha256=a0U2xTQ8Uwo6RohC9JqTq1gCzwkqcZAbW8PPdhN9x-I,14397
7
+ nsarchive/cls/republic.py,sha256=16NFNCkJxOeVRd6BoJ68AlrTESQgRfZ5FSFlNWTEdK0,4103
8
+ nsarchive/instances/_economy.py,sha256=vMK8nRBHjLWmAmTu1f3XkWimFUk8tuV3P9KIuKRdNpw,9596
9
+ nsarchive/instances/_entities.py,sha256=6diGZVdtCBgw3ybnx09nBMfLrA1zpNM0DZT7grxKHCo,9319
10
+ nsarchive/instances/_republic.py,sha256=M8k2rZJvQGzOyZlmqRDiB-d615hZOqD3kuRrgYP4JqA,12004
11
+ nsarchive/utils.py,sha256=L37Dm8aO0Sm3FDLPf2tP6fo-1lodDq7JIz-WXttNuJg,684
12
+ nsarchive-3.0.0a5.dist-info/LICENSE,sha256=aFLFZg6LEJFpTlNQ8su3__jw4GfV-xWBmC1cePkKZVw,35802
13
+ nsarchive-3.0.0a5.dist-info/METADATA,sha256=Zsf-oJLY3WNCPQJGOO6ZsobBiJsH4sDmeoUJ46b5EkQ,657
14
+ nsarchive-3.0.0a5.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
15
+ nsarchive-3.0.0a5.dist-info/RECORD,,
@@ -1,15 +0,0 @@
1
- nsarchive/__init__.py,sha256=_IK4p7rSwTN9GahaxnL4gkgXOCCkT0vMgBXbJY_MXVA,656
2
- nsarchive/assets/default_avatar.png,sha256=n-4vG_WPke8LvbY3ZU6oA-H-OtRoIu7woKnRq9DCIlI,51764
3
- nsarchive/cls/archives.py,sha256=3vyGOBZUE-B-G_QMJXRIPD0d-1O5z4wqv-2MRf5AQdA,2506
4
- nsarchive/cls/base.py,sha256=R6ZD2_DVOvjTO6VZ0HteFWVmdW9fieyIpGF9P0PqYk4,7424
5
- nsarchive/cls/economy.py,sha256=soe3ATrtQem-u80vz8nXfsn_3TqMdhpolyTxRenH2C0,2742
6
- nsarchive/cls/entities.py,sha256=cc76FSkigUm_ryT_tzLNIDj-TDIAOLtleXy9xutLvnc,14072
7
- nsarchive/cls/republic.py,sha256=16NFNCkJxOeVRd6BoJ68AlrTESQgRfZ5FSFlNWTEdK0,4103
8
- nsarchive/instances/_economy.py,sha256=kVIbsCIrctV5yA3nlnSEYkJ8Cuh74YnQKtntIXTqOY0,8892
9
- nsarchive/instances/_entities.py,sha256=6diGZVdtCBgw3ybnx09nBMfLrA1zpNM0DZT7grxKHCo,9319
10
- nsarchive/instances/_republic.py,sha256=M8k2rZJvQGzOyZlmqRDiB-d615hZOqD3kuRrgYP4JqA,12004
11
- nsarchive/utils.py,sha256=qpQCZLlbVApOLtCI2ml54QwUld6K8fDxyBfwzofqXzw,610
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,,