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