76 lines
No EOL
3.1 KiB
Python
76 lines
No EOL
3.1 KiB
Python
''' База данных бота-интегратора Дискорда и ГитЛаба
|
||
© Стешенко Артём и Зажигин Богдан 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 |