diff --git a/source/gitlab-discord_bot/database.py b/source/gitlab-discord_bot/database.py new file mode 100644 index 0000000..18bc50a --- /dev/null +++ b/source/gitlab-discord_bot/database.py @@ -0,0 +1,85 @@ +''' База данных бота-интегратора Дискорда и ГитЛаба +© Стешенко Артём и Зажигин Богдан 2023—2023 ''' + + +from dataclasses import dataclass, field + # Описание структур данных — + # https://docs.python.org/3/library/dataclasses.html +# from yarl import URL +# # Работа с URL на Гитлаб Проект — +# # https://yarl.aio-libs.org/en/latest +from msgpack import ExtType, packb, unpackb + # Бинарная сериализация, создание машинной базы данных — + # https://github.com/msgpack/msgpack-python/blob/main/README.md + + + +@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): + """ Слишком простой метод для реализации. + Используйте `URL.host` из `yarl`. """ + return False + + +@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) -> bool: + """ Подготовка базы данных и сохранение её сериализации + файл с названием «`gitlab-discord.msgpack`» по умолчанию. """ + + def prepare(database: list[GitlabDiscordBinding]) -> list: + basic_list = list() # создание обычного объекта типа «список» + for binding in range(len(self.gitlab_discord_bindings)): # перевод в него объектов типа «GitlabDiscordBinding» + basic_list.append([ + self.gitlab_discord_bindings[binding].discord_user_gitlab_token, + self.gitlab_discord_bindings[binding].gitlab_project_url, + self.gitlab_discord_bindings[binding].discord_channel_id, + self.gitlab_discord_bindings[binding].discord_user_id]) + return basic_list + + try: + file = open(filename, "wb") + serialization = packb(prepare(self.gitlab_discord_bindings)) + file.write(serialization) # type: ignore + return True + except: + return False + + 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 \ No newline at end of file