Создал скрипт для работы с базой данных
This commit is contained in:
parent
0c1f7efb82
commit
8e3113bfca
1 changed files with 85 additions and 0 deletions
85
source/gitlab-discord_bot/database.py
Normal file
85
source/gitlab-discord_bot/database.py
Normal file
|
@ -0,0 +1,85 @@
|
||||||
|
''' База данных бота-интегратора Дискорда и ГитЛаба
|
||||||
|
© Стешенко Артём и Зажигин Богдан 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
|
Loading…
Add table
Reference in a new issue