add ban and unban commands, integrate BanMiddleware, and extend database schema
This commit is contained in:
@@ -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))
|
||||
|
||||
@@ -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
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user