discord-gitlab/source/gitlab-discord_bot/database.py

85 lines
No EOL
3.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

''' База данных бота-интегратора Дискорда и ГитЛаба
© Стешенко Артём и Зажигин Богдан 2023—2023 '''
from dataclasses import dataclass, field
# Описание структур данных —
# 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
# Бинарная сериализация, создание машинной базы данных —
# https://github.com/msgpack/msgpack-python/blob/main/README.md
@dataclass
class GitlabDiscordBinding:
"""Данные, необходимые для интеграции Дискорд Канала и Гитлаб Проекта."""
discord_user_gitlab_token: str # Персональный токен Дискорд Пользователя для ГитЛаба
gitlab_project_url: str # URL ГитЛаб Проекта для которого подходит токен
discord_channel_id: int # Идентификационный номер Дискорд Канала для работы с проектом в ГитЛабе
discord_user_id: int # Идентификационный номер Дискорд Пользователя
# def get_project_id(self):
def get_project_host_url(self):
""" Слишком простой метод для реализации.
Используйте `URL.host` из `yarl`. """
return False
@dataclass
class GitlabDiscordDatabase:
""" Методы для работы со списком значений «`GitlabDiscordBinding`». """
gitlab_discord_bindings: list[GitlabDiscordBinding] = field(default_factory = lambda: [GitlabDiscordBinding("0", "0", 0, 0)])
filename: str = "gitlab-discord.msgpack"
def save(self, filename: str = filename) -> bool:
""" Подготовка базы данных и сохранение её сериализации
файл с названием «`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
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:
""" Установление значений из сериализованного файла
базы данных в с названием «gitlab-discord.msgpack» по умолчанию. """
def prepare(basic_list: list) -> list[GitlabDiscordBinding]:
database = list()
for element in range(len(basic_list)):
database.append(GitlabDiscordBinding(
discord_user_gitlab_token = basic_list[element][0],
gitlab_project_url = basic_list[element][1],
discord_channel_id = basic_list[element][2],
discord_user_id = basic_list[element][3]
))
return database
try:
file = open(filename, "rb")
content = file.read()
basic_list = unpackb(content)
self.gitlab_discord_bindings = prepare(basic_list)
return True
except:
return False