Basic database function implemented

This commit is contained in:
Nikita Tyukalov, ASUS, Linux
2026-08-25 21:13:27 +03:00
parent ff6656fdb0
commit ddc1c36c72
7 changed files with 360 additions and 63 deletions

View File

@@ -8,22 +8,25 @@ from mab import MatrixBot
from nio import MatrixRoom, RoomMessageText
import util
from database import Database
from datatypes import *
#
# PRIVATE
#
_bot: MatrixBot = None # type: ignore
_db: Database = None # type: ignore
def _generate_help_message() -> str:
"""Generates help message in HTML markup"""
result = "<b><i>Как использовать</i></b><br><ol>"
result = "<strong><i>Как использовать</i></strong><br><ol>"
result += "<li>Используя <code>!auth</code>, создайте токен</li>"
result += "<li>Добавьте бота в комнату для уведомлений</li>"
result += "<li>Выполните <code>!info</code> в комнате, чтобы узнать код канала уведомений</li>"
result += "<li>Используя полученные токен и код канала, отправьте уведомление через веб-запрос</li>"
result += "</ol>"
result += "<br><br><b><i>Команды</i></b>"
result += "<br><br><strong><i>Команды</i></strong>"
for aliases in _COMMANDS:
result += f"<br><code>!{aliases[0]}</code> - <i>{html.escape(_COMMANDS[aliases][1])}</i>"
return result
@@ -51,7 +54,7 @@ async def _on_text(room: MatrixRoom, event: RoomMessageText) -> None:
if cb:
break
if cb is None:
await _bot.send_text_to_room(room.room_id, "<b>Используйте <code>!help</code></b>")
await _bot.send_text_to_room(room.room_id, "<strong>Используйте <code>!help</code></strong>")
return
try:
await cb(room, parts[1:])
@@ -67,93 +70,112 @@ async def _on_cmd_help(room: MatrixRoom, args: list[str]) -> None:
async def _on_cmd_info(room: MatrixRoom, args: list[str]) -> None:
"""!info"""
response = "<b><i>Сведения о комнате</i></b><br>"
response += f"<b>channel: <b><code>{html.escape(room.room_id)}</code>"
# get room info (or add it)
room_info = await _db.room_get(room.room_id)
if room_info is None:
room_info = await _db.room_create(room.room_id)
# failure
if room_info is None:
await _bot.send_text_to_room(
room.room_id,
"<strong>Нет информации о комнате</strong>",
is_html=True
)
return
# respond
response = "<strong><i>Сведения о комнате</i></strong><br>"
response += f"<strong>Канал:</strong> <code>{html.escape(room_info.code)}</code>"
await _bot.send_text_to_room(room.room_id, response, is_html=True)
async def _on_cmd_tokens(room: MatrixRoom, args: list[str]) -> None:
"""!info"""
TEST_LIST = {
"t0K3n": {
"created": time.time() - 60,
"last_use": time.time() - 30,
"total_uses": 534,
"service_name": "Резервное копирование",
},
"T35t_t0KeN": {
"created": time.time() - 12341,
"last_use": time.time() - 123,
"total_uses": 342,
"service_name": None,
},
}
response = "<b><i>Список токенов</i></b>"
for token in TEST_LIST:
data = TEST_LIST[token]
response += f"<br><b><code>{html.escape(token)}</code></b><br><ul>"
if data["service_name"] is not None:
response += f"<li><b>Имя службы:</b> <code>{data["service_name"]}</code></li>"
# get all tokens and check if there are none
tokens = await _db.token_get_all()
if not tokens:
await _bot.send_text_to_room(
room.room_id,
"<strong>Нет токенов, используйте <code>!auth</code></strong>",
is_html=True
)
return
# create the list of tokens
response = "<strong><i>Список токенов</i></strong>"
for token in tokens:
response += f"<br><strong><code>{html.escape(token.code)}</code></strong><br><ul>"
if token.name is not None:
response += f"<li><strong>Имя службы:</strong> <code>{token.name}</code></li>"
else:
response += f"<li><b>Имя службы:</b> <i>указывается в запросе</i></li>"
response += f"<li><b>Создан:</b> <i>{util.date_to_text(data["created"])}</i></li>"
response += f"<li><b>Последнее использование:</b> <i>{util.date_to_text(data["last_use"])}</i></li>"
response += f"<li><b>Всего использований:</b> <i>{data["total_uses"]}</i></li>"
response += f"<li><strong>Имя службы:</strong> <i>указывается в запросе</i></li>"
response += f"<li><strong>Создан:</strong> <i>{util.date_to_text(token.created_at)}</i></li>"
response += f"<li><strong>Последнее использование:</strong> <i>{util.date_to_text(token.last_access_at)}</i></li>"
response += "</ul>"
# respond
await _bot.send_text_to_room(room.room_id, response, is_html=True)
async def _on_cmd_auth(room: MatrixRoom, args: list[str]) -> None:
"""!auth"""
new_token = "inr3i4evfds"
new_token_name = " ".join(args) if args else None
if type(new_token_name) is str and not new_token_name.strip():
new_token_name = None
response = "<b>Создан новый токен</b>"
response += f"<br><b>Код:</b> <code>{new_token}</code>"
response += f"<br><b>Имя сервиса:</b> "
if new_token_name:
response += f"<code>{html.escape(new_token_name)}</code>"
# create new token
token = await _db.token_create()
# set the name if it is provided
if args:
token.name = " ".join(args)
await _db.token_set_name(token.code, token.name)
# create the response
response = "<strong>Создан новый токен</strong>"
response += f"<br><strong>Код:</strong> <code>{token.code}</code>"
response += f"<br><strong>Имя сервиса:</strong> "
if token.name:
response += f"<code>{html.escape(token.name)}</code>"
else:
response += "указывается в запросе"
# respond
await _bot.send_text_to_room(room.room_id, response, is_html=True)
async def _on_cmd_deauth(room: MatrixRoom, args: list[str]) -> None:
"""!deauth"""
# no token provided
if len(args) != 1:
await _bot.send_text_to_room(room.room_id, "<b>Укажите токен, который надо удалить (должен быть ровно один аргумент)</b>", is_html=True)
await _bot.send_text_to_room(room.room_id, "<strong>Укажите токен, который надо удалить (должен быть ровно один аргумент)</strong>", is_html=True)
return
token = args[0]
# TODO
response = f"<b>Удалён токен <code>{token}</code></b>"
# check if token does not exist
if await _db.token_get(token) is None:
await _bot.send_text_to_room(room.room_id, "<strong>Токен не найден</strong>", is_html=True)
return
# remove the token
await _db.token_delete(token)
# respond
response = f"<strong>Удалён токен <code>{token}</code></strong>"
await _bot.send_text_to_room(room.room_id, response, is_html=True)
async def _on_cmd_name(room: MatrixRoom, args: list[str]) -> None:
"""!name"""
# check arguments
if len(args) < 1:
error = "<b>Требуется указать как минимум токен. Если хотите убрать имя, то имя указывать не надо. Если имя нужно назначить или изменить, то после токена укажите новое имя.</b>"
error = "<strong>Требуется указать как минимум токен. Если хотите убрать имя, то имя указывать не надо. Если имя нужно назначить или изменить, то после токена укажите новое имя.</strong>"
await _bot.send_text_to_room(room.room_id, error, is_html=True)
return
token = args[0]
new_name = " ".join(args[1:])
if not new_name.strip():
new_name = None
# TODO
# check if token exists
if await _db.token_get(token) is None:
await _bot.send_text_to_room(room.room_id, "<strong>Токен не существует</strong>", is_html=True)
return
# set new name
await _db.token_set_name(token, new_name)
# prepare the response
if new_name:
response = f"<b>Новое имя для токена <code>{token}</code>: <code>{new_name}</code></b>"
response = f"<strong>Новое имя для токена <code>{token}</code>: <code>{new_name}</code></strong>"
else:
response = f"<b>Удалено имя для токена <code>{token}</code></b>"
response = f"<strong>Удалено имя для токена <code>{token}</code></strong>"
# respond
await _bot.send_text_to_room(room.room_id, response, is_html=True)
async def _on_cmd_leave(room: MatrixRoom, args: list[str]) -> None:
"""!leave"""
await _bot.send_text_to_room(room.room_id, "<b>Команда не реализована</b>", is_html=True)
await _bot.send_text_to_room(room.room_id, "<strong>Команда не реализована</strong>", is_html=True)
_COMMANDS = {
("help", "h", "?"): (_on_cmd_help, "Получить справку"),
@@ -168,8 +190,9 @@ _COMMANDS = {
#
# PUBLIC
#
def setup(bot: MatrixBot) -> None:
def setup(bot: MatrixBot, db: Database) -> None:
"""Setup the callbacks"""
global _bot
global _bot, _db
_db = db
_bot = bot
_bot.add_event_callback(_on_text, RoomMessageText) # type: ignore