mirror of
https://github.com/eternnoir/pyTelegramBotAPI.git
synced 2023-08-10 21:12:57 +03:00
Middlewares, new file, and examples
This commit is contained in:
parent
6770011dd7
commit
a9b422783f
11
examples/asynchronous_telebot/chat_join_request.py
Normal file
11
examples/asynchronous_telebot/chat_join_request.py
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
from telebot.async_telebot import AsyncTeleBot
|
||||||
|
import asyncio
|
||||||
|
import telebot
|
||||||
|
bot = AsyncTeleBot('TOKEN')
|
||||||
|
|
||||||
|
@bot.chat_join_request_handler()
|
||||||
|
async def make_some(message: telebot.types.ChatJoinRequest):
|
||||||
|
await bot.send_message(message.chat.id, 'I accepted a new user!')
|
||||||
|
await bot.approve_chat_join_request(message.chat.id, message.from_user.id)
|
||||||
|
|
||||||
|
asyncio.run(bot.polling(skip_pending=True))
|
33
examples/asynchronous_telebot/chat_member_example.py
Normal file
33
examples/asynchronous_telebot/chat_member_example.py
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
from telebot import types,util
|
||||||
|
from telebot.async_telebot import AsyncTeleBot
|
||||||
|
import asyncio
|
||||||
|
bot = AsyncTeleBot('TOKEN')
|
||||||
|
|
||||||
|
#chat_member_handler. When status changes, telegram gives update. check status from old_chat_member and new_chat_member.
|
||||||
|
@bot.chat_member_handler()
|
||||||
|
async def chat_m(message: types.ChatMemberUpdated):
|
||||||
|
old = message.old_chat_member
|
||||||
|
new = message.new_chat_member
|
||||||
|
if new.status == "member":
|
||||||
|
await bot.send_message(message.chat.id,"Hello {name}!".format(name=new.user.first_name)) # Welcome message
|
||||||
|
|
||||||
|
#if bot is added to group, this handler will work
|
||||||
|
@bot.my_chat_member_handler()
|
||||||
|
async def my_chat_m(message: types.ChatMemberUpdated):
|
||||||
|
old = message.old_chat_member
|
||||||
|
new = message.new_chat_member
|
||||||
|
if new.status == "member":
|
||||||
|
await bot.send_message(message.chat.id,"Somebody added me to group") # Welcome message, if bot was added to group
|
||||||
|
await bot.leave_chat(message.chat.id)
|
||||||
|
|
||||||
|
#content_Type_service is:
|
||||||
|
#'new_chat_members', 'left_chat_member', 'new_chat_title', 'new_chat_photo', 'delete_chat_photo', 'group_chat_created',
|
||||||
|
#'supergroup_chat_created', 'channel_chat_created', 'migrate_to_chat_id', 'migrate_from_chat_id', 'pinned_message',
|
||||||
|
#'proximity_alert_triggered', 'voice_chat_scheduled', 'voice_chat_started', 'voice_chat_ended',
|
||||||
|
#'voice_chat_participants_invited', 'message_auto_delete_timer_changed'
|
||||||
|
# this handler deletes service messages
|
||||||
|
|
||||||
|
@bot.message_handler(content_types=util.content_type_service)
|
||||||
|
async def delall(message: types.Message):
|
||||||
|
await bot.delete_message(message.chat.id,message.message_id)
|
||||||
|
asyncio.run(bot.polling())
|
@ -0,0 +1,13 @@
|
|||||||
|
import asyncio
|
||||||
|
from telebot.async_telebot import AsyncTeleBot
|
||||||
|
from telebot import asyncio_filters
|
||||||
|
bot = AsyncTeleBot('TOKEN')
|
||||||
|
|
||||||
|
# Handler
|
||||||
|
@bot.message_handler(chat_types=['supergroup'], is_chat_admin=True)
|
||||||
|
async def answer_for_admin(message):
|
||||||
|
await bot.send_message(message.chat.id,"hello my admin")
|
||||||
|
|
||||||
|
# Register filter
|
||||||
|
bot.add_custom_filter(asyncio_filters.IsAdminFilter(bot))
|
||||||
|
asyncio.run(bot.polling())
|
@ -0,0 +1,44 @@
|
|||||||
|
from telebot.async_telebot import AsyncTeleBot
|
||||||
|
import telebot
|
||||||
|
bot = AsyncTeleBot('TOKEN')
|
||||||
|
|
||||||
|
|
||||||
|
# AdvancedCustomFilter is for list, string filter values
|
||||||
|
class MainFilter(telebot.asyncio_filters.AdvancedCustomFilter):
|
||||||
|
key='text'
|
||||||
|
@staticmethod
|
||||||
|
async def check(message, text):
|
||||||
|
return message.text in text
|
||||||
|
|
||||||
|
# SimpleCustomFilter is for boolean values, such as is_admin=True
|
||||||
|
class IsAdmin(telebot.asyncio_filters.SimpleCustomFilter):
|
||||||
|
key='is_admin'
|
||||||
|
@staticmethod
|
||||||
|
async def check(message: telebot.types.Message):
|
||||||
|
result = await bot.get_chat_member(message.chat.id,message.from_user.id)
|
||||||
|
return result.status in ['administrator','creator']
|
||||||
|
|
||||||
|
|
||||||
|
@bot.message_handler(is_admin=True, commands=['admin']) # Check if user is admin
|
||||||
|
async def admin_rep(message):
|
||||||
|
await bot.send_message(message.chat.id, "Hi admin")
|
||||||
|
|
||||||
|
@bot.message_handler(is_admin=False, commands=['admin']) # If user is not admin
|
||||||
|
async def not_admin(message):
|
||||||
|
await bot.send_message(message.chat.id, "You are not admin")
|
||||||
|
|
||||||
|
@bot.message_handler(text=['hi']) # Response to hi message
|
||||||
|
async def welcome_hi(message):
|
||||||
|
await bot.send_message(message.chat.id, 'You said hi')
|
||||||
|
|
||||||
|
@bot.message_handler(text=['bye']) # Response to bye message
|
||||||
|
async def bye_user(message):
|
||||||
|
await bot.send_message(message.chat.id, 'You said bye')
|
||||||
|
|
||||||
|
|
||||||
|
# Do not forget to register filters
|
||||||
|
bot.add_custom_filter(MainFilter())
|
||||||
|
bot.add_custom_filter(IsAdmin())
|
||||||
|
|
||||||
|
import asyncio
|
||||||
|
asyncio.run(bot.polling())
|
@ -0,0 +1,19 @@
|
|||||||
|
from telebot.async_telebot import AsyncTeleBot
|
||||||
|
import telebot
|
||||||
|
import asyncio
|
||||||
|
bot = AsyncTeleBot('TOKEN')
|
||||||
|
|
||||||
|
|
||||||
|
# Chat id can be private or supergroups.
|
||||||
|
@bot.message_handler(chat_id=[12345678], commands=['admin']) # chat_id checks id corresponds to your list or not.
|
||||||
|
async def admin_rep(message):
|
||||||
|
await bot.send_message(message.chat.id, "You are allowed to use this command.")
|
||||||
|
|
||||||
|
@bot.message_handler(commands=['admin'])
|
||||||
|
async def not_admin(message):
|
||||||
|
await bot.send_message(message.chat.id, "You are not allowed to use this command")
|
||||||
|
|
||||||
|
# Do not forget to register
|
||||||
|
bot.add_custom_filter(telebot.asyncio_filters.ChatFilter())
|
||||||
|
|
||||||
|
asyncio.run(bot.polling())
|
@ -0,0 +1,22 @@
|
|||||||
|
from telebot.async_telebot import AsyncTeleBot
|
||||||
|
import telebot
|
||||||
|
import asyncio
|
||||||
|
bot = AsyncTeleBot('TOKEN')
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Check if message is a reply
|
||||||
|
@bot.message_handler(is_reply=True)
|
||||||
|
async def start_filter(message):
|
||||||
|
await bot.send_message(message.chat.id, "Looks like you replied to my message.")
|
||||||
|
|
||||||
|
# Check if message was forwarded
|
||||||
|
@bot.message_handler(is_forwarded=True)
|
||||||
|
async def text_filter(message):
|
||||||
|
await bot.send_message(message.chat.id, "I do not accept forwarded messages!")
|
||||||
|
|
||||||
|
# Do not forget to register filters
|
||||||
|
bot.add_custom_filter(telebot.asyncio_filters.IsReplyFilter())
|
||||||
|
bot.add_custom_filter(telebot.asyncio_filters.ForwardFilter())
|
||||||
|
|
||||||
|
asyncio.run(bot.polling())
|
@ -0,0 +1,21 @@
|
|||||||
|
from telebot.async_telebot import AsyncTeleBot
|
||||||
|
import telebot
|
||||||
|
import asyncio
|
||||||
|
bot = AsyncTeleBot('TOKEN')
|
||||||
|
|
||||||
|
|
||||||
|
# Check if message starts with @admin tag
|
||||||
|
@bot.message_handler(text_startswith="@admin")
|
||||||
|
async def start_filter(message):
|
||||||
|
await bot.send_message(message.chat.id, "Looks like you are calling admin, wait...")
|
||||||
|
|
||||||
|
# Check if text is hi or hello
|
||||||
|
@bot.message_handler(text=['hi','hello'])
|
||||||
|
async def text_filter(message):
|
||||||
|
await bot.send_message(message.chat.id, "Hi, {name}!".format(name=message.from_user.first_name))
|
||||||
|
|
||||||
|
# Do not forget to register filters
|
||||||
|
bot.add_custom_filter(telebot.asyncio_filters.TextMatchFilter())
|
||||||
|
bot.add_custom_filter(telebot.asyncio_filters.TextStartsFilter())
|
||||||
|
|
||||||
|
asyncio.run(bot.polling())
|
75
examples/asynchronous_telebot/custom_states.py
Normal file
75
examples/asynchronous_telebot/custom_states.py
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
import telebot
|
||||||
|
from telebot import asyncio_filters
|
||||||
|
from telebot.async_telebot import AsyncTeleBot
|
||||||
|
import asyncio
|
||||||
|
bot = AsyncTeleBot('TOKEN')
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class MyStates:
|
||||||
|
name = 1
|
||||||
|
surname = 2
|
||||||
|
age = 3
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@bot.message_handler(commands=['start'])
|
||||||
|
async def start_ex(message):
|
||||||
|
"""
|
||||||
|
Start command. Here we are starting state
|
||||||
|
"""
|
||||||
|
await bot.set_state(message.from_user.id, MyStates.name)
|
||||||
|
await bot.send_message(message.chat.id, 'Hi, write me a name')
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@bot.message_handler(state="*", commands='cancel')
|
||||||
|
async def any_state(message):
|
||||||
|
"""
|
||||||
|
Cancel state
|
||||||
|
"""
|
||||||
|
await bot.send_message(message.chat.id, "Your state was cancelled.")
|
||||||
|
await bot.delete_state(message.from_user.id)
|
||||||
|
|
||||||
|
@bot.message_handler(state=MyStates.name)
|
||||||
|
async def name_get(message):
|
||||||
|
"""
|
||||||
|
State 1. Will process when user's state is 1.
|
||||||
|
"""
|
||||||
|
await bot.send_message(message.chat.id, f'Now write me a surname')
|
||||||
|
await bot.set_state(message.from_user.id, MyStates.surname)
|
||||||
|
async with bot.retrieve_data(message.from_user.id) as data:
|
||||||
|
data['name'] = message.text
|
||||||
|
|
||||||
|
|
||||||
|
@bot.message_handler(state=MyStates.surname)
|
||||||
|
async def ask_age(message):
|
||||||
|
"""
|
||||||
|
State 2. Will process when user's state is 2.
|
||||||
|
"""
|
||||||
|
await bot.send_message(message.chat.id, "What is your age?")
|
||||||
|
await bot.set_state(message.from_user.id, MyStates.age)
|
||||||
|
async with bot.retrieve_data(message.from_user.id) as data:
|
||||||
|
data['surname'] = message.text
|
||||||
|
|
||||||
|
# result
|
||||||
|
@bot.message_handler(state=MyStates.age, is_digit=True)
|
||||||
|
async def ready_for_answer(message):
|
||||||
|
async with bot.retrieve_data(message.from_user.id) as data:
|
||||||
|
await bot.send_message(message.chat.id, "Ready, take a look:\n<b>Name: {name}\nSurname: {surname}\nAge: {age}</b>".format(name=data['name'], surname=data['surname'], age=message.text), parse_mode="html")
|
||||||
|
await bot.delete_state(message.from_user.id)
|
||||||
|
|
||||||
|
#incorrect number
|
||||||
|
@bot.message_handler(state=MyStates.age, is_digit=False)
|
||||||
|
async def age_incorrect(message):
|
||||||
|
await bot.send_message(message.chat.id, 'Looks like you are submitting a string in the field age. Please enter a number')
|
||||||
|
|
||||||
|
# register filters
|
||||||
|
|
||||||
|
bot.add_custom_filter(asyncio_filters.StateFilter(bot))
|
||||||
|
bot.add_custom_filter(asyncio_filters.IsDigitFilter())
|
||||||
|
|
||||||
|
# set saving states into file.
|
||||||
|
bot.enable_saving_states() # you can delete this if you do not need to save states
|
||||||
|
|
||||||
|
asyncio.run(bot.polling())
|
27
examples/asynchronous_telebot/echo_bot.py
Normal file
27
examples/asynchronous_telebot/echo_bot.py
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
|
||||||
|
# This is a simple echo bot using the decorator mechanism.
|
||||||
|
# It echoes any incoming text messages.
|
||||||
|
|
||||||
|
from telebot.async_telebot import AsyncTeleBot
|
||||||
|
import asyncio
|
||||||
|
bot = AsyncTeleBot('TOKEN')
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Handle '/start' and '/help'
|
||||||
|
@bot.message_handler(commands=['help', 'start'])
|
||||||
|
async def send_welcome(message):
|
||||||
|
await bot.reply_to(message, """\
|
||||||
|
Hi there, I am EchoBot.
|
||||||
|
I am here to echo your kind words back to you. Just say anything nice and I'll say the exact same thing to you!\
|
||||||
|
""")
|
||||||
|
|
||||||
|
|
||||||
|
# Handle all other messages with content_type 'text' (content_types defaults to ['text'])
|
||||||
|
@bot.message_handler(func=lambda message: True)
|
||||||
|
async def echo_message(message):
|
||||||
|
await bot.reply_to(message, message.text)
|
||||||
|
|
||||||
|
|
||||||
|
asyncio.run(bot.polling())
|
19
examples/asynchronous_telebot/register_handler.py
Normal file
19
examples/asynchronous_telebot/register_handler.py
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
from telebot.async_telebot import AsyncTeleBot
|
||||||
|
import asyncio
|
||||||
|
bot = AsyncTeleBot('TOKEN')
|
||||||
|
|
||||||
|
async def start_executor(message):
|
||||||
|
await bot.send_message(message.chat.id, 'Hello!')
|
||||||
|
|
||||||
|
bot.register_message_handler(start_executor, commands=['start']) # Start command executor
|
||||||
|
|
||||||
|
# See also
|
||||||
|
# bot.register_callback_query_handler(*args, **kwargs)
|
||||||
|
# bot.register_channel_post_handler(*args, **kwargs)
|
||||||
|
# bot.register_chat_member_handler(*args, **kwargs)
|
||||||
|
# bot.register_inline_handler(*args, **kwargs)
|
||||||
|
# bot.register_my_chat_member_handler(*args, **kwargs)
|
||||||
|
# bot.register_edited_message_handler(*args, **kwargs)
|
||||||
|
# And other functions..
|
||||||
|
|
||||||
|
asyncio.run(bot.polling(skip_pending=True))
|
13
examples/asynchronous_telebot/skip_updates_example.py
Normal file
13
examples/asynchronous_telebot/skip_updates_example.py
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
from telebot.async_telebot import AsyncTeleBot
|
||||||
|
import asyncio
|
||||||
|
bot = AsyncTeleBot('TOKEN')
|
||||||
|
|
||||||
|
@bot.message_handler(commands=['start', 'help'])
|
||||||
|
async def send_welcome(message):
|
||||||
|
await bot.reply_to(message, "Howdy, how are you doing?")
|
||||||
|
|
||||||
|
@bot.message_handler(func=lambda message: True)
|
||||||
|
async def echo_all(message):
|
||||||
|
await bot.reply_to(message, message.text)
|
||||||
|
|
||||||
|
asyncio.run(bot.polling(skip_pending=True))# Skip pending skips old updates
|
2823
telebot/__init__.py
2823
telebot/__init__.py
File diff suppressed because it is too large
Load Diff
2869
telebot/async_telebot.py
Normal file
2869
telebot/async_telebot.py
Normal file
File diff suppressed because it is too large
Load Diff
@ -144,7 +144,8 @@ class IsAdminFilter(SimpleCustomFilter):
|
|||||||
self._bot = bot
|
self._bot = bot
|
||||||
|
|
||||||
async def check(self, message):
|
async def check(self, message):
|
||||||
return self._bot.get_chat_member(message.chat.id, message.from_user.id).status in ['creator', 'administrator']
|
result = await self._bot.get_chat_member(message.chat.id, message.from_user.id)
|
||||||
|
return result.status in ['creator', 'administrator']
|
||||||
|
|
||||||
class StateFilter(AdvancedCustomFilter):
|
class StateFilter(AdvancedCustomFilter):
|
||||||
"""
|
"""
|
||||||
@ -158,10 +159,11 @@ class StateFilter(AdvancedCustomFilter):
|
|||||||
key = 'state'
|
key = 'state'
|
||||||
|
|
||||||
async def check(self, message, text):
|
async def check(self, message, text):
|
||||||
if await self.bot.current_states.current_state(message.from_user.id) is False: return False
|
result = await self.bot.current_states.current_state(message.from_user.id)
|
||||||
|
if result is False: return False
|
||||||
elif text == '*': return True
|
elif text == '*': return True
|
||||||
elif type(text) is list: return await self.bot.current_states.current_state(message.from_user.id) in text
|
elif type(text) is list: return result in text
|
||||||
return await self.bot.current_states.current_state(message.from_user.id) == text
|
return result == text
|
||||||
|
|
||||||
class IsDigitFilter(SimpleCustomFilter):
|
class IsDigitFilter(SimpleCustomFilter):
|
||||||
"""
|
"""
|
||||||
|
@ -94,11 +94,11 @@ class StateFile:
|
|||||||
|
|
||||||
async def delete_state(self, chat_id):
|
async def delete_state(self, chat_id):
|
||||||
"""Delete a state"""
|
"""Delete a state"""
|
||||||
states_data = await self._read_data()
|
states_data = self._read_data()
|
||||||
states_data.pop(chat_id)
|
states_data.pop(chat_id)
|
||||||
await self._save_data(states_data)
|
await self._save_data(states_data)
|
||||||
|
|
||||||
async def _read_data(self):
|
def _read_data(self):
|
||||||
"""
|
"""
|
||||||
Read the data from file.
|
Read the data from file.
|
||||||
"""
|
"""
|
||||||
@ -107,7 +107,7 @@ class StateFile:
|
|||||||
file.close()
|
file.close()
|
||||||
return states_data
|
return states_data
|
||||||
|
|
||||||
async def _create_dir(self):
|
def _create_dir(self):
|
||||||
"""
|
"""
|
||||||
Create directory .save-handlers.
|
Create directory .save-handlers.
|
||||||
"""
|
"""
|
||||||
@ -152,7 +152,7 @@ class StateFile:
|
|||||||
"""
|
"""
|
||||||
await self.delete_state(chat_id)
|
await self.delete_state(chat_id)
|
||||||
|
|
||||||
async def retrieve_data(self, chat_id):
|
def retrieve_data(self, chat_id):
|
||||||
"""
|
"""
|
||||||
Save input text.
|
Save input text.
|
||||||
|
|
||||||
@ -195,7 +195,7 @@ class StateFileContext:
|
|||||||
return self.data
|
return self.data
|
||||||
|
|
||||||
async def __aexit__(self, exc_type, exc_val, exc_tb):
|
async def __aexit__(self, exc_type, exc_val, exc_tb):
|
||||||
old_data = await self.obj._read_data()
|
old_data = self.obj._read_data()
|
||||||
for i in self.data:
|
for i in self.data:
|
||||||
old_data[self.chat_id]['data'][i] = self.data.get(i)
|
old_data[self.chat_id]['data'][i] = self.data.get(i)
|
||||||
await self.obj._save_data(old_data)
|
await self.obj._save_data(old_data)
|
||||||
|
Loading…
Reference in New Issue
Block a user