This repository has been archived on 2024-07-28. You can view files and clone it, but cannot push or open issues or pull requests.
moderator-bot/handlers/users/user.py

160 lines
4.6 KiB
Python

from load import dp, bot, types
from database import Member, Restriction
import config
from aiogram.utils.keyboard import InlineKeyboardBuilder, ReplyKeyboardBuilder
from aiogram.fsm.context import FSMContext
from aiogram.types import ReplyKeyboardRemove
from aiogram.fsm.state import State, StatesGroup
from aiogram import F
from aiogram.filters import Command
from filters import ChatTypeFilter
class ReportRestriction(StatesGroup):
state1 = State()
state2 = State()
@dp.message(
Command("start", "help"),
ChatTypeFilter("private")
)
async def start_command_private(message: types.Message):
bot_description_menu = ReplyKeyboardBuilder()
bot_description_menu.button(text="Check restrictions")
bot_description_menu.button(text="About Us")
await message.answer((
f"Hi, **{message.from_user.first_name}**!\n"
"My commands:\n"
"\t\t/help /start - read this message."
), reply_markup=bot_description_menu.as_markup(resize_keyboard=True))
@dp.message(F.text == "About Us")
async def about_us(message: types.Message):
await message.answer((
"Moderator bot - an open source project for managing a Telegram group.\n\n"
"Possibilities:\n"
"1. Role system\n"
"2. Simple commands such as !ban, !mute\n"
"3. Convenient sticker/photo disabling with !stickers, !media\n"
"4. Users can report admins.\n"
"5. Admins can give warnings to users.\n"
"\nRelease version: 2.5.2\n"
"[Github](https://github.com/hok7z/moderator-bot)")
)
@dp.message(F.text == "Check restrictions")
async def check_for_restrict(message: types.Message, state: FSMContext):
await state.set_state(ReportRestriction.state1)
user = Member.get(Member.user_id == message.from_user.id)
restrictions = Restriction.select().where(Restriction.to_user == user)
if (not restrictions):
await message.answer("✅No restrictions.")
return
for restriction in restrictions:
markup = InlineKeyboardBuilder()
markup.button(
text="✉️ Report restriction",
callback_data=restriction.id
)
from_user = restriction.from_user
to_user = restriction.to_user
await message.answer((
"Restriction #{}\n"
"from user [{}](tg://user?id={})\n"
"to user [{}](tg://user?id={})\n"
"Note: {}\n"
"{}\n"
).format(
restriction.id,
from_user.first_name,
from_user.user_id,
to_user.first_name,
to_user.user_id,
restriction.text,
restriction.timestamp
), reply_markup=markup.as_markup())
await state.set_state(ReportRestriction.state1)
@dp.callback_query(ReportRestriction.state1)
async def report_restriction(call: types.CallbackQuery, state: FSMContext):
await call.answer(cache_time=60)
callback_data = call.data
restriction_id = int(callback_data)
cancel_markup = ReplyKeyboardBuilder()
cancel_markup.button(text="❌ Cancel")
await state.update_data(restriction_id=restriction_id)
await call.message.answer(
"Please,enter your report",
reply_markup=cancel_markup.as_markup(resize_keyboard=True)
)
await state.set_state(ReportRestriction.state2)
@dp.message(ReportRestriction.state2)
async def get_message_report(message: types.Message, state: FSMContext):
answer = message.text
if not ("Cancel" in answer):
data = await state.get_data()
restriction_id = data.get("restriction_id")
restriction = Restriction.get(id=restriction_id)
from_user = restriction.from_user
to_user = restriction.to_user
restriction_timestamp = restriction.timestamp.strftime("%d.%m.%y at %H:%M")
await bot.send_message(config.second_group_id, (
"Report on restriction #{}\n"
"Complaint from: [{}](tg://user?id={})\n"
"Complaint about: [{}](tg://user?id={})\n"
"Sent {}\n"
"{}\n"
"Message: {}"
).format(
restriction_id,
from_user.first_name,
from_user.user_id,
to_user.first_name,
to_user.user_id,
restriction.text,
restriction_timestamp,
answer,
))
await message.answer(
"Report restriction sended",
reply_markup=ReplyKeyboardRemove()
)
else:
await message.answer(
"Operation cancaled",
reply_markup=ReplyKeyboardRemove()
)
await state.clear()