spluspy 2.1.2__tar.gz → 2.1.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {spluspy-2.1.2 → spluspy-2.1.4}/CHANGELOG.md +11 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/PKG-INFO +1 -1
- {spluspy-2.1.2 → spluspy-2.1.4}/pyproject.toml +1 -1
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/__version__.py +1 -1
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/version.py +1 -1
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/admin.py +44 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/client/client.py +72 -16
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/models/message.py +83 -6
- {spluspy-2.1.2 → spluspy-2.1.4}/.gitignore +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/CONTRIBUTING.md +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/Dockerfile +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/LICENSE +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/MANIFEST.in +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/README.md +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/README.rst +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/examples/01_hello_bot.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/examples/02_echo_bot.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/examples/03_command_bot.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/examples/04_private_only.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/examples/05_group_only.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/examples/06_regex_bot.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/examples/07_user_filter.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/examples/08_combined_filters.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/examples/09_inline_keyboard.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/examples/10_reply_keyboard.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/examples/11_message_actions.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/examples/12_media_bot.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/examples/13_fsm_bot.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/examples/14_plugin_bot.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/examples/15_middleware_bot.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/examples/16_scheduler_bot.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/examples/17_conversation.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/examples/18_chat_management.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/examples/19_event_types.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/examples/20_sync_bot.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/examples/21_album_handler.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/examples/22_download_bot.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/examples/23_url_button.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/examples/24_string_session.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/examples/25_error_handling.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/examples/25_working_bot.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/examples/26_message_entities.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/examples/27_search_messages.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/examples/28_poll_bot.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/examples/29_dice_bot.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/examples/30_cache_bot.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/examples/31_reaction_bot.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/examples/32_mark_read_bot.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/examples/33_context_manager.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/examples/34_user_info.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/examples/35_chat_info.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/examples/36_forward_copy.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/examples/37_admin_bot.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/examples/38_media_filters.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/examples/39_status_bot.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/examples/40_delete_detection.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/examples/41_read_detection.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/examples/42_raw_events.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/examples/43_poll_handler.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/examples/44_reaction_handler.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/examples/45_typing_handler.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/examples/46_get_messages.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/examples/47_iter_messages.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/examples/48_get_members.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/examples/49_resolve_username.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/examples/50_invoke.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/setup.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/__init__.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/__init__.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/_updates/__init__.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/_updates/entitycache.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/_updates/messagebox.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/_updates/session.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/client/__init__.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/client/account.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/client/auth.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/client/bots.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/client/buttons.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/client/chats.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/client/dialogs.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/client/downloads.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/client/messageparse.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/client/messages.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/client/soroushclient.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/client/telegrambaseclient.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/client/updates.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/client/uploads.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/client/users.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/crypto/__init__.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/crypto/aes.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/crypto/aesctr.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/crypto/authkey.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/crypto/cdndecrypter.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/crypto/factorization.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/crypto/fast_aes.pyx +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/crypto/fast_rsa.pyx +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/crypto/libssl.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/crypto/rsa.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/custom.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/errors/__init__.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/errors/common.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/errors/rpcbaseerrors.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/errors/rpcerrorlist.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/events/__init__.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/events/album.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/events/callbackquery.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/events/chataction.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/events/common.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/events/inlinequery.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/events/messagedeleted.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/events/messageedited.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/events/messageread.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/events/newmessage.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/events/raw.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/events/userupdate.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/extensions/__init__.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/extensions/binaryreader.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/extensions/html.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/extensions/markdown.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/extensions/messagepacker.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/functions.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/helpers.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/hints.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/network/__init__.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/network/authenticator.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/network/connection/__init__.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/network/connection/connection.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/network/connection/http.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/network/connection/tcpabridged.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/network/connection/tcpfull.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/network/connection/tcpintermediate.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/network/connection/tcpmtproxy.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/network/connection/tcpobfuscated.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/network/connection/websocket.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/network/mtprotoplainsender.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/network/mtprotosender.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/network/mtprotostate.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/network/requeststate.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/password.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/requestiter.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/sessions/__init__.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/sessions/abstract.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/sessions/memory.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/sessions/sqlite.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/sessions/string.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/sync.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/__init__.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/alltlobjects.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/core/__init__.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/core/gzippacked.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/core/messagecontainer.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/core/rpcresult.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/core/tlmessage.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/custom/__init__.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/custom/adminlogevent.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/custom/button.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/custom/chatgetter.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/custom/conversation.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/custom/dialog.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/custom/draft.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/custom/file.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/custom/forward.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/custom/inlinebuilder.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/custom/inlineresult.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/custom/inlineresults.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/custom/inputsizedfile.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/custom/message.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/custom/messagebutton.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/custom/participantpermissions.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/custom/qrlogin.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/custom/sendergetter.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/custom/types.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/functions/__init__.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/functions/account.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/functions/auth.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/functions/bots.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/functions/channels.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/functions/chatlists.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/functions/conference.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/functions/contacts.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/functions/folders.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/functions/help.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/functions/langpack.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/functions/messages.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/functions/payments.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/functions/phone.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/functions/photos.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/functions/premium.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/functions/stats.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/functions/stories.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/functions/thirdParty.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/functions/updates.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/functions/upload.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/functions/users.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/patched/__init__.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/tlobject.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/types/__init__.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/types/account.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/types/auth.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/types/bots.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/types/channels.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/types/chatlists.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/types/conference.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/types/contacts.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/types/help.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/types/messages.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/types/payments.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/types/phone.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/types/photos.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/types/premium.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/types/stats.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/types/stickers.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/types/storage.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/types/stories.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/types/thirdParty.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/types/update.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/types/updates.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/types/upload.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/tl/types/users.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/types.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/_engine/utils.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/afk.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/cli.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/client/__init__.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/client/chat_mixin.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/client/conversation.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/client/media_mixin.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/compat.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/config.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/errors/__init__.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/errors/exceptions.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/events/__init__.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/events/album.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/events/base.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/events/callback.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/events/chat_action.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/events/edited.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/events/inline.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/events/message.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/events/message_deleted.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/events/message_read.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/events/user_update.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/filters/__init__.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/filters/filters.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/fsm/__init__.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/fsm/state.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/middleware/__init__.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/middleware/base.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/middleware/rate_limit.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/mirror.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/models/__init__.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/models/bot.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/models/chat.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/models/enums.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/models/media.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/models/objects.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/models/user.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/network/__init__.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/network/client.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/network/connection.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/network/http_client.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/network/mtproto.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/network/protocols.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/network/spluspy_adapter.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/network/transport.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/plugins/__init__.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/plugins/loader.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/py.typed +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/scheduler/__init__.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/scheduler/scheduler.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/session/__init__.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/session/base.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/session/memory.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/session/sqlite.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/session/string.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/storage/__init__.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/storage/base.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/storage/entity_cache.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/storage/memory.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/storage/postgres.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/storage/redis.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/storage/sqlite.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/sync/__init__.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/sync/client.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/utils/__init__.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/utils/batch.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/utils/cache.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/utils/chat_lock.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/utils/file_transfer.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/utils/helpers.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/utils/logger.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/utils/rate_limiter.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/utils/resolver.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/spluspy/utils/version_check.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/tests/__init__.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/tests/test_client.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/tests/test_filters.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/tests/test_fsm.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/tests/test_fsm_enhanced.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/tests/test_middleware.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/tests/test_rate_limiter.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/tests/test_resolver.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/tests/test_scheduler.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/tests/test_session.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/tests/test_storage.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/tests/test_types.py +0 -0
- {spluspy-2.1.2 → spluspy-2.1.4}/tests/test_utils.py +0 -0
|
@@ -5,6 +5,17 @@ All notable changes to SplusPy will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/).
|
|
7
7
|
|
|
8
|
+
## [2.1.3] - 2026-07-13
|
|
9
|
+
|
|
10
|
+
### Fixed
|
|
11
|
+
- Fixed loop error in Bots: scheduler tasks now run on the correct event loop
|
|
12
|
+
- Fixed `wait_until_ready()` method not existing error
|
|
13
|
+
- Fixed `pin_chat_message` method name to `pin_message`
|
|
14
|
+
|
|
15
|
+
### Added
|
|
16
|
+
- `get_reply_message()` method to `Message` class for fetching replied-to messages
|
|
17
|
+
- Pin/unpin commands for managers, owners, and creator (`پین`, `انپین`, `انپین همه`)
|
|
18
|
+
|
|
8
19
|
## [2.1.1] - 2026-07-12
|
|
9
20
|
|
|
10
21
|
### Changed
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: spluspy
|
|
3
|
-
Version: 2.1.
|
|
3
|
+
Version: 2.1.4
|
|
4
4
|
Summary: A modern async Python library for interacting with Soroush Plus
|
|
5
5
|
Project-URL: Homepage, https://github.com/Itskillmaster/spluspy
|
|
6
6
|
Project-URL: Documentation, https://github.com/Itskillmaster/spluspy#readme
|
|
@@ -157,6 +157,50 @@ class ChatAdmin:
|
|
|
157
157
|
logger.error("unmute_user(chat=%s, user=%s) failed: %s", chat_id, user_id, exc)
|
|
158
158
|
return False
|
|
159
159
|
|
|
160
|
+
async def pin_chat_message(
|
|
161
|
+
self,
|
|
162
|
+
chat_id: int,
|
|
163
|
+
message_id: Union[int, str],
|
|
164
|
+
notify: bool = True,
|
|
165
|
+
) -> bool:
|
|
166
|
+
"""Pin a specific message in a chat.
|
|
167
|
+
|
|
168
|
+
Args:
|
|
169
|
+
chat_id: Target chat.
|
|
170
|
+
message_id: Message identifier to pin.
|
|
171
|
+
notify: If ``True``, notify all members.
|
|
172
|
+
|
|
173
|
+
Returns:
|
|
174
|
+
``True`` on success, ``False`` on failure.
|
|
175
|
+
"""
|
|
176
|
+
try:
|
|
177
|
+
return await self._client.pin_chat_message(
|
|
178
|
+
chat_id, message_id, notify=notify,
|
|
179
|
+
)
|
|
180
|
+
except Exception as exc:
|
|
181
|
+
logger.error("pin_chat_message(chat=%s, msg=%s) failed: %s", chat_id, message_id, exc)
|
|
182
|
+
return False
|
|
183
|
+
|
|
184
|
+
async def unpin_chat_message(
|
|
185
|
+
self,
|
|
186
|
+
chat_id: int,
|
|
187
|
+
message_id: Union[int, str],
|
|
188
|
+
) -> bool:
|
|
189
|
+
"""Unpin a specific message in a chat.
|
|
190
|
+
|
|
191
|
+
Args:
|
|
192
|
+
chat_id: Target chat.
|
|
193
|
+
message_id: Message identifier to unpin.
|
|
194
|
+
|
|
195
|
+
Returns:
|
|
196
|
+
``True`` on success, ``False`` on failure.
|
|
197
|
+
"""
|
|
198
|
+
try:
|
|
199
|
+
return await self._client.unpin_chat_message(chat_id, message_id)
|
|
200
|
+
except Exception as exc:
|
|
201
|
+
logger.error("unpin_chat_message(chat=%s, msg=%s) failed: %s", chat_id, message_id, exc)
|
|
202
|
+
return False
|
|
203
|
+
|
|
160
204
|
async def pin_message(
|
|
161
205
|
self,
|
|
162
206
|
chat_id: int,
|
|
@@ -2120,12 +2120,17 @@ class Client(MediaMixin, ChatManagementMixin):
|
|
|
2120
2120
|
on_progress=on_progress,
|
|
2121
2121
|
)
|
|
2122
2122
|
|
|
2123
|
-
async def
|
|
2124
|
-
|
|
2123
|
+
async def pin_chat_message(
|
|
2124
|
+
self,
|
|
2125
|
+
chat_id: Union[int, str],
|
|
2126
|
+
message_id: Union[int, str],
|
|
2127
|
+
notify: bool = True,
|
|
2128
|
+
) -> bool:
|
|
2129
|
+
"""Pin a specific message in a chat.
|
|
2125
2130
|
|
|
2126
2131
|
Args:
|
|
2127
|
-
chat_id: Target chat identifier.
|
|
2128
|
-
|
|
2132
|
+
chat_id: Target chat identifier (int ID, ``@username``, etc.).
|
|
2133
|
+
message_id: Message identifier to pin (int or str).
|
|
2129
2134
|
notify: If ``True``, notify all members about the pin.
|
|
2130
2135
|
|
|
2131
2136
|
Returns:
|
|
@@ -2133,38 +2138,89 @@ class Client(MediaMixin, ChatManagementMixin):
|
|
|
2133
2138
|
"""
|
|
2134
2139
|
client = self._get_client()
|
|
2135
2140
|
if not client:
|
|
2136
|
-
logger.warning("
|
|
2141
|
+
logger.warning("pin_chat_message skipped: client not connected")
|
|
2137
2142
|
return False
|
|
2138
|
-
msg_id =
|
|
2143
|
+
msg_id = int(message_id)
|
|
2139
2144
|
try:
|
|
2140
|
-
|
|
2145
|
+
try:
|
|
2146
|
+
from spluspy._engine import functions
|
|
2147
|
+
except ImportError:
|
|
2148
|
+
from telethon import functions # type: ignore[import-untyped]
|
|
2149
|
+
|
|
2150
|
+
input_peer = await client.get_input_entity(int(chat_id))
|
|
2151
|
+
await client(functions.messages.UpdatePinnedMessageRequest(
|
|
2152
|
+
peer=input_peer,
|
|
2153
|
+
id=msg_id,
|
|
2154
|
+
silent=not notify,
|
|
2155
|
+
))
|
|
2141
2156
|
return True
|
|
2142
2157
|
except Exception as exc:
|
|
2143
|
-
logger.error("
|
|
2158
|
+
logger.error("pin_chat_message(chat=%s, msg=%s) failed: %s", chat_id, msg_id, exc)
|
|
2144
2159
|
return False
|
|
2145
2160
|
|
|
2146
|
-
async def
|
|
2147
|
-
|
|
2161
|
+
async def unpin_chat_message(
|
|
2162
|
+
self,
|
|
2163
|
+
chat_id: Union[int, str],
|
|
2164
|
+
message_id: Union[int, str],
|
|
2165
|
+
) -> bool:
|
|
2166
|
+
"""Unpin a specific message in a chat.
|
|
2148
2167
|
|
|
2149
2168
|
Args:
|
|
2150
|
-
chat_id: Target chat identifier.
|
|
2151
|
-
|
|
2169
|
+
chat_id: Target chat identifier (int ID, ``@username``, etc.).
|
|
2170
|
+
message_id: Message identifier to unpin (int or str).
|
|
2152
2171
|
|
|
2153
2172
|
Returns:
|
|
2154
2173
|
``True`` on success, ``False`` on failure.
|
|
2155
2174
|
"""
|
|
2156
2175
|
client = self._get_client()
|
|
2157
2176
|
if not client:
|
|
2158
|
-
logger.warning("
|
|
2177
|
+
logger.warning("unpin_chat_message skipped: client not connected")
|
|
2159
2178
|
return False
|
|
2160
|
-
msg_id =
|
|
2179
|
+
msg_id = int(message_id)
|
|
2161
2180
|
try:
|
|
2162
|
-
|
|
2181
|
+
try:
|
|
2182
|
+
from spluspy._engine import functions
|
|
2183
|
+
except ImportError:
|
|
2184
|
+
from telethon import functions # type: ignore[import-untyped]
|
|
2185
|
+
|
|
2186
|
+
input_peer = await client.get_input_entity(int(chat_id))
|
|
2187
|
+
await client(functions.messages.UpdatePinnedMessageRequest(
|
|
2188
|
+
peer=input_peer,
|
|
2189
|
+
id=msg_id,
|
|
2190
|
+
unpin=True,
|
|
2191
|
+
))
|
|
2163
2192
|
return True
|
|
2164
2193
|
except Exception as exc:
|
|
2165
|
-
logger.error("
|
|
2194
|
+
logger.error("unpin_chat_message(chat=%s, msg=%s) failed: %s", chat_id, msg_id, exc)
|
|
2166
2195
|
return False
|
|
2167
2196
|
|
|
2197
|
+
async def pin_message(self, chat_id: int, message: Union[Message, int], *, notify: bool = False) -> bool:
|
|
2198
|
+
"""Pin a message in a chat.
|
|
2199
|
+
|
|
2200
|
+
Args:
|
|
2201
|
+
chat_id: Target chat identifier.
|
|
2202
|
+
message: :class:`Message` object or message ID to pin.
|
|
2203
|
+
notify: If ``True``, notify all members about the pin.
|
|
2204
|
+
|
|
2205
|
+
Returns:
|
|
2206
|
+
``True`` on success, ``False`` on failure.
|
|
2207
|
+
"""
|
|
2208
|
+
msg_id = message.id if isinstance(message, Message) else message
|
|
2209
|
+
return await self.pin_chat_message(chat_id, msg_id, notify=notify)
|
|
2210
|
+
|
|
2211
|
+
async def unpin_message(self, chat_id: int, message: Union[Message, int]) -> bool:
|
|
2212
|
+
"""Unpin a message in a chat.
|
|
2213
|
+
|
|
2214
|
+
Args:
|
|
2215
|
+
chat_id: Target chat identifier.
|
|
2216
|
+
message: :class:`Message` object or message ID to unpin.
|
|
2217
|
+
|
|
2218
|
+
Returns:
|
|
2219
|
+
``True`` on success, ``False`` on failure.
|
|
2220
|
+
"""
|
|
2221
|
+
msg_id = message.id if isinstance(message, Message) else message
|
|
2222
|
+
return await self.unpin_chat_message(chat_id, msg_id)
|
|
2223
|
+
|
|
2168
2224
|
async def unpin_all_messages(self, chat_id: int) -> bool:
|
|
2169
2225
|
client = self._get_client()
|
|
2170
2226
|
if not client:
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
+
import logging
|
|
5
6
|
from dataclasses import dataclass, field
|
|
6
7
|
from datetime import datetime
|
|
7
8
|
from typing import TYPE_CHECKING, Any, Optional, Union
|
|
@@ -19,6 +20,8 @@ if TYPE_CHECKING:
|
|
|
19
20
|
from spluspy.models.media import Media
|
|
20
21
|
from spluspy.models.user import User
|
|
21
22
|
|
|
23
|
+
logger = logging.getLogger("message")
|
|
24
|
+
|
|
22
25
|
|
|
23
26
|
@dataclass(slots=True)
|
|
24
27
|
class Message:
|
|
@@ -163,19 +166,93 @@ class Message:
|
|
|
163
166
|
raise RuntimeError("Message is not bound to a client")
|
|
164
167
|
return await self._client.copy_messages(chat_id, self)
|
|
165
168
|
|
|
166
|
-
async def
|
|
167
|
-
"""
|
|
169
|
+
async def get_reply_message(self) -> Optional["Message"]:
|
|
170
|
+
"""Get the message this message is replying to.
|
|
171
|
+
|
|
172
|
+
Validates that this message is actually a reply by checking
|
|
173
|
+
:attr:`is_reply` / :attr:`reply_to`, then fetches the parent
|
|
174
|
+
message from the server via the bound client.
|
|
175
|
+
|
|
176
|
+
Returns:
|
|
177
|
+
The replied-to :class:`Message`, or ``None`` if this is
|
|
178
|
+
not a reply, the message is not bound, or the fetch fails.
|
|
179
|
+
"""
|
|
180
|
+
if self._client is None:
|
|
181
|
+
logger.warning("get_reply_message: message not bound to a client")
|
|
182
|
+
return None
|
|
183
|
+
if not self.is_reply or not self.reply_to:
|
|
184
|
+
return None
|
|
185
|
+
if self.reply_to_message is not None:
|
|
186
|
+
return self.reply_to_message
|
|
187
|
+
try:
|
|
188
|
+
client = self._client._get_client()
|
|
189
|
+
if client is None:
|
|
190
|
+
logger.warning("get_reply_message: underlying client not connected")
|
|
191
|
+
return None
|
|
192
|
+
raw_msg = await client.get_messages(self.chat_id, ids=self.reply_to)
|
|
193
|
+
if raw_msg is None:
|
|
194
|
+
logger.warning(
|
|
195
|
+
"get_reply_message: could not fetch message %s from chat %s",
|
|
196
|
+
self.reply_to, self.chat_id,
|
|
197
|
+
)
|
|
198
|
+
return None
|
|
199
|
+
from spluspy.client.client import _extract_reply_fields
|
|
200
|
+
|
|
201
|
+
sender_id = getattr(raw_msg, "sender_id", None)
|
|
202
|
+
if sender_id is None and hasattr(raw_msg, "from_id") and raw_msg.from_id:
|
|
203
|
+
fid = raw_msg.from_id
|
|
204
|
+
sender_id = (
|
|
205
|
+
getattr(fid, "user_id", None)
|
|
206
|
+
if hasattr(fid, "user_id")
|
|
207
|
+
else (fid if isinstance(fid, int) else None)
|
|
208
|
+
)
|
|
209
|
+
reply_to, reply_to_sender_id = _extract_reply_fields(raw_msg)
|
|
210
|
+
|
|
211
|
+
self.reply_to_message = Message(
|
|
212
|
+
id=raw_msg.id,
|
|
213
|
+
text=getattr(raw_msg, "message", "") or "",
|
|
214
|
+
chat_id=self.chat_id,
|
|
215
|
+
sender_id=sender_id,
|
|
216
|
+
reply_to=reply_to,
|
|
217
|
+
reply_to_sender_id=reply_to_sender_id,
|
|
218
|
+
is_private=getattr(raw_msg, "is_private", True),
|
|
219
|
+
is_group=getattr(raw_msg, "is_group", False),
|
|
220
|
+
is_channel=getattr(raw_msg, "is_channel", False),
|
|
221
|
+
media=getattr(raw_msg, "media", None),
|
|
222
|
+
forward_origin=getattr(raw_msg, "fwd_from", None),
|
|
223
|
+
)
|
|
224
|
+
self.reply_to_message._client = self._client
|
|
225
|
+
return self.reply_to_message
|
|
226
|
+
except Exception as exc:
|
|
227
|
+
logger.warning("get_reply_message failed: %s", exc)
|
|
228
|
+
return None
|
|
229
|
+
|
|
230
|
+
async def pin(self, notify: bool = True) -> bool:
|
|
231
|
+
"""Pin this message in its chat.
|
|
232
|
+
|
|
233
|
+
Args:
|
|
234
|
+
notify: If ``True``, notify all members about the pin.
|
|
235
|
+
|
|
236
|
+
Returns:
|
|
237
|
+
``True`` on success, ``False`` on failure.
|
|
238
|
+
"""
|
|
168
239
|
if self._client is None:
|
|
169
240
|
raise RuntimeError("Message is not bound to a client")
|
|
170
|
-
return await self._client.
|
|
171
|
-
self.chat_id, self, notify=notify
|
|
241
|
+
return await self._client.pin_chat_message(
|
|
242
|
+
self.chat_id, self.id, notify=notify,
|
|
172
243
|
)
|
|
173
244
|
|
|
174
245
|
async def unpin(self) -> bool:
|
|
175
|
-
"""Unpin this message.
|
|
246
|
+
"""Unpin this message.
|
|
247
|
+
|
|
248
|
+
Returns:
|
|
249
|
+
``True`` on success, ``False`` on failure.
|
|
250
|
+
"""
|
|
176
251
|
if self._client is None:
|
|
177
252
|
raise RuntimeError("Message is not bound to a client")
|
|
178
|
-
return await self._client.
|
|
253
|
+
return await self._client.unpin_chat_message(
|
|
254
|
+
self.chat_id, self.id,
|
|
255
|
+
)
|
|
179
256
|
|
|
180
257
|
async def react(self, emoji: str) -> bool:
|
|
181
258
|
"""Add a reaction to this message."""
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|