Compare commits
6 commits
Author | SHA1 | Date | |
---|---|---|---|
e3b1bbacf6 | |||
e2a06a6219 | |||
|
0c1f7efb82 | ||
|
2ae2254c97 | ||
724faa3667 | |||
|
71ac1b60e1 |
2 changed files with 62 additions and 114 deletions
62
source/gitlab-discord_bot/bot.py
Normal file
62
source/gitlab-discord_bot/bot.py
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
''' Интеграция Дискорда и ГитЛаба
|
||||||
|
© Стешенко Артём и Зажигин Богдан 2023—2023 '''
|
||||||
|
|
||||||
|
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"))) # авторизация бота по токену из среды и запуск
|
|
@ -1,114 +0,0 @@
|
||||||
''' Интеграция Дискорда и ГитЛаба
|
|
||||||
© Стешенко Артём и Зажигин Богдан 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
|
|
||||||
|
|
||||||
|
|
||||||
database = open("database.msgpack", "a+") # создать базу данных если её нет
|
|
||||||
'''database.close()'''
|
|
||||||
|
|
||||||
try: # декодирует базу данных если она есть
|
|
||||||
database_spisok = msgpack.unpackb(database.read())
|
|
||||||
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)):
|
|
||||||
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(msgpack.packb(database_spisok, use_bin_type = True))
|
|
||||||
|
|
||||||
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()'''
|
|
Loading…
Add table
Reference in a new issue