add ban and unban commands, integrate BanMiddleware, and extend database schema

This commit is contained in:
2026-07-02 22:12:05 +03:00
parent a097abf5bc
commit 1287fe7ec8
8 changed files with 138 additions and 5 deletions
+22
View File
@@ -52,3 +52,25 @@ async def cmd_view(message: Message, locale: str):
content_type=log[4],
timestamp=log[5],
text=log[6]))
@router.message(Command("ban"), F.from_user.id.in_(settings.admins))
async def cmd_ban(message: Message, locale: str):
args = message.text.split()
if len(args) < 2 or not args[1].isdigit():
await message.answer("Usage: /ban [user_id]")
return
user_id = int(args[1])
db.ban_user(user_id)
await message.answer(_("user_banned", locale=locale, user_id=user_id))
@router.message(Command("unban"), F.from_user.id.in_(settings.admins))
async def cmd_unban(message: Message, locale: str):
args = message.text.split()
if len(args) < 2 or not args[1].isdigit():
await message.answer("Usage: /unban [user_id]")
return
user_id = int(args[1])
db.unban_user(user_id)
await message.answer(_("user_unbanned", locale=locale, user_id=user_id))
+16
View File
@@ -40,3 +40,19 @@ class I18nMiddleware(BaseMiddleware):
data["locale"] = "en"
return await handler(event, data)
class BanMiddleware(BaseMiddleware):
async def __call__(
self,
handler: Callable[[TelegramObject, Dict[str, Any]], Awaitable[Any]],
event: TelegramObject,
data: Dict[str, Any],
) -> Any:
from_user = data.get("event_from_user")
if from_user:
from bot.utils.db import db
if db.is_user_banned(from_user.id):
return
return await handler(event, data)
+26 -2
View File
@@ -18,7 +18,8 @@ class Database:
username TEXT,
full_name TEXT,
language_code TEXT,
first_seen TIMESTAMP
first_seen TIMESTAMP,
is_banned INTEGER DEFAULT 0
)
""")
conn.execute("""
@@ -36,12 +37,35 @@ class Database:
def log_user(self, user):
with self.get_connection() as conn:
# Check if user already exists to preserve is_banned status if we were using INSERT OR REPLACE
# But INSERT OR REPLACE would overwrite is_banned if we don't include it.
# Better to use INSERT OR IGNORE and then UPDATE or a more complex query.
conn.execute("""
INSERT OR REPLACE INTO users (user_id, username, full_name, language_code, first_seen)
INSERT INTO users (user_id, username, full_name, language_code, first_seen)
VALUES (?, ?, ?, ?, ?)
ON CONFLICT(user_id) DO UPDATE SET
username=excluded.username,
full_name=excluded.full_name,
language_code=excluded.language_code
""", (user.id, user.username, user.full_name, user.language_code, datetime.now()))
conn.commit()
def ban_user(self, user_id):
with self.get_connection() as conn:
conn.execute("UPDATE users SET is_banned = 1 WHERE user_id = ?", (user_id,))
conn.commit()
def unban_user(self, user_id):
with self.get_connection() as conn:
conn.execute("UPDATE users SET is_banned = 0 WHERE user_id = ?", (user_id,))
conn.commit()
def is_user_banned(self, user_id):
with self.get_connection() as conn:
cursor = conn.execute("SELECT is_banned FROM users WHERE user_id = ?", (user_id,))
row = cursor.fetchone()
return bool(row[0]) if row else False
def log_message(self, message):
self.log_user(message.from_user)
with self.get_connection() as conn: