diff --git a/bot_callbacks.py b/bot_callbacks.py
index 7ddcba2..b14e257 100644
--- a/bot_callbacks.py
+++ b/bot_callbacks.py
@@ -4,8 +4,7 @@ import html
import time
import traceback
-from mab import MatrixBot, TextCommandFilter
-from nio import MatrixRoom, RoomMessageText
+from mab import * # type: ignore
import util
from database import Database
@@ -14,7 +13,6 @@ from datatypes import *
#
# PRIVATE
#
-_bot: MatrixBot = None # type: ignore
_db: Database = None # type: ignore
_COMMANDS = {
@@ -27,6 +25,7 @@ _COMMANDS = {
"ban": "Забанить IP адрес",
"unban": "Разбанить IP адрес",
"bans": "Получить список забаненных IP адресов",
+ "short": "(Небезопасно) Создать токен-имя",
}
def _generate_help_message() -> str:
@@ -46,38 +45,35 @@ def _generate_help_message() -> str:
#
# COMMAND HANDLERS
#
-async def _on_cmd_help(room: MatrixRoom, event: RoomMessageText) -> None:
+async def _on_cmd_help(ctx: EventContext) -> None:
"""!help"""
- await _bot.send_text_to_room(room.room_id, _generate_help_message(), is_html=True)
+ await ctx.bot.send_text(ctx.room, _generate_help_message())
-async def _on_cmd_info(room: MatrixRoom, event: RoomMessageText) -> None:
+async def _on_cmd_info(ctx: EventContext) -> None:
"""!info"""
# get room info (or add it)
- room_info = await _db.room_get(room.room_id)
+ room_info = await _db.room_get(ctx.room.room_id)
if room_info is None:
- room_info = await _db.room_create(room.room_id)
+ room_info = await _db.room_create(ctx.room.room_id)
# failure
if room_info is None:
- await _bot.send_text_to_room(
- room.room_id,
- "Нет информации о комнате",
- is_html=True
+ await ctx.bot.send_text(
+ ctx.room, "Нет информации о комнате"
)
return
# respond
response = "Сведения о комнате
"
response += f"Канал: {html.escape(room_info.code)}"
- await _bot.send_text_to_room(room.room_id, response, is_html=True)
+ await ctx.bot.send_text(ctx.room, response)
-async def _on_cmd_tokens(room: MatrixRoom, event: RoomMessageText) -> None:
+async def _on_cmd_tokens(ctx: EventContext) -> None:
"""!info"""
# 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,
- "Нет токенов, используйте !auth",
- is_html=True
+ await ctx.bot.send_text(
+ ctx.room,
+ "Нет токенов, используйте !auth"
)
return
# create the list of tokens
@@ -92,15 +88,15 @@ async def _on_cmd_tokens(room: MatrixRoom, event: RoomMessageText) -> None:
response += f"
{token}"
- await _bot.send_text_to_room(room.room_id, response, is_html=True)
+ await ctx.bot.send_text(ctx.room, response)
-async def _on_cmd_name(room: MatrixRoom, event: RoomMessageText) -> None:
+async def _on_cmd_name(ctx: EventContext) -> None:
"""!name"""
# check arguments
- if len(event.command_args) < 1:
+ if len(ctx[CTX_CMD_ARGS]) < 1:
error = "Требуется указать как минимум токен. Если хотите убрать имя, то имя указывать не надо. Если имя нужно назначить или изменить, то после токена укажите новое имя."
- await _bot.send_text_to_room(room.room_id, error, is_html=True)
+ await ctx.bot.send_text(ctx.room, error)
return
- token = event.command_args[0]
- new_name = " ".join(event.command_args[1:])
+ token = ctx[CTX_CMD_ARGS][0]
+ new_name = " ".join(ctx[CTX_CMD_ARGS][1:])
if not new_name.strip():
new_name = None
# check if token exists
if await _db.token_get(token) is None:
- await _bot.send_text_to_room(room.room_id, "Токен не существует", is_html=True)
+ await ctx.bot.send_text(ctx.room, "Токен не существует")
return
# set new name
await _db.token_set_name(token, new_name)
@@ -153,51 +149,51 @@ async def _on_cmd_name(room: MatrixRoom, event: RoomMessageText) -> None:
else:
response = f"Удалено имя для токена {token}"
# respond
- await _bot.send_text_to_room(room.room_id, response, is_html=True)
+ await ctx.bot.send_text(ctx.room, response)
-async def _on_cmd_ban(room: MatrixRoom, event: RoomMessageText) -> None:
+async def _on_cmd_ban(ctx: EventContext) -> None:
"""!ban"""
# check arguments
- if len(event.command_args) < 2:
+ if len(ctx[CTX_CMD_ARGS]) < 2:
error = "Формат: !ban <IP> <SECONDS> [REASON]"
- await _bot.send_text_to_room(room.room_id, error, is_html=True)
+ await ctx.bot.send_text(ctx.room, error)
return
# get event.command_args
try:
- ip = event.command_args[0]
- duration = float(event.command_args[1])
- reason = " ".join(event.command_args[2:]) if event.command_args[2:] else "Manual ban"
+ ip = ctx[CTX_CMD_ARGS][0]
+ duration = float(ctx[CTX_CMD_ARGS][1])
+ reason = " ".join(ctx[CTX_CMD_ARGS][2:]) if ctx[CTX_CMD_ARGS][2:] else "Manual ban"
except:
error = "Возникла ошибка. Наверняка неправильно указаны секунды."
- await _bot.send_text_to_room(room.room_id, error, is_html=True)
+ await ctx.bot.send_text(ctx.room, error)
return
# ban
try:
await _db.ban_create(ip, time.time() + duration, reason)
- await _bot.send_text_to_room(room.room_id, "IP адрес заблокирован", is_html=True)
+ await ctx.bot.send_text(ctx.room, "IP адрес заблокирован")
except:
- await _bot.send_text_to_room(room.room_id, "Возникла ошибка", is_html=True)
+ await ctx.bot.send_text(ctx.room, "Возникла ошибка")
-async def _on_cmd_unban(room: MatrixRoom, event: RoomMessageText) -> None:
+async def _on_cmd_unban(ctx: EventContext) -> None:
"""!unban"""
# check arguments
- if len(event.command_args) != 1:
+ if len(ctx[CTX_CMD_ARGS]) != 1:
error = "Формат: !ban <IP>"
- await _bot.send_text_to_room(room.room_id, error, is_html=True)
+ await ctx.bot.send_text(ctx.room, error)
return
# unban
try:
- await _db.ban_delete(event.command_args[0])
- await _bot.send_text_to_room(room.room_id, "IP адрес разблокирован (если он был заблокирован)", is_html=True)
+ await _db.ban_delete(ctx[CTX_CMD_ARGS][0])
+ await ctx.bot.send_text(ctx.room, "IP адрес разблокирован (если он был заблокирован)")
except:
- await _bot.send_text_to_room(room.room_id, "Возникла ошибка", is_html=True)
+ await ctx.bot.send_text(ctx.room, "Возникла ошибка")
-async def _on_cmd_bans(room: MatrixRoom, event: RoomMessageText) -> None:
+async def _on_cmd_bans(ctx: EventContext) -> None:
"""!bans"""
# list
bans = _db.ban_get_all()
if not bans:
- await _bot.send_text_to_room(room.room_id, "Нет заблокированных IP адресов", is_html=True)
+ await ctx.bot.send_text(ctx.room, "Нет заблокированных IP адресов")
return
# create the response
result = "Список заблокированных IP{html.escape(ban["reason"])}!short <token>"
+ await ctx.bot.send_text(ctx.room, error)
+ return
+ # create new token
+ try:
+ token = await _db.token_create(ctx[CTX_CMD_ARGS][0])
+ except Exception as e:
+ await ctx.bot.send_text(ctx.room, f"Не удалось создать токен: {" ".join(e.args)}")
+ return
+ # create the response
+ response = "Создан новый токен"
+ response += f"{token.code}"
+ response += f"