From a09e81bb6fc06b03d7cc73a1f683535773c38d10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=97=D0=B0=D0=B6=D0=B8=D0=B3=D0=B8=D0=BD=20=D0=91=D0=BE?= =?UTF-8?q?=D0=B3=D0=B4=D0=B0=D0=BD=20=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5?= =?UTF-8?q?=D0=B5=D0=B2=D0=B8=D1=87?= Date: Tue, 11 Apr 2023 23:12:04 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=B8=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D0=BE=D0=B2=D0=B0=D0=BB=20=D0=B3=D0=BB=D0=B0=D0=B2=D0=BD?= =?UTF-8?q?=D1=8B=D0=B9=20=D1=84=D0=B0=D0=B9=D0=BB=20=D0=B2=20=D0=BF=D1=80?= =?UTF-8?q?=D0=BE=D1=81=D1=82=D0=BE=20=C2=AB`boy.py`=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/gitlab-discord_bot/bot.py | 116 +++++++++++++++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100644 source/gitlab-discord_bot/bot.py diff --git a/source/gitlab-discord_bot/bot.py b/source/gitlab-discord_bot/bot.py new file mode 100644 index 0000000..a35fc1b --- /dev/null +++ b/source/gitlab-discord_bot/bot.py @@ -0,0 +1,116 @@ +''' Интеграция Дискорда и ГитЛаба +© Стешенко Артём и Зажигин Богдан 2023—2023 ''' + +from os import environ, remove + # Получение переменных среды и удаление файлов — + # https://docs.python.org/3.12/library/os.html +import msgpack + # Бинарная сериализация, создание машинной базы данных — + # https://github.com/msgpack/msgpack-python/blob/main/README.md +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() + + +gitlab_instance = gitlab.Gitlab(url = 'https://gitlab.megu.one', private_token = environ.get("TOKEN_GITLAB")) # определение адреса и токена экземляра ГитЛаба +'''project = gitlab_instance.projects.get(13)''' # определение проекта в котором нужно создавать задачи + # TODO: Привязка экзепмляра и проекта к Дискорд Каналу в БД, а не в коде + + +intents = discord.Intents.default() # использовать требования по умолчанию +intents.message_content = True # требовать содержимое сообщений + # Определение событий требуемых для функционирования бота, например, «пользователь печатает» можно игнорировать, а отправленное сообщение нужно получить + +discord_bot = discord.Client(intents=intents) # определение конфигурации бота + +@discord_bot.event +async def on_message(message): # обработка каждого сообщения + command = message.content.startswith + reply = message.channel.send + + if message.author == discord_bot.user: # самооигнор + return + + issue_text = message.content.replace("/issue ","") # получение текста команды «issue» + if command('/issue'): # команда создания задачи на ГитЛабе + if database_spisok.get(int(message.channel.id)): + project = gitlab_instance.projects.get(database_spisok.get(int(message.channel.id))) + if project.issues.create({'title': issue_text}): + await reply("Задача «" + issue_text + "» создана успешно, ^w^") + else: + await reply("не получилось, QwQ") + else: + await reply("данных нет, введите пожалуйста id для подключения через /project (id проекта), ^w^") + + if command('/project'): + try: + database_spisok[int(message.channel.id)] = int(message.content.replace("/project ","")) + open("database.msgpack", "wb").write(msgpack.packb(database_spisok)) + await reply("данные сохранены ^w^") + except: + await reply("не удалось сохранить id") + + if command('/remove'): # команда удаления базы данных + try: + remove("database.msgpack") + await reply("данные удалены ^w^") + except: + await reply("не удалось удалить файлы") + + if command('/show'): + if database_spisok.get(int(message.channel.id)): + await reply(database_spisok.get(int(message.channel.id))) + else: + await reply("данных нет, введите id для подключения через /project (id проекта), ^w^") + + if command('/speak'): + await reply("я бот для создания проектов на gitlab через дискорд созданный Артёмом (ака: TheRandomFurryGuy) и Богданом богом данным (ака: Zaboal) | [идея сделать меня фурри была предложена 1-м ради шутки]") + await reply("====================================") + await reply("список комманд которые я выполняю:\n/issue - создание задачи на gitlab\n/project - подключение id канала discord с id канала gitlab\n/remove - удаление id\n/show - показ id (к каждому каналу discord подключён отдельный id gitlab)\n/speak - я расскажу немного о себе (что сейчас и делаю)") + + '''if command('/save'): + open("database.msgpack", "wb").write(msgpack.packb(database_spisok))''' + +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