diff --git a/source/gitlab-discord_bot/bot.py b/source/gitlab-discord_bot/bot.py index a35fc1b..5776361 100644 --- a/source/gitlab-discord_bot/bot.py +++ b/source/gitlab-discord_bot/bot.py @@ -1,24 +1,19 @@ ''' Интеграция Дискорда и ГитЛаба © Стешенко Артём и Зажигин Богдан 2023—2023 ''' -from os import environ, remove +from os import environ # Получение переменных среды и удаление файлов — # https://docs.python.org/3.12/library/os.html -import msgpack - # Бинарная сериализация, создание машинной базы данных — - # https://github.com/msgpack/msgpack-python/blob/main/README.md +from database import * + # Система управления базой данных — + # документация внутри кода import gitlab, discord # Обертка АПИ ГитЛаба — https://python-gitlab.readthedocs.io/en/latest и # АПИ Дискорда — https://discordpy.readthedocs.io/en/latest - -try: - with open("database.msgpack", "rb") as database: - database_content = database.read() - database_spisok = msgpack.unpackb(database_content, strict_map_key=False) -except: - database_spisok = dict() +database = GitlabDiscordDatabase() +database.retrieve # получить данные из сериализованного файла БД gitlab_instance = gitlab.Gitlab(url = 'https://gitlab.megu.one', private_token = environ.get("TOKEN_GITLAB")) # определение адреса и токена экземляра ГитЛаба @@ -57,7 +52,7 @@ async def on_message(message): # обработка каждого сообще open("database.msgpack", "wb").write(msgpack.packb(database_spisok)) await reply("данные сохранены ^w^") except: - await reply("не удалось сохранить id") + await reply("не удалось сохранить ссылку на проект") if command('/remove'): # команда удаления базы данных try: @@ -67,8 +62,8 @@ async def on_message(message): # обработка каждого сообще await reply("не удалось удалить файлы") if command('/show'): - if database_spisok.get(int(message.channel.id)): - await reply(database_spisok.get(int(message.channel.id))) + if database.get_project(message.channel.id): + await reply(database.get_project(message.channel.id)) else: await reply("данных нет, введите id для подключения через /project (id проекта), ^w^") @@ -85,32 +80,4 @@ discord_bot.run(environ.get("TOKEN_DISCORD")) # авторизация бота # TODO: Регистрировать команды бота в Команды Приложения — # https://discordpy.readthedocs.io/en/latest/interactions/api.html#application-commands: -#======================================================================= - -'''tree_commands = discord.app_commands.CommandTree(discord_bot) # Объявление дерева команд бота - if message.content.startswith('/project'): - slovar.update({message.channel.id: message.content.replace("/project ","")}) - await reply(slovar) -slovar = dict() -command_issue_extras = dict() -@tree_commands.command(name="issue", description="создать задачу на GitLab", nsfw=False, auto_locale_strings=False) -async def issue(interaction): - await interaction.response.send_message(f"Pong", ephemeral=True) -add_command(*command_issue, guild=None, guilds=None, override=True) -asyncio.run(sync(*command_issue, guild=None))''' - -#======================================================================= - -'''database_file = open("database.msgpack", "w") -database = msgpack.unpackb(database_file.read()) # \31123\123123\123132\213 -# {1: a}, {2: b} -Ctrl+c = SINGal TERMinate - -database[3] = "c" -# {1: a}, {2: b}, {3, c} - -# /save -database_file.write( - msgpack.packb(database, use_bin_type=True) # \31123\123123\123132\213 + \123123123123 -) -database_file.close()''' \ No newline at end of file +#======================================================================= \ No newline at end of file diff --git a/source/gitlab-discord_bot/database.py b/source/gitlab-discord_bot/database.py index 18bc50a..b76844e 100644 --- a/source/gitlab-discord_bot/database.py +++ b/source/gitlab-discord_bot/database.py @@ -2,15 +2,13 @@ © Стешенко Артём и Зажигин Богдан 2023—2023 ''' -from dataclasses import dataclass, field +from dataclasses import dataclass, field, astuple # Описание структур данных — # 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 +from msgpack import packb, unpackb # Бинарная сериализация, создание машинной базы данных — # https://github.com/msgpack/msgpack-python/blob/main/README.md +from yarl import URL @@ -25,9 +23,8 @@ class GitlabDiscordBinding: # def get_project_id(self): def get_project_host_url(self): - """ Слишком простой метод для реализации. - Используйте `URL.host` из `yarl`. """ - return False + project_host_url = "https://" + str(URL(self.gitlab_project_url).host) + return project_host_url @dataclass @@ -38,27 +35,15 @@ class GitlabDiscordDatabase: filename: str = "gitlab-discord.msgpack" - def save(self, filename: str = filename) -> bool: + + def save(self, filename: str = filename) -> None: """ Подготовка базы данных и сохранение её сериализации файл с названием «`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 + file = open(filename, "wb") + serialization = packb(astuple(self)) + file.write(serialization) # type: ignore - 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: """ Установление значений из сериализованного файла @@ -82,4 +67,10 @@ class GitlabDiscordDatabase: self.gitlab_discord_bindings = prepare(basic_list) return True except: - return False \ No newline at end of file + 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 \ No newline at end of file