Создал скрипт для работы с базой данных
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