Rubka 7.1.4__py3-none-any.whl → 7.1.6__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.
- rubka/api.py +0 -6
- rubka/asynco.py +80 -34
- rubka/context.py +105 -14
- rubka/rubino.py +19 -7
- {rubka-7.1.4.dist-info → rubka-7.1.6.dist-info}/METADATA +3 -3
- {rubka-7.1.4.dist-info → rubka-7.1.6.dist-info}/RECORD +9 -9
- {rubka-7.1.4.dist-info → rubka-7.1.6.dist-info}/WHEEL +0 -0
- {rubka-7.1.4.dist-info → rubka-7.1.6.dist-info}/entry_points.txt +0 -0
- {rubka-7.1.4.dist-info → rubka-7.1.6.dist-info}/top_level.txt +0 -0
rubka/api.py
CHANGED
|
@@ -61,13 +61,7 @@ def check_rubka_version():
|
|
|
61
61
|
latest_version = get_latest_version(package_name)
|
|
62
62
|
if latest_version is None:return
|
|
63
63
|
if installed_version != latest_version:
|
|
64
|
-
print(f"\n\nWARNING: Your installed version of '{package_name}' is OUTDATED and may cause errors or security risks!")
|
|
65
|
-
print(f"Installed version : {installed_version}")
|
|
66
|
-
print(f"Latest available version : {latest_version}")
|
|
67
|
-
print(f"Please update IMMEDIATELY by running:")
|
|
68
64
|
print(f"\npip install {package_name}=={latest_version}\n")
|
|
69
|
-
print(f"Not updating may lead to malfunctions or incompatibility.")
|
|
70
|
-
print(f"To see new methods : @rubka_library\n\n")
|
|
71
65
|
|
|
72
66
|
check_rubka_version()
|
|
73
67
|
def show_last_six_words(text):
|
rubka/asynco.py
CHANGED
|
@@ -72,14 +72,16 @@ async def check_rubka_version():
|
|
|
72
72
|
return
|
|
73
73
|
|
|
74
74
|
if installed_version != latest_version:
|
|
75
|
-
print(f"
|
|
76
|
-
print(
|
|
77
|
-
print(f"
|
|
78
|
-
print(f"
|
|
79
|
-
print(
|
|
80
|
-
print("
|
|
81
|
-
print("
|
|
82
|
-
|
|
75
|
+
print(f"CRITICAL WARNING: Your installed version of '{package_name}' is outdated.")
|
|
76
|
+
print("This poses a serious risk to stability, security, and compatibility with current features.")
|
|
77
|
+
print(f"- Installed version : {installed_version}")
|
|
78
|
+
print(f"- Latest version : {latest_version}")
|
|
79
|
+
print("\nImmediate action is required.")
|
|
80
|
+
print(f"Run the following command to update safely:")
|
|
81
|
+
print(f"\n pip install {package_name}=={latest_version}\n")
|
|
82
|
+
print("Delaying this update may result in unexpected crashes, data loss, or broken functionality.")
|
|
83
|
+
print("Stay up-to-date to ensure full support and access to the latest improvements.")
|
|
84
|
+
print("For new methods and updates, visit: @rubka_library\n")
|
|
83
85
|
|
|
84
86
|
|
|
85
87
|
|
|
@@ -141,11 +143,12 @@ safeSendMode ensures reliable message sending even if replying by message_id fai
|
|
|
141
143
|
max_cache_size and max_msg_age help manage duplicate message processing efficiently.
|
|
142
144
|
"""
|
|
143
145
|
|
|
144
|
-
def __init__(self, token: str, session_name: str = None, auth: str = None, Key: str = None, platform: str = "web", web_hook: str = None, timeout: int = 10, show_progress: bool = False, raise_errors: bool = True,proxy: str = None,retries: int = 2,retry_delay: float = 0.5,user_agent: str = None,safeSendMode = False,max_cache_size: int = 2000,max_msg_age : int = 60):
|
|
146
|
+
def __init__(self, token: str, session_name: str = None, auth: str = None, Key: str = None, platform: str = "web", web_hook: str = None, timeout: int = 10, show_progress: bool = False, raise_errors: bool = True,proxy: str = None,retries: int = 2,retry_delay: float = 0.5,user_agent: str = None,safeSendMode = False,max_cache_size: int = 2000,max_msg_age : int = 60,chunk_size : int = 64 * 1024):
|
|
145
147
|
self.token = token
|
|
146
148
|
self._inline_query_handlers: List[dict] = []
|
|
147
149
|
self.timeout = timeout
|
|
148
150
|
self.auth = auth
|
|
151
|
+
self.chunk_size = chunk_size
|
|
149
152
|
self.safeSendMode = safeSendMode
|
|
150
153
|
self.user_agent = user_agent
|
|
151
154
|
self.proxy = proxy
|
|
@@ -1051,7 +1054,7 @@ max_cache_size and max_msg_age help manage duplicate message processing efficien
|
|
|
1051
1054
|
self._processed_message_ids.popitem(last=False)
|
|
1052
1055
|
return False
|
|
1053
1056
|
|
|
1054
|
-
async def
|
|
1057
|
+
async def run_progelry(
|
|
1055
1058
|
self,
|
|
1056
1059
|
debug: bool = False,
|
|
1057
1060
|
sleep_time: float = 0.1,
|
|
@@ -1411,7 +1414,7 @@ max_cache_size and max_msg_age help manage duplicate message processing efficien
|
|
|
1411
1414
|
await check_rubka_version()
|
|
1412
1415
|
await self._initialize_webhook()
|
|
1413
1416
|
await self.geteToken()
|
|
1414
|
-
_log("Bot
|
|
1417
|
+
_log("Bot is up and running...", "info")
|
|
1415
1418
|
|
|
1416
1419
|
try:
|
|
1417
1420
|
while True:
|
|
@@ -1638,6 +1641,11 @@ max_cache_size and max_msg_age help manage duplicate message processing efficien
|
|
|
1638
1641
|
|
|
1639
1642
|
|
|
1640
1643
|
_log("Auto-restart requested. You can call run(...) again as needed.", "warning")
|
|
1644
|
+
def run(self, sleep_time : float = 0.1 ,*args, **kwargs):
|
|
1645
|
+
print("Connecting to the server...")
|
|
1646
|
+
loop = asyncio.get_event_loop()
|
|
1647
|
+
if loop.is_running():return loop.create_task(self.run_progelry(sleep_time=sleep_time,*args, **kwargs))
|
|
1648
|
+
else:return asyncio.run(self.run_progelry(sleep_time=sleep_time,*args, **kwargs))
|
|
1641
1649
|
async def _delete_after_task(self, chat_id: str, message_id: str, delay: int):
|
|
1642
1650
|
try:
|
|
1643
1651
|
await asyncio.sleep(delay)
|
|
@@ -1864,41 +1872,45 @@ max_cache_size and max_msg_age help manage duplicate message processing efficien
|
|
|
1864
1872
|
if chat_keypad_type: payload["chat_keypad_type"] = chat_keypad_type
|
|
1865
1873
|
return await self._post("sendLocation", {k: v for k, v in payload.items() if v is not None})
|
|
1866
1874
|
async def upload_media_file(self, upload_url: str, name: str, path: Union[str, Path]) -> str:
|
|
1867
|
-
is_temp_file = False
|
|
1868
1875
|
session = await self._get_session()
|
|
1876
|
+
is_temp_file = False
|
|
1869
1877
|
if isinstance(path, str) and path.startswith("http"):
|
|
1870
1878
|
async with session.get(path) as response:
|
|
1871
1879
|
if response.status != 200:
|
|
1872
1880
|
raise Exception(f"Failed to download file from URL ({response.status})")
|
|
1873
1881
|
content = await response.read()
|
|
1874
|
-
with tempfile.NamedTemporaryFile(delete=False) as
|
|
1875
|
-
|
|
1876
|
-
path =
|
|
1882
|
+
with tempfile.NamedTemporaryFile(delete=False) as tmp:
|
|
1883
|
+
tmp.write(content)
|
|
1884
|
+
path = tmp.name
|
|
1877
1885
|
is_temp_file = True
|
|
1886
|
+
|
|
1878
1887
|
file_size = os.path.getsize(path)
|
|
1879
|
-
|
|
1880
|
-
|
|
1888
|
+
chunk_size = self.chunk_size
|
|
1889
|
+
|
|
1890
|
+
progress_bar = tqdm(total=file_size, unit='B', unit_scale=True, unit_divisor=1024,
|
|
1891
|
+
desc=f'Uploading: {name}', colour='cyan', disable=not getattr(self, 'show_progress', True))
|
|
1892
|
+
|
|
1893
|
+
async def file_generator(file_path):
|
|
1881
1894
|
async with aiofiles.open(file_path, 'rb') as f:
|
|
1882
|
-
while
|
|
1883
|
-
chunk = await f.read(chunk_size)
|
|
1884
|
-
if not chunk:
|
|
1885
|
-
break
|
|
1895
|
+
while chunk := await f.read(chunk_size):
|
|
1886
1896
|
progress_bar.update(len(chunk))
|
|
1887
1897
|
yield chunk
|
|
1888
|
-
|
|
1889
|
-
|
|
1898
|
+
|
|
1899
|
+
form = aiohttp.FormData()
|
|
1900
|
+
form.add_field('file', file_generator(path), filename=name, content_type='application/octet-stream')
|
|
1901
|
+
|
|
1890
1902
|
try:
|
|
1891
|
-
async with session.post(upload_url, data=
|
|
1903
|
+
async with session.post(upload_url, data=form, timeout=aiohttp.ClientTimeout(total=None)) as response:
|
|
1892
1904
|
progress_bar.close()
|
|
1893
1905
|
if response.status != 200:
|
|
1894
|
-
|
|
1895
|
-
|
|
1896
|
-
|
|
1897
|
-
|
|
1898
|
-
|
|
1899
|
-
|
|
1900
|
-
|
|
1901
|
-
|
|
1906
|
+
text = await response.text()
|
|
1907
|
+
raise Exception(f"Upload failed ({response.status}): {text}")
|
|
1908
|
+
return (await response.json()).get('data', {}).get('file_id')
|
|
1909
|
+
except Exception as e:
|
|
1910
|
+
raise FeatureNotAvailableError(f"File upload not supported: {e}")
|
|
1911
|
+
finally:
|
|
1912
|
+
if is_temp_file:
|
|
1913
|
+
os.remove(path)
|
|
1902
1914
|
def get_extension(content_type: str) -> str:
|
|
1903
1915
|
ext = mimetypes.guess_extension(content_type)
|
|
1904
1916
|
return ext if ext else ''
|
|
@@ -2237,8 +2249,42 @@ max_cache_size and max_msg_age help manage duplicate message processing efficien
|
|
|
2237
2249
|
def get_all_member(self, channel_guid: str, search_text: str = None, start_id: str = None, just_get_guids: bool = False):
|
|
2238
2250
|
client = self._get_client()
|
|
2239
2251
|
return client.get_all_members(channel_guid, search_text, start_id, just_get_guids)
|
|
2240
|
-
async def send_poll(
|
|
2241
|
-
|
|
2252
|
+
async def send_poll(
|
|
2253
|
+
self,
|
|
2254
|
+
chat_id: str,
|
|
2255
|
+
question: str,
|
|
2256
|
+
options: List[str],
|
|
2257
|
+
type: Literal["Regular", "Quiz"] = "Regular",
|
|
2258
|
+
allows_multiple_answers: bool = False,
|
|
2259
|
+
is_anonymous: bool = True,
|
|
2260
|
+
correct_option_index: Optional[int] = None,
|
|
2261
|
+
hint: Optional[str] = None,
|
|
2262
|
+
reply_to_message_id: Optional[str] = None,
|
|
2263
|
+
disable_notification: bool = False,
|
|
2264
|
+
show_results : bool = False,
|
|
2265
|
+
inline_keypad : Optional[Dict[str, Any]] = None,
|
|
2266
|
+
chat_keypad: Optional[Dict[str, Any]] = None,
|
|
2267
|
+
chat_keypad_type: Optional[Literal["New", "Remove", "None"]] = None,
|
|
2268
|
+
|
|
2269
|
+
) -> AttrDict:
|
|
2270
|
+
return await self._post(
|
|
2271
|
+
"sendPoll", {
|
|
2272
|
+
"chat_id": chat_id,
|
|
2273
|
+
"question": question,
|
|
2274
|
+
"options": options,
|
|
2275
|
+
"type": type,
|
|
2276
|
+
"allows_multiple_answers": allows_multiple_answers,
|
|
2277
|
+
"is_anonymous": is_anonymous,
|
|
2278
|
+
"correct_option_index": correct_option_index,
|
|
2279
|
+
"explanation": hint,
|
|
2280
|
+
"show_results":show_results,
|
|
2281
|
+
"reply_to_message_id": reply_to_message_id,
|
|
2282
|
+
"disable_notification": disable_notification,
|
|
2283
|
+
"chat_keypad": chat_keypad,
|
|
2284
|
+
"inline_keypad":inline_keypad,
|
|
2285
|
+
"chat_keypad_type": chat_keypad_type,
|
|
2286
|
+
}
|
|
2287
|
+
)
|
|
2242
2288
|
async def check_join(self, channel_guid: str, chat_id: str = None) -> Union[bool, list[str]]:
|
|
2243
2289
|
client = self._get_client()
|
|
2244
2290
|
if chat_id:
|
rubka/context.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
from typing import Any, Dict, List,Optional
|
|
2
1
|
from typing import Union
|
|
3
2
|
from pathlib import Path
|
|
3
|
+
from typing import List, Optional, Dict, Any, Literal, Callable, Union,Set
|
|
4
4
|
import re,inspect
|
|
5
5
|
import asyncio
|
|
6
6
|
class File:
|
|
@@ -336,14 +336,40 @@ class Message:
|
|
|
336
336
|
)
|
|
337
337
|
|
|
338
338
|
|
|
339
|
-
def reply_poll(
|
|
340
|
-
|
|
339
|
+
def reply_poll(
|
|
340
|
+
self,
|
|
341
|
+
question: str,
|
|
342
|
+
options: List[str],
|
|
343
|
+
type: Literal['Regular', 'Quiz'] = "Regular",
|
|
344
|
+
allows_multiple_answers: bool = False,
|
|
345
|
+
is_anonymous: bool = True,
|
|
346
|
+
correct_option_index: Optional[int] = None,
|
|
347
|
+
hint: Optional[str] = None,
|
|
348
|
+
reply_to_message_id: Optional[str] = None,
|
|
349
|
+
disable_notification: bool = False,
|
|
350
|
+
show_results: bool = False,
|
|
351
|
+
inline_keypad: Optional[Dict[str, Any]] = None,
|
|
352
|
+
chat_keypad: Optional[Dict[str, Any]] = None,
|
|
353
|
+
chat_keypad_type: Optional[Literal['New', 'Remove', 'None']] = None,
|
|
354
|
+
**kwargs
|
|
355
|
+
) -> dict:
|
|
356
|
+
payload = {
|
|
341
357
|
"chat_id": self.chat_id,
|
|
342
358
|
"question": question,
|
|
343
359
|
"options": options,
|
|
344
|
-
"
|
|
345
|
-
|
|
346
|
-
|
|
360
|
+
"type": type,
|
|
361
|
+
"allows_multiple_answers": allows_multiple_answers,
|
|
362
|
+
"is_anonymous": is_anonymous,
|
|
363
|
+
"correct_option_index": correct_option_index,
|
|
364
|
+
"hint": hint,
|
|
365
|
+
"reply_to_message_id": self.message_id if not reply_to_message_id else reply_to_message_id,
|
|
366
|
+
"disable_notification": disable_notification,
|
|
367
|
+
"show_results": show_results,
|
|
368
|
+
"inline_keypad": inline_keypad,
|
|
369
|
+
"chat_keypad": chat_keypad,
|
|
370
|
+
"chat_keypad_type": chat_keypad_type,
|
|
371
|
+
}
|
|
372
|
+
return self.bot._post("sendPoll", {key: value for key, value in payload.items() if value is not None}, **kwargs)
|
|
347
373
|
|
|
348
374
|
|
|
349
375
|
def reply_document(
|
|
@@ -617,13 +643,69 @@ class InlineMessage:
|
|
|
617
643
|
if self.chat_id not in self.bot.sessions:
|
|
618
644
|
self.bot.sessions[self.chat_id] = {}
|
|
619
645
|
return self.bot.sessions[self.chat_id]
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
646
|
+
|
|
647
|
+
def reply(self, text: str, delete_after: int = None, **kwargs):
|
|
648
|
+
async def _reply_async():
|
|
649
|
+
send_func = self.bot.send_message
|
|
650
|
+
if inspect.iscoroutinefunction(send_func):
|
|
651
|
+
msg = await send_func(
|
|
652
|
+
self.chat_id,
|
|
653
|
+
text,
|
|
654
|
+
reply_to_message_id=self.message_id,
|
|
655
|
+
delete_after=delete_after,
|
|
656
|
+
**kwargs
|
|
657
|
+
)
|
|
658
|
+
else:
|
|
659
|
+
msg = send_func(
|
|
660
|
+
self.chat_id,
|
|
661
|
+
text,
|
|
662
|
+
reply_to_message_id=self.message_id,
|
|
663
|
+
delete_after=delete_after,
|
|
664
|
+
**kwargs
|
|
665
|
+
)
|
|
666
|
+
class Pick:
|
|
667
|
+
def __init__(self, bot, chat_id, message_id):
|
|
668
|
+
self.bot = bot
|
|
669
|
+
self.chat_id = chat_id
|
|
670
|
+
self.message_id = message_id
|
|
671
|
+
|
|
672
|
+
def edit(self, new_text):
|
|
673
|
+
async def _edit():
|
|
674
|
+
func = self.bot.edit_message_text
|
|
675
|
+
if inspect.iscoroutinefunction(func):
|
|
676
|
+
await func(self.chat_id, self.message_id, new_text)
|
|
677
|
+
else:
|
|
678
|
+
func(self.chat_id, self.message_id, new_text)
|
|
679
|
+
|
|
680
|
+
try:
|
|
681
|
+
loop = asyncio.get_running_loop()
|
|
682
|
+
if loop.is_running():
|
|
683
|
+
return asyncio.create_task(_edit())
|
|
684
|
+
except RuntimeError:
|
|
685
|
+
return asyncio.run(_edit())
|
|
686
|
+
|
|
687
|
+
def delete(self):
|
|
688
|
+
async def _delete():
|
|
689
|
+
func = self.bot.delete_message
|
|
690
|
+
if inspect.iscoroutinefunction(func):
|
|
691
|
+
await func(self.chat_id, self.message_id)
|
|
692
|
+
else:
|
|
693
|
+
func(self.chat_id, self.message_id)
|
|
694
|
+
try:
|
|
695
|
+
loop = asyncio.get_running_loop()
|
|
696
|
+
if loop.is_running():
|
|
697
|
+
return asyncio.create_task(_delete())
|
|
698
|
+
except RuntimeError:
|
|
699
|
+
return asyncio.run(_delete())
|
|
700
|
+
chat_id = msg.get("chat_id") if isinstance(msg, dict) else getattr(msg, "chat_id", self.chat_id)
|
|
701
|
+
message_id = msg.get("message_id") if isinstance(msg, dict) else getattr(msg, "message_id", self.message_id)
|
|
702
|
+
return Pick(self.bot, chat_id, message_id)
|
|
703
|
+
try:
|
|
704
|
+
loop = asyncio.get_running_loop()
|
|
705
|
+
if loop.is_running():
|
|
706
|
+
return asyncio.create_task(_reply_async())
|
|
707
|
+
except RuntimeError:
|
|
708
|
+
return asyncio.run(_reply_async())
|
|
627
709
|
def answer(self, text: str, **kwargs):
|
|
628
710
|
return self.bot.send_message(
|
|
629
711
|
self.chat_id,
|
|
@@ -631,6 +713,7 @@ class InlineMessage:
|
|
|
631
713
|
reply_to_message_id=self.message_id,
|
|
632
714
|
**kwargs
|
|
633
715
|
)
|
|
716
|
+
|
|
634
717
|
|
|
635
718
|
def reply_poll(self, question: str, options: List[str], **kwargs) -> Dict[str, Any]:
|
|
636
719
|
return self.bot._post("sendPoll", {
|
|
@@ -841,4 +924,12 @@ class InlineMessage:
|
|
|
841
924
|
return self.bot.delete_message(
|
|
842
925
|
chat_id=self.chat_id,
|
|
843
926
|
message_id=self.message_id
|
|
844
|
-
)
|
|
927
|
+
)
|
|
928
|
+
@hybrid_property
|
|
929
|
+
async def author_name(self):return await self.bot.get_name(self.chat_id)
|
|
930
|
+
@hybrid_property
|
|
931
|
+
async def name(self):return await self.bot.get_name(self.chat_id)
|
|
932
|
+
@hybrid_property
|
|
933
|
+
async def username(self):return await self.bot.get_username(self.chat_id)
|
|
934
|
+
@hybrid_property
|
|
935
|
+
async def author_info(self):return await self.bot.get_chat(self.chat_id)
|
rubka/rubino.py
CHANGED
|
@@ -5,6 +5,10 @@ from tempfile import NamedTemporaryFile
|
|
|
5
5
|
from os import system, chmod, remove
|
|
6
6
|
from base64 import b64encode
|
|
7
7
|
from io import BytesIO
|
|
8
|
+
class InvalidInputError(Exception):
|
|
9
|
+
def __init__(self, message="Invalid input provided"):
|
|
10
|
+
self.message = message
|
|
11
|
+
super().__init__(self.message)
|
|
8
12
|
class confing():
|
|
9
13
|
headers= {
|
|
10
14
|
"User-Agent": "okhttp/3.12.1",
|
|
@@ -192,9 +196,15 @@ class req:
|
|
|
192
196
|
except:
|
|
193
197
|
continue
|
|
194
198
|
else:
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
199
|
+
|
|
200
|
+
response_data = response.json()
|
|
201
|
+
|
|
202
|
+
if 'data_enc' in response_data:
|
|
203
|
+
return loads(self.enc.decrypt(response_data['data_enc']))
|
|
204
|
+
if response_data.get('status') != "OK":
|
|
205
|
+
raise InvalidInputError(f"Error : {response_data.get('status_det', 'Unknown error')}")
|
|
206
|
+
return response_data
|
|
207
|
+
|
|
198
208
|
|
|
199
209
|
def requestUploadFile(self,file_name:str,size:str,file_type:str,profile_id:str=None):
|
|
200
210
|
return self.send_request({
|
|
@@ -203,6 +213,7 @@ class req:
|
|
|
203
213
|
"file_type": file_type,
|
|
204
214
|
"profile_id": profile_id
|
|
205
215
|
},"requestUploadFile")
|
|
216
|
+
|
|
206
217
|
|
|
207
218
|
def upload(self, post_file, post_type: str, profile_id: str = None):
|
|
208
219
|
file_byte_code = post_file if isinstance(post_file, bytes) else open(post_file, "rb").read()
|
|
@@ -476,11 +487,12 @@ class Bot():
|
|
|
476
487
|
if response.status == 200:
|
|
477
488
|
response_data = json.loads(response.data.decode('utf-8'))
|
|
478
489
|
if 'data' in response_data:
|
|
479
|
-
|
|
490
|
+
return response_data['data']
|
|
480
491
|
else:
|
|
481
|
-
|
|
482
|
-
else
|
|
483
|
-
raise Exception("Request Error Server")
|
|
492
|
+
raise Exception(f"Error: {response_data.get('status_det', 'Unknown error')}")
|
|
493
|
+
else:
|
|
494
|
+
raise Exception(f"Request Error Server - Status Code: {response.status}")
|
|
495
|
+
|
|
484
496
|
def edit_info_page(
|
|
485
497
|
self,
|
|
486
498
|
username_me:str,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: Rubka
|
|
3
|
-
Version: 7.1.
|
|
4
|
-
Summary:
|
|
3
|
+
Version: 7.1.6
|
|
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
|
|
7
7
|
Author: Mahdi Ahmadi
|
|
@@ -12,7 +12,7 @@ License: MIT
|
|
|
12
12
|
Project-URL: Bug Tracker, https://t.me/Bprogrammer
|
|
13
13
|
Project-URL: Documentation, https://github.com/Mahdy-Ahmadi/rubka/blob/main/README.md
|
|
14
14
|
Project-URL: Source Code, https://github.com/Mahdy-Ahmadi/Rubka
|
|
15
|
-
Keywords: rubika bot api library chat messaging rubpy pyrubi rubigram
|
|
15
|
+
Keywords: rubika bot api library chat messaging rubpy pyrubi rubigram rubika_bot rubika_api fast_rub
|
|
16
16
|
Classifier: Development Status :: 5 - Production/Stable
|
|
17
17
|
Classifier: Intended Audience :: Developers
|
|
18
18
|
Classifier: Programming Language :: Python :: 3
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
rubka/__init__.py,sha256=P6IBiORfp-GqKHe5LZ-5lldWyG7tnrUYUcAQDUgwXmY,1973
|
|
2
|
-
rubka/api.py,sha256=
|
|
3
|
-
rubka/asynco.py,sha256=
|
|
2
|
+
rubka/api.py,sha256=wa1gQj7NDc7QEbmNNRz-TIOdVqfMWFC362tndRKdqig,68449
|
|
3
|
+
rubka/asynco.py,sha256=WMQQSX7rjqKn4aGphgC7BQvSqR0DDfe9uEXnmb8ZNHo,110233
|
|
4
4
|
rubka/button.py,sha256=woSzZVd5MtTqOrP-YgkH5b0GS9y4DuKBsFSc9-KuLnk,13320
|
|
5
5
|
rubka/config.py,sha256=Bck59xkOiqioLv0GkQ1qPGnBXVctz1hKk6LT4h2EPx0,78
|
|
6
|
-
rubka/context.py,sha256
|
|
6
|
+
rubka/context.py,sha256=OowmsvqkThzB1NDhK5629Jm4ExdaWcjUo4rsBjpTtjA,38536
|
|
7
7
|
rubka/decorators.py,sha256=hGwUoE4q2ImrunJIGJ_kzGYYxQf1ueE0isadqraKEts,1157
|
|
8
8
|
rubka/exceptions.py,sha256=DDOGIHEMoliHNW5E7C_s38WZgqqMBv9812fcJGvj7TY,1173
|
|
9
9
|
rubka/filters.py,sha256=DY1bdkpRKIiLtVcy6X3hOnlGPcVOK4HFb3QgmaPx6Oo,12116
|
|
@@ -12,7 +12,7 @@ rubka/jobs.py,sha256=GvLMLsVhcSEzRTgkvnPISPEBN71suW2xXI0hUaUZPTo,378
|
|
|
12
12
|
rubka/keyboards.py,sha256=7nr-dT2bQJVQnQ6RMWPTSjML6EEk6dsBx-4d8pab8xk,488
|
|
13
13
|
rubka/keypad.py,sha256=yGsNt8W5HtUFBzVF1m_p7GySlu1hwIcSvXZ4BTdrlvg,9558
|
|
14
14
|
rubka/logger.py,sha256=J2I6NiK1z32lrAzC4H1Et6WPMBXxXGCVUsW4jgcAofs,289
|
|
15
|
-
rubka/rubino.py,sha256=
|
|
15
|
+
rubka/rubino.py,sha256=hejkavxd9lmQMI_f8cNjGpGEHSobCzfTLHousWEHjA8,61128
|
|
16
16
|
rubka/tv.py,sha256=rBoyCadCH3I3YqQGrQYv_dLtTg1I63AzVf1orn-hbko,5724
|
|
17
17
|
rubka/update.py,sha256=-oC9h7U_H3CrtqUCDCnFXAvC7zdSmwxlc0CNwL1XLxM,34314
|
|
18
18
|
rubka/utils.py,sha256=XUQUZxQt9J2f0X5hmAH_MH1kibTAfdT1T4AaBkBhBBs,148
|
|
@@ -37,8 +37,8 @@ rubka/adaptorrubka/types/socket/message.py,sha256=0WgLMZh4eow8Zn7AiSX4C3GZjQTkIg
|
|
|
37
37
|
rubka/adaptorrubka/utils/__init__.py,sha256=OgCFkXdNFh379quNwIVOAWY2NP5cIOxU5gDRRALTk4o,54
|
|
38
38
|
rubka/adaptorrubka/utils/configs.py,sha256=nMUEOJh1NqDJsf9W9PurkN_DLYjO6kKPMm923i4Jj_A,492
|
|
39
39
|
rubka/adaptorrubka/utils/utils.py,sha256=5-LioLNYX_TIbQGDeT50j7Sg9nAWH2LJUUs-iEXpsUY,8816
|
|
40
|
-
rubka-7.1.
|
|
41
|
-
rubka-7.1.
|
|
42
|
-
rubka-7.1.
|
|
43
|
-
rubka-7.1.
|
|
44
|
-
rubka-7.1.
|
|
40
|
+
rubka-7.1.6.dist-info/METADATA,sha256=ot_eijQARS-ukqO0VI3JaQOGWuSZIEyDWjSDfUrcnq0,34667
|
|
41
|
+
rubka-7.1.6.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
42
|
+
rubka-7.1.6.dist-info/entry_points.txt,sha256=4aESuUmuUOALMUy7Kucv_Gb5YlqhsJmTmdXLlZU9sJ0,46
|
|
43
|
+
rubka-7.1.6.dist-info/top_level.txt,sha256=vy2A4lot11cRMdQS-F4HDCIXL3JK8RKfu7HMDkezJW4,6
|
|
44
|
+
rubka-7.1.6.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|