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