A monkeypatcher add-on for Pyrogram that does conversation handling
Project description
pyromod
A monkeypatcher add-on for Pyrogram which does conversation handling and other cool stuff.
In other words, it is a compilation of utilities i developed for improving my personal experience with Pyrogram. It works together with Pyrogram, it is not a fork/modded version. It does monkeypatching to add features to Pyrogram classes on the go (so i don't need to update on every Pyrogram's release).
Usage
Import pyromod
one time in your script and you'll already be able to use the modified pyrogram in all your handlers. Example:
# config.py
import pyromod
from pyrogram import Client
app = Client('my_session')
Then you can, from another file, do from config import app
to import the modded Pyrogram Client we created above. It will be modded globally.
All the patches are applied automatically as soon as pyromod is imported.
Methods
All pyromod methods are callable by any of these ways:
await Client.<method>(identifier, ...)
await Chat.<method>()
await User.<method>()
In the last two, Pyrogram automatically gets the ids from the object, to compound the identifier
tuple that Client.listen
uses.
These are the methods pyromod adds:
-
listen(identifier, filters=None, listener_type=ListenerTypes.MESSAGE, timeout=None, unallowed_click_alert=True)
Awaits for a new message in the specified chat and returns its Message object. If listener_type is set toListenerTypes.CALLBACK_QUERY
, it awaits and returns a CallbackQuery object. You can pass Update Filters to thefilters
parameter just like you do for the update handlers. e.g.filters=filters.photo & filters.bot
identifier
is a tuple containing, in this exact order, (chat_id, user_id, message_id). It lets you specify exactly which update you want. You don't need to worry about that if you mostly use the bound methods.unnalowed_click_alert
is the text that users will see in an alert when the button is not waiting for them to click. If True, it uses the default text atPyromodConfig.unnalowed_click_alert_text
. If False, no text is shown. -
ask(text, identifier, filters=None, listener_type=ListenerTypes.MESSAGE, timeout=None, unallowed_click_alert=True)
Same aslisten
, but sends a message to identifier[0] before and only then waits for a response. You can additionally pass any of theClient.send_message()
parameters. Check the example below. The object of the sent message is returned inside of the attributerequest
Example:
answer = await message.chat.ask('*Send me your name:*', parse_mode=enums.ParseMode.MARKDOWN)
await answer.request.edit_text("Name received!")
await answer.reply(f'Your name is: {answer.text}', quote=True)
Message.wait_for_click(from_user_id=None, timeout=None, filters=None, alert=True)
Awaits from a click on any button on the Message object. Iffrom_user_id
is passed, pyromod will wait for a click of that user. If you pass any text toalert
, it will be shown to any other user. Ifalert
is True, it will use the default text. If False, no text will be shown.
pyromod.helpers
Tools for creating inline keyboards a lot easier.
pyromod.helpers.ikb
Creates a inline keyboard. Its first and only argument is a list (the keyboard itself) containing lists (the lines) of buttons, which can be lists or tuples. I use tuples to avoid a mess with a lot of brackets. Tuples makes it easier to read.
The button syntax is very simple: (TEXT, VALUE, TYPE)
, with TYPE being any existent button type (e.g. url
) and VALUE is its value. If you omit the type, it will be considered as a callback button.
If you pass only a string as button, it will be used as text and callback_data for the InlineKeyboardButton.
This syntax will be automagically converted by pyromod.
Examples:
from pyromod.helpers import ikb
...
keyboard = ikb([
[('Button 1', 'call_1'), ('Button 2', 'call_2')],
[('Another button', 't.me/pyromodchat', 'url')]
])
await message.reply('Easy inline keyboard', reply_markup=keyboard)
keyboard = ikb([
["Mars", "Earth", "Venus"],
["Saturn", "Jupyter"]
])
await message.reply("Easiest inline keyboard", reply_markup=keyboard)
pyromod.helpers.array_chunk
Chunk the elements of a list into small lists. i.e. [1, 2, 3, 4] can become [[1,2], [3,4]]. This is extremely useful if you want to build a keyboard dinamically with more than 1 column. You just put all buttons together in a list and run:
lines = array_chunk(buttons, 2)
keyboard = ikb(lines)
This will generate a list of lines with 2 buttons on each one.
pyromod.nav
Tools for creating navigation keyboards.
pyromod.nav.Pagination
Creates a full paginated keyboard. Usage:
from pyrogram import Client, filters
from pyromod.nav import Pagination
from pyromod.helpers import ikb
def page_data(page):
return f'view_page {page}'
def item_data(item, page):
return f'view_item {item} {page}'
def item_title(item, page):
return f'Item {item} of page {page}'
@Client.on_message(filters.regex('/nav'))
async def on_nav(c,m):
objects = [*range(1,100)]
page = Pagination(
objects,
page_data=page_data, # callback to define the callback_data for page buttons in the bottom
item_data=item_data, # callback to define the callback_data for each item button
item_title=item_title # callback to define the text for each item button
)
index = 0 # in which page is it now? (used to calculate the offset)
lines = 5 # how many lines of the keyboard to include for the items
columns = how many columns include in each items' line
kb = page.create(index, lines, columns)
await m.reply('Test', reply_markup=ikb(kb))
pyromod.PyrogramConfig
It lets you do some tweaks on pyromod behavior.
class PyromodConfig:
timeout_handler = None
stopped_handler = None
throw_exceptions = True
unallowed_click_alert = True
unallowed_click_alert_text = (
"[pyromod] You're not expected to click this button."
)
timeout_handler
and stopped_handler
are callbacks that receive (identifier, listener_data) as arguments. timeout_handler receives an extra arg timeout
. When they are in use, pyromod won't throw the exceptions ListenerStopped and ListenedTimeout.
Copyright & License
This project may include snippets of Pyrogram code
- Pyrogram - Telegram MTProto API Client Library for Python. Copyright (C) 2017-2022 Dan <https://github.com/delivrance>
Licensed under the terms of the GNU Lesser General Public License v3 or later (LGPLv3+)
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file pyromod-2.0.0.tar.gz
.
File metadata
- Download URL: pyromod-2.0.0.tar.gz
- Upload date:
- Size: 11.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.3.2 CPython/3.11.1 Linux/4.19.113-25310050
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | f9c3a9a2d6cebe57aa5b915199e5bde26eb4c528b222439c28a90092a7d1fc5b |
|
MD5 | 79756bbfef73ea82ff4825c85b2fdf83 |
|
BLAKE2b-256 | 48e29123bb8d324bcce50a9006de4ab7712693a0bfafa98e2443214b377e9871 |
File details
Details for the file pyromod-2.0.0-py3-none-any.whl
.
File metadata
- Download URL: pyromod-2.0.0-py3-none-any.whl
- Upload date:
- Size: 28.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.3.2 CPython/3.11.1 Linux/4.19.113-25310050
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | eb34d31154fdb82c00c987e4e51e87615443eb183b4e79389db3d1ed394cc2c9 |
|
MD5 | d856775987702f3f3160696c9a56cfcd |
|
BLAKE2b-256 | 15e526ece34fd4f6fc6ae8b1032844345bdd8d801dd0f14055989e2a027b00c0 |