diff --git a/bot.py b/bot.py index cf110ec..48ebded 100644 --- a/bot.py +++ b/bot.py @@ -51,6 +51,7 @@ MESSAGE_NEED_REPLY = 'Извините, но эту команду нужно в MESSAGE_DEFAULT_RULES = 'Правила не установлены. Просто ведите себя хорошо.' MESSAGE_DEFAULT_GREETING_JOIN = 'Добро пожаловать, {name}!' MESSAGE_DEFAULT_GREETING_REJOIN = 'С возвращением, {name}!' +MESSAGE_DEFAULT_BIRTHDAY = 'Сегодня {name} празднует День Рождения!\nПоздравляем!\n@all' @bot.on.chat_message(text="!помощь") @@ -73,6 +74,7 @@ async def rules_handler(message: Message): response += '!правила* - изменить правила\n' response += '!приветствие* - изменить приветствие новичков\n' response += '!возвращение* - изменить приветствие при возвращении\n' + response += '!деньрождения* - изменить уведомление о дне рождения\n' response += '!предупреждение* - выдать предупреждение участнику\n' response += '\n' response += italic('Команды с пометкой * нужно вызывать в ответном сообщении.') @@ -167,6 +169,27 @@ async def set_greeting_rejoin_handler(message: Message): await message.answer('Приветствие при возвращении изменено.') +@bot.on.chat_message(text="!деньрождения") +async def set_birthday_handler(message: Message): + chat_id = message.peer_id + chat = create_chat_if_not_exists(chat_id) + if chat['active'] == 0: + await message.answer(MESSAGE_CHAT_NOT_ACTIVE) + return + + chat_members = await bot.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('Уведомление о дне рождения изменено.') + + @bot.on.chat_message(text="!предупреждение") async def warning_handler(message: Message): chat_id = message.peer_id @@ -377,7 +400,42 @@ async def wait_until(target_time: datetime.datetime): await asyncio.sleep(delay_seconds) -async def counters_reset_task(): +def reset_counters(reset_month: bool): + print('Resetting daily counters...') + database.DB.reset_messages_today() + + if reset_month: + print('Resetting monthly counters...') + database.DB.reset_messages_month() + + +async def check_birthdays(): + chats = database.DB.get_chats() + for chat in chats: + if chat['active'] == 0: + continue + + chat_id = chat['id'] + members = await bot.api.messages.get_conversation_members(peer_id=chat_id, extended=False, fields=['bdate']) + today = datetime.datetime.today() + + for member in members.profiles: + if member.id < 0 or member.bdate is None: + continue + + parts = member.bdate.split('.') + if len(parts) < 2: + continue + day = int(parts[0]) + month = int(parts[1]) + + if day == today.day and month == today.month: + message = chat['birthday_message'] or MESSAGE_DEFAULT_BIRTHDAY + message = message.format(name=f'@id{member.id} ({member.first_name} {member.last_name})') + await bot.api.messages.send(random_id=0, peer_id=chat_id, message=message) + + +async def daily_maintenance_task(): tz = datetime.timezone(datetime.timedelta(hours=3), name="MSK") target_time = datetime.time(6, 0, 0, tzinfo=tz) @@ -391,12 +449,8 @@ async def counters_reset_task(): while True: await wait_until(target_datetime) - print('Resetting daily counters...') - database.DB.reset_messages_today() - - if target_datetime.day == 1: - print('Resetting monthly counters...') - database.DB.reset_messages_month() + reset_counters(target_datetime.day == 1) + await check_birthdays() target_datetime = target_datetime + datetime.timedelta(days=1) @@ -406,5 +460,5 @@ async def startup_task(): bot.loop_wrapper.on_startup.append(startup_task()) -bot.loop_wrapper.add_task(counters_reset_task()) +bot.loop_wrapper.add_task(daily_maintenance_task()) bot.run_forever() diff --git a/database.py b/database.py index 76858b0..e5a31d1 100644 --- a/database.py +++ b/database.py @@ -15,6 +15,7 @@ class Database: "rules" TEXT, "greeting_join" TEXT, "greeting_rejoin" TEXT, + "birthday_message" TEXT, PRIMARY KEY("id")) """) @@ -31,6 +32,10 @@ class Database: self.conn.commit() + def get_chats(self): + self.cursor.execute("SELECT * FROM chats") + return self.cursor.fetchall() + def get_chat(self, chat_id: int): self.cursor.execute("SELECT * FROM chats WHERE id = ?", (chat_id,)) return self.cursor.fetchone()