Use mongodb for twitch tokens

This commit is contained in:
2024-11-17 01:16:14 +01:00
parent b5a64c02ce
commit 9ad15ccef3
11 changed files with 442 additions and 149 deletions

View File

@@ -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
View 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()

View File

@@ -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()),

View File

@@ -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__)

View File

@@ -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

View File

@@ -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

View File

@@ -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__)

View 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"]

View File

@@ -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()