RubigramClient 1.7.17__py3-none-any.whl

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.
Files changed (132) hide show
  1. rubigram/__init__.py +15 -0
  2. rubigram/client.py +294 -0
  3. rubigram/enums/__init__.py +52 -0
  4. rubigram/enums/buttons/__init__.py +13 -0
  5. rubigram/enums/buttons/button_calendar_type.py +20 -0
  6. rubigram/enums/buttons/button_location_type.py +20 -0
  7. rubigram/enums/buttons/button_selection_get_type.py +20 -0
  8. rubigram/enums/buttons/button_selection_search_type.py +20 -0
  9. rubigram/enums/buttons/button_selection_type.py +22 -0
  10. rubigram/enums/buttons/button_textbox_type_keypad.py +20 -0
  11. rubigram/enums/buttons/button_textbox_type_line.py +20 -0
  12. rubigram/enums/buttons/button_type.py +58 -0
  13. rubigram/enums/chat_action_type.py +22 -0
  14. rubigram/enums/chat_keypad_type.py +20 -0
  15. rubigram/enums/chat_type.py +24 -0
  16. rubigram/enums/enum.py +6 -0
  17. rubigram/enums/file_type.py +28 -0
  18. rubigram/enums/forwarded_from_type.py +22 -0
  19. rubigram/enums/live_location_status.py +20 -0
  20. rubigram/enums/message_sender_type.py +20 -0
  21. rubigram/enums/metadata_type.py +18 -0
  22. rubigram/enums/parse_mode.py +20 -0
  23. rubigram/enums/payment_status_type.py +20 -0
  24. rubigram/enums/poll_status_type.py +20 -0
  25. rubigram/enums/update_endpoint_type.py +26 -0
  26. rubigram/enums/update_type.py +28 -0
  27. rubigram/errors.py +16 -0
  28. rubigram/filters.py +865 -0
  29. rubigram/http_session.py +96 -0
  30. rubigram/methods/__init__.py +26 -0
  31. rubigram/methods/chats/__init__.py +10 -0
  32. rubigram/methods/chats/get_chat.py +53 -0
  33. rubigram/methods/decorators/__init__.py +25 -0
  34. rubigram/methods/decorators/on_inline_message.py +70 -0
  35. rubigram/methods/decorators/on_message.py +62 -0
  36. rubigram/methods/decorators/on_remove_message.py +65 -0
  37. rubigram/methods/decorators/on_start.py +65 -0
  38. rubigram/methods/decorators/on_started_bot.py +70 -0
  39. rubigram/methods/decorators/on_stop.py +65 -0
  40. rubigram/methods/decorators/on_stopped_bot.py +70 -0
  41. rubigram/methods/decorators/on_update_message.py +70 -0
  42. rubigram/methods/files/__init__.py +32 -0
  43. rubigram/methods/files/download_file.py +118 -0
  44. rubigram/methods/files/get_file.py +41 -0
  45. rubigram/methods/files/get_file_name.py +41 -0
  46. rubigram/methods/files/request_send_file.py +49 -0
  47. rubigram/methods/files/send_file.py +133 -0
  48. rubigram/methods/files/send_gif.py +51 -0
  49. rubigram/methods/files/send_music.py +97 -0
  50. rubigram/methods/files/send_photo.py +95 -0
  51. rubigram/methods/files/send_video.py +96 -0
  52. rubigram/methods/files/send_voice.py +96 -0
  53. rubigram/methods/files/upload_file.py +114 -0
  54. rubigram/methods/messages/__init__.py +34 -0
  55. rubigram/methods/messages/delete_messages.py +84 -0
  56. rubigram/methods/messages/edit_chat_keypad.py +68 -0
  57. rubigram/methods/messages/edit_message.py +82 -0
  58. rubigram/methods/messages/edit_message_keypad.py +72 -0
  59. rubigram/methods/messages/edit_message_text.py +68 -0
  60. rubigram/methods/messages/forward_message.py +78 -0
  61. rubigram/methods/messages/remove_chat_keypad.py +46 -0
  62. rubigram/methods/messages/send_contact.py +114 -0
  63. rubigram/methods/messages/send_location.py +108 -0
  64. rubigram/methods/messages/send_message.py +115 -0
  65. rubigram/methods/messages/send_poll.py +104 -0
  66. rubigram/methods/messages/send_sticker.py +98 -0
  67. rubigram/methods/network/__init__.py +12 -0
  68. rubigram/methods/network/request.py +129 -0
  69. rubigram/methods/settings/__init__.py +16 -0
  70. rubigram/methods/settings/set_command.py +50 -0
  71. rubigram/methods/settings/setup_endpoints.py +48 -0
  72. rubigram/methods/settings/update_bot_endpoint.py +62 -0
  73. rubigram/methods/updates/__init__.py +14 -0
  74. rubigram/methods/updates/get_me.py +35 -0
  75. rubigram/methods/updates/get_update.py +62 -0
  76. rubigram/methods/utilities/__init__.py +14 -0
  77. rubigram/methods/utilities/dispatcher.py +66 -0
  78. rubigram/methods/utilities/run.py +118 -0
  79. rubigram/rubino/__init__.py +6 -0
  80. rubigram/rubino/client.py +374 -0
  81. rubigram/rubino/network.py +129 -0
  82. rubigram/server/__init__.py +6 -0
  83. rubigram/server/server.py +245 -0
  84. rubigram/state/__init__.py +7 -0
  85. rubigram/state/state.py +121 -0
  86. rubigram/state/storage.py +131 -0
  87. rubigram/types/__init__.py +66 -0
  88. rubigram/types/aux_data.py +28 -0
  89. rubigram/types/bot.py +51 -0
  90. rubigram/types/bot_command.py +26 -0
  91. rubigram/types/buttons/__init__.py +13 -0
  92. rubigram/types/buttons/button.py +59 -0
  93. rubigram/types/buttons/button_calendar.py +40 -0
  94. rubigram/types/buttons/button_location.py +40 -0
  95. rubigram/types/buttons/button_number_picker.py +34 -0
  96. rubigram/types/buttons/button_selection.py +48 -0
  97. rubigram/types/buttons/button_selection_item.py +32 -0
  98. rubigram/types/buttons/button_string_picker.py +29 -0
  99. rubigram/types/buttons/button_text_box.py +40 -0
  100. rubigram/types/chat.py +86 -0
  101. rubigram/types/config/__init__.py +6 -0
  102. rubigram/types/config/object.py +442 -0
  103. rubigram/types/contact_message.py +29 -0
  104. rubigram/types/file.py +78 -0
  105. rubigram/types/forwarded_from.py +39 -0
  106. rubigram/types/keypads/__init__.py +7 -0
  107. rubigram/types/keypads/keypad.py +31 -0
  108. rubigram/types/keypads/keypad_row.py +23 -0
  109. rubigram/types/live_location.py +44 -0
  110. rubigram/types/location.py +24 -0
  111. rubigram/types/messages/__init__.py +8 -0
  112. rubigram/types/messages/inline_message.py +78 -0
  113. rubigram/types/messages/message.py +117 -0
  114. rubigram/types/messages/update_message.py +341 -0
  115. rubigram/types/metadata/__init__.py +7 -0
  116. rubigram/types/metadata/metadata.py +43 -0
  117. rubigram/types/metadata/metadata_parts.py +42 -0
  118. rubigram/types/payment_status.py +30 -0
  119. rubigram/types/poll.py +32 -0
  120. rubigram/types/poll_status.py +40 -0
  121. rubigram/types/sticker.py +33 -0
  122. rubigram/types/updates/__init__.py +7 -0
  123. rubigram/types/updates/update.py +917 -0
  124. rubigram/types/updates/updates.py +56 -0
  125. rubigram/utils/__init__.py +14 -0
  126. rubigram/utils/auto_delete.py +93 -0
  127. rubigram/utils/parser.py +99 -0
  128. rubigramclient-1.7.17.dist-info/METADATA +215 -0
  129. rubigramclient-1.7.17.dist-info/RECORD +132 -0
  130. rubigramclient-1.7.17.dist-info/WHEEL +5 -0
  131. rubigramclient-1.7.17.dist-info/licenses/LICENSE +21 -0
  132. rubigramclient-1.7.17.dist-info/top_level.txt +1 -0
@@ -0,0 +1,56 @@
1
+ # RubigramClient - Rubika API library for python
2
+ # Copyright (C) 2025-present Javad <https://github.com/DevJavad>
3
+ # Github - https://github.com/DevJavad/rubigram
4
+
5
+
6
+ from __future__ import annotations
7
+
8
+ from typing import Optional
9
+ from dataclasses import dataclass
10
+ from ..config import Object
11
+ from rubigram import types
12
+
13
+
14
+ @dataclass
15
+ class Updates(Object):
16
+ """
17
+ **Represents a collection of multiple updates received from Rubigram.**
18
+ `from rubigram.types import Updates`
19
+
20
+ This object wraps a list of `Update` instances and includes the
21
+ `next_offset_id` to fetch additional updates.
22
+
23
+ Attributes:
24
+ updates (`Optional[list[rubigram.types.Update]]`):
25
+ A list of update objects.
26
+
27
+ next_offset_id (`Optional[str]`):
28
+ The ID offset to fetch the next batch of updates.
29
+ """
30
+ updates: Optional[list[types.Update]] = None
31
+ next_offset_id: Optional[str] = None
32
+
33
+ @classmethod
34
+ def parse(cls, data: dict):
35
+ """
36
+ **Parse a dictionary into an `Updates` instance.**
37
+
38
+ Converts raw dictionary data into a structured `Updates` object
39
+ containing parsed `Update` instances.
40
+
41
+ Args:
42
+ data (`dict`):
43
+ The raw dictionary data representing updates.
44
+
45
+ Returns:
46
+ Updates: A fully parsed `Updates` object containing `Update` instances.
47
+ """
48
+ data = data or {}
49
+ updates = [
50
+ types.Update.parse(update) if isinstance(update, dict) else update
51
+ for update in data.get("updates", []) or []
52
+ ]
53
+ return cls(
54
+ updates=updates,
55
+ next_offset_id=data.get("next_offset_id")
56
+ )
@@ -0,0 +1,14 @@
1
+ # RubigramClient - Rubika API library for python
2
+ # Copyright (C) 2025-present Javad <https://github.com/DevJavad>
3
+ # Github - https://github.com/DevJavad/rubigram
4
+
5
+
6
+ from .auto_delete import AutoDelete
7
+ from .parser import Parser
8
+
9
+
10
+ class Utils(
11
+ AutoDelete,
12
+ Parser
13
+ ):
14
+ pass
@@ -0,0 +1,93 @@
1
+ # RubigramClient - Rubika API library for python
2
+ # Copyright (C) 2025-present Javad <https://github.com/DevJavad>
3
+ # Github - https://github.com/DevJavad/rubigram
4
+
5
+
6
+ import asyncio
7
+ import rubigram
8
+ import logging
9
+
10
+
11
+ logger = logging.getLogger(__name__)
12
+
13
+
14
+ class AutoDelete:
15
+ @staticmethod
16
+ def run(
17
+ client: "rubigram.Client",
18
+ message: "rubigram.types.UMessage",
19
+ delay: int
20
+ ):
21
+ """
22
+ **Schedule automatic deletion of a message after delay.**
23
+ `AutoDelete.run(client, message, 10)`
24
+
25
+ This static method schedules a message to be automatically deleted
26
+ after the specified delay in seconds. The deletion runs asynchronously
27
+ in the background.
28
+
29
+ Args:
30
+ client (`rubigram.Client`):
31
+ The client instance used to delete the message.
32
+
33
+ message (`rubigram.types.UMessage`):
34
+ The message object to be deleted.
35
+
36
+ delay (`int`):
37
+ Number of seconds to wait before deleting the message.
38
+
39
+ Example:
40
+ .. code-block:: python
41
+
42
+ # Send a message and schedule its deletion after 30 seconds
43
+ message = await client.send_message(chat_id, "This will be deleted soon")
44
+ AutoDelete.run(client, message, 30)
45
+
46
+ Note:
47
+ - If delay is 0 or negative, no deletion is scheduled
48
+ - Deletion runs as a background task and won't block execution
49
+ - Errors during deletion are logged as warnings but not raised
50
+ """
51
+ if delay <= 0:
52
+ return
53
+
54
+ asyncio.create_task(
55
+ AutoDelete.auto_delete_task(client, message, delay)
56
+ )
57
+
58
+ @staticmethod
59
+ async def auto_delete_task(
60
+ client: "rubigram.Client",
61
+ message: "rubigram.types.UMessage",
62
+ delay: int
63
+ ):
64
+ """
65
+ **Background task to automatically delete a message.**
66
+ `await AutoDelete.auto_delete_task(client, message, 10)`
67
+
68
+ This internal method waits for the specified delay and then
69
+ attempts to delete the message. Any exceptions during deletion
70
+ are caught and logged as warnings.
71
+
72
+ Args:
73
+ client (`rubigram.Client`):
74
+ The client instance used to delete the message.
75
+
76
+ message (`rubigram.types.UMessage`):
77
+ The message object to be deleted.
78
+
79
+ delay (`int`):
80
+ Number of seconds to wait before deleting the message.
81
+
82
+ Note:
83
+ This method is designed to run as a background task and
84
+ should not be called directly. Use `AutoDelete.run()` instead.
85
+ """
86
+ try:
87
+ await asyncio.sleep(delay)
88
+ await client.delete_messages(message.chat_id, message.message_id)
89
+
90
+ except Exception as error:
91
+ logger.warning(
92
+ "Auto delete message, chat_id=%s, message_id=%s, error=%s", message.chat_id, message.message_id, error
93
+ )
@@ -0,0 +1,99 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import Union, TYPE_CHECKING
4
+ import re
5
+
6
+ if TYPE_CHECKING:
7
+ from rubigram.enums import ParseMode
8
+
9
+
10
+ MARKDOWN_PATTERNS: list = [
11
+ ("Bold", r"\*\*(.*?)\*\*", 4),
12
+ ("Italic", r"__(.*?)__", 4),
13
+ ("Underline", r"--(.*?)--", 4),
14
+ ("Strike", r"~~(.*?)~~", 4),
15
+ ("Pre", r"```([\s\S]*?)```", 6, re.DOTALL),
16
+ ("Mono", r"(?<!`)`([^`\n]+?)`(?!`)", 2),
17
+ ("Link", r"\[(.*?)\]\((.*?)\)", None),
18
+ ("Quote", r"^> (.+)$", None, re.MULTILINE),
19
+ ("Spoiler", r"\|\|(.*?)\|\|", 4),
20
+ ]
21
+ HTML_PATTERNS: list = [
22
+ ("Bold", r"<b>(.*?)</b>"),
23
+ ("Italic", r"<i>(.*?)</i>"),
24
+ ("Underline", r"<u>(.*?)</u>"),
25
+ ("Strike", r"<s>(.*?)</s>"),
26
+ ("Pre", r"<code>(.*?)</code>"),
27
+ ("Link", r'<a href="(.*?)">(.*?)</a>'),
28
+ ("Quote", r"<blockquote>(.*?)</blockquote>"),
29
+ ("Spoiler", r'<span class="spoiler">(.*?)</span>'),
30
+ ]
31
+
32
+
33
+ class Parser:
34
+ @staticmethod
35
+ def parser(text: str, type: Union[str, ParseMode]) -> dict:
36
+ metadata_parts = []
37
+ data = text
38
+
39
+ parse_mode = type.value.lower() if hasattr(type, "value") else type.lower()
40
+ patterns = HTML_PATTERNS if parse_mode == "html" else MARKDOWN_PATTERNS
41
+ mention_pattern = r"@@(.+?)\|(.+?)@@"
42
+ offset = 0
43
+
44
+ for match in re.finditer(mention_pattern, data):
45
+ start, end = match.span()
46
+ name, user_id = match.group(1), match.group(2)
47
+ from_index = start - offset
48
+ data = data[:from_index] + name + data[end - offset:]
49
+ offset += (end - start) - len(name)
50
+
51
+ metadata_parts.append({
52
+ "from_index": from_index,
53
+ "length": len(name),
54
+ "type": "MentionText",
55
+ "mention_text_user_id": user_id
56
+ })
57
+
58
+ for i in patterns:
59
+ if len(i) == 3:
60
+ format, pattern, _ = i
61
+ flags = 0
62
+
63
+ elif len(i) == 4:
64
+ format, pattern, _, flags = i
65
+
66
+ else:
67
+ format, pattern = i
68
+ flags = re.DOTALL
69
+
70
+ tmp_text = data
71
+ offset = 0
72
+
73
+ for match in re.finditer(pattern, tmp_text, flags):
74
+ start, end = match.span()
75
+ if format == "Link":
76
+ if parse_mode == "html":
77
+ url, content = match.group(1), match.group(2)
78
+ else:
79
+ content, url = match.group(1), match.group(2)
80
+ else:
81
+ content, url = match.group(1), None
82
+
83
+ from_index = start - offset
84
+
85
+ metadata_parts.append({
86
+ "from_index": from_index,
87
+ "length": len(content),
88
+ "type": format,
89
+ **({"link_url": url} if url else {})
90
+ })
91
+
92
+ data = data[:from_index] + content + data[end - offset:]
93
+ offset += (end - start) - len(content)
94
+
95
+ result = {"text": data}
96
+ if metadata_parts:
97
+ result["metadata"] = {"meta_data_parts": metadata_parts}
98
+
99
+ return result
@@ -0,0 +1,215 @@
1
+ Metadata-Version: 2.4
2
+ Name: RubigramClient
3
+ Version: 1.7.17
4
+ Summary: A simple and flexible Python library for building advanced Rubika bots with powerful message handling, inline buttons, and custom filters.
5
+ Author-email: Javad <MrJavad.Email@gmail.com>
6
+ License: MIT License
7
+
8
+ Copyright (c) 2025 Javad
9
+
10
+ Permission is hereby granted, free of charge, to any person obtaining a copy
11
+ of this software and associated documentation files (the "Software"), to deal
12
+ in the Software without restriction, including without limitation the rights
13
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14
+ copies of the Software, and to permit persons to whom the Software is
15
+ furnished to do so, subject to the following conditions:
16
+
17
+ The above copyright notice and this permission notice shall be included in all
18
+ copies or substantial portions of the Software.
19
+
20
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26
+ SOFTWARE.
27
+ Project-URL: GitHub, https://github.com/DevJavad/rubigram
28
+ Classifier: Programming Language :: Python :: 3
29
+ Classifier: License :: OSI Approved :: MIT License
30
+ Classifier: Operating System :: OS Independent
31
+ Requires-Python: >=3.4
32
+ Description-Content-Type: text/markdown
33
+ License-File: LICENSE
34
+ Requires-Dist: aiohttp
35
+ Requires-Dist: aiofiles
36
+ Requires-Dist: aiocache
37
+ Dynamic: license-file
38
+
39
+ <p align="center">
40
+ <img src="http://rubigram.ir/rubigram.jpg" alt="Rubigram" width="200"/>
41
+ </p>
42
+ <p align="center">
43
+ <strong> Python library for rubika API</strong>
44
+ </p>
45
+ <p align="center">
46
+ <a href="https://pypi.org/project/RubigramClient">
47
+ <img src="https://img.shields.io/pypi/v/RubigramClient?style=flat-square" alt="PyPI">
48
+ </a>
49
+ <a href="http://rubigram.ir/docs">
50
+ <img src="https://img.shields.io/badge/docs-online-blue?style=flat-square" alt="Documentation">
51
+ </a>
52
+ </p>
53
+
54
+ # Rubigram
55
+ Rubigram is a powerful asynchronous Python framework for **building advanced bots on Rubika**, offering features like concurrent message handling, advanced filtering, and support for both webhooks and polling.
56
+
57
+
58
+ ## Features
59
+ - Asynchronous and fast: handle multiple messages concurrently.
60
+ - Advanced filters for private chats, commands, and text messages.
61
+ - Easy message and media sending (text, images, videos, files).
62
+ - Support for both **webhooks** and **polling**.
63
+ - Interactive keyboards and buttons for better user engagement.
64
+ - Flexible integration with databases for storing settings and data.
65
+
66
+ ## Start
67
+ ```python
68
+ from rubigram import Client, filters
69
+ from rubigram.types import Update
70
+
71
+ client = Client("bot_token")
72
+
73
+ @client.on_message(filters.command("start"))
74
+ async def start(client: Client, update: Update):
75
+ await update.reply("||Hello|| __from__ **Rubigram!**")
76
+
77
+ client.run()
78
+ ```
79
+
80
+ ## Button and Keypad
81
+ ```python
82
+ from rubigram import Client, filters
83
+ from rubigram.enums import ChatKeypadType
84
+ from rubigram.types import Update, Keypad, Button, KeypadRow
85
+
86
+ client = Client("bot_token")
87
+
88
+
89
+ @client.on_message(filters.photo)
90
+ async def start(client: Client, update: Update):
91
+ button_1 = Button("send", "send Photo")
92
+ button_2 = Button("save", "Save Photo")
93
+ row = KeypadRow([button_1, button_2])
94
+ keypad = Keypad([row])
95
+ await update.reply(
96
+ "Select your action:",
97
+ chat_keypad=keypad,
98
+ chat_keypad_type=ChatKeypadType.NEW
99
+ )
100
+
101
+ client.run()
102
+ ```
103
+
104
+ ## Use webhook and Get inline button data
105
+ ```python
106
+ from rubigram import Client, Server, filters
107
+ from rubigram.types import (
108
+ Update,
109
+ Button,
110
+ Keypad,
111
+ KeypadRow,
112
+ InlineMessage
113
+ )
114
+
115
+
116
+ client = Client(token="bot_token", webhook="webhook_url")
117
+ server = Server(client, host="127.0.0.1", port=8080)
118
+
119
+
120
+ @client.on_message(filters.photo)
121
+ async def start(client: Client, update: Update):
122
+ button_1 = Button("send", "send Photo")
123
+ button_2 = Button("save", "Save Photo")
124
+ row = KeypadRow([button_1, button_2])
125
+ keypad = Keypad([row])
126
+ await update.reply("Select your action:", inline_keypad=keypad)
127
+
128
+
129
+ @client.on_inline_message(filters.button(["send", "save"]))
130
+ async def inline_message(client: Client, message: InlineMessage):
131
+ button_id = message.aux_data.button_id
132
+ if button_id == "send":
133
+ await message.answer("You clicked the save send button")
134
+ else:
135
+ await message.answer("You clicked the save save button")
136
+
137
+
138
+ @client.on_start()
139
+ async def start(client):
140
+ print("Start bot ....")
141
+
142
+
143
+ @client.on_stop()
144
+ async def stop(client):
145
+ print("Stop bot")
146
+
147
+
148
+ server.run_server()
149
+ ```
150
+
151
+ ## Auto state and save tmp data in cache
152
+ ```python
153
+ from rubigram import Client, Storage, filters
154
+ from rubigram.types import Update
155
+
156
+
157
+ storage = Storage(ttl=120)
158
+ client = Client("bot_token", storage=storage) # You can leave the `storage` parametr empty
159
+
160
+
161
+ @client.on_message(filters.command("start") & filters.private)
162
+ async def start(client: Client, update: Update):
163
+ state = client.state(update.chat_id)
164
+ await state.set("name")
165
+ await update.reply("Send your name:")
166
+
167
+
168
+ @client.on_message(filters.state("name") & filters.text & filters.private)
169
+ async def save_name(client: Client, update: Update):
170
+ state = client.state(update.chat_id)
171
+ await state.set("email", name=update.text)
172
+ await update.reply("Send your Email:")
173
+
174
+
175
+ @client.on_message(filters.state("email") & filters.text & filters.private)
176
+ async def save_email(client: Client, update: Update):
177
+ state = client.state(update.chat_id)
178
+ data = await state.get()
179
+ print(data)
180
+ await state.delete()
181
+
182
+
183
+ client.run()
184
+ ```
185
+
186
+
187
+ ## Implementation of multiple programs
188
+ ```python
189
+ from rubigram import Client
190
+ import asyncio
191
+
192
+ tokens = ["TOKEN_1", "TOKEN_2"]
193
+
194
+ async def main():
195
+ for token in tokens:
196
+ async with Client(token) as client:
197
+ info = await client.get_me()
198
+ print(info)
199
+
200
+ asyncio.run(main())
201
+ ```
202
+
203
+ ## Rubino
204
+ ```python
205
+ from rubigram.rubino import Rubino
206
+ import asyncio
207
+
208
+
209
+ async def main():
210
+ async with Rubino(auth="auth_account") as client:
211
+ info = await client.get_my_profile_info()
212
+ print(info)
213
+
214
+ asyncio.run(main())
215
+ ```
@@ -0,0 +1,132 @@
1
+ rubigram/__init__.py,sha256=uQUhmks3Rea9_N1hiwur1Sjc3BlhTB1Ml8VYCiRfPuk,520
2
+ rubigram/client.py,sha256=U3rcDCPtlX9hX2vIuTDQlwFwEAjm_bCdepip3yfWBkg,9874
3
+ rubigram/errors.py,sha256=Zzjf_iBPN1lFge5UVueP9WrfpgFH3ADPZ2b-jXLsQg4,540
4
+ rubigram/filters.py,sha256=2VZ6UVOVEMxQRcylIceGDpO8ejZf1v_AVtjMNi3HF_k,24828
5
+ rubigram/http_session.py,sha256=ZMiO3xC-5Pn6tiZT8RyIN5IigFxq_mD86BC2X0mqhXc,3162
6
+ rubigram/enums/__init__.py,sha256=AinScHrcm0hTumU877D_N3I_Tqj8-gM7X_iAqvWqK24,1527
7
+ rubigram/enums/chat_action_type.py,sha256=d-Fr5U6zNB5o1HjbxOL79-fUWi6UFV6qdg24al-K_Og,675
8
+ rubigram/enums/chat_keypad_type.py,sha256=oUuR0zl07Dz9MFNnGctf-V-hsf_A42wBYmF2H14Sk2k,563
9
+ rubigram/enums/chat_type.py,sha256=CbXbQKTKdBWXozb-ix7-qiZKOA88FFSYeDEBW8fk9lk,616
10
+ rubigram/enums/enum.py,sha256=Rngf_t5CW4WzFosA-3ouL51Z3zwh_z8BJgLEYxbW1zM,140
11
+ rubigram/enums/file_type.py,sha256=aieDwI89oLYuN-nlB8ZJ5Oc6b8dxq0D7RG6E39iXYaA,735
12
+ rubigram/enums/forwarded_from_type.py,sha256=N8yNKP4pufwlQjvweszjhyWTOODncWZUy-hqLHPFxgE,636
13
+ rubigram/enums/live_location_status.py,sha256=x2dK-mRz5WB9Qylgt_XKtAvHhaGKXr3J3cnPGVbIjfE,542
14
+ rubigram/enums/message_sender_type.py,sha256=2ZrGGA_aKbMtrL76ijq4YGvKhPMal-AJ5pYG-CHGVCA,515
15
+ rubigram/enums/metadata_type.py,sha256=ukaLzluZp3i8y03-aFeWvMeWIyVnXCC-PDKbdyFOp98,437
16
+ rubigram/enums/parse_mode.py,sha256=meiGw9hpOYgBAmmvBdk1c0i3xA87BrhxzFTYLRoJwWM,518
17
+ rubigram/enums/payment_status_type.py,sha256=jJCA2-28LRPMogvbNmEossuge6YvEBR8kZB0gVCA2W8,550
18
+ rubigram/enums/poll_status_type.py,sha256=LH6HAXmPfsc577IS7XLTg2HSopWBw01wW27gLqEYeRI,545
19
+ rubigram/enums/update_endpoint_type.py,sha256=cBgNKkB3nZQ85B_5EH-CpYOfdeFJCFX4lCfJ0TZQE_w,1037
20
+ rubigram/enums/update_type.py,sha256=QkJp9Hqg0bf5x08r4F9aV7yZKFJNh_2wpP5qtCUC-ZE,923
21
+ rubigram/enums/buttons/__init__.py,sha256=1qTom0H7NYw2Aqz-qSltoaWoB_jgsE0T9YmS6jZkZ1w,629
22
+ rubigram/enums/buttons/button_calendar_type.py,sha256=N9OgNbXz_m_d-_P5nB6D4G2sEMmPRy65-hcOZUfKtYE,588
23
+ rubigram/enums/buttons/button_location_type.py,sha256=IdXOVCfjxdxZfQn1k1l2mrlyXT8gjLrjKyLB3vjN6k4,523
24
+ rubigram/enums/buttons/button_selection_get_type.py,sha256=5Xs0a7TBAQbOz8qjZEyurZ0Yn_mZ7dflmfqpALBtsP0,539
25
+ rubigram/enums/buttons/button_selection_search_type.py,sha256=jt0T3XsjZtadW4CONtPn-7MuQsSRzf_Oaoe60ZjqLfs,550
26
+ rubigram/enums/buttons/button_selection_type.py,sha256=2LEVk6MgrFq1qfXWIZZ5EuyzifICTaqpn60B8_eJbM8,706
27
+ rubigram/enums/buttons/button_textbox_type_keypad.py,sha256=aoyPVT5ssMejk3g_JbeXsKI59xK1KHgsNUEU8kWzPa0,559
28
+ rubigram/enums/buttons/button_textbox_type_line.py,sha256=uf97oUP3KTUOyPF0bpJHj2EwWPhh6DpmTj_rY3lJuOk,580
29
+ rubigram/enums/buttons/button_type.py,sha256=vNbUVSrcSii_qZAhmAR2kAlNZkELgbe70w8plPlKaI0,2257
30
+ rubigram/methods/__init__.py,sha256=EKYss7IQ7VQ3Lca8YNTGdljZfBDGkST3rlNuyM0DN4M,564
31
+ rubigram/methods/chats/__init__.py,sha256=2MDfgKnVuQEVfqyq93uvcSTrVTTp58DfhJr4L21LNEM,238
32
+ rubigram/methods/chats/get_chat.py,sha256=ZGjtkt1la1Bz7uvLYJC6RT1dj2yWq6Ins9Gxse-iz54,1760
33
+ rubigram/methods/decorators/__init__.py,sha256=olVd8jdCOialwD_hGoaeog5du6Nr131io-QC61eyWM4,674
34
+ rubigram/methods/decorators/on_inline_message.py,sha256=UOqSKqCdypvgt2e1AlUf8NYiMqEwudEPVDl17YCfdhc,2571
35
+ rubigram/methods/decorators/on_message.py,sha256=i1_YGE_QowwWHqCCXZfTbPOcMUZMxqQU375sZfvVrmQ,2145
36
+ rubigram/methods/decorators/on_remove_message.py,sha256=0BnU3tLumTJjUdBtxX4dvxfAuEJV7lq-EqvTmJyDlog,2438
37
+ rubigram/methods/decorators/on_start.py,sha256=_eT3Ixx93EbI0Z2XsrwApdyCcthIL8qO9AYYsV41HM8,2436
38
+ rubigram/methods/decorators/on_started_bot.py,sha256=VuknpI0cTl0dP972AXnfBWa3FvLFJmZHStiYxHkxiLA,2577
39
+ rubigram/methods/decorators/on_stop.py,sha256=VUkqrHyHomhyjAHWhpySd5CugPw-ntkoxbKXtL41KCo,2361
40
+ rubigram/methods/decorators/on_stopped_bot.py,sha256=hAieolFKfHFVDrnqxV0GXgk8V1l2H7dIjgDvGek588U,2573
41
+ rubigram/methods/decorators/on_update_message.py,sha256=gu0uD0DVTCq566nLaELyLfybhdnnYouOyZpzuxxPtTA,2579
42
+ rubigram/methods/files/__init__.py,sha256=VFHisaBxUO_5NtZsiMZ63__PhmFL5-fMONYkwIizYrc,785
43
+ rubigram/methods/files/download_file.py,sha256=rPpXaFdEDc0EKlT5XZ8OD2BzR1N96XB34lp6mjFFDe8,4057
44
+ rubigram/methods/files/get_file.py,sha256=g_m56IneVceJkDT0riUVEw72ePSINB60eslEgprhx-I,1221
45
+ rubigram/methods/files/get_file_name.py,sha256=Kvg3z-dRjPkSph79ZFgE-mRzRmFstYSPUXUkAXvrVMk,1164
46
+ rubigram/methods/files/request_send_file.py,sha256=elMXjSHSDJRC8NVmI9HP7auyBqjl3U4T26o7jatqbBI,1559
47
+ rubigram/methods/files/send_file.py,sha256=PhGTCse7kQGCUWklUDattqUU0sZ_DMKE1iO5N8Srlsg,5457
48
+ rubigram/methods/files/send_gif.py,sha256=AmcaHEUNOkNvxe0U-wJMEeKRNX438-aBfjA0mOVmOkU,1661
49
+ rubigram/methods/files/send_music.py,sha256=MzzuOPcM9UCISqoAzEXHM_0Y1zCd5fd8fHGkj9GNFbs,3720
50
+ rubigram/methods/files/send_photo.py,sha256=F1-yYp_7Ku8EuqW-yAPeMsUDJuTt3_v5SmOL57vL9wQ,3704
51
+ rubigram/methods/files/send_video.py,sha256=KgdY-QPcjDP7t-A2yj56qXsGP6OJ0FV_xsLdnV7_Xq4,3698
52
+ rubigram/methods/files/send_voice.py,sha256=mgYH3oNcp8MW-cz1i2EhUN3z-SbhtPVepkLhIsuP9GQ,3759
53
+ rubigram/methods/files/upload_file.py,sha256=ws9JzeAusGvg9n2FEuAdwJPQVK5WJkhqPViD2beT_HM,4148
54
+ rubigram/methods/messages/__init__.py,sha256=0IPThIq2dp4tyXJBvMxzZL1jIK6sOUAn1NF3BSgKuL8,956
55
+ rubigram/methods/messages/delete_messages.py,sha256=a8bxrxSLu1LW-Qh0llqiyx_grDeUL7-BCROi3I47fPU,2904
56
+ rubigram/methods/messages/edit_chat_keypad.py,sha256=h8sobAGh7yzN7BnSH03vz66QdG7kYlKW-w-HOIcGqIM,2062
57
+ rubigram/methods/messages/edit_message.py,sha256=ew9NcoOxhHfhz8VYayYrpCowrh5Fm0XT-ItehZo9ZXc,3104
58
+ rubigram/methods/messages/edit_message_keypad.py,sha256=UgHb4coUUpHztX-L--sxQGEJntSMwFPT-2Xq3ncQkTY,2325
59
+ rubigram/methods/messages/edit_message_text.py,sha256=fBO78RweDQClaZLgrKYNR4ALRNbV56vrDcxlQHri48w,2103
60
+ rubigram/methods/messages/forward_message.py,sha256=YbeRVAbOo6NAR_RahzXTCiicNs4_Yx82bDn1N_WKVvA,2753
61
+ rubigram/methods/messages/remove_chat_keypad.py,sha256=1JSTPqQpaQnz40M41_lCyaxDhX66DW9TL2nvSiF_XhE,1327
62
+ rubigram/methods/messages/send_contact.py,sha256=KRwW5Mdmiw_L2yUY6VupY-XVIZGdP6aOGifFzXuHMuk,3956
63
+ rubigram/methods/messages/send_location.py,sha256=IwV5LnQyCWf2rKDcCKUognHIfDB30_oPf4jieKqDSq0,3763
64
+ rubigram/methods/messages/send_message.py,sha256=YOS-h1oa3NxNM9E7kQOyPBv2UA2hZoKyP9nKXxMq6j8,4184
65
+ rubigram/methods/messages/send_poll.py,sha256=FsJOBA3-NLz869XMbUmJDaRvDhBC4NTxwuQlnPMCeEU,3789
66
+ rubigram/methods/messages/send_sticker.py,sha256=WONntdCJPlTEHbVSpdlxjeLrYoMgNIGiBDylSIXzdEo,3658
67
+ rubigram/methods/network/__init__.py,sha256=8RXL8cLzlJtwW2sgYWhbTNsaJp5jzmFrejd18ZwXZe4,247
68
+ rubigram/methods/network/request.py,sha256=rPd78AxKehY32vovQ6qS41uHdQoES9WEHwEDIvnheaA,4592
69
+ rubigram/methods/settings/__init__.py,sha256=Dv3fCtpgCcSSuEHLED_Pyqm20g5ZSHgQNmzDCJUTtog,404
70
+ rubigram/methods/settings/set_command.py,sha256=1eahcdBVJOvELBfolfT7Ckvh19M6nT6YPE7aVPkX2Ic,1735
71
+ rubigram/methods/settings/setup_endpoints.py,sha256=xN_bRk_YF0vxXTyWYc8OlxdV6Lrxy6AHXUn5NzkBrjU,1818
72
+ rubigram/methods/settings/update_bot_endpoint.py,sha256=9a8y4LW88prbUOwZYVsDGlL_-AeArtpt8fjS9ItpzsI,2354
73
+ rubigram/methods/updates/__init__.py,sha256=Vk7vLRHzyes-v5PIEXVZbFQY7EN1gml-vDNHrqAJLPg,295
74
+ rubigram/methods/updates/get_me.py,sha256=LIZ1ZSFfs9rb64xMPLJ5jHlX2M98-CNsenHuiYaA5SI,1171
75
+ rubigram/methods/updates/get_update.py,sha256=97kZ3XC6J1U16oRWT0MXbL0NYg4UpC9AdYtLu4skze8,2168
76
+ rubigram/methods/utilities/__init__.py,sha256=ukmUUqf_MjQsDwMZggMtdD_n9B-k-F8u-pL54Eokjr0,290
77
+ rubigram/methods/utilities/dispatcher.py,sha256=JPtTz6oZDG1V5vSuMqfHkLdyRjvdTkRtrid5Nkhs5Fg,2567
78
+ rubigram/methods/utilities/run.py,sha256=Ln_ya_m-hGkLW_nO9cdvGxMZ0JhiV_wrd9CUHHKYF0U,4181
79
+ rubigram/rubino/__init__.py,sha256=DzpQxe9R3czgfaqOaRWdu6UXTUOWAc7o91nDpdWJYRE,198
80
+ rubigram/rubino/client.py,sha256=O2Gpc9I1fpq5_b9atOzw6obAUm8ufw1DiJB9-nUiVaA,14900
81
+ rubigram/rubino/network.py,sha256=Caj14m98cHFn7XDThRU9fXyXD0_hhFq_1NU-cAWL_lk,4167
82
+ rubigram/server/__init__.py,sha256=Xw3KCT0EdCmQl0WAlX9Y8n0TKxXJIvn8UhFnIL3jyA8,198
83
+ rubigram/server/server.py,sha256=-19GKt2VLvUyWvxkS_KpjS-mro67KFDxCy9oU8THCd0,7866
84
+ rubigram/state/__init__.py,sha256=rFaOzNPqxA2gxlebTTQf4E4jn6h2O3j8wdD_dTkCb88,226
85
+ rubigram/state/state.py,sha256=TVGb8bcr7dnb-dj_sFwj8xhnH6C5D7oYVE_481Kbhuo,3817
86
+ rubigram/state/storage.py,sha256=1qz2KafHQlYZDQMAgGRYY4-mKRx8dn_so4PxinL_d2k,4216
87
+ rubigram/types/__init__.py,sha256=bN-Mt9x35SwirJtVxm2_xDaY7s3zsrcaA-i-Q_qMj90,1575
88
+ rubigram/types/aux_data.py,sha256=7KOtMJKrOq7zp9DhZLZMQede5r2xkrVgRXk9Z7XFJtk,868
89
+ rubigram/types/bot.py,sha256=AUNiwB8czhizlGfEVObDc31XJ7UGU6L6O1lzHgLViN4,1381
90
+ rubigram/types/bot_command.py,sha256=02dz374_9w2a18hD4G7DnzOQEkew-YGvQDoXOQxNopU,726
91
+ rubigram/types/chat.py,sha256=_LbAPGm8gbbCE9pRUkKyNrSt3y0Ama0sKWqk-JFQya4,2646
92
+ rubigram/types/contact_message.py,sha256=RcSD4MleGabrkM1Q0nKWN2NmRGFgJdRSobQgbiKXSJI,802
93
+ rubigram/types/file.py,sha256=37pd714Rl9ulQuc4N9XG6suHZ9W0TltTD3M2v64rqQA,2184
94
+ rubigram/types/forwarded_from.py,sha256=ccYcdrdyZ1ImQavL7MKWFw6VN17I_S3HQMDuT5O24-c,1288
95
+ rubigram/types/live_location.py,sha256=NLMTwuTABo5HHdDBUcwmLJuLNSlGEMLxjQ5MBPZm1x0,1456
96
+ rubigram/types/location.py,sha256=b6Zbsu2zmgqN-axbN58NuL4uOJxp-uUgqymS_9-ndWY,578
97
+ rubigram/types/payment_status.py,sha256=pQC4Vn4ddxbKtGFv3k7Vv875-B709V5sUicwyaIwu5k,975
98
+ rubigram/types/poll.py,sha256=QspHE95RNu1QRhEGh7OkF-0i_SVRk3Fhpl7Yo3CzsoI,885
99
+ rubigram/types/poll_status.py,sha256=SYdO1NZjzmWV7OKysBDBz-JMrvVnBc8t0Am_XpJQliU,1308
100
+ rubigram/types/sticker.py,sha256=wXGzUeYPvmEMoJXQUZ_Zzx1zWerG64_3Y0BBpDW8zTU,912
101
+ rubigram/types/buttons/__init__.py,sha256=D1GZ8FiyaEJzxlPtdVT8PexRbheQ1h8LdbH68tkFQps,543
102
+ rubigram/types/buttons/button.py,sha256=dQpgA7x4LjWgv8Kd77uKsvH-QaCfGqXjKrP6oPexk6o,2076
103
+ rubigram/types/buttons/button_calendar.py,sha256=ZmArKqq94vqmO8KZdME-MJdV0QvPyuNOFXW_W0Zwm4M,1158
104
+ rubigram/types/buttons/button_location.py,sha256=e3QST6fl8E-y6AjlsXk-EeK4sIM4SmAxy3GYLFyraGk,1312
105
+ rubigram/types/buttons/button_number_picker.py,sha256=2QjshVoqUU868UC6PkTt-G3dssmz6hWSnkkk15jY-xE,919
106
+ rubigram/types/buttons/button_selection.py,sha256=lljgbWqfu-DM9D_kYLIa68G8e51Xl7a9YSKYN09OIK0,1507
107
+ rubigram/types/buttons/button_selection_item.py,sha256=xTXjHN5-a9nl5PuOLIXdULgTRxHhAjcTFdechzV1gRM,981
108
+ rubigram/types/buttons/button_string_picker.py,sha256=I5PxwaYnTOWKqcgTp4u_4SwMOJOxJwphHt9vyPz90T8,816
109
+ rubigram/types/buttons/button_text_box.py,sha256=yTjExzgcjGEQIafcTseEWcdr6Z7hP_A9lULSyBbwAiM,1271
110
+ rubigram/types/config/__init__.py,sha256=YyFmkyBd0iQwgRMkopC7aIc1nNUf30v1ub59zUMIl54,198
111
+ rubigram/types/config/object.py,sha256=ooyhnl6MsjJFFpZtYLJLe5KCmyUnp_5h06LCJa9K4X4,13404
112
+ rubigram/types/keypads/__init__.py,sha256=RjFuNPb9BhXkekD3fld68oVvZ_mnYB_zBnxt0mtlCZo,233
113
+ rubigram/types/keypads/keypad.py,sha256=71SapAPcTfpxPkV_6oBpsNce1bnvc8h0HqrctMPeBz4,1029
114
+ rubigram/types/keypads/keypad_row.py,sha256=clnEFzmpfjAOXDx9v5g1VBf9Y2HTn8wgNa4Jy-hjNug,658
115
+ rubigram/types/messages/__init__.py,sha256=C3qcGV4AosJRwWC2q_lXd9yRAJDrduZiYusjA06wdYw,281
116
+ rubigram/types/messages/inline_message.py,sha256=uojBuPLmL9sKehimRfB73iAW5T0G66uOuMKzAXTefV8,2493
117
+ rubigram/types/messages/message.py,sha256=XTBu4ZvosXqveaWXCJAtadILMFMVofvMSgpWCqmOQas,4019
118
+ rubigram/types/messages/update_message.py,sha256=e4CClyKqKrqQrlyUbcdqcbgwBdZOd-555GKTS7yAHX8,10784
119
+ rubigram/types/metadata/__init__.py,sha256=FmRPYDYfkBkavmVCoxQa9fjgmP29Ep4H9UFXP4TA0Wg,245
120
+ rubigram/types/metadata/metadata.py,sha256=jv0lX-Zs8x5iJLbRFPR7FXpHqivW4Grsr_ZCONHUPL4,1333
121
+ rubigram/types/metadata/metadata_parts.py,sha256=0oEZrfgb_EDJjrk_vb3eWGbxoVx7cCA7T1fCsbZ4VK8,1298
122
+ rubigram/types/updates/__init__.py,sha256=7upW117wADRgh_SxDvx7f0NR_QDWUNTc6_JOPEFuW04,228
123
+ rubigram/types/updates/update.py,sha256=7pI_FyQPEYSjCRLxTWZfEAJYYJpSf20BKhpmnLRVCgE,31578
124
+ rubigram/types/updates/updates.py,sha256=KVSo4Q5CpS2tkhFPhD-s6Z28iUaCcxwtpzSVxGRyZKo,1737
125
+ rubigram/utils/__init__.py,sha256=rDSQG6CeYw3_cdLKowRY6HKJ1GKSWNxAyIREB9Yff0E,296
126
+ rubigram/utils/auto_delete.py,sha256=KcxRLKIRX0OrwDMOaDAi_j0o545fGyjRBH_qQVzTRLc,3070
127
+ rubigram/utils/parser.py,sha256=K6G17Als2jN8Bt3rNYpc_ukJWV_efOCjqW4Nd0Y4_eI,3383
128
+ rubigramclient-1.7.17.dist-info/licenses/LICENSE,sha256=W2bekuLJMG2c-8SvTkJflMF5wY_Mx6rsXfXoCQvRzOI,1081
129
+ rubigramclient-1.7.17.dist-info/METADATA,sha256=0r75ueSLM6ePE4evxbKGxSj3XRs_xmHtkFG1KZjNXZs,6752
130
+ rubigramclient-1.7.17.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
131
+ rubigramclient-1.7.17.dist-info/top_level.txt,sha256=Mhg5HfkL6rLec5sI4ClGmwoqYUANAZUz8sVa1sT_cas,9
132
+ rubigramclient-1.7.17.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (80.9.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Javad
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1 @@
1
+ rubigram