2023-02-19 18:10:11 +02:00
import asyncio
2021-07-05 00:41:27 +02:00
import logging
2022-08-14 01:07:52 +03:00
from aiogram import Bot , Dispatcher , Router
2023-08-10 11:06:48 +03:00
from aiogram . enums import ParseMode , UpdateType
from aiogram . filters import LEAVE_TRANSITION , ChatMemberUpdatedFilter , CommandStart
2022-08-14 01:07:52 +03:00
from aiogram . types import (
CallbackQuery ,
ChatMemberUpdated ,
InlineKeyboardButton ,
InlineKeyboardMarkup ,
Message ,
)
2021-07-05 00:41:27 +02:00
TOKEN = " 6wo "
logger = logging . getLogger ( __name__ )
logging . basicConfig ( level = logging . INFO )
2023-02-19 18:10:11 +02:00
router = Router ( )
2021-07-05 00:41:27 +02:00
2023-02-19 18:10:11 +02:00
2023-08-10 11:06:48 +03:00
@router.message ( CommandStart ( ) )
2021-07-05 00:41:27 +02:00
async def command_start_handler ( message : Message ) - > None :
"""
2023-08-06 16:59:29 +03:00
This handler receives messages with ` / start ` command
2021-07-05 00:41:27 +02:00
"""
await message . answer (
f " Hello, <b> { message . from_user . full_name } !</b> " ,
reply_markup = InlineKeyboardMarkup (
inline_keyboard = [ [ InlineKeyboardButton ( text = " Tap me, bro " , callback_data = " * " ) ] ]
) ,
)
2023-02-19 18:10:11 +02:00
@router.chat_member ( )
2021-07-05 00:41:27 +02:00
async def chat_member_update ( chat_member : ChatMemberUpdated , bot : Bot ) - > None :
await bot . send_message (
chat_member . chat . id ,
" Member {chat_member.from_user.id} was changed "
2021-09-07 01:04:33 +03:00
+ f " from { chat_member . old_chat_member . status } to { chat_member . new_chat_member . status } " ,
2021-07-05 00:41:27 +02:00
)
# this router will use only callback_query updates
sub_router = Router ( )
@sub_router.callback_query ( )
async def callback_tap_me ( callback_query : CallbackQuery ) - > None :
await callback_query . answer ( " Yeah good, now i ' m fine " )
# this router will use only edited_message updates
sub_sub_router = Router ( )
@sub_sub_router.edited_message ( )
2021-09-07 00:32:43 +03:00
async def edited_message_handler ( edited_message : Message ) - > None :
2023-08-10 11:06:48 +03:00
await edited_message . reply ( " Message was edited, Big Brother watches you " )
2021-07-05 00:41:27 +02:00
# this router will use only my_chat_member updates
deep_dark_router = Router ( )
2023-08-10 11:06:48 +03:00
@deep_dark_router.my_chat_member ( ~ ChatMemberUpdatedFilter ( LEAVE_TRANSITION ) )
2021-07-05 00:41:27 +02:00
async def my_chat_member_change ( chat_member : ChatMemberUpdated , bot : Bot ) - > None :
await bot . send_message (
chat_member . chat . id ,
2023-08-10 11:06:48 +03:00
" This Bot`s status was changed from "
2021-09-07 01:04:33 +03:00
+ f " { chat_member . old_chat_member . status } to { chat_member . new_chat_member . status } " ,
2021-07-05 00:41:27 +02:00
)
2023-02-19 18:10:11 +02:00
async def main ( ) - > None :
2022-08-14 18:40:41 +03:00
# Initialize Bot instance with a default parse mode which will be passed to all API calls
2023-08-10 11:06:48 +03:00
bot = Bot ( TOKEN , parse_mode = ParseMode . HTML )
2021-07-05 00:41:27 +02:00
2023-02-19 18:10:11 +02:00
dp = Dispatcher ( )
dp . include_router ( router )
2021-07-05 00:41:27 +02:00
sub_router . include_router ( deep_dark_router )
2023-02-19 18:10:11 +02:00
router . include_router ( sub_router )
router . include_router ( sub_sub_router )
2021-07-05 00:41:27 +02:00
2023-08-10 11:06:48 +03:00
# Specify which updates should be handled by Dispatcher.
# By default, all types, that used in handlers will be used.
useful_updates = [
UpdateType . MESSAGE ,
UpdateType . CALLBACK_QUERY ,
UpdateType . EDITED_MESSAGE ,
# UpdateType.MY_CHAT_MEMBER, # Here we decided to skip the my_chat_member updates, even though it's used in our handlers. Uncomment this line to enable it.
]
2021-07-05 00:41:27 +02:00
2023-08-10 11:06:48 +03:00
# Start event dispatching
2023-02-19 18:10:11 +02:00
await dp . start_polling ( bot , allowed_updates = useful_updates )
2021-07-05 00:41:27 +02:00
2023-08-10 11:06:48 +03:00
# If you want to use all the update types registered in the dispatcher, you should not specify the `allowed_updates` parameter:
# await dp.start_polling(bot)
2021-07-05 00:41:27 +02:00
if __name__ == " __main__ " :
2023-02-19 18:10:11 +02:00
logging . basicConfig ( level = logging . INFO )
asyncio . run ( main ( ) )