nsarchive 3.0.0a4__py3-none-any.whl → 3.0.0a6__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 +1 -1
- nsarchive/cls/base.py +19 -2
- nsarchive/cls/economy.py +168 -38
- nsarchive/cls/entities.py +10 -7
- nsarchive/instances/_economy.py +208 -186
- nsarchive/instances/_entities.py +2 -2
- nsarchive/utils.py +4 -1
- {nsarchive-3.0.0a4.dist-info → nsarchive-3.0.0a6.dist-info}/METADATA +2 -1
- nsarchive-3.0.0a6.dist-info/RECORD +15 -0
- nsarchive-3.0.0a4.dist-info/RECORD +0 -15
- {nsarchive-3.0.0a4.dist-info → nsarchive-3.0.0a6.dist-info}/LICENSE +0 -0
- {nsarchive-3.0.0a4.dist-info → nsarchive-3.0.0a6.dist-info}/WHEEL +0 -0
nsarchive/__init__.py
CHANGED
nsarchive/cls/base.py
CHANGED
@@ -2,7 +2,10 @@ import io
|
|
2
2
|
import json
|
3
3
|
import requests
|
4
4
|
import typing
|
5
|
-
|
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
|
-
|
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,
|
23
|
-
self.
|
24
|
-
|
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.
|
41
|
+
self.flagged: bool = False
|
28
42
|
|
29
|
-
|
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
|
-
-
|
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
|
45
|
-
self.id: NSID = NSID(
|
46
|
-
self.
|
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
|
-
|
50
|
-
|
51
|
-
|
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
|
-
|
54
|
-
|
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
|
-
|
61
|
-
|
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
|
-
|
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,
|
95
|
-
self.
|
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
|
-
|
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.
|
35
|
-
self.
|
36
|
-
self.
|
37
|
-
self.
|
38
|
-
self.items = Permission("---r") # APPEND =
|
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.
|
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
|
|
@@ -89,6 +92,7 @@ class Position:
|
|
89
92
|
res.raise_for_status()
|
90
93
|
|
91
94
|
def _load(self, _data: dict):
|
95
|
+
self.id = _data['id']
|
92
96
|
self.name = _data['name']
|
93
97
|
self.permissions.merge(_data['permissions'])
|
94
98
|
self.manager_permissions.merge(_data['manager_permissions'])
|
@@ -128,7 +132,6 @@ class Entity:
|
|
128
132
|
if res.status_code == 200:
|
129
133
|
self.name = new_name
|
130
134
|
else:
|
131
|
-
print(res.status_code)
|
132
135
|
res.raise_for_status()
|
133
136
|
|
134
137
|
def set_position(self, position: Position) -> None:
|
nsarchive/instances/_economy.py
CHANGED
@@ -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
|
-
|
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.
|
40
|
-
|
41
|
-
account.
|
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.
|
65
|
+
'owner_id': account.owner_id,
|
64
66
|
'bank': account.bank,
|
65
67
|
'income': account.income
|
66
68
|
}
|
67
69
|
|
68
|
-
self.
|
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
|
-
|
83
|
-
|
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
|
-
|
86
|
-
|
87
|
-
|
88
|
-
---- OBJETS & VENTES ----
|
89
|
-
"""
|
76
|
+
return res.json()['digicode']
|
77
|
+
else:
|
78
|
+
res.raise_for_status()
|
90
79
|
|
91
|
-
def
|
80
|
+
def fetch_accounts(self, **query: typing.Any) -> list[BankAccount]:
|
92
81
|
"""
|
93
|
-
|
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
|
-
|
98
|
-
|
99
|
-
"""
|
100
|
-
|
101
|
-
return # Provisoire
|
85
|
+
query: `**dict`\n
|
86
|
+
La requête pour filtrer les comptes.
|
102
87
|
|
103
|
-
|
104
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
96
|
+
if _res.status_code == 200:
|
97
|
+
_data = _res.json()
|
98
|
+
else:
|
99
|
+
_res.raise_for_status()
|
100
|
+
return []
|
121
101
|
|
122
|
-
|
102
|
+
res = []
|
123
103
|
|
124
|
-
|
125
|
-
|
104
|
+
for _acc in _data:
|
105
|
+
if not _acc: continue
|
126
106
|
|
127
|
-
|
128
|
-
item.title = _item['title']
|
129
|
-
item.emoji = _item['emoji']
|
107
|
+
account = BankAccount(_acc["owner_id"])
|
130
108
|
|
131
|
-
|
109
|
+
account.id = NSID(_acc['id'])
|
110
|
+
account._url = f"{self.url}/bank/accounts/{account.id}"
|
132
111
|
|
133
|
-
|
134
|
-
"""
|
135
|
-
*INDISPONIBLE DANS CETTE VERSION.*\n
|
136
|
-
Annule le référencement d'un item.
|
112
|
+
account._load(_acc)
|
137
113
|
|
138
|
-
|
139
|
-
item: `.Item`\n
|
140
|
-
Item à supprimer
|
141
|
-
"""
|
114
|
+
res.append(account)
|
142
115
|
|
143
|
-
return
|
116
|
+
return res
|
144
117
|
|
145
|
-
|
118
|
+
"""
|
119
|
+
---- INVENTAIRES ----
|
120
|
+
"""
|
146
121
|
|
147
|
-
def
|
122
|
+
def get_inventory(self, id: NSID) -> Inventory:
|
148
123
|
"""
|
149
|
-
|
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
|
128
|
+
ID de l'inventaire.
|
155
129
|
|
156
130
|
## Renvoie
|
157
|
-
- `.
|
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
|
-
|
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
|
-
|
146
|
+
inventory = Inventory(id)
|
147
|
+
inventory._url = f"{self.url}/bank/inventories/{inventory.id}"
|
170
148
|
|
171
|
-
|
172
|
-
sale.__dict__ = _data
|
149
|
+
inventory._load(_data)
|
173
150
|
|
174
|
-
return
|
151
|
+
return inventory
|
175
152
|
|
176
|
-
def
|
153
|
+
def save_inventory(self, inventory: Inventory) -> str:
|
177
154
|
"""
|
178
|
-
|
179
|
-
Vend un item sur le marché.
|
155
|
+
Sauvegarde un inventaire dans la base de données.
|
180
156
|
|
181
157
|
## Paramètres
|
182
|
-
|
183
|
-
|
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
|
-
|
162
|
+
_data = inventory.__dict__
|
193
163
|
|
194
|
-
|
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
|
-
|
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
|
-
|
170
|
+
return res.json()['digicode']
|
171
|
+
else:
|
172
|
+
res.raise_for_status()
|
202
173
|
|
203
|
-
def
|
174
|
+
def fetch_inventories(self, **query: typing.Any) -> list[Inventory]:
|
204
175
|
"""
|
205
|
-
|
206
|
-
|
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
|
-
|
186
|
+
query = "&".join(f"{k}={ urllib.parse.quote(v) }" for k, v in query.items())
|
210
187
|
|
211
|
-
|
212
|
-
|
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
|
-
----
|
213
|
+
---- ITEMS ----
|
216
214
|
"""
|
217
215
|
|
218
|
-
def
|
216
|
+
def get_item(self, id: NSID) -> Item:
|
219
217
|
"""
|
220
|
-
|
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
|
222
|
+
ID de l'item.
|
226
223
|
|
227
|
-
##
|
228
|
-
- `.
|
224
|
+
## Renvoie
|
225
|
+
- `.Item`
|
229
226
|
"""
|
230
227
|
|
231
|
-
|
228
|
+
id = NSID(id)
|
229
|
+
res = requests.get(f"{self.url}/marketplace/items/{id}", headers = self.default_headers)
|
232
230
|
|
233
|
-
|
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
|
-
|
239
|
-
|
240
|
-
|
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
|
-
|
244
|
+
item._load(_data)
|
244
245
|
|
245
|
-
return
|
246
|
+
return item
|
246
247
|
|
247
|
-
def
|
248
|
+
def save_item(self, item: Item) -> None:
|
248
249
|
"""
|
249
|
-
|
250
|
-
Sauvegarder un inventaire
|
250
|
+
Sauvegarde un item dans le marketplace.
|
251
251
|
|
252
252
|
## Paramètres
|
253
|
-
|
254
|
-
|
253
|
+
- item: `.Item`\n
|
254
|
+
Item à sauvegarder
|
255
255
|
"""
|
256
256
|
|
257
|
-
|
257
|
+
_data = item.__dict__
|
258
258
|
|
259
|
-
|
259
|
+
res = requests.put(f"{self.url}/marketplace/register_item", headers = self.default_headers, json = _data)
|
260
260
|
|
261
|
-
|
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
|
267
|
+
def fetch_items(self, **query: typing.Any) -> list[Item]:
|
264
268
|
"""
|
265
|
-
|
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
|
-
|
270
|
-
|
272
|
+
query: `**dict`\n
|
273
|
+
La requête pour filtrer les items.
|
274
|
+
|
275
|
+
## Renvoie
|
276
|
+
- `list[.Item]`
|
271
277
|
"""
|
272
278
|
|
273
|
-
|
279
|
+
query = "&".join(f"{k}={ urllib.parse.quote(v) }" for k, v in query.items())
|
274
280
|
|
275
|
-
self.
|
281
|
+
_res = requests.get(f"{self.url}/fetch/items?{query}", headers = self.default_headers)
|
276
282
|
|
277
|
-
|
278
|
-
|
279
|
-
|
283
|
+
if _res.status_code == 200:
|
284
|
+
_data = _res.json()
|
285
|
+
else:
|
286
|
+
_res.raise_for_status()
|
287
|
+
return []
|
280
288
|
|
281
|
-
|
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
|
-
|
287
|
-
|
288
|
-
Archive à ajouter
|
289
|
-
"""
|
291
|
+
for _item in _data:
|
292
|
+
if not _item: continue
|
290
293
|
|
291
|
-
|
294
|
+
item = Item()
|
292
295
|
|
293
|
-
|
294
|
-
|
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
|
-
|
299
|
+
item._load(_item)
|
298
300
|
|
299
|
-
|
300
|
-
_data['_type'] = "transaction"
|
301
|
-
else:
|
302
|
-
_data['_type'] = "action"
|
301
|
+
res.append(item)
|
303
302
|
|
304
|
-
|
303
|
+
return res
|
305
304
|
|
306
|
-
|
305
|
+
|
306
|
+
"""
|
307
|
+
---- VENTES ----
|
308
|
+
"""
|
309
|
+
|
310
|
+
def get_sale(self, id: NSID) -> Sale:
|
307
311
|
"""
|
308
|
-
|
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
|
316
|
+
ID de la annonce.
|
314
317
|
|
315
318
|
## Renvoie
|
316
|
-
- `.
|
319
|
+
- `.Sale`
|
317
320
|
"""
|
318
321
|
|
319
|
-
return Archive() # Provisoire
|
320
|
-
|
321
322
|
id = NSID(id)
|
322
|
-
|
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
|
-
|
328
|
-
|
329
|
-
|
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
|
-
|
333
|
-
archive.action = _data['action']
|
334
|
-
archive.date = _data['date']
|
335
|
-
archive.details = _data['details']
|
338
|
+
sale._load(_data)
|
336
339
|
|
337
|
-
return
|
340
|
+
return sale
|
338
341
|
|
339
|
-
def
|
342
|
+
def fetch_sales(self, **query: typing.Any) -> list[Sale]:
|
340
343
|
"""
|
341
|
-
|
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:
|
346
|
-
|
347
|
+
query: `**dict`\n
|
348
|
+
La requête pour filtrer les annonces.
|
347
349
|
|
348
350
|
## Renvoie
|
349
|
-
- `list[.
|
351
|
+
- `list[.Sale]`
|
350
352
|
"""
|
351
353
|
|
352
|
-
|
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
|
-
|
376
|
+
res.append(sale)
|
355
377
|
|
356
|
-
return
|
378
|
+
return res
|
nsarchive/instances/_entities.py
CHANGED
@@ -52,12 +52,12 @@ class EntityInstance(Instance):
|
|
52
52
|
if _data is None: # ID inexistant chez les entités
|
53
53
|
return None
|
54
54
|
|
55
|
-
if _data['_class'] == '
|
55
|
+
if _data['_class'] == 'individuals':
|
56
56
|
entity = User(id)
|
57
57
|
entity._url = f"{self.url}/model/individuals/{id}"
|
58
58
|
|
59
59
|
entity._load(_data)
|
60
|
-
elif _data['_class'] == '
|
60
|
+
elif _data['_class'] == 'organizations':
|
61
61
|
entity = Organization(id)
|
62
62
|
entity._url = f"{self.url}/model/organizations/{id}"
|
63
63
|
|
nsarchive/utils.py
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: nsarchive
|
3
|
-
Version: 3.0.
|
3
|
+
Version: 3.0.0a6
|
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
|
@@ -12,6 +12,7 @@ Classifier: Programming Language :: Python :: 3.10
|
|
12
12
|
Classifier: Programming Language :: Python :: 3.11
|
13
13
|
Classifier: Programming Language :: Python :: 3.12
|
14
14
|
Requires-Dist: pillow (>=10.4,<11.0)
|
15
|
+
Requires-Dist: requests (>=2.31,<3.0)
|
15
16
|
Description-Content-Type: text/markdown
|
16
17
|
|
17
18
|
# NSArchive
|
@@ -0,0 +1,15 @@
|
|
1
|
+
nsarchive/__init__.py,sha256=mGEv74tD1yb0EB42ZYXfiJWX_FxE6raf8LH0lJLDkNk,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=HcfKydEMqmLkBvoIY2DRGK0PO_6ic5WK826VHaUwyjI,14428
|
7
|
+
nsarchive/cls/republic.py,sha256=16NFNCkJxOeVRd6BoJ68AlrTESQgRfZ5FSFlNWTEdK0,4103
|
8
|
+
nsarchive/instances/_economy.py,sha256=vMK8nRBHjLWmAmTu1f3XkWimFUk8tuV3P9KIuKRdNpw,9596
|
9
|
+
nsarchive/instances/_entities.py,sha256=pYNoGyYg-I6QDtY3swFb2_rNm2FemG2S5ouYkZLidLE,9327
|
10
|
+
nsarchive/instances/_republic.py,sha256=M8k2rZJvQGzOyZlmqRDiB-d615hZOqD3kuRrgYP4JqA,12004
|
11
|
+
nsarchive/utils.py,sha256=L37Dm8aO0Sm3FDLPf2tP6fo-1lodDq7JIz-WXttNuJg,684
|
12
|
+
nsarchive-3.0.0a6.dist-info/LICENSE,sha256=aFLFZg6LEJFpTlNQ8su3__jw4GfV-xWBmC1cePkKZVw,35802
|
13
|
+
nsarchive-3.0.0a6.dist-info/METADATA,sha256=XiRacmzL8zP5XMgUMTzWRG8nZoAF5mma6LGzmW6rrlI,695
|
14
|
+
nsarchive-3.0.0a6.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
|
15
|
+
nsarchive-3.0.0a6.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,,
|
File without changes
|
File without changes
|