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/groups/simple_admin.py

377 lines
12 KiB
Python
Raw Normal View History

2022-11-06 03:48:10 -05:00
from load import bot, dp, types
2022-08-07 04:45:35 -04:00
from aiogram.types.chat_permissions import ChatPermissions
import config
2022-11-06 03:48:10 -05:00
from database import Member, Restriction
from database import MemberRoles
2022-08-07 04:45:35 -04:00
2022-12-01 05:54:32 -05:00
from utils import get_command_args, get_argument, parse_timedelta_from_message
2022-08-07 04:45:35 -04:00
2022-08-16 06:28:08 -04:00
2022-12-01 05:54:32 -05:00
@dp.message_handler(
commands=["ban", "sban"],
commands_prefix="!",
available_roles=[MemberRoles.HELPER, MemberRoles.ADMIN]
)
2022-08-07 04:45:35 -04:00
async def ban_user(message: types.Message):
2022-12-01 05:54:32 -05:00
command = await get_command_args(message)
2022-11-28 14:27:41 -05:00
2022-11-06 03:48:10 -05:00
to_user = command.to_user
from_user = command.from_user
2022-08-07 04:45:35 -04:00
# If can't descibe user data
2022-11-06 03:48:10 -05:00
if (not to_user) or (not from_user):
2022-08-07 04:45:35 -04:00
await message.answer((
2022-11-06 03:48:10 -05:00
"Usage: !ban (@username|id) reason=None\n"
"Reply to a message or use with a username")
2022-08-07 04:45:35 -04:00
)
return
# Ban user and save (bool)
2022-11-06 03:48:10 -05:00
status = await bot.kick_chat_member(chat_id=message.chat.id, user_id=to_user.user_id, until_date=None)
2022-08-07 04:45:35 -04:00
2022-11-28 14:27:41 -05:00
if status and (not command.is_silent):
2022-11-06 03:48:10 -05:00
await message.answer(f"[{from_user.first_name}](tg://user?id={from_user.user_id}) has banned [{to_user.first_name}](tg://user?id={to_user.user_id})",parse_mode="Markdown")
2022-08-07 04:45:35 -04:00
# Open restrict
2022-11-06 03:48:10 -05:00
Restriction.create(
from_user=from_user,
to_user=to_user,
2022-12-01 05:54:32 -05:00
text=message.text,
message_id=message.message_id
2022-11-06 03:48:10 -05:00
)
2022-08-07 04:45:35 -04:00
2022-12-01 05:54:32 -05:00
@dp.message_handler(
commands=["unban", "sunban"],
commands_prefix="!",
available_roles=[MemberRoles.HELPER,MemberRoles.ADMIN]
)
2022-08-07 04:45:35 -04:00
async def unban_user(message: types.Message):
2022-12-01 05:54:32 -05:00
command = await get_command_args(message)
2022-11-06 03:48:10 -05:00
to_user = command.to_user
from_user = command.from_user
2022-08-07 04:45:35 -04:00
# If can't descibe user data
2022-11-06 03:48:10 -05:00
if (not to_user) or (not from_user):
2022-08-07 04:45:35 -04:00
await message.answer((
2022-11-06 03:48:10 -05:00
"Usage: !unban (@username|id) reason=None\n"
"Reply to a message or use with username/id")
2022-08-07 04:45:35 -04:00
)
return
2022-12-01 05:54:32 -05:00
# Unban user and set status
2022-11-06 03:48:10 -05:00
status = await bot.unban_chat_member(chat_id=message.chat.id, user_id=to_user.user_id)
2022-08-07 04:45:35 -04:00
2022-11-28 14:27:41 -05:00
if status and (not command.is_silent):
2022-11-06 03:48:10 -05:00
await message.answer(f"[{from_user.first_name}](tg://user?id={from_user.user_id}) has unbanned [{to_user.first_name}](tg://user?id={to_user.user_id})",parse_mode="Markdown")
2022-12-01 05:54:32 -05:00
Restriction.create(
from_user=from_user,
to_user=to_user,
text=message.text,
message_id=message.message_id
2022-11-06 03:48:10 -05:00
)
2022-12-01 05:54:32 -05:00
@dp.message_handler(
commands=["info"],
commands_prefix="!",
available_roles=[MemberRoles.HELPER, MemberRoles.ADMIN]
)
2022-11-06 03:48:10 -05:00
async def info_user(message: types.Message):
2022-12-01 05:54:32 -05:00
command = await get_command_args(message)
2022-11-06 03:48:10 -05:00
to_user = command.to_user
if (not to_user):
await message.answer((
"Usage: !info (@username|id)\n"
"Reply to a message or use with username/id")
)
return
2022-08-07 04:45:35 -04:00
2022-11-06 03:48:10 -05:00
await message.answer((
f"[{to_user.first_name}](tg://user?id={to_user.user_id}) ({to_user.role})\n"
f"Warns: {to_user.warns}/{config.limit_of_warns}"),
parse_mode="Markdown"
)
2022-08-16 06:28:08 -04:00
2022-12-01 05:54:32 -05:00
@dp.message_handler(
commands=["kick", "skick"],
commands_prefix="!",
available_roles=[MemberRoles.HELPER, MemberRoles.ADMIN]
)
async def kick_user(message: types.Message):
command = await get_command_args(message)
2022-11-06 03:48:10 -05:00
to_user = command.to_user
from_user = command.from_user
2022-08-07 04:45:35 -04:00
2022-11-06 03:48:10 -05:00
if (not to_user) or (not from_user):
2022-08-07 04:45:35 -04:00
await message.answer((
2022-11-06 03:48:10 -05:00
"Usage: !kick (@username|id) reason=None\n"
"Reply to a message or use with a username/id")
2022-08-07 04:45:35 -04:00
)
return
2022-11-06 03:48:10 -05:00
status1 = await bot.kick_chat_member(chat_id=message.chat.id, user_id=to_user.user_id, until_date=None)
status2 = await bot.unban_chat_member(chat_id=message.chat.id, user_id=to_user.user_id)
2022-11-28 14:27:41 -05:00
if (not status1 and status2) and (not command.is_silent):
2022-11-06 03:48:10 -05:00
await message.answer(f"[{from_user.first_name}](tg://user?id={from_user.user_id}) has kicked [{to_user.first_name}](tg://user?id={to_user.user_id})",parse_mode="Markdown")
2022-08-07 04:45:35 -04:00
2022-12-01 05:54:32 -05:00
2022-11-06 03:48:10 -05:00
Restriction.create(
from_user=from_user,
to_user=to_user,
2022-12-01 05:54:32 -05:00
text=message.text,
message_id=message.message_id
2022-11-06 03:48:10 -05:00
)
2022-08-16 06:28:08 -04:00
2022-08-07 04:45:35 -04:00
2022-12-01 05:54:32 -05:00
@dp.message_handler(
commands=["mute", "smute"],
commands_prefix="!",
available_roles=[MemberRoles.ADMIN]
)
2022-08-07 04:45:35 -04:00
async def mute_user(message:types.Message):
2022-12-01 05:54:32 -05:00
command = await get_command_args(message)
2022-08-07 04:45:35 -04:00
2022-11-06 03:48:10 -05:00
to_user = command.to_user
from_user = command.from_user
2022-08-07 04:45:35 -04:00
2022-12-01 05:54:32 -05:00
duration = await parse_timedelta_from_message(message)
2022-11-06 03:48:10 -05:00
if (not to_user) or (not from_user):
2022-08-07 04:45:35 -04:00
await message.answer((
2022-11-06 03:48:10 -05:00
"Usage:!mute (@username|id) (duration)\n"
"Reply to a message or use with a username/id")
2022-08-07 04:45:35 -04:00
)
return
permissions = ChatPermissions(can_send_messages=False)
status = await bot.restrict_chat_member(
chat_id=message.chat.id,
2022-11-06 03:48:10 -05:00
user_id=to_user.user_id,
until_date=duration,
2022-08-07 04:45:35 -04:00
permissions=permissions
)
2022-11-06 03:48:10 -05:00
2022-11-28 14:27:41 -05:00
if status and (not command.is_silent):
2022-12-01 05:54:32 -05:00
await message.answer(f"[{from_user.first_name}](tg://user?id={from_user.user_id}) has muted [{to_user.first_name}](tg://user?id={to_user.user_id})",parse_mode="Markdown")
2022-11-06 03:48:10 -05:00
2022-08-07 04:45:35 -04:00
2022-11-06 03:48:10 -05:00
Restriction.create(
from_user=from_user,
to_user=to_user,
2022-12-01 05:54:32 -05:00
text=message.text,
message_id=message.message_id
2022-11-06 03:48:10 -05:00
)
2022-08-16 06:28:08 -04:00
2022-08-07 04:45:35 -04:00
2022-12-01 05:54:32 -05:00
@dp.message_handler(
commands=["unmute","sunmute"],
commands_prefix="!",
available_roles=[MemberRoles.ADMIN]
)
2022-08-07 04:45:35 -04:00
async def umute_user(message: types.Message):
# Get information
2022-12-01 05:54:32 -05:00
command = await get_command_args(message)
2022-11-06 03:48:10 -05:00
to_user = command.to_user
from_user = command.from_user
2022-08-07 04:45:35 -04:00
# If can't
2022-11-06 03:48:10 -05:00
if (not to_user) or (not from_user):
2022-08-07 04:45:35 -04:00
await message.answer((
2022-08-16 06:28:08 -04:00
"Usage:!unmute (@username|id) reason=None.\n"
2022-08-07 04:45:35 -04:00
"Reply to a message or use with a username/id.")
)
return
# Get chat permissions
2022-08-16 06:28:08 -04:00
group_permissions = config.group_permissions
2022-08-07 04:45:35 -04:00
# Set permissions
permissions = ChatPermissions(
2022-12-01 05:54:32 -05:00
can_send_messages = group_permissions["can_send_messages"],
can_send_media_messages = group_permissions["can_send_media_messages"],
can_send_polls = group_permissions["can_send_polls"],
can_send_other_messages = group_permissions["can_send_other_messages"],
can_add_web_page_previews = group_permissions["can_add_web_page_previews"],
can_change_info = group_permissions["can_change_info"],
can_invite_users = group_permissions["can_invite_users"],
can_pin_messages = group_permissions["can_pin_messages"]
2022-08-07 04:45:35 -04:00
)
# Restrict user and save
status = await bot.restrict_chat_member(
chat_id=message.chat.id,
2022-11-06 03:48:10 -05:00
user_id=to_user.user_id,
2022-08-07 04:45:35 -04:00
permissions=permissions
)
2022-11-28 14:27:41 -05:00
if status and (not command.is_silent):
2022-11-06 03:48:10 -05:00
await message.answer(f"[{from_user.first_name}](tg://user?id={from_user.user_id}) has unmuted [{to_user.first_name}](tg://user?id={to_user.user_id})",parse_mode="Markdown")
2022-08-07 04:45:35 -04:00
2022-12-01 05:54:32 -05:00
@dp.message_handler(
commands=["pin"],
commands_prefix="!",
available_roles=[MemberRoles.HELPER, MemberRoles.ADMIN]
)
async def pin_message(message: types.Message):
2022-08-07 04:45:35 -04:00
await bot.pin_chat_message(message.chat.id, message.reply_to_message.message_id)
2022-12-01 05:54:32 -05:00
@dp.message_handler(
commands=["readonly","ro"],
commands_prefix="!",
available_roles=[MemberRoles.ADMIN]
)
async def readonly_mode(message: types.Message):
2022-08-16 06:28:08 -04:00
group_permissions = config.group_permissions
2022-11-27 14:38:22 -05:00
status = config.group_permissions['can_send_messages']
2022-11-28 14:27:41 -05:00
2022-11-27 14:38:22 -05:00
if (status):
await message.answer("🔕 Readonly mode enabled!")
2022-08-07 04:45:35 -04:00
chat_permissions = ChatPermissions(
2022-12-01 05:54:32 -05:00
can_send_messages = not status
2022-08-07 04:45:35 -04:00
)
else:
2022-11-27 14:38:22 -05:00
await message.answer("🔔 Readonly mode disabled!")
2022-08-07 04:45:35 -04:00
chat_permissions = ChatPermissions(
2022-12-01 05:54:32 -05:00
can_send_messages = group_permissions['can_send_messages'],
can_send_media_messages = group_permissions["can_send_media_messages"],
can_send_other_messages = group_permissions['can_send_other_messages'],
can_send_polls = group_permissions['can_send_polls'],
can_invite_users = group_permissions['can_invite_users'],
can_change_info = group_permissions['can_change_info'],
can_add_web_page_previews = group_permissions['can_add_web_page_previews'],
can_pin_messages = group_permissions['can_pin_messages']
2022-08-07 04:45:35 -04:00
)
2022-11-27 14:38:22 -05:00
config.group_permissions["can_send_messages"] = not status
2022-12-01 05:54:32 -05:00
await bot.set_chat_permissions(chat_id = message.chat.id, permissions = chat_permissions)
2022-08-16 06:28:08 -04:00
2022-12-01 05:54:32 -05:00
@dp.message_handler(
commands=["warn","w"],
commands_prefix="!",
available_roles=[MemberRoles.HELPER, MemberRoles.ADMIN]
)
2022-08-07 04:45:35 -04:00
async def warn_user(message: types.Message):
# Get information
2022-12-01 05:54:32 -05:00
command = await get_command_args(message)
2022-08-07 04:45:35 -04:00
2022-11-06 03:48:10 -05:00
to_user = command.to_user
from_user = command.from_user
if (not to_user) or (not from_user):
2022-08-07 04:45:35 -04:00
await message.answer((
2022-11-06 03:48:10 -05:00
"Usage: !warn (@username|id) reason=None\n"
"Reply to a message or use with username/id")
2022-08-07 04:45:35 -04:00
)
return
2022-11-06 03:48:10 -05:00
to_user.warns += 1
to_user.save()
2022-08-07 04:45:35 -04:00
2022-11-06 03:48:10 -05:00
await message.answer(f"[{from_user.first_name}](tg://user?id={from_user.user_id}) has warned [{to_user.first_name}](tg://user?id={to_user.user_id}) ({to_user.warns}/{config.limit_of_warns})",parse_mode="Markdown")
2022-08-07 04:45:35 -04:00
2022-11-06 03:48:10 -05:00
if (to_user.warns == config.limit_of_warns):
await message.answer(f"[{to_user.first_name}](tg://user?id={to_user.user_id}) has been banned!",parse_mode="Markdown")
await bot.kick_chat_member(chat_id=message.chat.id, user_id=to_user.user_id, until_date=None)
2022-12-01 05:54:32 -05:00
2022-11-06 03:48:10 -05:00
Restriction.create(
from_user=from_user,
2022-12-01 05:54:32 -05:00
to_user=to_user,
text=message.text,
message_id=message.message_id
2022-11-06 03:48:10 -05:00
)
2022-08-07 04:45:35 -04:00
2022-08-16 06:28:08 -04:00
2022-12-01 05:54:32 -05:00
@dp.message_handler(
commands=["reload"],
commands_prefix="!"
)
async def reload(message: types.Message):
2022-11-06 03:48:10 -05:00
from load import tgc
2022-12-01 05:54:32 -05:00
owner_exists = Member.get_or_none(Member.role == "owner")
if (not owner_exists):
2022-11-06 03:48:10 -05:00
Member.create(
user_id = message.from_user.id,
first_name = message.from_user.first_name,
username = message.from_user.username,
2022-12-01 05:54:32 -05:00
role = "owner",
2022-11-06 03:48:10 -05:00
)
2022-12-01 05:54:32 -05:00
2022-11-06 03:48:10 -05:00
# TODO: do this every 1 hours
members = await tgc.members_list(config.group_id)
for member in members:
2022-12-01 05:54:32 -05:00
user = Member.get_or_none(Member.user_id == member["id"])
2022-11-06 03:48:10 -05:00
if (not user):
Member.create(
2022-12-01 05:54:32 -05:00
user_id = member["id"],
first_name = member["first_name"],
username = member["username"],
2022-11-06 03:48:10 -05:00
)
else:
user.first_name = member["first_name"]
user.username = member["username"]
user.save()
2022-08-07 04:45:35 -04:00
group = await bot.get_chat(message.chat.id)
group_permissions = dict(group["permissions"])
2022-08-16 06:28:08 -04:00
2022-08-07 04:45:35 -04:00
for permission in group_permissions.keys():
2022-08-16 06:28:08 -04:00
config.group_permissions[permission] = group_permissions[permission]
2022-08-13 08:25:52 -04:00
2022-11-06 03:48:10 -05:00
await message.answer("Reloaded!")
2022-08-07 04:45:35 -04:00
2022-08-16 06:28:08 -04:00
2022-12-01 05:54:32 -05:00
@dp.message_handler(
commands=["setrole"],
commands_prefix="!",
available_roles=[MemberRoles.ADMIN]
)
2022-08-07 04:45:35 -04:00
async def set_role(message:types.Message):
2022-12-01 05:54:32 -05:00
command = await get_command_args(message)
new_role = get_argument(command.arguments)
2022-08-16 06:28:08 -04:00
2022-11-06 03:48:10 -05:00
to_user = command.to_user
from_user = command.from_user
2022-08-07 04:45:35 -04:00
2022-11-06 03:48:10 -05:00
if (not to_user) or (not from_user) or (not new_role):
2022-08-16 06:28:08 -04:00
await message.answer((
2022-11-06 03:48:10 -05:00
"!setrole (@username|id) role(owner,admin,helper,member).\n"
2022-08-16 06:28:08 -04:00
"Reply to a message or use with username."
))
2022-08-07 04:45:35 -04:00
return
2022-12-01 05:54:32 -05:00
2022-08-16 06:28:08 -04:00
if not (new_role in [member.value for member in MemberRoles]):
2022-11-06 03:48:10 -05:00
await message.answer(f"Role {new_role} not exists")
2022-08-07 04:45:35 -04:00
return
2022-08-16 06:28:08 -04:00
2022-11-06 03:48:10 -05:00
if (from_user.user_id == to_user.user_id):
await message.answer("❌ You can't set role yourself")
2022-08-07 04:45:35 -04:00
return
2022-11-06 03:48:10 -05:00
to_user.role = new_role
to_user.save()
2022-12-01 05:54:32 -05:00
await message.answer(f"{new_role.capitalize()} role set for \
[{to_user.first_name}](tg://user?id={to_user.user_id})",parse_mode="Markdown")