impr: Update database to use guild ids.

This commit is contained in:
Lemon4ksan
2025-01-09 12:51:25 +03:00
parent 7df90b48df
commit 7d462442cc
5 changed files with 158 additions and 89 deletions

View File

@@ -5,85 +5,98 @@ from typing import Any, cast
from pymongo import MongoClient
from pymongo.collection import Collection
from yandex_music import Track
from MusicBot.database.user import User, ExplicitUser, TrackInfo
from MusicBot.database.user import User, ExplicitUser
from MusicBot.database.guild import Guild, ExplicitGuild
client: MongoClient = MongoClient("mongodb://localhost:27017/")
users: Collection[User] = client.YandexMusicBot.users
def create_record(uid: int | str) -> None:
"""Create user database record.
guilds: Collection[Guild] = client.YandexMusicBot.guilds
Args:
uid (int | str): User id.
"""
uid = str(uid)
users.insert_one(ExplicitUser(
_id=uid,
ym_token=None,
tracks_list=[],
current_track=None,
is_stopped=True
))
class BaseUsersDatabase:
def update(uid: int | str, data: dict[Any, Any]) -> None:
"""Update user record.
def create_record(self, uid: int) -> None:
"""Create user database record.
Args:
uid (int | str): User id.
data (dict[Any, Any]): Updated data.
"""
get_user(uid)
users.update_one({'_id': str(uid)}, {"$set": data})
Args:
uid (int): User id.
"""
uid = uid
users.insert_one(ExplicitUser(
_id=uid,
ym_token=None
))
def get_user(uid: int | str) -> User:
"""Get user record from database. Create new entry if not present.
def update(self, uid: int, data: User) -> None:
"""Update user record.
Args:
uid (int | str): User id.
Args:
uid (int): User id.
data (dict[Any, Any]): Updated data.
"""
self.get_user(uid)
users.update_one({'_id': uid}, {"$set": data})
Returns:
User: User record.
"""
user = users.find_one({'_id': str(uid)})
if not user:
create_record(uid)
user = users.find_one({'_id': str(uid)})
return cast(User, user)
def get_user(self, uid: int) -> User:
"""Get user record from database. Create new entry if not present.
def get_ym_token(uid: int | str) -> str | None:
user = users.find_one({'_id': str(uid)})
if not user:
create_record(uid)
user = cast(User, users.find_one({'_id': str(uid)}))
return user['ym_token']
Args:
uid (int): User id.
def get_tracks_list(uid: int | str) -> list[TrackInfo]:
user = get_user(uid)
return user.get('tracks_list')
Returns:
User: User record.
"""
user = users.find_one({'_id': uid})
if not user:
self.create_record(uid)
user = users.find_one({'_id': uid})
return cast(User, user)
def pop_track(uid: int | str) -> TrackInfo:
tracks_list = get_tracks_list(uid)
track = tracks_list.pop(0)
update(uid, {'tracks_list': tracks_list})
return track
def get_ym_token(self, uid: int) -> str | None:
user = users.find_one({'_id': uid})
if not user:
self.create_record(uid)
user = cast(User, users.find_one({'_id': uid}))
return user['ym_token']
def add_track(uid: int | str, track: Track | TrackInfo) -> None:
tracks_list = get_tracks_list(uid)
if isinstance(track, Track):
track = TrackInfo(
track_id=str(track.id),
title=track.title, # type: ignore
avail=track.available, # type: ignore
artists=", ".join(track.artists_name()),
albums=", ".join([album.title for album in track.albums]), # type: ignore
duration=track.duration_ms, # type: ignore
explicit=track.explicit or bool(track.content_warning),
bg_video=track.background_video_uri
)
tracks_list.append(track)
update(uid, {'tracks_list': tracks_list})
class BaseGuildsDatabase:
def create_record(self, gid: int) -> None:
"""Create guild database record.
def set_current_track(uid: int | str) -> None:
update(uid, {'current_track': str(uid)})
Args:
gid (int): Guild id.
"""
guilds.insert_one(ExplicitGuild(
_id=gid,
tracks_list=[],
previous_tracks_list=[],
current_track=None,
is_stopped=True,
allow_explicit=True,
allow_menu=True
))
def update(self, gid: int, data: dict[Any, Any]) -> None:
"""Update guild record.
Args:
gid (int): Guild id.
data (dict[Any, Any]): Updated data.
"""
self.get_guild(gid)
guilds.update_one({'_id': gid}, {"$set": data})
def get_guild(self, gid: int) -> Guild:
"""Get guild record from database. Create new entry if not present.
Args:
uid (int): User id.
Returns:
Guild: Guild record.
"""
guild = guilds.find_one({'_id': gid})
if not guild:
self.create_record(gid)
guild = guilds.find_one({'_id': gid})
return cast(Guild, guild)