With commands

parent a870b567
......@@ -7,6 +7,7 @@ import os
import atexit
from dotenv import load_dotenv
from aiogram.filters import Command
from aiogram.filters import CommandObject
import logging
from aiogram import types
from aiogram.types import ChatMemberUpdated, Message, BotCommand
......@@ -459,12 +460,146 @@ async def report_spam(message: types.Message):
# Удаляем сообщение с командой
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():
"""Запуск бота."""
logger.info("bot is running")
await bot.set_my_commands([
BotCommand(command="/spam", description="Оповестить о спаме уполномоченных людей"),
BotCommand(command="/unban", description="Разбанить пользователя (доступно модераторам)"),
BotCommand(command="/ban", description="Разбанить пользователя (доступно модераторам)")
])
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