mirror of
https://github.com/kurbezz/discord-bot.git
synced 2025-12-06 15:15:37 +01:00
Use mongodb for twitch tokens
This commit is contained in:
@@ -53,6 +53,8 @@ class Config(BaseSettings):
|
||||
|
||||
STREAMERS: list[StreamerConfig] = []
|
||||
|
||||
MONGODB_URI: str
|
||||
|
||||
SECRETS_FILE_PATH: str
|
||||
|
||||
@field_validator("STREAMERS", mode="before")
|
||||
33
src/core/mongo.py
Normal file
33
src/core/mongo.py
Normal file
@@ -0,0 +1,33 @@
|
||||
import contextlib
|
||||
|
||||
from mongojet import create_client
|
||||
|
||||
from core.config import config
|
||||
|
||||
|
||||
async def create_mongo_client():
|
||||
return await create_client(config.MONGODB_URI)
|
||||
|
||||
|
||||
class MongoDBSessionManager:
|
||||
def __init__(self):
|
||||
self.client = None
|
||||
|
||||
async def init(self):
|
||||
self.client = await create_mongo_client()
|
||||
|
||||
async def close(self):
|
||||
if self.client is not None:
|
||||
await self.client.close()
|
||||
|
||||
@contextlib.asynccontextmanager
|
||||
async def connect(self):
|
||||
if self.client is None:
|
||||
await self.init()
|
||||
|
||||
assert self.client is not None
|
||||
|
||||
yield self.client
|
||||
|
||||
|
||||
mongo_manager = MongoDBSessionManager()
|
||||
@@ -2,9 +2,11 @@ from asyncio import wait, create_task
|
||||
import logging
|
||||
|
||||
from services.discord import start_discord_sevice
|
||||
from services.twitch import start_twitch_service
|
||||
from services.twitch.twitch import start_twitch_service
|
||||
from services.scheduler_sync import start_synchronizer
|
||||
|
||||
from core.mongo import mongo_manager
|
||||
|
||||
logging.basicConfig(level=logging.INFO)
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
@@ -14,6 +16,8 @@ logger.setLevel(logging.INFO)
|
||||
async def main():
|
||||
logger.info("Starting services...")
|
||||
|
||||
await mongo_manager.init()
|
||||
|
||||
await wait([
|
||||
create_task(start_discord_sevice()),
|
||||
create_task(start_twitch_service()),
|
||||
|
||||
@@ -7,7 +7,7 @@ from discord import app_commands
|
||||
|
||||
from services.games_list import GameList, GameItem
|
||||
|
||||
from config import config
|
||||
from core.config import config
|
||||
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@@ -3,7 +3,7 @@ from typing import Literal
|
||||
|
||||
from httpx import AsyncClient
|
||||
|
||||
from config import config, StreamerConfig
|
||||
from core.config import config, StreamerConfig
|
||||
from services.twitch_state import State
|
||||
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ import logging
|
||||
from httpx import AsyncClient
|
||||
from pydantic import BaseModel, field_serializer, SerializationInfo
|
||||
|
||||
from config import config
|
||||
from core.config import config
|
||||
|
||||
from services.scheduler_sync.twitch_events import TwitchEvent
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@ from services.scheduler_sync.discord_events import (
|
||||
)
|
||||
from services.scheduler_sync.comparators import compare
|
||||
|
||||
from config import config, TwitchConfig
|
||||
from core.config import config, TwitchConfig
|
||||
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
52
src/services/twitch/token_storage.py
Normal file
52
src/services/twitch/token_storage.py
Normal file
@@ -0,0 +1,52 @@
|
||||
from asyncio import Lock
|
||||
import json
|
||||
|
||||
import aiofiles
|
||||
|
||||
from core.config import config
|
||||
from core.mongo import mongo_manager
|
||||
|
||||
|
||||
class TokenStorage:
|
||||
COLLECTION_NAME = "secrets"
|
||||
OBJECT_ID = "twitch_tokens"
|
||||
|
||||
lock = Lock()
|
||||
|
||||
@staticmethod
|
||||
async def save(acceess_token: str, refresh_token: str):
|
||||
data = {"access_token": acceess_token, "refresh_token": refresh_token}
|
||||
|
||||
async with TokenStorage.lock:
|
||||
async with aiofiles.open(config.SECRETS_FILE_PATH, "w") as f:
|
||||
await f.write(json.dumps(data))
|
||||
|
||||
async with mongo_manager.connect() as client:
|
||||
db = client.get_default_database()
|
||||
collection = db[TokenStorage.COLLECTION_NAME]
|
||||
|
||||
await collection.update_one(
|
||||
{"_id": TokenStorage.OBJECT_ID},
|
||||
{"$set": data},
|
||||
upsert=True
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
async def get() -> tuple[str, str]:
|
||||
async with mongo_manager.connect() as client:
|
||||
db = client.get_default_database()
|
||||
collection = db[TokenStorage.COLLECTION_NAME]
|
||||
|
||||
data = await collection.find_one({"_id": TokenStorage.OBJECT_ID})
|
||||
if data is not None:
|
||||
return data["access_token"], data["refresh_token"]
|
||||
|
||||
async with TokenStorage.lock:
|
||||
async with aiofiles.open(config.SECRETS_FILE_PATH, "r") as f:
|
||||
data_str = await f.read()
|
||||
|
||||
data = json.loads(data_str)
|
||||
|
||||
await TokenStorage.save(data["access_token"], data["refresh_token"])
|
||||
|
||||
return data["access_token"], data["refresh_token"]
|
||||
@@ -1,6 +1,5 @@
|
||||
from asyncio import Lock, sleep
|
||||
from datetime import datetime
|
||||
import json
|
||||
import logging
|
||||
|
||||
from twitchAPI.helper import first
|
||||
@@ -9,9 +8,7 @@ from twitchAPI.twitch import Twitch
|
||||
from twitchAPI.type import AuthScope
|
||||
from twitchAPI.object.eventsub import StreamOnlineEvent, ChannelUpdateEvent
|
||||
|
||||
import aiofiles
|
||||
|
||||
from config import config, StreamerConfig
|
||||
from core.config import config, StreamerConfig
|
||||
from services.notification import notify
|
||||
from services.twitch_state import State
|
||||
|
||||
@@ -19,27 +16,6 @@ from services.twitch_state import State
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class TokenStorage:
|
||||
lock = Lock()
|
||||
|
||||
@staticmethod
|
||||
async def save(acceess_token: str, refresh_token: str):
|
||||
data = json.dumps({"access_token": acceess_token, "refresh_token": refresh_token})
|
||||
|
||||
async with TokenStorage.lock:
|
||||
async with aiofiles.open(config.SECRETS_FILE_PATH, "w") as f:
|
||||
await f.write(data)
|
||||
|
||||
@staticmethod
|
||||
async def get() -> tuple[str, str]:
|
||||
async with TokenStorage.lock:
|
||||
async with aiofiles.open(config.SECRETS_FILE_PATH, "r") as f:
|
||||
data_str = await f.read()
|
||||
|
||||
data = json.loads(data_str)
|
||||
return data["access_token"], data["refresh_token"]
|
||||
|
||||
|
||||
class TwitchService:
|
||||
lock = Lock()
|
||||
|
||||
Reference in New Issue
Block a user