With commands

parent a870b567
...@@ -7,6 +7,7 @@ import os ...@@ -7,6 +7,7 @@ import os
import atexit import atexit
from dotenv import load_dotenv from dotenv import load_dotenv
from aiogram.filters import Command from aiogram.filters import Command
from aiogram.filters import CommandObject
import logging import logging
from aiogram import types from aiogram import types
from aiogram.types import ChatMemberUpdated, Message, BotCommand from aiogram.types import ChatMemberUpdated, Message, BotCommand
...@@ -459,12 +460,146 @@ async def report_spam(message: types.Message): ...@@ -459,12 +460,146 @@ async def report_spam(message: types.Message):
# Удаляем сообщение с командой # Удаляем сообщение с командой
await message.delete() await message.delete()
# Обработчик команды /unban
@dp.message(Command("unban"))
async def unban_user_command(message: types.Message, command: CommandObject):
if message.chat.type not in ["group", "supergroup"]:
await message.reply("Эта команда доступна только в группах.")
return
# Проверяем права пользователя
chat_member = await bot.get_chat_member(message.chat.id, message.from_user.id)
if chat_member.status not in ["administrator", "creator"]:
await message.reply("❌ У вас нет прав для разбана пользователей.")
return
# Проверяем аргументы
if not command.args:
await message.reply("Использование: /unban user_id")
return
try:
user_id = int(command.args.strip()) # строго только ID
except ValueError:
await message.reply("❌ ID должен быть числом. Использование: /unban user_id")
return
try:
# Разбан в чате
await bot.unban_chat_member(message.chat.id, user_id, only_if_banned=True)
# Удаляем из таблицы забаненных
conn = sqlite3.connect(db_path)
cursor = conn.cursor()
cursor.execute("DELETE FROM banned_users WHERE id = ?", (user_id,))
conn.commit()
conn.close()
# Лог в группу логов
await bot.send_message(
log_chat_id,
f"✅ Moderator <b>{message.from_user.full_name}</b> ({message.from_user.id}) "
f"unbanned user с ID <b>{user_id}</b>.",
parse_mode="HTML"
)
# Удаляем сообщение с командой
await message.delete()
except Exception as e:
await message.reply(f"Unban error: {e}")
await bot.send_message(
log_chat_id,
f"❌ Error of unbanning ID <b>{command.args}</b>: {e}",
parse_mode="HTML"
)
# Обработчик команды /ban
@dp.message(Command("ban"))
async def ban_user_command(message: types.Message, command: CommandObject):
# Проверяем, что команду вызывает админ/модератор
chat_member = await bot.get_chat_member(message.chat.id, message.from_user.id)
if chat_member.status not in ["administrator", "creator"]:
await message.reply("❌ У вас нет прав для бана пользователей.")
return
user_id = None
ban_reason = "Manual ban"
# 1) Бан по ID: /ban user_id
if command.args:
try:
user_id = int(command.args.strip())
# Получаем информацию о пользователе
member = await bot.get_chat_member(message.chat.id, user_id)
first_name = member.user.first_name or ""
last_name = member.user.last_name or ""
username = member.user.username or ""
except ValueError:
await message.reply("❌ ID должен быть числом. Использование: /ban user_id")
return
except Exception:
first_name = last_name = username = ""
# 2) Бан в ответ на сообщение
elif message.reply_to_message:
target_user = message.reply_to_message.from_user
user_id = target_user.id
first_name = target_user.first_name or ""
last_name = target_user.last_name or ""
username = target_user.username or ""
ban_reason = "Manual ban by reply"
else:
await message.reply("Использование: /ban user_id или /ban (в ответ на сообщение)")
return
try:
# Баним пользователя в чате
await bot.ban_chat_member(message.chat.id, user_id)
# Переносим в таблицу забаненных
ban_user(user_id, first_name, last_name, username, ban_reason)
# Лог в группу логов
await bot.send_message(
log_chat_id,
f"❌ Moderator <b>{message.from_user.full_name}</b> ({message.from_user.id}) "
f"banned user <b>{first_name} {last_name}</b> "
f"(ID: <code>{user_id}</code>, @{username if username else 'NULL'})\n"
f"Reason: {ban_reason}",
parse_mode="HTML"
)
# Удаляем команду /ban из чата
await message.delete()
# Удаляем сообщение спамера
if message.reply_to_message:
try:
await message.reply_to_message.delete()
except Exception as e:
await bot.send_message(
log_chat_id,
f"⚠️ Не удалось удалить сообщение спамера (ID {user_id}): {e}",
parse_mode="HTML"
)
except Exception as e:
await message.reply(f"Ban error: {e}")
await bot.send_message(
log_chat_id,
f"❌ Error of banning ID <b>{user_id}</b>: {e}",
parse_mode="HTML"
)
async def main(): async def main():
"""Запуск бота.""" """Запуск бота."""
logger.info("bot is running") logger.info("bot is running")
await bot.set_my_commands([ await bot.set_my_commands([
BotCommand(command="/spam", description="Оповестить о спаме уполномоченных людей"), BotCommand(command="/spam", description="Оповестить о спаме уполномоченных людей"),
BotCommand(command="/unban", description="Разбанить пользователя (доступно модераторам)"),
BotCommand(command="/ban", description="Разбанить пользователя (доступно модераторам)")
]) ])
await dp.start_polling(bot) await dp.start_polling(bot)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment