Добавлено уведомление о днях рождения.
This commit is contained in:
parent
0d15c7aabd
commit
7578ad00c8
2 changed files with 67 additions and 8 deletions
70
bot.py
70
bot.py
|
|
@ -51,6 +51,7 @@ MESSAGE_NEED_REPLY = 'Извините, но эту команду нужно в
|
||||||
MESSAGE_DEFAULT_RULES = 'Правила не установлены. Просто ведите себя хорошо.'
|
MESSAGE_DEFAULT_RULES = 'Правила не установлены. Просто ведите себя хорошо.'
|
||||||
MESSAGE_DEFAULT_GREETING_JOIN = 'Добро пожаловать, {name}!'
|
MESSAGE_DEFAULT_GREETING_JOIN = 'Добро пожаловать, {name}!'
|
||||||
MESSAGE_DEFAULT_GREETING_REJOIN = 'С возвращением, {name}!'
|
MESSAGE_DEFAULT_GREETING_REJOIN = 'С возвращением, {name}!'
|
||||||
|
MESSAGE_DEFAULT_BIRTHDAY = 'Сегодня {name} празднует День Рождения!\nПоздравляем!\n@all'
|
||||||
|
|
||||||
|
|
||||||
@bot.on.chat_message(text="!помощь")
|
@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 += '!деньрождения* - изменить уведомление о дне рождения\n'
|
||||||
response += '!предупреждение* - выдать предупреждение участнику\n'
|
response += '!предупреждение* - выдать предупреждение участнику\n'
|
||||||
response += '\n'
|
response += '\n'
|
||||||
response += italic('Команды с пометкой * нужно вызывать в ответном сообщении.')
|
response += italic('Команды с пометкой * нужно вызывать в ответном сообщении.')
|
||||||
|
|
@ -167,6 +169,27 @@ async def set_greeting_rejoin_handler(message: Message):
|
||||||
await message.answer('Приветствие при возвращении изменено.')
|
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="!предупреждение")
|
@bot.on.chat_message(text="!предупреждение")
|
||||||
async def warning_handler(message: Message):
|
async def warning_handler(message: Message):
|
||||||
chat_id = message.peer_id
|
chat_id = message.peer_id
|
||||||
|
|
@ -377,7 +400,42 @@ async def wait_until(target_time: datetime.datetime):
|
||||||
await asyncio.sleep(delay_seconds)
|
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")
|
tz = datetime.timezone(datetime.timedelta(hours=3), name="MSK")
|
||||||
|
|
||||||
target_time = datetime.time(6, 0, 0, tzinfo=tz)
|
target_time = datetime.time(6, 0, 0, tzinfo=tz)
|
||||||
|
|
@ -391,12 +449,8 @@ async def counters_reset_task():
|
||||||
while True:
|
while True:
|
||||||
await wait_until(target_datetime)
|
await wait_until(target_datetime)
|
||||||
|
|
||||||
print('Resetting daily counters...')
|
reset_counters(target_datetime.day == 1)
|
||||||
database.DB.reset_messages_today()
|
await check_birthdays()
|
||||||
|
|
||||||
if target_datetime.day == 1:
|
|
||||||
print('Resetting monthly counters...')
|
|
||||||
database.DB.reset_messages_month()
|
|
||||||
|
|
||||||
target_datetime = target_datetime + datetime.timedelta(days=1)
|
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.on_startup.append(startup_task())
|
||||||
bot.loop_wrapper.add_task(counters_reset_task())
|
bot.loop_wrapper.add_task(daily_maintenance_task())
|
||||||
bot.run_forever()
|
bot.run_forever()
|
||||||
|
|
|
||||||
|
|
@ -15,6 +15,7 @@ class Database:
|
||||||
"rules" TEXT,
|
"rules" TEXT,
|
||||||
"greeting_join" TEXT,
|
"greeting_join" TEXT,
|
||||||
"greeting_rejoin" TEXT,
|
"greeting_rejoin" TEXT,
|
||||||
|
"birthday_message" TEXT,
|
||||||
PRIMARY KEY("id"))
|
PRIMARY KEY("id"))
|
||||||
""")
|
""")
|
||||||
|
|
||||||
|
|
@ -31,6 +32,10 @@ class Database:
|
||||||
|
|
||||||
self.conn.commit()
|
self.conn.commit()
|
||||||
|
|
||||||
|
def get_chats(self):
|
||||||
|
self.cursor.execute("SELECT * FROM chats")
|
||||||
|
return self.cursor.fetchall()
|
||||||
|
|
||||||
def get_chat(self, chat_id: int):
|
def get_chat(self, chat_id: int):
|
||||||
self.cursor.execute("SELECT * FROM chats WHERE id = ?", (chat_id,))
|
self.cursor.execute("SELECT * FROM chats WHERE id = ?", (chat_id,))
|
||||||
return self.cursor.fetchone()
|
return self.cursor.fetchone()
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue