Rubka 7.1.18__tar.gz → 7.2.1__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.
Files changed (51) hide show
  1. {rubka-7.1.18 → rubka-7.2.1}/PKG-INFO +1 -1
  2. {rubka-7.1.18 → rubka-7.2.1}/Rubka.egg-info/PKG-INFO +1 -1
  3. {rubka-7.1.18 → rubka-7.2.1}/rubka/asynco.py +58 -39
  4. {rubka-7.1.18 → rubka-7.2.1}/rubka/context.py +28 -2
  5. {rubka-7.1.18 → rubka-7.2.1}/rubka/filters.py +4 -3
  6. {rubka-7.1.18 → rubka-7.2.1}/setup.py +1 -1
  7. {rubka-7.1.18 → rubka-7.2.1}/README.md +0 -0
  8. {rubka-7.1.18 → rubka-7.2.1}/Rubka.egg-info/SOURCES.txt +0 -0
  9. {rubka-7.1.18 → rubka-7.2.1}/Rubka.egg-info/dependency_links.txt +0 -0
  10. {rubka-7.1.18 → rubka-7.2.1}/Rubka.egg-info/entry_points.txt +0 -0
  11. {rubka-7.1.18 → rubka-7.2.1}/Rubka.egg-info/not-zip-safe +0 -0
  12. {rubka-7.1.18 → rubka-7.2.1}/Rubka.egg-info/requires.txt +0 -0
  13. {rubka-7.1.18 → rubka-7.2.1}/Rubka.egg-info/top_level.txt +0 -0
  14. {rubka-7.1.18 → rubka-7.2.1}/rubka/__init__.py +0 -0
  15. {rubka-7.1.18 → rubka-7.2.1}/rubka/adaptorrubka/__init__.py +0 -0
  16. {rubka-7.1.18 → rubka-7.2.1}/rubka/adaptorrubka/client/__init__.py +0 -0
  17. {rubka-7.1.18 → rubka-7.2.1}/rubka/adaptorrubka/client/client.py +0 -0
  18. {rubka-7.1.18 → rubka-7.2.1}/rubka/adaptorrubka/crypto/__init__.py +0 -0
  19. {rubka-7.1.18 → rubka-7.2.1}/rubka/adaptorrubka/crypto/crypto.py +0 -0
  20. {rubka-7.1.18 → rubka-7.2.1}/rubka/adaptorrubka/enums.py +0 -0
  21. {rubka-7.1.18 → rubka-7.2.1}/rubka/adaptorrubka/exceptions.py +0 -0
  22. {rubka-7.1.18 → rubka-7.2.1}/rubka/adaptorrubka/methods/__init__.py +0 -0
  23. {rubka-7.1.18 → rubka-7.2.1}/rubka/adaptorrubka/methods/methods.py +0 -0
  24. {rubka-7.1.18 → rubka-7.2.1}/rubka/adaptorrubka/network/__init__.py +0 -0
  25. {rubka-7.1.18 → rubka-7.2.1}/rubka/adaptorrubka/network/helper.py +0 -0
  26. {rubka-7.1.18 → rubka-7.2.1}/rubka/adaptorrubka/network/network.py +0 -0
  27. {rubka-7.1.18 → rubka-7.2.1}/rubka/adaptorrubka/network/socket.py +0 -0
  28. {rubka-7.1.18 → rubka-7.2.1}/rubka/adaptorrubka/sessions/__init__.py +0 -0
  29. {rubka-7.1.18 → rubka-7.2.1}/rubka/adaptorrubka/sessions/sessions.py +0 -0
  30. {rubka-7.1.18 → rubka-7.2.1}/rubka/adaptorrubka/types/__init__.py +0 -0
  31. {rubka-7.1.18 → rubka-7.2.1}/rubka/adaptorrubka/types/socket/__init__.py +0 -0
  32. {rubka-7.1.18 → rubka-7.2.1}/rubka/adaptorrubka/types/socket/message.py +0 -0
  33. {rubka-7.1.18 → rubka-7.2.1}/rubka/adaptorrubka/utils/__init__.py +0 -0
  34. {rubka-7.1.18 → rubka-7.2.1}/rubka/adaptorrubka/utils/configs.py +0 -0
  35. {rubka-7.1.18 → rubka-7.2.1}/rubka/adaptorrubka/utils/utils.py +0 -0
  36. {rubka-7.1.18 → rubka-7.2.1}/rubka/api.py +0 -0
  37. {rubka-7.1.18 → rubka-7.2.1}/rubka/button.py +0 -0
  38. {rubka-7.1.18 → rubka-7.2.1}/rubka/config.py +0 -0
  39. {rubka-7.1.18 → rubka-7.2.1}/rubka/decorators.py +0 -0
  40. {rubka-7.1.18 → rubka-7.2.1}/rubka/exceptions.py +0 -0
  41. {rubka-7.1.18 → rubka-7.2.1}/rubka/helpers.py +0 -0
  42. {rubka-7.1.18 → rubka-7.2.1}/rubka/jobs.py +0 -0
  43. {rubka-7.1.18 → rubka-7.2.1}/rubka/keyboards.py +0 -0
  44. {rubka-7.1.18 → rubka-7.2.1}/rubka/keypad.py +0 -0
  45. {rubka-7.1.18 → rubka-7.2.1}/rubka/logger.py +0 -0
  46. {rubka-7.1.18 → rubka-7.2.1}/rubka/metadata.py +0 -0
  47. {rubka-7.1.18 → rubka-7.2.1}/rubka/rubino.py +0 -0
  48. {rubka-7.1.18 → rubka-7.2.1}/rubka/tv.py +0 -0
  49. {rubka-7.1.18 → rubka-7.2.1}/rubka/update.py +0 -0
  50. {rubka-7.1.18 → rubka-7.2.1}/rubka/utils.py +0 -0
  51. {rubka-7.1.18 → rubka-7.2.1}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: Rubka
3
- Version: 7.1.18
3
+ Version: 7.2.1
4
4
  Summary: Rubika: A Python library for interacting with the Rubika Bot API. This library provides an easy-to-use interface to send messages, polls, stickers, media files, manage groups and channels, handle inline keyboards, and implement advanced bot features like subscription management, user authentication, and message handling. Ideal for developers looking to automate and extend their Rubika bots with Python.
5
5
  Home-page: https://github.com/Mahdy-Ahmadi/Rubka
6
6
  Download-URL: https://github.com/Mahdy-Ahmadi/rubka/archive/refs/tags/v6.6.4.zip
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: Rubka
3
- Version: 7.1.18
3
+ Version: 7.2.1
4
4
  Summary: Rubika: A Python library for interacting with the Rubika Bot API. This library provides an easy-to-use interface to send messages, polls, stickers, media files, manage groups and channels, handle inline keyboards, and implement advanced bot features like subscription management, user authentication, and message handling. Ideal for developers looking to automate and extend their Rubika bots with Python.
5
5
  Home-page: https://github.com/Mahdy-Ahmadi/Rubka
6
6
  Download-URL: https://github.com/Mahdy-Ahmadi/rubka/archive/refs/tags/v6.6.4.zip
@@ -280,6 +280,7 @@ max_cache_size and max_msg_age help manage duplicate message processing efficien
280
280
  self.proxy = proxy
281
281
  self.max_msg_age = max_msg_age
282
282
  self.retries = retries
283
+ self.middleware_data = []
283
284
 
284
285
  self.retry_delay = retry_delay
285
286
  self.raise_errors = raise_errors
@@ -541,6 +542,11 @@ max_cache_size and max_msg_age help manage duplicate message processing efficien
541
542
 
542
543
  #decorator#
543
544
 
545
+ def middleware(self):
546
+ def decorator(func: Callable[[Any, Union[Message, InlineMessage]], None]):
547
+ self.middleware_data.append(func)
548
+ return func
549
+ return decorator
544
550
  def on_message_private(
545
551
  self,
546
552
  chat_id: Optional[Union[str, List[str]]] = None,
@@ -1842,20 +1848,23 @@ max_cache_size and max_msg_age help manage duplicate message processing efficien
1842
1848
  reply_to_message_id: Optional[str] = None,
1843
1849
  chat_keypad_type: Optional[Literal["New", "Remove"]] = None,
1844
1850
  delete_after: Optional[int] = None,
1845
- parse_mode: Optional[Literal["HTML", "Markdown"]] = None
1851
+ parse_mode: Optional[Literal["HTML", "Markdown"]] = None,
1852
+ meta_data:Optional[dict] = None
1846
1853
  ) -> Dict[str, Any]:
1847
-
1848
1854
  payload = {
1849
1855
  "chat_id": chat_id,
1850
1856
  "text": text,
1851
1857
  "disable_notification": disable_notification,
1852
1858
  }
1853
- parse_mode_to_use = parse_mode or self.parse_mode
1854
- if text:
1855
- text, metadata = self._parse_text_metadata(text, parse_mode_to_use)
1856
- payload["text"] = text
1857
- if metadata:
1858
- payload["metadata"] = metadata
1859
+ if not meta_data:
1860
+ parse_mode_to_use = parse_mode or self.parse_mode
1861
+ if text:
1862
+ text, metadata = self._parse_text_metadata(text, parse_mode_to_use)
1863
+ payload["text"] = text
1864
+ if metadata:
1865
+ payload["metadata"] = metadata
1866
+ else :
1867
+ payload["metadata"] = meta_data
1859
1868
  if chat_keypad:
1860
1869
  payload["chat_keypad"] = chat_keypad
1861
1870
  payload["chat_keypad_type"] = chat_keypad_type or "New"
@@ -2142,16 +2151,20 @@ max_cache_size and max_msg_age help manage duplicate message processing efficien
2142
2151
  raise ValueError(f"Invalid media type. Must be one of {allowed}")
2143
2152
  result = await self._post("requestSendFile", {"type": media_type})
2144
2153
  return result.get("data", {}).get("upload_url")
2145
- async def _send_uploaded_file(self, chat_id: str, file_id: str,type_file : str = "file",text: Optional[str] = None, chat_keypad: Optional[Dict[str, Any]] = None, inline_keypad: Optional[Dict[str, Any]] = None, disable_notification: bool = False, reply_to_message_id: Optional[str] = None, chat_keypad_type: Optional[Literal["New", "Remove", "None"]] = "None",parse_mode: Optional[Literal["HTML", "Markdown"]] = None) -> Dict[str, Any]:
2154
+ async def _send_uploaded_file(self, chat_id: str, file_id: str,type_file : str = "file",text: Optional[str] = None, chat_keypad: Optional[Dict[str, Any]] = None, inline_keypad: Optional[Dict[str, Any]] = None, disable_notification: bool = False, reply_to_message_id: Optional[str] = None, chat_keypad_type: Optional[Literal["New", "Remove", "None"]] = "None",parse_mode: Optional[Literal["HTML", "Markdown"]] = None,meta_data:Optional[dict] = None) -> Dict[str, Any]:
2146
2155
  payload = {"chat_id": chat_id, "file_id": file_id, "text": text, "disable_notification": disable_notification, "chat_keypad_type": chat_keypad_type}
2147
2156
  if chat_keypad: payload["chat_keypad"] = chat_keypad
2148
2157
  if inline_keypad: payload["inline_keypad"] = inline_keypad
2149
2158
  if reply_to_message_id: payload["reply_to_message_id"] = str(reply_to_message_id)
2150
- parse_mode_to_use = parse_mode or self.parse_mode
2151
- if text:
2152
- text, metadata = self._parse_text_metadata(text, parse_mode_to_use)
2153
- payload["text"] = text
2154
- if metadata:payload["metadata"] = metadata
2159
+ if not meta_data:
2160
+ parse_mode_to_use = parse_mode or self.parse_mode
2161
+ if text:
2162
+ text, metadata = self._parse_text_metadata(text, parse_mode_to_use)
2163
+ payload["text"] = text
2164
+ if metadata:
2165
+ payload["metadata"] = metadata
2166
+ else :
2167
+ payload["metadata"] = meta_data
2155
2168
  payload["time"] = "10"
2156
2169
  resp = await self._post("sendFile", payload)
2157
2170
  message_id_put = resp["data"]["message_id"]
@@ -2171,26 +2184,26 @@ max_cache_size and max_msg_age help manage duplicate message processing efficien
2171
2184
  "chat_keypad_type":chat_keypad_type
2172
2185
  }
2173
2186
  return AttrDict(result)
2174
- async def _send_file_generic(self, media_type, chat_id, path, file_id, text, file_name, inline_keypad, chat_keypad, reply_to_message_id, disable_notification, chat_keypad_type,parse_mode: Optional[Literal["HTML", "Markdown"]] = None):
2187
+ async def _send_file_generic(self, media_type, chat_id, path, file_id, text, file_name, inline_keypad, chat_keypad, reply_to_message_id, disable_notification, chat_keypad_type,parse_mode: Optional[Literal["HTML", "Markdown"]] = None,meta_data:Optional[dict] = None):
2175
2188
  if path:
2176
2189
  file_name = file_name or Path(path).name
2177
2190
  upload_url = await self.get_upload_url(media_type)
2178
2191
  file_id = await self.upload_media_file(upload_url, file_name, path)
2179
2192
  if not file_id:
2180
2193
  raise ValueError("Either path or file_id must be provided.")
2181
- return await self._send_uploaded_file(chat_id=chat_id, file_id=file_id, text=text, inline_keypad=inline_keypad, chat_keypad=chat_keypad, reply_to_message_id=reply_to_message_id, disable_notification=disable_notification, chat_keypad_type=chat_keypad_type,type_file=media_type,parse_mode=parse_mode)
2182
- async def send_document(self, chat_id: str, path: Optional[Union[str, Path]] = None, file_id: Optional[str] = None, text: Optional[str] = None, file_name: Optional[str] = None, inline_keypad: Optional[Dict[str, Any]] = None, chat_keypad: Optional[Dict[str, Any]] = None, reply_to_message_id: Optional[str] = None, disable_notification: bool = False, chat_keypad_type: Optional[Literal["New", "Remove", "None"]] = "None",parse_mode: Optional[Literal["HTML", "Markdown"]] = None) -> Dict[str, Any]:
2183
- return await self._send_file_generic("File", chat_id, path, file_id, text, file_name, inline_keypad, chat_keypad, reply_to_message_id, disable_notification, chat_keypad_type,parse_mode=parse_mode)
2184
- async def send_file(self, chat_id: str, path: Optional[Union[str, Path]] = None, file_id: Optional[str] = None, caption: Optional[str] = None, file_name: Optional[str] = None, inline_keypad: Optional[Dict[str, Any]] = None, chat_keypad: Optional[Dict[str, Any]] = None, reply_to_message_id: Optional[str] = None, disable_notification: bool = False, chat_keypad_type: Optional[Literal["New", "Remove", "None"]] = "None",parse_mode: Optional[Literal["HTML", "Markdown"]] = None) -> Dict[str, Any]:
2185
- return await self._send_file_generic("File", chat_id, path, file_id, caption, file_name, inline_keypad, chat_keypad, reply_to_message_id, disable_notification, chat_keypad_type,parse_mode=parse_mode)
2186
- async def re_send(self, chat_id: str, path: Optional[Union[str, Path]] = None, file_id: Optional[str] = None, caption: Optional[str] = None, file_name: Optional[str] = None, inline_keypad: Optional[Dict[str, Any]] = None, chat_keypad: Optional[Dict[str, Any]] = None, reply_to_message_id: Optional[str] = None, disable_notification: bool = False, chat_keypad_type: Optional[Literal["New", "Remove", "None"]] = "None",parse_mode: Optional[Literal["HTML", "Markdown"]] = None) -> Dict[str, Any]:
2187
- return await self._send_file_generic("File", chat_id, path, file_id, caption, file_name, inline_keypad, chat_keypad, reply_to_message_id, disable_notification, chat_keypad_type,parse_mode=parse_mode)
2188
- async def send_video(self, chat_id: str, path: Optional[Union[str, Path]] = None, file_id: Optional[str] = None, text: Optional[str] = None, file_name: Optional[str] = None, inline_keypad: Optional[Dict[str, Any]] = None, chat_keypad: Optional[Dict[str, Any]] = None, reply_to_message_id: Optional[str] = None, disable_notification: bool = False, chat_keypad_type: Optional[Literal["New", "Remove", "None"]] = "None",parse_mode: Optional[Literal["HTML", "Markdown"]] = None) -> Dict[str, Any]:
2189
- return await self._send_file_generic("Video", chat_id, path, file_id, text, file_name, inline_keypad, chat_keypad, reply_to_message_id, disable_notification, chat_keypad_type,parse_mode=parse_mode)
2190
- async def send_voice(self, chat_id: str, path: Optional[Union[str, Path]] = None, file_id: Optional[str] = None, text: Optional[str] = None, file_name: Optional[str] = None, inline_keypad: Optional[Dict[str, Any]] = None, chat_keypad: Optional[Dict[str, Any]] = None, reply_to_message_id: Optional[str] = None, disable_notification: bool = False, chat_keypad_type: Optional[Literal["New", "Remove", "None"]] = "None",parse_mode: Optional[Literal["HTML", "Markdown"]] = None) -> Dict[str, Any]:
2191
- return await self._send_file_generic("voice", chat_id, path, file_id, text, file_name, inline_keypad, chat_keypad, reply_to_message_id, disable_notification, chat_keypad_type,parse_mode=parse_mode)
2192
- async def send_image(self, chat_id: str, path: Optional[Union[str, Path]] = None, file_id: Optional[str] = None, text: Optional[str] = None, file_name: Optional[str] = None, inline_keypad: Optional[Dict[str, Any]] = None, chat_keypad: Optional[Dict[str, Any]] = None, reply_to_message_id: Optional[str] = None, disable_notification: bool = False, chat_keypad_type: Optional[Literal["New", "Remove", "None"]] = "None",parse_mode: Optional[Literal["HTML", "Markdown"]] = None) -> Dict[str, Any]:
2193
- return await self._send_file_generic("Image", chat_id, path, file_id, text, file_name, inline_keypad, chat_keypad, reply_to_message_id, disable_notification, chat_keypad_type,parse_mode=parse_mode)
2194
+ return await self._send_uploaded_file(chat_id=chat_id, file_id=file_id, text=text, inline_keypad=inline_keypad, chat_keypad=chat_keypad, reply_to_message_id=reply_to_message_id, disable_notification=disable_notification, chat_keypad_type=chat_keypad_type,type_file=media_type,parse_mode=parse_mode,meta_data=meta_data)
2195
+ async def send_document(self, chat_id: str, path: Optional[Union[str, Path]] = None, file_id: Optional[str] = None, text: Optional[str] = None, file_name: Optional[str] = None, inline_keypad: Optional[Dict[str, Any]] = None, chat_keypad: Optional[Dict[str, Any]] = None, reply_to_message_id: Optional[str] = None, disable_notification: bool = False, chat_keypad_type: Optional[Literal["New", "Remove", "None"]] = "None",parse_mode: Optional[Literal["HTML", "Markdown"]] = None,meta_data:Optional[dict] = None) -> Dict[str, Any]:
2196
+ return await self._send_file_generic("File", chat_id, path, file_id, text, file_name, inline_keypad, chat_keypad, reply_to_message_id, disable_notification, chat_keypad_type,parse_mode=parse_mode,meta_data=meta_data)
2197
+ async def send_file(self, chat_id: str, path: Optional[Union[str, Path]] = None, file_id: Optional[str] = None, caption: Optional[str] = None, file_name: Optional[str] = None, inline_keypad: Optional[Dict[str, Any]] = None, chat_keypad: Optional[Dict[str, Any]] = None, reply_to_message_id: Optional[str] = None, disable_notification: bool = False, chat_keypad_type: Optional[Literal["New", "Remove", "None"]] = "None",parse_mode: Optional[Literal["HTML", "Markdown"]] = None,meta_data:Optional[dict] = None) -> Dict[str, Any]:
2198
+ return await self._send_file_generic("File", chat_id, path, file_id, caption, file_name, inline_keypad, chat_keypad, reply_to_message_id, disable_notification, chat_keypad_type,parse_mode=parse_mode,meta_data=meta_data)
2199
+ async def re_send(self, chat_id: str, path: Optional[Union[str, Path]] = None, file_id: Optional[str] = None, caption: Optional[str] = None, file_name: Optional[str] = None, inline_keypad: Optional[Dict[str, Any]] = None, chat_keypad: Optional[Dict[str, Any]] = None, reply_to_message_id: Optional[str] = None, disable_notification: bool = False, chat_keypad_type: Optional[Literal["New", "Remove", "None"]] = "None",parse_mode: Optional[Literal["HTML", "Markdown"]] = None,meta_data:Optional[dict] = None) -> Dict[str, Any]:
2200
+ return await self._send_file_generic("File", chat_id, path, file_id, caption, file_name, inline_keypad, chat_keypad, reply_to_message_id, disable_notification, chat_keypad_type,parse_mode=parse_mode,meta_data=meta_data)
2201
+ async def send_video(self, chat_id: str, path: Optional[Union[str, Path]] = None, file_id: Optional[str] = None, text: Optional[str] = None, file_name: Optional[str] = None, inline_keypad: Optional[Dict[str, Any]] = None, chat_keypad: Optional[Dict[str, Any]] = None, reply_to_message_id: Optional[str] = None, disable_notification: bool = False, chat_keypad_type: Optional[Literal["New", "Remove", "None"]] = "None",parse_mode: Optional[Literal["HTML", "Markdown"]] = None,meta_data:Optional[dict] = None) -> Dict[str, Any]:
2202
+ return await self._send_file_generic("Video", chat_id, path, file_id, text, file_name, inline_keypad, chat_keypad, reply_to_message_id, disable_notification, chat_keypad_type,parse_mode=parse_mode,meta_data=meta_data)
2203
+ async def send_voice(self, chat_id: str, path: Optional[Union[str, Path]] = None, file_id: Optional[str] = None, text: Optional[str] = None, file_name: Optional[str] = None, inline_keypad: Optional[Dict[str, Any]] = None, chat_keypad: Optional[Dict[str, Any]] = None, reply_to_message_id: Optional[str] = None, disable_notification: bool = False, chat_keypad_type: Optional[Literal["New", "Remove", "None"]] = "None",parse_mode: Optional[Literal["HTML", "Markdown"]] = None,meta_data:Optional[dict] = None) -> Dict[str, Any]:
2204
+ return await self._send_file_generic("voice", chat_id, path, file_id, text, file_name, inline_keypad, chat_keypad, reply_to_message_id, disable_notification, chat_keypad_type,parse_mode=parse_mode,meta_data=meta_data)
2205
+ async def send_image(self, chat_id: str, path: Optional[Union[str, Path]] = None, file_id: Optional[str] = None, text: Optional[str] = None, file_name: Optional[str] = None, inline_keypad: Optional[Dict[str, Any]] = None, chat_keypad: Optional[Dict[str, Any]] = None, reply_to_message_id: Optional[str] = None, disable_notification: bool = False, chat_keypad_type: Optional[Literal["New", "Remove", "None"]] = "None",parse_mode: Optional[Literal["HTML", "Markdown"]] = None,meta_data:Optional[dict] = None) -> Dict[str, Any]:
2206
+ return await self._send_file_generic("Image", chat_id, path, file_id, text, file_name, inline_keypad, chat_keypad, reply_to_message_id, disable_notification, chat_keypad_type,parse_mode=parse_mode,meta_data=meta_data)
2194
2207
  async def send_music(
2195
2208
  self,
2196
2209
  chat_id: str,
@@ -2203,7 +2216,8 @@ max_cache_size and max_msg_age help manage duplicate message processing efficien
2203
2216
  reply_to_message_id: Optional[str] = None,
2204
2217
  disable_notification: bool = False,
2205
2218
  chat_keypad_type: Optional[Literal["New", "Remove", "None"]] = "None",
2206
- parse_mode: Optional[Literal["HTML", "Markdown"]] = None
2219
+ parse_mode: Optional[Literal["HTML", "Markdown"]] = None,
2220
+ meta_data:Optional[dict] = None
2207
2221
  ) -> Dict[str, Any]:
2208
2222
  valid_extensions = {"ogg", "oga", "opus", "flac"}
2209
2223
  extension = "flac"
@@ -2236,7 +2250,8 @@ max_cache_size and max_msg_age help manage duplicate message processing efficien
2236
2250
  reply_to_message_id,
2237
2251
  disable_notification,
2238
2252
  chat_keypad_type,
2239
- parse_mode=parse_mode
2253
+ parse_mode=parse_mode,
2254
+ meta_data=meta_data
2240
2255
  )
2241
2256
  async def send_gif(
2242
2257
  self,
@@ -2250,7 +2265,8 @@ max_cache_size and max_msg_age help manage duplicate message processing efficien
2250
2265
  reply_to_message_id: Optional[str] = None,
2251
2266
  disable_notification: bool = False,
2252
2267
  chat_keypad_type: Optional[Literal["New", "Remove", "None"]] = "None",
2253
- parse_mode: Optional[Literal["HTML", "Markdown"]] = None
2268
+ parse_mode: Optional[Literal["HTML", "Markdown"]] = None,
2269
+ meta_data:Optional[dict] = None
2254
2270
  ) -> Dict[str, Any]:
2255
2271
  valid_extensions = {"gif"}
2256
2272
  extension = "gif"
@@ -2283,7 +2299,7 @@ max_cache_size and max_msg_age help manage duplicate message processing efficien
2283
2299
  reply_to_message_id,
2284
2300
  disable_notification,
2285
2301
  chat_keypad_type,
2286
- parse_mode=parse_mode
2302
+ parse_mode=parse_mode,meta_data=meta_data
2287
2303
  )
2288
2304
 
2289
2305
  async def get_avatar_me(self, save_as: str = None) -> str:
@@ -2427,18 +2443,21 @@ max_cache_size and max_msg_age help manage duplicate message processing efficien
2427
2443
  return await self._post("leaveChat", {"chat_id": chat_id})
2428
2444
  async def forward_message(self, from_chat_id: str, message_id: str, to_chat_id: str, disable_notification: bool = False) -> Dict[str, Any]:
2429
2445
  return await self._post("forwardMessage", {"from_chat_id": from_chat_id, "message_id": message_id, "to_chat_id": to_chat_id, "disable_notification": disable_notification})
2430
- async def edit_message_text(self, chat_id: str, message_id: str, text: str, parse_mode: Optional[Literal["HTML", "Markdown"]] = None) -> Dict[str, Any]:
2446
+ async def edit_message_text(self, chat_id: str, message_id: str, text: str, parse_mode: Optional[Literal["HTML", "Markdown"]] = None,meta_data:Optional[dict] = None) -> Dict[str, Any]:
2431
2447
  payload = {
2432
2448
  "chat_id": chat_id,
2433
2449
  "message_id": message_id,
2434
2450
  "text": text,
2435
2451
  }
2436
- parse_mode_to_use = parse_mode or self.parse_mode
2437
- if text:
2438
- text, metadata = self._parse_text_metadata(text, parse_mode_to_use)
2439
- payload["text"] = text
2440
- if metadata:
2441
- payload["metadata"] = metadata
2452
+ if not meta_data:
2453
+ parse_mode_to_use = parse_mode or self.parse_mode
2454
+ if text:
2455
+ text, metadata = self._parse_text_metadata(text, parse_mode_to_use)
2456
+ payload["text"] = text
2457
+ if metadata:
2458
+ payload["metadata"] = metadata
2459
+ else :
2460
+ payload["metadata"] = meta_data
2442
2461
  return await self._post("editMessageText", payload)
2443
2462
  async def edit_inline_keypad(self,chat_id: str,message_id: str,inline_keypad: Dict[str, Any],text: str = None) -> Dict[str, Any]:
2444
2463
  if text is not None:await self._post("editMessageText", {"chat_id": chat_id,"message_id": message_id,"text": text})
@@ -288,6 +288,7 @@ class Message:
288
288
  self.is_audio = None
289
289
  self.is_voice = None
290
290
  self.is_document = None
291
+ self.is_music = None
291
292
  self.is_archive = None
292
293
  self.is_executable = None
293
294
  self.is_font = None
@@ -356,6 +357,7 @@ class Message:
356
357
  self.is_photo = name.endswith((".jpg", ".jpeg", ".png", ".gif", ".webp"))
357
358
  self.is_video = name.endswith((".mp4", ".mov", ".avi", ".mkv", ".webm"))
358
359
  self.is_audio = name.endswith((".mp3", ".wav", ".ogg", ".m4a", ".flac"))
360
+ self.is_music = name.endswith((".mp3", ".wav", ".ogg", ".m4a", ".flac"))
359
361
  self.is_voice = name.endswith((".ogg", ".m4a"))
360
362
  self.is_document = name.endswith((".pdf", ".doc", ".docx", ".txt", ".xls", ".xlsx", ".ppt", ".pptx"))
361
363
  self.is_archive = name.endswith((".zip", ".rar", ".7z", ".tar", ".gz"))
@@ -437,8 +439,32 @@ class Message:
437
439
  reply_to_message_id=self.message_id,
438
440
  **kwargs
439
441
  )
440
-
441
-
442
+ async def copy(self, to_chat_id: Optional[str], message_id: Optional[str] = None):await self.copy_message(to_chat_id, message_id)
443
+ async def copy_message(self, to_chat_id: Optional[str], message_id: Optional[str] = None):
444
+ try:
445
+ send_func = None
446
+ kwargs = {
447
+ "chat_id": to_chat_id,
448
+ "reply_to_message_id": message_id,
449
+ "meta_data": self.metadata
450
+ }
451
+ if getattr(self, "is_photo", False):
452
+ send_func = self.bot.send_image
453
+ elif getattr(self, "is_video", False):
454
+ send_func = self.bot.send_video
455
+ elif getattr(self, "is_document", False):
456
+ send_func = self.bot.send_document
457
+ elif getattr(self, "is_text", False):
458
+ send_func = self.bot.send_message
459
+ kwargs["text"] = self.text
460
+ if send_func:
461
+ if hasattr(self, "file") and self.file:
462
+ kwargs["path"] = await self.bot.get_url_file(self.file.file_id)
463
+ return await send_func(**kwargs)
464
+ else:
465
+ raise Exception("Unsupported message type.")
466
+ except Exception as e:
467
+ raise Exception(f"Error: {e}")
442
468
  def reply_poll(
443
469
  self,
444
470
  question: str,
@@ -244,9 +244,10 @@ def chat_title_equals(value: str):
244
244
 
245
245
  return Filter(lambda m: getattr(m, "chat", None) and getattr(m.chat, "title", "") == value)
246
246
 
247
- def chat_id_is(cid: str):
248
- return Filter(lambda m: getattr(m, "chat", None) and getattr(m.chat, "id", None) == cid)
249
-
247
+ def chat_id_is(sender_id: str):
248
+ return Filter(lambda m: getattr(m, "chat_id", None) == sender_id)
249
+ def sender_id_is(sender_id: str):
250
+ return Filter(lambda m: getattr(m, "sender_id", None) == sender_id)
250
251
  def chat_member_count(min_count: int = 0, max_count: int = None):
251
252
 
252
253
  def _filter(m):
@@ -13,7 +13,7 @@ with open("README.md", "r", encoding="utf-8") as f:
13
13
 
14
14
  setup(
15
15
  name='Rubka',
16
- version='7.1.18',
16
+ version='7.2.1',
17
17
  description=(
18
18
  "Rubika: A Python library for interacting with the Rubika Bot API. "
19
19
  "This library provides an easy-to-use interface to send messages, polls, "
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