async def ft(event): if event.is_private: return await event.reply("This command is made to be used in group chats, not in pm!") fedowner = sql.get_user_owner_fed_full(event.sender_id) if not fedowner: return await event.reply("You don't have a fed to transfer!") for f in fedowner: fed_id = f["fed_id"] name = f["fed"]["fname"] user = await suck(event) user_id = user.id if user_id == BOT_ID: return await event.reply("Yeah I don't use Feds!") if user.bot: return await event.reply("Bots can't own federations.") fedora = sql.get_user_owner_fed_full(user_id) try: replied_user = await tbot(GetFullUserRequest(user)) fname = replied_user.user.first_name except: fname = "User" if user_id == event.sender_id: return await event.reply("You can only transfer your fed to others!") if fedora: return await event.reply(f"[{fname}](tg://user?id={user_id}) already owns a federation - they can't own another.") getuser = sql.search_user_in_fed(fed_id, user_id) if not getuser: return await event.reply(f"[{fname}](tg://user?id={user_id}) isn't an admin in {name} -you can only give your fed to other admins.") mk = f"{user_id}|{event.sender_id}" km = f"{user_id}|{event.sender_id}" text = f"[{fname}](tg://user?id={user_id}), please confirm you would like to receive fed {name} (`{fed_id}`) from [{event.sender.first_name}](tg://user?id={event.sender_id})" buttons = [Button.inline('Accept', data="fkxd_{}".format(mk)),Button.inline('Decline', data="smewxy_{}".format(km))] await tbot.send_message(event.chat_id, text, buttons=buttons)
async def log(event): chat = event.chat_id if not is_admin(event, event.sender_id): return await event.reply("You need to be an admin to do this") args = event.pattern_match.group(1) if not args: fedowner = sql.get_user_owner_fed_full(event.sender_id) if not fedowner: return await event.reply( "Only fed creators can set a fed log - but you don't have a federation!" ) for f in fedowner: args = "{}".format(f["fed_id"]) name = f["fed"]["fname"] else: if len(args) < 8: return await event.reply("This isn't a valid FedID format!") getfed = sql.search_fed_by_id(args) name = getfed["fname"] if not getfed: return await event.reply( "This FedID does not refer to an existing federation.") setlog = sql.set_fed_log(args, chat) await event.reply( f"This has been set as the fed log for {name} - all fed related actions will be logged here." )
async def unsub(event): args = event.pattern_match.group(1) fedowner = sql.get_user_owner_fed_full(event.sender_id) if not fedowner: return await event.reply( "Only federation creators can unsubscribe from a fed. But you don't have a federation!" ) for f in fedowner: fed_id = f["fed_id"] name = f["fed"]["fname"] if not args: return await event.reply( "You need to specify which federation you're asking about by giving me a FedID!" ) if len(args) < 8: return await event.reply("This isn't a valid FedID format!") getfed = sql.search_fed_by_id(args) if not getfed: return await event.reply( "This FedID does not refer to an existing federation.") sname = getfed["fname"] remsub = sql.rem_sub(fed_id, args) unsubfed = sql.unsubs_fed(args, fed_id) await event.reply( f"Federation {name} is no longer subscribed to {sname}. Bans in {sname} will no longer be applied.\nPlease note that any bans that happened because the user was banned from the subfed will need to be removed manually." )
async def fd(event): if event.is_private: return await event.reply( "This command is made to be run in a group where the person you would like to promote is present." ) fedowner = sql.get_user_owner_fed_full(event.sender_id) if not fedowner: return await event.reply( "Only federation creators can promote people, and you don't seem to have a federation to promote to!" ) args = await get_user_from_event(event) if not args: return await event.reply( "I don't know who you're talking about, you're going to need to specify a user...!" ) chat = event.chat for f in fedowner: fed_id = f["fed_id"] name = f["fed"]["fname"] user_id = args.id if sql.search_user_in_fed(fed_id, user_id) is False: return await event.reply( f"This person isn't a federation admin for '{name} ', how could I demote them?" ) replied_user = await tbot(GetFullUserRequest(user_id)) fname = replied_user.user.first_name sql.user_demote_fed(fed_id, user_id) return await event.reply( f"User [{fname}](tg://user?id={user_id}) is no longer an admin of {name} ({fed_id})" )
async def sk(event): if not event.is_private: return await event.reply("This command is made to be used in PM.") fedowner = sql.get_user_owner_fed_full(event.sender_id) if fedowner: try: for f in fedowner: name = f["fed"]["fname"] fed_id = f["fed_id"] text = f"You are the **owner** of the following federation:\n`{fed_id}`: {name}" o = sql.get_user_admin_fed_full(event.sender_id) if not len(o) == 0: list = "\nYou are **admin** in the following federations:" else: list = "" for q in o: fname = q["fed"]["fname"] fid = q["fed_id"] list += f"\n-`{fid}`:{fname}" if len(o) < 10: txt = f"{text}\n{list}" await event.reply(txt) if len(o) > 10: text += f"\n\nLooks like {event.sender.first_name} is admin in quite a lot of federations; I'll have to make a file to list them all." buttons = [Button.inline("Make the fedadmin file", data="fadmin")] await event.reply(text, buttons=buttons) except Exception as e: await event.reply(f"{e}")
async def new(event): if not event.is_private: return await event.reply( "Create your federation in my PM - not in a group.") name = event.pattern_match.group(1) fedowner = sql.get_user_owner_fed_full(event.sender_id) if fedowner: for f in fedowner: text = "{}".format(f["fed"]["fname"]) return await event.reply( f"You already have a federation called `{text}` ; you can't create another. If you would like to rename it, use /renamefed." ) if not name: return await event.reply( "You need to give your federation a name! Federation names can be up to 64 characters long." ) if len(name) > 64: return await event.reply( "Federation names can only be upto 64 charactors long.") fed_id = str(uuid.uuid4()) fed_name = name x = sql.new_fed(event.sender_id, fed_name, fed_id) return await event.reply( f"Created new federation with FedID: `{fed_id}`.\nUse this ID to join the federation! eg:\n`/joinfed {fed_id}`" )
async def sub(event): args = event.pattern_match.group(1) fedowner = sql.get_user_owner_fed_full(event.sender_id) if not fedowner: return await event.reply("Only federation creators can subscribe to a fed. But you don't have a federation!") for f in fedowner: fed_id = f["fed_id"] name = f["fed"]["fname"] if not args: return await event.reply("You need to specify which federation you're asking about by giving me a FedID!") if len(args) < 8: return await event.reply("This isn't a valid FedID format!") getfed = sql.search_fed_by_id(args) if not getfed: return await event.reply("This FedID does not refer to an existing federation.") sname = getfed["fname"] if args == fed_id: return await event.reply("... What's the point in subscribing a fed to itself?") try: subs = sql.MYFEDS_SUBSCRIBER except: subs = [] if len(subs) >= 5: return await event.reply("You can subscribe to at most 5 federations. Please unsubscribe from other federations before adding more.") subfed = sql.subs_fed(args, fed_id) addsub = sql.add_sub(fed_id, args) await event.reply(f"Federation {name} has now subscribed to {sname}. All fedbans in {sname} will now take effect in both feds.")
async def info(event): if not event.is_private: if not await is_admin(event, event.sender_id): return await event.reply( "This command can only be used in private.") input = event.pattern_match.group(1) fedowner = sql.get_user_owner_fed_full(event.sender_id) if not input: if not fedowner: return await event.reply( "You need to give me a FedID to check, or be a federation creator to use this command!" ) if input: fed_id = input info = sql.get_fed_info(fed_id) if not info: return await event.reply("There is no federation with this FedID.") name = info["fname"] elif fedowner: for f in fedowner: fed_id = f["fed_id"] name = f["fed"]["fname"] info = sql.get_fed_info(fed_id) if info: owner = int(info["owner"]) getfban = sql.get_all_fban_users(fed_id) getfchat = sql.all_fed_chats(fed_id) FEDADMIN = sql.all_fed_users(fed_id) TotalAdminFed = len(FEDADMIN) caption = "Fed info:\n" caption += f"FedID: `{fed_id}`\n" caption += f"Name: {name}\n" caption += f"Creator: [this person](tg://user?id={owner}) (`{owner}`)\n" caption += f"Number of admins: `{TotalAdminFed}`\n" caption += f"Number of bans: `{len(getfban)}`\n" caption += f"Number of connected chats: `{len(getfchat)}`\n" try: subs = sql.get_subscriber(fed_id) except: subs = [] caption += f"Number of subscribed feds: `{len(subs)}`" try: getmy = sql.get_mysubs(fed_id) except: getmy = [] if len(getmy) == 0: caption += "\n\nThis federation is not subscribed to any other feds." else: caption += "\n\nSubscribed to the following feds:" for x in getmy: nfo = sql.get_fed_info(x) nme = nfo["fname"] caption += f"\n- {nme} (`{x}`)" buttons = Button.inline("Check Fed Admins", data="fedadm_{}".format(fed_id)) await tbot.send_message(event.chat_id, caption, buttons=buttons)
async def ligunset(event): chat = event.chat_id fedowner = sql.get_user_owner_fed_full(event.sender_id) if not fedowner: return await event.reply("Only fed creators can unset a fed log - but you don't have a federation!") for f in fedowner: args = f["fed_id"] name = f["fed"]["fname"] setlog = sql.set_fed_log(args, None) await event.reply(f"The {name} federation has had its log location unset.")
async def p(event): if event.is_private: return await event.reply( "This command is made to be run in a group where the person you would like to promote is present." ) fedowner = sql.get_user_owner_fed_full(event.sender_id) if not fedowner: return await event.reply( "Only federation creators can promote people, and you don't seem to have a federation to promote to!" ) args = await get_user_from_event(event) if not args: return await event.reply( "I don't know who you're talking about, you're going to need to specify a user...!" ) chat = event.chat for f in fedowner: fed_id = f["fed_id"] name = f["fed"]["fname"] user_id = args.id fban, fbanreason, fbantime = sql.get_fban_user(fed_id, int(args.id)) replied_user = await tbot(GetFullUserRequest(user_id)) fname = replied_user.user.first_name if fban: if fbanreason != '': return await event.reply( f"User {fname} is fbanned in {name}. You should unfban them before promoting.\n\nReason:\n{fbanreason}" ) else: return await event.reply( f"User {fname} is fbanned in {name}. You should unfban them before promoting." ) getuser = sql.search_user_in_fed(fed_id, user_id) if getuser: return await event.reply( f"[{fname}](tg://user?id={args.id}) is already an admin in {name}!" ) try: cdata = f"{user_id}|{event.sender_id}" await tbot.send_message( event.chat_id, f"Please get [{fname}](tg://user?id={args.id}) to confirm that they would like to be fed admin for {name}", buttons=[ Button.inline("Confirm", data="fkfed_{}".format(cdata)), Button.inline("Cancel", data="smex_{}".format(cdata)), ], ) except Exception as e: print(e)
async def cgname(event): if not event.is_private: return await event.reply("You can only rename your fed in PM.") user_id = event.sender_id newname = event.pattern_match.group(1) fedowner = sql.get_user_owner_fed_full(event.sender_id) if not fedowner: return await event.reply("It doesn't look like you have a federation yet!") if not newname: return await event.reply("You need to give your federation a new name! Federation names can be up to 64 characters long.") for f in fedowner: fed_id = f["fed_id"] name = f["fed"]["fname"] sql.rename_fed(fed_id, user_id, newname) return await event.reply(f"Tada! I've renamed your federation from '{name}' to '{newname}'. [FedID: `{fed_id}`].")
async def smexy(event): if not event.is_private: return await event.reply("Delete your federation in my PM - not in a group.") fedowner = sql.get_user_owner_fed_full(event.sender_id) if not fedowner: return await event.reply("It doesn't look like you have a federation yet!") for f in fedowner: fed_id = "{}".format(f["fed_id"]) name = f["fed"]["fname"] await tbot.send_message( event.chat_id, "Are you sure you want to delete your federation? This action cannot be undone - you will lose your entire ban list, and '{}' will be permanently gone.".format(name), buttons=[ [Button.inline("Delete Federation", data="rmfed_{}".format(fed_id))], [Button.inline("Cancel", data="nada")], ], )
async def smex_fed(event): tata = event.pattern_match.group(1) data = tata.decode() input = data.split("_", 1)[1] user, owner= input.split("|") user = user.strip() owner = owner.strip() fedowner = sql.get_user_owner_fed_full(int(owner)) for f in fedowner: fed_id = f["fed_id"] name = f["fed"]["fname"] rt = await tbot(GetFullUserRequest(int(user))) fname = rt.user.first_name if not event.sender_id == int(user): return await event.answer("You are not the user being fpromoted") res = sql.user_join_fed(fed_id, int(user)) if res: return await event.edit(f"User [{fname}](tg://user?id={user}) is now an admin of {name} [`{fed_id}`]")
async def fex(event): if event.is_group: fed_id = sql.get_fed_id(event.chat_id) if not fed_id: return await event.reply("This chat isn't in any federations.") else: if is_user_fed_owner(fed_id, int(event.sender_id)) is False: return await event.reply("Only the fed creator can export the ban list.") else: fedowner = sql.get_user_owner_fed_full(event.sender_id) if not fedowner: return await event.reply("It doesn't look like you have a federation yet!") for f in fedowner: fed_id = f["fed_id"] info = sql.get_fed_info(fed_id) name = info["fname"] getfban = sql.get_all_fban_users(fed_id) if len(getfban) == 0: return await event.reply(f"There are no banned users in {name}") backups = "" try: for users in getfban: getuserinfo = sql.get_all_fban_users_target(fed_id, users) json_parser = { "user_id": users, "first_name": getuserinfo["first_name"], "last_name": getuserinfo["last_name"], "user_name": getuserinfo["user_name"], "reason": getuserinfo["reason"], } backups += json.dumps(json_parser) backups += "\n" with BytesIO(str.encode(backups)) as output: output.name = "fbanned_users.csv" await tbot.send_file( event.chat_id, file=output, filename="fbanned_users.json", caption="Fbanned users in \n** {}**.".format( info["fname"] ), ) except Exception as e: print(e)
async def smex_fed(event): chat = event.chat_id tata = event.pattern_match.group(1) data = tata.decode() input = data.split("_", 1)[1] user, owner= input.split("|") user = user.strip() cname = owner.strip() fedowner = sql.get_user_owner_fed_full(int(cname)) for f in fedowner: fed_id = f["fed_id"] name = f["fed"]["fname"] rt = await tbot(GetFullUserRequest(int(user))) tr = await tbot(GetFullUserRequest(int(cname))) fname = rt.user.first_name dname = tr.user.first_name if not event.sender_id == int(user): return await event.answer("This action is not intended for you!.") res = sql.tr_fed(fed_id, int(user)) if not res: return await event.edit("Fed transfer failed!") if res: ses = sql.user_join_fed(fed_id, int(cname)) sql.user_demote_fed(fed_id, int(user)) text = f"Congratulations! Federation {name} ({fed_id}) has successfully been transferred from [{dname}](tg://user?id={cname}) to [{fname}](tg://user?id={user})" await event.edit(text, buttons=None) sxa = "**Fed Transfer**\n" sxa += f"**Fed:** {name}\n" sxa += f"**New Fed Owner:** [{fname}](tg://user?id={user}) - `{user}`\n" sxa += f"**Old Fed Owner:** [{dname}](tg://user?id={cname}) - `{cname}`\n" sxa += f"\n[{fname}](tg://user?id={user}) is now the fed owner. They can promote/demote admins as they like." getfednotif = sql.user_feds_report(int(user)) await tbot.send_message(event.chat_id, sxa) if getfednotif: if int(info["owner"]) != int(chat): await tbot.send_message( int(info["owner"]), sxa) get_fedlog = sql.get_fed_log(fed_id) if get_fedlog: if int(get_fedlog) != int(chat): await tbot.send_message( int(get_fedlog), sxa)
async def unfban(event): user = event.sender chat = event.chat_id if event.is_group: fed_id = sql.get_fed_id(chat) if not fed_id: return await event.reply("This chat isn't in any federations.") else: fedowner = sql.get_user_owner_fed_full(event.sender_id) if not fedowner: return await event.reply("It doesn't look like you have a federation yet!") for f in fedowner: fed_id = "{}".format(f["fed_id"]) info = sql.get_fed_info(fed_id) name = info["fname"] if is_user_fed_admin(fed_id, user.id) is False: return await event.reply(f"You aren't a federation admin for {name}!") input = event.pattern_match.group(2) if input: arg = input.split(" ", 1) if not event.reply_to_msg_id: if len(arg) == 2: iid = arg[0] reason = arg[1] else: iid = arg[0] reason = None if not iid.isnumeric(): entity = await tbot.get_input_entity(iid) try: r_sender_id = entity.user_id except Exception: await event.reply("Couldn't fetch that user.") return else: r_sender_id = int(iid) try: replied_user = await tbot(GetFullUserRequest(r_sender_id)) fname = replied_user.user.first_name username = replied_user.user.username lname = replied_user.user.last_name except Exception: fname = "User" username = None lname = None else: reply_message = await event.get_reply_message() iid = reply_message.sender_id fname = reply_message.sender.first_name lname = reply_message.sender.last_name username = reply_message.sender.username if input: reason = input else: reason = None r_sender_id = iid if r_sender_id == BOT_ID or r_sender_id == OWNER_ID: return await event.reply("Oh you're a funny one aren't you! How do you think I would have fbanned myself hm?.") name = info["fname"] fban_user_id = int(r_sender_id) fban_user_name = fname fban_user_lname = lname fban_user_uname = username fban, fbanreason, fbantime = sql.get_fban_user(fed_id, int(r_sender_id)) if not fban: return await event.reply(f"This user isn't banned in the current federation, {name}. [{fed_id}]") temp = sql.un_fban_user(fed_id, fban_user_id) if temp: sxa = "**New un-FedBan**\n" sxa += f"**Fed:** {name}\n" sxa += f"**FedAdmin:** [{event.sender.first_name}](tg://user?id={event.sender_id})\n" sxa += f"**User:** [{fname}](tg://user?id={r_sender_id})\n" sxa += f"**User ID:** `{r_sender_id}`\n" if reason: sxa += f"**Reason:** {reason}" await tbot.send_message( event.chat_id, sxa) getfednotif = sql.user_feds_report(info["owner"]) if getfednotif: if int(info["owner"]) != int(chat): await tbot.send_message( int(info["owner"]), sxa) get_fedlog = sql.get_fed_log(fed_id) if get_fedlog: if int(get_fedlog) != int(chat): await tbot.send_message( int(get_fedlog), sxa)
async def _(event): user = event.sender chat = event.chat_id if event.is_group: fed_id = sql.get_fed_id(chat) if not fed_id: return await event.reply("This chat isn't in any federations.") else: fedowner = sql.get_user_owner_fed_full(event.sender_id) if not fedowner: return await event.reply("It doesn't look like you have a federation yet!") for f in fedowner: fed_id = "{}".format(f["fed_id"]) info = sql.get_fed_info(fed_id) name = info["fname"] if is_user_fed_admin(fed_id, user.id) is False: return await event.reply(f"You aren't a federation admin for {name}!") pop = event.pattern_match.group(1) if not event.reply_to_msg_id: if not pop: return await event.reply("I don't know who you're talking about, you're going to need to specify a user...!") if not event.reply_to_msg_id: art = event.pattern_match.group(1) if art: arg = art.split(" ", 1) if len(arg) == 2: iid = arg[0] reason = arg[1] else: iid = arg[0] reason = None input = reason if reason and len(input) > 1024: reason = reason[:1024] else: reason = reason if not iid.isnumeric(): entity = await tbot.get_input_entity(iid) try: r_sender_id = entity.user_id except Exception: await event.reply("I don't know who you're talking about, you're going to need to specify a user...!") return else: r_sender_id = int(iid) try: replied_user = await tbot(GetFullUserRequest(r_sender_id)) fname = replied_user.user.first_name username = replied_user.user.username lname = replied_user.user.last_name except Exception: fname = f"user(`{r_sender_id}`)" username = None lname = None else: input = event.pattern_match.group(1) reply_message = await event.get_reply_message() iid = reply_message.sender_id fname = reply_message.sender.first_name lname = reply_message.sender.last_name username = reply_message.sender.username if input: if len(input) > 1024: reason = input[:1024] else: reason = input else: reason = None r_sender_id = iid if r_sender_id == BOT_ID or r_sender_id == OWNER_ID: return await event.reply("Oh you're a funny one aren't you! I am _not_ going to fedban myself.") name = info["fname"] if is_user_fed_owner(fed_id, int(r_sender_id)) is True: return await event.reply(f"I'm not banning the fed owner from their own fed! [{name}]") if is_user_fed_admin(fed_id, int(r_sender_id)) is True: return await event.reply(f"I'm not banning a fed admin from their own fed! [{name}]") fban_user_id = int(r_sender_id) fban_user_name = fname fban_user_lname = lname fban_user_uname = username fban, fbanreason, fbantime = sql.get_fban_user(fed_id, int(r_sender_id)) if fban: if fbanreason == '' and reason == None: return await event.reply(f'User [{fname}](tg://)/user?id={r_sender_id}) is already banned in {name}. There is no reason set for their fedban yet, so feel free to set one.') if reason == fbanreason: return await event.reply(f'User [{fname}](tg://user?id={r_sender_id}) has already been fbanned, with the exact same reason.') if reason == None: if fbanreason == '': return await event.reply(f'User [{fname}](tg://user?id={r_sender_id}) is already banned in {name}.') else: return await event.reply(f'User [{fname}](tg://user?id={r_sender_id}) is already banned in {name}, with reason:\n`{fbanreason}`.') if not fban: current_datetime = datetime.now(pytz.timezone("Asia/Kolkata")) kuk = f"{current_datetime}" mal = kuk[:10] rec = mal.replace("-", "") x = sql.fban_user( fed_id, fban_user_id, fban_user_name, fban_user_lname, fban_user_uname, reason, int(rec), ) if input and len(input) >= 1024: shrunk = "\n\nNote: The fban reason was over 1024 characters, so has been truncated." else: shrunk = '' if reason == None: reason = 'None given.' sax = "**New FedBan**\n" sax += f"**Fed:** {name}\n" sax += f"**FedAdmin:** [{event.sender.first_name}](tg://user?id={event.sender_id})\n" sax += f"**User:** [{fname}](tg://user?id={r_sender_id})\n" sax += f"**User ID:** `{r_sender_id}`\n" sax += f"**Reason:** {reason}{shrunk}" else: if input and len(input) >= 1024: shrunk = "\n\nNote: The fban reason was over 1024 characters, so has been truncated." else: shrunk = '' current_datetime = datetime.now(pytz.timezone("Asia/Kolkata")) kuk = f"{current_datetime}" mal = kuk[:10] rec = mal.replace("-", "") fed_name = info["fname"] temp = sql.un_fban_user(fed_id, fban_user_id) if not temp: await event.reply("Failed to update the reason for fedban!") return x = sql.fban_user( fed_id, fban_user_id, fban_user_name, fban_user_lname, fban_user_uname, reason, int(rec), ) if reason == None: reason = 'None given.' sax = "**FedBan Reason Update**\n" sax += f"**Fed:** {name}\n" sax += f"**FedAdmin:** [{event.sender.first_name}](tg://user?id={event.sender_id})\n" sax += f"**User:** [{fname}](tg://user?id={r_sender_id})\n" sax += f"**User ID:** `{r_sender_id}`\n" if not fbanreason == '': sax += f"**Previous Reason:** {fbanreason}\n" sax += f"**New Reason:** {reason}{shrunk}" await tbot.send_message( event.chat_id, sax) getfednotif = sql.user_feds_report(info["owner"]) if getfednotif: if int(info["owner"]) != int(chat): await tbot.send_message( int(info["owner"]), sax) get_fedlog = sql.get_fed_log(fed_id) if get_fedlog: if int(get_fedlog) != int(chat): await tbot.send_message( int(get_fedlog), sax) fed_chats = list(sql.all_fed_chats(fed_id)) if len(fed_chats) != 0: for fedschat in fed_chats: try: await tbot( EditBannedRequest(int(fedschat), int(fban_user_id), BANNED_RIGHTS) ) except Exception: pass subscriber = list(sql.get_subscriber(fed_id)) if len(subscriber) != 0: for fedsid in subscriber: x = sql.fban_user( fedsid, fban_user_id, fban_user_name, fban_user_lname, fban_user_uname, reason, int(rec), ) all_fedschat = sql.all_fed_chats(fedsid) for fedschat in all_fedschat: try: await tbot( EditBannedRequest(int(fedschat), int(fban_user_id), BANNED_RIGHTS) ) except Exception: continue