Spaces:
Paused
Paused
| import base64 | |
| import re | |
| import asyncio | |
| from pyrogram import filters | |
| from pyrogram.enums import ChatMemberStatus | |
| from config import FORCE_SUB_CHANNEL, ADMINS | |
| from pyrogram.errors.exceptions.bad_request_400 import UserNotParticipant | |
| from pyrogram.errors import FloodWait | |
| async def is_subscribed(filter, client, update): | |
| if not FORCE_SUB_CHANNEL: | |
| return True | |
| user_id = update.from_user.id | |
| if user_id in ADMINS: | |
| return True | |
| try: | |
| member = await client.get_chat_member(chat_id = FORCE_SUB_CHANNEL, user_id = user_id) | |
| except UserNotParticipant: | |
| return False | |
| if not member.status in [ChatMemberStatus.OWNER, ChatMemberStatus.ADMINISTRATOR, ChatMemberStatus.MEMBER]: | |
| return False | |
| else: | |
| return True | |
| async def encode(string): | |
| string_bytes = string.encode("ascii") | |
| base64_bytes = base64.urlsafe_b64encode(string_bytes) | |
| base64_string = (base64_bytes.decode("ascii")).strip("=") | |
| return base64_string | |
| async def decode(base64_string): | |
| base64_string = base64_string.strip("=") # links generated before this commit will be having = sign, hence striping them to handle padding errors. | |
| base64_bytes = (base64_string + "=" * (-len(base64_string) % 4)).encode("ascii") | |
| string_bytes = base64.urlsafe_b64decode(base64_bytes) | |
| string = string_bytes.decode("ascii") | |
| return string | |
| async def get_messages(client, message_ids): | |
| messages = [] | |
| total_messages = 0 | |
| while total_messages != len(message_ids): | |
| temb_ids = message_ids[total_messages:total_messages+200] | |
| try: | |
| msgs = await client.get_messages( | |
| chat_id=client.db_channel.id, | |
| message_ids=temb_ids | |
| ) | |
| except FloodWait as e: | |
| await asyncio.sleep(e.x) | |
| msgs = await client.get_messages( | |
| chat_id=client.db_channel.id, | |
| message_ids=temb_ids | |
| ) | |
| except: | |
| pass | |
| total_messages += len(temb_ids) | |
| messages.extend(msgs) | |
| return messages | |
| async def get_message_id(client, message): | |
| if message.forward_from_chat: | |
| if message.forward_from_chat.id == client.db_channel.id: | |
| return message.forward_from_message_id | |
| else: | |
| return 0 | |
| elif message.forward_sender_name: | |
| return 0 | |
| elif message.text: | |
| pattern = "https://t.me/(?:c/)?(.*)/(\d+)" | |
| matches = re.match(pattern,message.text) | |
| if not matches: | |
| return 0 | |
| channel_id = matches.group(1) | |
| msg_id = int(matches.group(2)) | |
| if channel_id.isdigit(): | |
| if f"-100{channel_id}" == str(client.db_channel.id): | |
| return msg_id | |
| else: | |
| if channel_id == client.db_channel.username: | |
| return msg_id | |
| else: | |
| return 0 | |
| def get_readable_time(seconds: int) -> str: | |
| count = 0 | |
| up_time = "" | |
| time_list = [] | |
| time_suffix_list = ["s", "m", "h", "days"] | |
| while count < 4: | |
| count += 1 | |
| remainder, result = divmod(seconds, 60) if count < 3 else divmod(seconds, 24) | |
| if seconds == 0 and remainder == 0: | |
| break | |
| time_list.append(int(result)) | |
| seconds = int(remainder) | |
| hmm = len(time_list) | |
| for x in range(hmm): | |
| time_list[x] = str(time_list[x]) + time_suffix_list[x] | |
| if len(time_list) == 4: | |
| up_time += f"{time_list.pop()}, " | |
| time_list.reverse() | |
| up_time += ":".join(time_list) | |
| return up_time | |
| subscribed = filters.create(is_subscribed) | |
| # Jishu Developer | |
| # Don't Remove Credit 🥺 | |
| # Telegram Channel @Madflix_Bots | |
| # Backup Channel @JishuBotz | |
| # Developer @JishuDeveloper | |