discord-gitlab/source/gitlab-discord_bot/database.py

76 lines
No EOL
3.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

''' База данных бота-интегратора Дискорда и ГитЛаба
© Стешенко Артём и Зажигин Богдан 2023—2023 '''
from dataclasses import dataclass, field, astuple
# Описание структур данных —
# https://docs.python.org/3/library/dataclasses.html
from msgpack import packb, unpackb
# Бинарная сериализация, создание машинной базы данных —
# https://github.com/msgpack/msgpack-python/blob/main/README.md
from yarl import URL
@dataclass
class GitlabDiscordBinding:
"""Данные, необходимые для интеграции Дискорд Канала и Гитлаб Проекта."""
discord_user_gitlab_token: str # Персональный токен Дискорд Пользователя для ГитЛаба
gitlab_project_url: str # URL ГитЛаб Проекта для которого подходит токен
discord_channel_id: int # Идентификационный номер Дискорд Канала для работы с проектом в ГитЛабе
discord_user_id: int # Идентификационный номер Дискорд Пользователя
# def get_project_id(self):
def get_project_host_url(self):
project_host_url = "https://" + str(URL(self.gitlab_project_url).host)
return project_host_url
@dataclass
class GitlabDiscordDatabase:
""" Методы для работы со списком значений «`GitlabDiscordBinding`». """
gitlab_discord_bindings: list[GitlabDiscordBinding] = field(default_factory = lambda: [GitlabDiscordBinding("0", "0", 0, 0)])
filename: str = "gitlab-discord.msgpack"
def save(self, filename: str = filename) -> None:
""" Подготовка базы данных и сохранение её сериализации
файл с названием «`gitlab-discord.msgpack`» по умолчанию. """
file = open(filename, "wb")
serialization = packb(astuple(self))
file.write(serialization) # type: ignore
def retrieve(self, filename: str = filename) -> bool:
""" Установление значений из сериализованного файла
базы данных в с названием «gitlab-discord.msgpack» по умолчанию. """
def prepare(basic_list: list) -> list[GitlabDiscordBinding]:
database = list()
for element in range(len(basic_list)):
database.append(GitlabDiscordBinding(
discord_user_gitlab_token = basic_list[element][0],
gitlab_project_url = basic_list[element][1],
discord_channel_id = basic_list[element][2],
discord_user_id = basic_list[element][3]
))
return database
try:
file = open(filename, "rb")
content = file.read()
basic_list = unpackb(content)
self.gitlab_discord_bindings = prepare(basic_list)
return True
except:
return False
def get_project(self, discord_channel_id: int):
for binding in range(len(self.gitlab_discord_bindings)):
if self.gitlab_discord_bindings[binding].discord_channel_id == discord_channel_id:
return self.gitlab_discord_bindings[binding].gitlab_project_url