Недоделал доделываемое
This commit is contained in:
parent
dd9ae4f828
commit
f3fbf605d3
2 changed files with 27 additions and 69 deletions
|
@ -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()'''
|
||||
#=======================================================================
|
|
@ -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
|
||||
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
|
Loading…
Add table
Reference in a new issue