You can implement conversation in your project based on pyrogram very easy with pyrostep.
Features:
- Full type hint
- Support step handling
- Support asking
- Change core settings of pyrogram
Installing
pip3 install -U pyrostep
Content
Use pyrostep.listen()
to start listening on your client:
from pyrogram import Client
import pyrostep
# ...
client = Client("myaccount")
pyrostep.listen(client)
Note
Always use pyrostep.listen()
before adding your handlers.
After that, we have two ways to make conversation: wait_for method or step handling
⏰ In this way we can use pyrostep.wait_for
function, that waits for an update (e.g message) from your target.
client = Client("myaccount")
pyrostep.listen(client)
# ...
@client.on_message()
async def get_name(_, message):
await message.reply("Send your name?")
answer = await pyrostep.wait_for(message.from_user.id)
await message.reply(f"Your name is {answer.text}")
Tip
You can specify how long it will wait with timeout
parameter. see this example:
client = Client("myaccount")
pyrostep.listen(client)
# ...
@client.on_message()
async def get_name(_, message):
await message.reply("Send your name?")
try:
answer = await pyrostep.wait_for(message.from_user.id, timeout=10)
except TimeoutError:
await message.reply("Timed out")
else:
await message.reply(f"Your name is {answer.text}")
🔗 Related functions:
clear()
: remove all registered steps (and cancels all wait_for's).
🎯 In this way we will use this functions:
pyrostep.register_next_step()
We will specify a function that should process the next update from the target with pyrostep.register_next_step()
.
Important
In this way we cannot specify a timeout.
client = Client("myaccount")
pyrostep.listen(client)
# ...
@client.on_message()
async def get_name(_, message):
await message.reply("Send your name?")
await pyrostep.register_next_step(
message.from_user.id, get_age
)
async def get_age(_, message):
await message.reply("OK, Send your age?")
await pyrostep.register_next_step(
message.from_user.id,
say_info,
kwargs={"name": message.text}
)
async def say_info(_, message, name: str = None):
await message.reply(f"Name: {name} - Age: {message.text}")
🔗 Related functions:
unregister_steps(id)
: remove registered step for id.clear()
: remove all registered steps (and cancels all wait_for's).
📁 If you're using plugins in pyrogram, maybe you cannot use pyrostep.listen()
, so you can use pyrostep.listening_handler
function.
How? there's an example:
# plugin file
from pyrogram import Client
import pyrostep
Client.on_message()
async def stephandler(client, message):
await pyrostep.listening_handler(client, message)
# your other handlers
Warning
We didn't test it completely.
✂️ pyrostep have some shortcuts and shorthands for you.
split_list splites your list.
example:
>>> from pyrostep import shortcuts
>>> split_list([1, 2, 3, 4, 5, 6], 2)
[[1, 2], [3, 4], [5, 6]]
>>> split_list([1, 2, 3], 2)
[[1, 2], [3]]
keyboard creates ReplyKeyboardMarkup from your list.
example:
>>> from pyrostep import shortcuts
>>> buttons = [
... [["Top Left"], ["Top Right"]],
... [["Bottom | Request Contact", True, "request_contact"]]
... ]
>>> shortcuts.keyboard(buttons)
ReplyKeyboardMarkup(keyboard=[[KeyboardButton(text='Top Left'), KeyboardButton(text='Top Right')], [KeyboardButton(text='Bottom | Request Contact', request_contact=True)]])
inlinekeyboard creates InlineKeyboardMarkup from your list.
example:
>>> from pyrostep import shortcuts
>>> buttons = [
... [["Top Left", "data_1"], ["Top Right", "data_2"]],
... [["Bottom", "Your URL", "url"]]
... ]
>>> shortcuts.inlinekeyboard(buttons)
InlineKeyboardMarkup(inline_keyboard=[[InlineKeyboardButton(text='Top Left', callback_data='data_1'), InlineKeyboardButton(text='Top Right', callback_data='data_2')], [InlineKeyboardButton(text='Bottom', url='Your URL')]])
validation_channels checks user is already in channels or not.
returns True
if user is already in channels, returns False
otherwise.
example:
>>> from pyrostep import shortcuts
>>> user_id = 56392019
>>> channels = [-10279279837, -10823827873, 'channel_username']
>>> await validation_channels(app, user_id, channels)
True
This package helps you to change pyrogram connection settings.
Note
All of these functions should be used before importing pyrogram
How many times does it try to connect (to proxy or telegram)?
How many times does it try to invoke a method?
How many seconds to wait for connection?
How many times does it try to authenticate?
Example:
from pyrostep import connection
connection.connection_max_retries(3)
connection.invoke_max_retries(3)
connection.session_start_timeout(20)
connection.session_max_retries(2)
from pyrogram import Client
# code ...