-
Notifications
You must be signed in to change notification settings - Fork 19
/
Copy pathdatabase.py
67 lines (51 loc) · 1.8 KB
/
database.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
from __future__ import annotations
from base64 import b64decode
from json import loads
from os import environ as env
from nextcord.ext import commands
class Database(commands.Cog):
def __init__(self, bot):
self.bot = bot
self.api_base: str = env["CONSUL_ADDR"]
self.consul_token: str = env["CONSUL_TOKEN"]
async def get(self, key: str) -> dict | None:
r = await self.bot.session.get(
f"{self.api_base}/v1/kv/previous/{key}",
headers={"X-Consul-Token": self.consul_token},
)
if r.status == 404:
return None
data = await r.json()
value = data[0]["Value"]
return loads(b64decode(value).decode("utf-8"))
async def set(self, key: str, value: dict) -> None:
r = await self.bot.session.put(
f"{self.api_base}/v1/kv/previous/{key}",
headers={"X-Consul-Token": self.consul_token},
json=value,
)
r.raise_for_status()
async def delete(self, key: str) -> None:
r = await self.bot.session.delete(
f"{self.api_base}/v1/kv/previous/{key}",
headers={"X-Consul-Token": self.consul_token},
)
r.raise_for_status()
async def list(self, prefix: str) -> dict | None:
r = await self.bot.session.get(
f"{self.api_base}/v1/kv/previous/{prefix}",
headers={"X-Consul-Token": self.consul_token},
params={"recurse": "true"},
)
if r.status == 404:
return None
r.raise_for_status()
data = await r.json()
return {
item["Key"].removeprefix("previous/"): loads(
b64decode(item["Value"]).decode("utf-8")
)
for item in data
}
def setup(bot):
bot.add_cog(Database(bot))