Compare commits

..

6 commits

2 changed files with 62 additions and 121 deletions

View file

@ -0,0 +1,62 @@
''' Интеграция Дискорда и ГитЛаба
© Стешенко Артём и Зажигин Богдан 20232023 '''
from os import environ
# Получение переменных среды и удаление файлов —
# https://docs.python.org/3.12/library/os.html
import gitlab, discord
# Обертка АПИ ГитЛаба — https://python-gitlab.readthedocs.io/en/latest и
# АПИ Дискорда — https://discordpy.readthedocs.io/en/latest
database_spisok = dict()
gitlab_instance = gitlab.Gitlab(url = 'https://gitlab.megu.one', private_token = environ.get("TOKEN_GITLAB")) # определение адреса и токена экземляра ГитЛаба
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(str(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("Данных нет, введите идентификатор проекта через `/project <ID>` ^w^")
if command('/project'):
try:
database_spisok[int(message.channel.id)] = int(message.content.replace("/project ",""))
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("Данных нет, введите идентификатор проекта через `/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 - я расскажу немного о себе (что сейчас и делаю)")
discord_bot.run(str(environ.get("TOKEN_DISCORD"))) # авторизация бота по токену из среды и запуск

View file

@ -1,121 +0,0 @@
''' Интеграция Дискорда и ГитЛаба
© Стешенко Артём и Зажигин Богдан 20232023 '''
from os import environ, remove
# Получение переменных среды и удаление файлов —
# https://docs.python.org/3.12/library/os.html
import logging
# Логирование логики бота —
# https://docs.python.org/3/library/logging.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
logging.error("Открытие базы данных…")
database = open("database.msgpack", "a+") # создать базу данных если её нет
'''database.close()'''
logging.error("Получение информации из базы данных…")
try: # декодирует базу данных если она есть
database_spisok = msgpack.unpackb(database.read())
logging.error("Декодирован MessagePack из базы данных…")
except:
database_spisok = dict()
logging.error("Декодирование не удалось, создан словарь…")
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)):
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 ",""))
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'):
database.write(str(msgpack.packb(database_spisok, use_bin_type = False)))
discord_bot.run(environ.get("TOKEN_DISCORD"), log_handler=None) # авторизация бота по токену из среды и запуск
# 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()'''