Basic database function implemented
This commit is contained in:
135
bot_callbacks.py
135
bot_callbacks.py
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user