forked from OrudoCA/qBitDownload-Bot
Add Redis implementation of CacheDB
- Add RedisCache class - Add REDIS_HOST env var
This commit is contained in:
parent
1e3ce3a55e
commit
dd27264fd5
|
@ -7,4 +7,5 @@ frozenlist>=1.4.1
|
|||
idna>=3.7
|
||||
multidict>=6.0.5
|
||||
python-magic>=0.4.27
|
||||
redis>=5.0.8
|
||||
yarl>=1.9.4
|
||||
|
|
7
setup.py
7
setup.py
|
@ -7,6 +7,11 @@ setup(
|
|||
author="ORUDO",
|
||||
author_email="root@orudo.ru",
|
||||
description="A simple Telegram bot that will allow you to upload torrent files / magnet links to a remote Torrent server (qBitTorrent, Transmission, etc.)",
|
||||
install_requires=["aiohttp>=3.10.0", "aiofiles>=24.1.0", "aiofiles>=24.1.0"],
|
||||
install_requires=[
|
||||
"aiohttp>=3.10.0",
|
||||
"aiofiles>=24.1.0",
|
||||
"aiofiles>=24.1.0",
|
||||
"redis>=5.0.8",
|
||||
],
|
||||
packages=["tubot", "tubot.static", "tubot.torrent", "tubot.dirgetter", "db"],
|
||||
)
|
||||
|
|
|
@ -13,6 +13,9 @@ from aiofiles.ospath import isdir, isfile
|
|||
from aiofiles.os import mkdir
|
||||
from aiofiles import open
|
||||
from asyncio import sleep
|
||||
from redis import asyncio as aioredis
|
||||
from json import loads as json_loads
|
||||
from json import dumps as json_dumps
|
||||
|
||||
|
||||
class PythonCache(CacheDB):
|
||||
|
@ -100,3 +103,87 @@ class PythonCache(CacheDB):
|
|||
@property
|
||||
async def get_dirs(self) -> dict:
|
||||
return self.dirs
|
||||
|
||||
|
||||
class RedisCache(CacheDB):
|
||||
"""
|
||||
Redis implementation of Cache DataBase
|
||||
"""
|
||||
|
||||
_ctype = CacheDBTypes.Redis
|
||||
host: str
|
||||
|
||||
def __init__(self, redis_host: str) -> None:
|
||||
super().__init__()
|
||||
self.host = redis_host
|
||||
|
||||
async def __validate__(self) -> bool:
|
||||
async with aioredis.from_url(
|
||||
f"redis://{self.host}", encoding="utf-8", decode_responses=True
|
||||
) as redis:
|
||||
return await redis.ping()
|
||||
|
||||
# Users
|
||||
|
||||
async def add_user(self, tg_id: int, name: str) -> None:
|
||||
async with aioredis.from_url(
|
||||
f"redis://{self.host}", encoding="utf-8", decode_responses=True
|
||||
) as redis:
|
||||
user = User(tg_id, name)
|
||||
json = json_dumps(user.dict)
|
||||
await redis.set(str(tg_id), json)
|
||||
|
||||
async def user_state(self, tg_id: int) -> UserStates:
|
||||
async with aioredis.from_url(
|
||||
f"redis://{self.host}", encoding="utf-8", decode_responses=True
|
||||
) as redis:
|
||||
json = await redis.get(str(tg_id))
|
||||
user = json_loads(json)
|
||||
return user["state"]
|
||||
|
||||
async def change_user_state(self, tg_id: int, status: UserStates) -> None:
|
||||
async with aioredis.from_url(
|
||||
f"redis://{self.host}", encoding="utf-8", decode_responses=True
|
||||
) as redis:
|
||||
json = await redis.get(str(tg_id))
|
||||
user = json_loads(json)
|
||||
user["state"] = status
|
||||
json = json_dumps(user)
|
||||
await redis.set(str(tg_id), json)
|
||||
|
||||
async def auth_user(self, tg_id: int) -> None:
|
||||
async with aioredis.from_url(
|
||||
f"redis://{self.host}", encoding="utf-8", decode_responses=True
|
||||
) as redis:
|
||||
json = await redis.get(str(tg_id))
|
||||
user = json_loads(json)
|
||||
user["auth"] = True
|
||||
json = json_dumps(user)
|
||||
await redis.set(str(tg_id), json)
|
||||
|
||||
async def is_user_auth(self, tg_id: int) -> bool:
|
||||
async with aioredis.from_url(
|
||||
f"redis://{self.host}", encoding="utf-8", decode_responses=True
|
||||
) as redis:
|
||||
json = await redis.get(str(tg_id))
|
||||
user = json_loads(json)
|
||||
return bool(user["auth"])
|
||||
|
||||
# Dirs
|
||||
|
||||
async def cache_dirs(self, dirs: dict, expire: int) -> None:
|
||||
async with aioredis.from_url(
|
||||
f"redis://{self.host}", encoding="utf-8", decode_responses=True
|
||||
) as redis:
|
||||
json = json_dumps(dirs)
|
||||
await redis.set("dirs", json, ex=expire)
|
||||
|
||||
@property
|
||||
async def get_dirs(self) -> dict:
|
||||
async with aioredis.from_url(
|
||||
f"redis://{self.host}", encoding="utf-8", decode_responses=True
|
||||
) as redis:
|
||||
resp = await redis.get("dirs")
|
||||
if resp is None:
|
||||
return {}
|
||||
return json_loads(resp)
|
||||
|
|
|
@ -14,6 +14,7 @@ class CacheDBTypes(Enum):
|
|||
"""
|
||||
|
||||
PythonPKL = "python"
|
||||
Redis = "redis"
|
||||
|
||||
|
||||
class UserStates(Enum):
|
||||
|
|
|
@ -26,7 +26,6 @@ class IValidatable(ABC):
|
|||
|
||||
|
||||
class ENV(object):
|
||||
|
||||
_name: str | None = None
|
||||
DEFAULT: str
|
||||
|
||||
|
|
|
@ -15,3 +15,12 @@ class PN_CACHE(ENV):
|
|||
|
||||
_name = "PN_CACHE"
|
||||
DEFAULT = "/etc/tubot"
|
||||
|
||||
|
||||
class REDIS_HOST(ENV):
|
||||
"""
|
||||
Redis host adress
|
||||
"""
|
||||
|
||||
_name = "REDIS_HOST"
|
||||
DEFAULT = "localhost:6379"
|
||||
|
|
Loading…
Reference in New Issue