vk_chat_bot/handlers/admin.py

192 lines
6.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from vkbottle import bold, VKAPIError
from vkbottle.bot import Message
from vkbottle_types.codegen.objects import MessagesGetConversationMembers
import database
from messages import *
import utils
from labeler import labeler
def vk_user_is_admin(user_id: int, chat_members: MessagesGetConversationMembers):
for member in chat_members.items:
if member.member_id != user_id:
continue
return member.is_admin
return False
@labeler.chat_message(text="!старт")
async def start_handler(message: Message):
chat_id = message.peer_id
database.create_chat_if_not_exists(chat_id)
chat_members = await message.ctx_api.messages.get_conversation_members(peer_id=chat_id, extended=False)
if not vk_user_is_admin(message.from_id, chat_members):
await message.answer(MESSAGE_PERMISSION_DENIED)
return
database.DB.chat_update(chat_id, active=1)
for member in chat_members.items:
# Пропустить ботов
if member.member_id < 0:
continue
database.create_user_if_not_exists(chat_id, member.member_id)
await message.answer('Готова к работе!')
@labeler.chat_message(text="!правила")
async def rules_handler(message: Message):
chat_id = message.peer_id
chat = database.create_chat_if_not_exists(chat_id)
if chat['active'] == 0:
await message.answer(MESSAGE_CHAT_NOT_ACTIVE)
return
if message.reply_message is None:
if chat['rules'] is not None:
await message.answer(bold('Правила чата') + '\n' + chat['rules'])
else:
await message.answer(MESSAGE_DEFAULT_RULES)
else:
chat_members = await message.ctx_api.messages.get_conversation_members(peer_id=chat_id, extended=False)
if not vk_user_is_admin(message.from_id, chat_members):
await message.answer(MESSAGE_PERMISSION_DENIED)
return
database.DB.chat_update(chat_id, rules=message.reply_message.text)
await message.answer('Правила чата изменены.')
@labeler.chat_message(text="!приветствие")
async def set_greeting_join_handler(message: Message):
chat_id = message.peer_id
chat = database.create_chat_if_not_exists(chat_id)
if chat['active'] == 0:
await message.answer(MESSAGE_CHAT_NOT_ACTIVE)
return
chat_members = await message.ctx_api.messages.get_conversation_members(peer_id=chat_id, extended=False)
if not vk_user_is_admin(message.from_id, chat_members):
await message.answer(MESSAGE_PERMISSION_DENIED)
return
if message.reply_message is None:
await message.answer(MESSAGE_NEED_REPLY)
return
database.DB.chat_update(chat_id, greeting_join=message.reply_message.text)
await message.answer('Приветствие изменено.')
@labeler.chat_message(text="!возвращение")
async def set_greeting_rejoin_handler(message: Message):
chat_id = message.peer_id
chat = database.create_chat_if_not_exists(chat_id)
if chat['active'] == 0:
await message.answer(MESSAGE_CHAT_NOT_ACTIVE)
return
chat_members = await message.ctx_api.messages.get_conversation_members(peer_id=chat_id, extended=False)
if not vk_user_is_admin(message.from_id, chat_members):
await message.answer(MESSAGE_PERMISSION_DENIED)
return
if message.reply_message is None:
await message.answer(MESSAGE_NEED_REPLY)
return
database.DB.chat_update(chat_id, greeting_rejoin=message.reply_message.text)
await message.answer('Приветствие при возвращении изменено.')
@labeler.chat_message(text="!деньрождения")
async def set_birthday_handler(message: Message):
chat_id = message.peer_id
chat = database.create_chat_if_not_exists(chat_id)
if chat['active'] == 0:
await message.answer(MESSAGE_CHAT_NOT_ACTIVE)
return
chat_members = await message.ctx_api.messages.get_conversation_members(peer_id=chat_id, extended=False)
if not vk_user_is_admin(message.from_id, chat_members):
await message.answer(MESSAGE_PERMISSION_DENIED)
return
if message.reply_message is None:
await message.answer(MESSAGE_NEED_REPLY)
return
database.DB.chat_update(chat_id, birthday_message=message.reply_message.text)
await message.answer('Уведомление о дне рождения изменено.')
@labeler.chat_message(text="!предупреждение")
async def warning_handler(message: Message):
chat_id = message.peer_id
chat = database.create_chat_if_not_exists(chat_id)
if chat['active'] == 0:
await message.answer(MESSAGE_CHAT_NOT_ACTIVE)
return
chat_members = await message.ctx_api.messages.get_conversation_members(peer_id=chat_id, extended=False)
if not vk_user_is_admin(message.from_id, chat_members):
await message.answer(MESSAGE_PERMISSION_DENIED)
return
if message.reply_message is None:
await message.answer(MESSAGE_NEED_REPLY)
return
user_id = message.reply_message.from_id
database.create_user_if_not_exists(chat_id, user_id)
database.DB.user_increment_warnings(chat_id, user_id)
user = database.DB.get_user(chat_id, user_id)
user_info = await message.ctx_api.users.get(user_ids=[user_id], name_case='gen')
if len(user_info) == 1:
await message.answer('У {} {} {} {}.'.format(
user_info[0].first_name,
user_info[0].last_name,
user['warnings'],
utils.make_word_agree_with_number(user['warnings'], 'предупреждение'))
)
@labeler.chat_message(text="!исключить")
async def ban_handler(message: Message):
chat_id = message.peer_id
chat = database.create_chat_if_not_exists(chat_id)
if chat['active'] == 0:
await message.answer(MESSAGE_CHAT_NOT_ACTIVE)
return
chat_members = await message.ctx_api.messages.get_conversation_members(peer_id=chat_id, extended=False)
if not vk_user_is_admin(message.from_id, chat_members):
await message.answer(MESSAGE_PERMISSION_DENIED)
return
if message.reply_message is None:
await message.answer(MESSAGE_NEED_REPLY)
return
user_id = message.reply_message.from_id
try:
await message.ctx_api.messages.remove_chat_user(chat_id - 2000000000, member_id=user_id)
if user_id > 0:
database.DB.delete_user(chat_id, user_id)
user_info = await message.ctx_api.users.get(user_ids=[user_id])
await message.answer('Участник {} {} исключен.'.format(user_info[0].first_name, user_info[0].last_name))
except VKAPIError as e:
print(e)
await message.answer('Извините, у меня не получилось исключить этого участника.')