def clear(ctx): if not functions.has_permission(ctx): return handler.error_handler(ctx, "nopermission", ctx.command) try: ctx.args[0] = int(ctx.args[0]) + 1 except: return handler.error_handler(ctx, "arguments", "clear (ilość wiadomości 1-99) [osoba]") if not len(ctx.args) <= 1 and int(ctx.args[0]) > 100: return handler.error_handler(ctx, "arguments", "clear (ilość wiadomości 1-99) [osoba]") messages = list(map(lambda x: x["id"], discord.get_messages(ctx.data["channel_id"], ctx.args[0]))) if len(ctx.data["mentions"]) == 1: x = [] ctx.args[0] = int(ctx.args[0]) - 1 for message in messages: message = discord.get_message(ctx.data["channel_id"], message) if "author" in message and message["author"]["id"] == ctx.data["mentions"][0]["id"]: x.append(message["id"]) messages = x message = f"Usunięto `{ctx.args[0]}` wiadomości użytkownika `{ctx.data['mentions'][0]['username']}`" else: message = f"Usunięto `{ctx.args[0]}` wiadomości" bulk_delete = discord.bulk_delete_messages(ctx.data["channel_id"], { "messages": messages }) if not bulk_delete.status_code == 204: return handler.error_handler(ctx, 8) ctx.send(message)
def encode(ctx): if not functions.has_permission(ctx): return handler.error_handler(ctx, "nopermission", ctx.command) ctx.args = " ".join(ctx.args).lower().split(" | ") if not len(ctx.args) == 2: return handler.error_handler( ctx, "arguments", "encode (tekst wyświetlany) | (tekst ukryty)") text = ctx.args[0][0] other = { "ą": "a", "ś": "s", "ó": "o", "ł": "l", "ę": "e", "ń": "n", "ź": "z", "ż": "z", "ć": "c" } for char in ctx.args[1]: if char in other: ctx.args[1] = ctx.args[1].replace(char, other[char]) for char in ctx.args[1]: if char in arrays._characters: text += arrays._characters[char] + "\u200f" text += ctx.args[0][1:] ctx.send("`" + text + "`")
def decode(ctx): if not functions.has_permission(ctx): return handler.error_handler(ctx, "nopermission", ctx.command) ctx.args = " ".join(ctx.args) if not ctx.args: return handler.error_handler( ctx, "arguments", "encode (tekst wyświetlany) | (tekst ukryty)") text = "" letter = "" chars = {value: key for key, value in arrays._characters.items()} for char in ctx.args: if char in chars or char == "\u200f": if char == "\u200f": text += chars[letter] letter = "" else: letter += char if not text: return ctx.send("W tej wiadomości nie ma ukrytego tekstu") ctx.send("`" + text + "`")
def gay(ctx): if not functions.has_permission(ctx): return handler.error_handler(ctx, "nopermission", ctx.command) if not ctx.data["mentions"]: user = ctx.data["author"]["id"], ctx.data["author"]["avatar"] else: user = ctx.data["mentions"][0]["id"], ctx.data["mentions"][0][ "avatar"] content = ctx.requests.get( f"https://cdn.discordapp.com/avatars/{user[0]}/{user[1]}.png?size=2048" ).content open("images/image.png", "wb").write(content) image = Image.open("images/image.png").convert("RGBA") lgbt = Image.open("images/lgbt.png").convert("RGBA") image = ImageOps.fit(image, (512, 512)) lgbt = ImageOps.fit(lgbt, (512, 512)) mask = Image.new("L", (512, 512), 128) avatar = Image.composite(image, lgbt, mask) avatar.save("images/gay.png") ctx.send(files=[("gay.png", open("images/gay.png", "rb"))])
def _ascii(ctx): if not functions.has_permission(ctx): return handler.error_handler(ctx, "nopermission", ctx.command) if not ctx.args: return handler.error_handler(ctx, "arguments", "ascii (tekst)") ctx.send("```" + pyfiglet.Figlet().renderText(" ".join(ctx.args)) + "```")
def panda(ctx): if not functions.has_permission(ctx): return handler.error_handler(ctx, "nopermission", ctx.command) image_url = ctx.requests.get( "https://some-random-api.ml/img/panda").json()["link"] image = ctx.requests.get(image_url).content ctx.send(files=[("panda.png", image)])
def howgay(ctx): if not functions.has_permission(ctx): return handler.error_handler(ctx, "nopermission", ctx.command) if not ctx.data["mentions"]: user = ctx.data["author"]["username"] else: user = ctx.data["mentions"][0]["username"] ctx.send(f"{user} jest gejem w {random.randint(0, 100)}%!")
def rnumber(ctx): if not functions.has_permission(ctx): return handler.error_handler(ctx, "nopermission", ctx.command) if not len(ctx.args) == 2: return handler.error_handler(ctx, "arguments", "rnumber (od) (do)") ctx.args = list(map(lambda x: int(x), ctx.args)) ctx.send(random.randint(ctx.args[0], ctx.args[1]))
def meme(ctx): if not functions.has_permission(ctx): return handler.error_handler(ctx, "nopermission", ctx.command) channel = discord.get_channel(ctx.data["channel_id"]) if not channel["nsfw"]: return handler.error_handler(ctx, "nsfw") url = ctx.requests.get("https://cenzurabot.pl/api/memes/jbzd").json() ctx.send(url["meme"])
def servericon(ctx): if not functions.has_permission(ctx): return handler.error_handler(ctx, "nopermission", ctx.command) guild = discord.get_guild(ctx.data["guild_id"]) image = ctx.requests.get( f"https://cdn.discordapp.com/icons/{ctx.data['guild_id']}/{guild['icon']}.png?size=2048" ).content ctx.send(files=[("servericon.png", image)])
def serverinfo(ctx): if not functions.has_permission(ctx): return handler.error_handler(ctx, "nopermission", ctx.command) guild = ctx.guilds[ctx.data["guild_id"]] ctx.send(embed = { "title": f"Informacje o {guild['name']}:", "color": 0xe74c3c, "fields": [ { "name": "Właściciel:", "value": f"<@{guild['owner_id']}> ({guild['owner_id']})", "inline": False }, { "name": "ID:", "value": ctx.data["guild_id"], "inline": False }, { "name": "Ilość osób:", "value": guild["member_count"], "inline": False }, { "name": "Ilość kanałów:", "value": len(guild["channels"]), "inline": False }, { "name": "Ilość ról:", "value": len(guild["roles"]), "inline": False }, { "name": "Ilość emotek:", "value": len(guild["emojis"]), "inline": False }, { "name": "Został stworzony:", "value": str(datetime.fromtimestamp(((int(ctx.data["guild_id"]) >> 22) + 1420070400000) / 1000)).split(".")[0], "inline": False }, { "name": "Boosty:", "value": f"{guild['premium_subscription_count']} boosty / {guild['premium_tier']} poziom", "inline": False } ], "thumbnail": { "url": f"https://cdn.discordapp.com/icons/{ctx.data['guild_id']}/{guild['icon']}.png?size=2048" } })
def google(ctx): if not functions.has_permission(ctx): return handler.error_handler(ctx, "nopermission", ctx.command) ctx.args = " ".join(ctx.args) if not ctx.args: return handler.error_handler(ctx, "arguments", "google (zapytanie)") ctx.send( f"https://google.com/search?q={urllib.parse.quote_plus(ctx.args)}")
def rchoice(ctx): if not functions.has_permission(ctx): return handler.error_handler(ctx, "nopermission", ctx.command) ctx.args = " ".join(ctx.args) ctx.args = ctx.args.split(" | ") if not len(ctx.args) >= 2: return handler.error_handler(ctx, "arguments", "rchoice (a) | (b) | [c] itd.") ctx.send(random.choice(ctx.args))
def hug(ctx): if not functions.has_permission(ctx): return handler.error_handler(ctx, "nopermission", ctx.command) if not len(ctx.data["mentions"]) == 1: return handler.error_handler(ctx, "arguments", "hug (osoba)") image_url = ctx.requests.get( "https://nekos.life/api/hug").json()["url"] image = ctx.requests.get(image_url).content ctx.send( f"**{ctx.data['author']['username']}** przytulił **{ctx.data['mentions'][0]['username']}**!", files=[("hug.gif", image)])
def avatar(ctx): if not functions.has_permission(ctx): return handler.error_handler(ctx, "nopermission", ctx.command) if not ctx.data["mentions"]: user = ctx.data["author"]["id"], ctx.data["author"]["avatar"] else: user = ctx.data["mentions"][0]["id"], ctx.data["mentions"][0][ "avatar"] image = ctx.requests.get( f"https://cdn.discordapp.com/avatars/{user[0]}/{user[1]}.png?size=2048" ).content ctx.send(files=[("avatar.png", image)])
def removewarnsevent(ctx): if not functions.has_permission(ctx): return handler.error_handler(ctx, "nopermission", ctx.command) if not len(ctx.args) == 1 or ctx.args[0] not in ["kick", "ban", "mute"]: return handler.error_handler(ctx, "arguments", "warnsevent (kick/ban/mute)") guild = ctx.data["guild_id"] guilds = functions.read_json("guilds") del guilds[guild]["warnsevent"][ctx.args[0]] ctx.send("Usunięto event") functions.write_json("guilds", guilds)
def clearwarns(ctx): if not functions.has_permission(ctx): return handler.error_handler(ctx, "nopermission", ctx.command) if not len(ctx.args) == 1: return handler.error_handler(ctx, "arguments", "clearwarns (osoba)") guild = ctx.data["guild_id"] guilds = functions.read_json("guilds") if not "warns" in guilds[guild] or not ctx.data["mentions"][0]["id"] in guilds[guild]["warns"]: return handler.error_handler(ctx, "notfound") del guilds[guild]["warns"][ctx.data["mentions"][0]["id"]] ctx.send("Wyczyszczono ostrzeżenia") functions.write_json("guilds", guilds)
def removewarn(ctx): if not functions.has_permission(ctx): return handler.error_handler(ctx, "nopermission", ctx.command) if not len(ctx.args) == 2: return handler.error_handler(ctx, "arguments", "removewarn (osoba) (id)") guild = ctx.data["guild_id"] guilds = functions.read_json("guilds") if not "warns" in guilds[guild] or not ctx.data["mentions"][0]["id"] in guilds[guild]["warns"]: return handler.error_handler(ctx, "notfound") del guilds[guild]["warns"][ctx.data["mentions"][0]["id"]][int(ctx.args[1])] ctx.send("Usunięto ostrzeżenie") functions.write_json("guilds", guilds)
def warns(ctx): if not functions.has_permission(ctx): return handler.error_handler(ctx, "nopermission", ctx.command) if not len(ctx.data["mentions"]) == 1: return handler.error_handler(ctx, "arguments", "warns (osoba)") guild = ctx.data["guild_id"] guilds = functions.read_json("guilds") if not "warns" in guilds[guild] or not ctx.data["mentions"][0]["id"] in guilds[guild]["warns"]: return handler.error_handler(ctx, "notfound") ctx.send(embed = { "title": f"Warny użytkownika {ctx.data['mentions'][0]['username']}:", "description": "\n".join([f"{guilds[guild]['warns'][ctx.data['mentions'][0]['id']].index(i)}. {i}" for i in guilds[guild]["warns"][ctx.data["mentions"][0]["id"]]]), "color": 0xe74c3c })
def warnsevent(ctx): if not functions.has_permission(ctx): return handler.error_handler(ctx, "nopermission", ctx.command) if not len(ctx.args) == 2 or ctx.args[0] not in ["kick", "ban", "mute"]: return handler.error_handler(ctx, "arguments", "warnsevent (kick/ban/mute) (ilość warnów)") guild = ctx.data["guild_id"] guilds = functions.read_json("guilds") if not "warnsevent" in guilds[guild]: guilds[guild]["warnsevent"] = {} guilds[guild]["warnsevent"][ctx.args[0]] = str(ctx.args[1]) ctx.send("Dodano event") functions.write_json("guilds", guilds)
def kick(ctx): if not functions.has_permission(ctx): return handler.error_handler(ctx, "nopermission", ctx.command) if not len(ctx.data["mentions"]) == 1: return handler.error_handler(ctx, "arguments", "kick (osoba) [powód]") if len(ctx.args) >= 2: ctx.args = " ".join(ctx.args[1:]) reason = ctx.args else: reason = "nie podano powodu" status = discord.remove_guild_member(ctx.data["guild_id"], ctx.data["mentions"][0]["id"]) if not status.status_code == 204: return handler.error_handler(ctx, 6) ctx.send(f"Wyrzucono użytkownika `{ctx.data['mentions'][0]['username']}` z powodu `{reason}`")
def unmute(ctx): if not functions.has_permission(ctx): return handler.error_handler(ctx, "nopermission", ctx.command) if not len(ctx.args) == 1: return handler.error_handler(ctx, "arguments", "unmute (osoba)") guild = ctx.data["guild_id"] guilds = functions.read_json("guilds") if not "mute_role" in guilds[guild]: return handler.error_handler(ctx, "notfound") status = discord.remove_guild_member_role(guild, ctx.data["mentions"][0]["id"], guilds[guild]["mute_role"]) if not status.status_code == 204: return handler.error_handler(ctx, 6) ctx.send("Odmutowano użytkownika")
def ship(ctx): if not functions.has_permission(ctx): return handler.error_handler(ctx, "nopermission", ctx.command) if len(ctx.data["mentions"]) == 1: me = ctx.data["author"]["id"], ctx.data["author"][ "avatar"], ctx.data["author"]["username"] me_avatar = f"https://cdn.discordapp.com/avatars/{me[0]}/{me[1]}.png?size=2048" m = ctx.data["mentions"][0]["id"], ctx.data["mentions"][0][ "avatar"], ctx.data["mentions"][0]["username"] m_avatar = f"https://cdn.discordapp.com/avatars/{m[0]}/{m[1]}.png?size=2048" elif len(ctx.data["mentions"]) == 2: me = ctx.data["mentions"][1]["id"], ctx.data["mentions"][1][ "avatar"], ctx.data["mentions"][1]["username"] me_avatar = f"https://cdn.discordapp.com/avatars/{me[0]}/{me[1]}.png?size=2048" m = ctx.data["mentions"][0]["id"], ctx.data["mentions"][0][ "avatar"], ctx.data["mentions"][0]["username"] m_avatar = f"https://cdn.discordapp.com/avatars/{m[0]}/{m[1]}.png?size=2048" else: return handler.error_handler(ctx, "arguments", "ship (osoba) [osoba]") open("images/member1.png", "wb").write(ctx.requests.get(m_avatar).content) open("images/member2.png", "wb").write(ctx.requests.get(me_avatar).content) para = Image.open("images/para.png").convert("RGBA") member1 = Image.open("images/member1.png").convert("RGBA") member2 = Image.open("images/member2.png").convert("RGBA") member1 = ImageOps.fit(member1, (300, 300)) member2 = ImageOps.fit(member2, (300, 300)) para.paste(member1, (360, 250), member1) para.paste(member2, (890, 180), member2) para.save("images/ship.png") ctx.send( f"**{m[2]}** + **{me[2]}** = **{m[2][:round(len(m[2]) / 2)].lower()}{me[2][round(len(me[2]) / 2):].lower()}**\nIch miłość jest równa **{random.randint(0, 100)}%**!", files=[("ship.png", open("images/ship.png", "rb"))])
def mute(ctx): if not functions.has_permission(ctx): return handler.error_handler(ctx, "nopermission", ctx.command) if not len(ctx.args) == 1: return handler.error_handler(ctx, "arguments", "mute (osoba)") guild = ctx.data["guild_id"] guilds = functions.read_json("guilds") if not "mute_role" in guilds[guild]: role = discord.create_guild_role(guild, {"name": "muted"}).json() guilds[guild]["mute_role"] = role["id"] channels = discord.get_guild_channels(guild) for channel in channels: if channel["type"] == 0: a = discord.edit_channel_permissions(channel["id"], role["id"], { "deny": permissions.permissions["SEND_MESSAGES"], "allow": permissions.permissions["ADD_REACTIONS"], "type": 0 }) elif channel["type"] == 2: discord.edit_channel_permissions(channel["id"], role["id"], { "deny": permissions.permissions["SPEAK"], "allow": permissions.permissions["VIEW_CHANNEL"], "type": 0 }) functions.write_json("guilds", guilds) status = discord.add_guild_member_role(guild, ctx.data["mentions"][0]["id"], guilds[guild]["mute_role"]) if not status.status_code == 204: return handler.error_handler(ctx, 6) ctx.send("Zmutowano użytkownika")
def garfield(ctx): if not functions.has_permission(ctx): return handler.error_handler(ctx, "nopermission", ctx.command) ctx.args = (" ".join(ctx.args)).lower() if not ctx.args: return handler.error_handler(ctx, "arguments", "garfield (tekst)") elif len(ctx.args) > 100: return handler.error_handler(ctx, "toolongtext", 100) other = { "ą": "a", "ś": "s", "ó": "o", "ł": "l", "ę": "e", "ń": "n", "ź": "z", "ż": "z", "ć": "c" } text = "" for letter in ctx.args: if ("garfield_" + letter in arrays.emotes) or (letter in other): if letter in other: letter = other[letter] letter = "garfield_" + letter text += f"<:{letter}:{arrays.emotes[letter]}>" elif letter in ["`", "\\"]: text += "" elif letter == " ": text += f"<:space:{arrays.emotes[' ']}>" else: text += letter ctx.send(text)
def snipe(ctx): if not functions.has_permission(ctx): return handler.error_handler(ctx, "nopermission", ctx.command) if not hasattr(ctx, "snipe"): return ctx.send("Nie udało sie złapać żadnej usuniętej wiadomości") snipe = ctx.snipe[ctx.data["guild_id"]] if len( ctx.snipe[ctx.data["guild_id"]]) < 10 else [ ctx.snipe[ctx.data["guild_id"]][::-1][_] for _ in range(10) ][::-1] ctx.send( embed={ "title": "Lista ostatnich usuniętych wiadomości:", "description": "\n".join([ f"<#{message['channel_id']}> <@{message['author']['id']}>: {message['content']}" for message in snipe ]), "color": 0xe74c3c })
def achievement(ctx): if not functions.has_permission(ctx): return handler.error_handler(ctx, "nopermission", ctx.command) ctx.args = " ".join(ctx.args) if not ctx.args: return handler.error_handler(ctx, "arguments", "achievement (tekst)") elif len(ctx.args) > 23: return handler.error_handler(ctx, "toolongtext", 23) ctx.args = ctx.args.replace(" ", "+").replace("ś", "s").replace( "ę", "e").replace("ż", "z").replace("ź", "z").replace("ł", "l").replace( "ó", "o").replace("ą", "a").replace("ć", "c").replace( "Ś", "S").replace("Ę", "E").replace("Ż", "Z").replace( "Ź", "Z").replace("Ł", "L").replace("Ó", "O").replace( "Ą", "A").replace("Ć", "C") image = ctx.requests.get( f"https://minecraftskinstealer.com/achievement/{random.randint(1, 40)}/Achievement+Get%21/{ctx.args}" ).content ctx.send(files=[("achievement.png", image)])
def cantseeme(ctx): if not functions.has_permission(ctx): return handler.error_handler(ctx, "nopermission", ctx.command) formats = ("image/png", "image/jpeg", "image/gif", "image/webp") if (len(ctx.data["mentions"]) and len(ctx.args)) == 1: message_type = "image" content = ctx.requests.get( f"https://cdn.discordapp.com/avatars/{ctx.data['mentions'][0]['id']}/{ctx.data['mentions'][0]['avatar']}.png?size=2048" ).content open("images/image.png", "wb").write(content) elif len(ctx.data["attachments"]) == 1: req = ctx.requests.get(ctx.data["attachments"][0]["url"]) message_type = "text" if req.headers["content-type"] in formats: message_type = "image" open("images/image.png", "wb").write(req.content) elif len(ctx.args) == 1 and ctx.args[0].startswith( ("https://", "http://")): req = ctx.requests.get(ctx.args[0]) message_type = "text" if req.headers["content-type"] in formats: message_type = "image" open("images/image.png", "wb").write(req.content) elif len(ctx.args) >= 1: message_type = "text" elif not ctx.args: message_type = "image" content = ctx.requests.get( f"https://cdn.discordapp.com/avatars/{ctx.data['author']['id']}/{ctx.data['author']['avatar']}.png?size=2048" ).content open("images/image.png", "wb").write(content) krzak = Image.open("images/krzak.png") image = Image.open("images/image.png") if message_type == "text": ctx.args = " ".join(ctx.args) center = [ round(krzak.size[0] / 2) - 50, round(krzak.size[1] / 2) - 60 ] if len(ctx.args) > 15: new_args = "" x = 0 for char in ctx.args: if x == 16: new_args += "\n" x = 0 new_args += char x += 1 ctx.args = new_args draw = ImageDraw.Draw(krzak) font = ImageFont.truetype("fonts/arial.ttf", 30) center = (round(center[0]), round(center[1])) draw.text(center, ctx.args, font=font) elif message_type == "image": width, height = image.size if width > 150: width = 150 if height > 100: height = 100 image.thumbnail((width, height)) center = (round(krzak.size[0] / 2) - round(image.size[0] / 2), round(krzak.size[1] / 2) - round(image.size[1] / 2) - 30) krzak.paste(image, center) krzak.save("images/cantseeme.png") ctx.send(files=[("cantseeme.png", open("images/cantseeme.png", "rb"))])
def cmd(ctx): if not functions.has_permission(ctx): return handler.error_handler(ctx, "nopermission", ctx.command)\ guild = ctx.data["guild_id"] guilds = functions.read_json("guilds") if not "cmd" in guilds[guild]: guilds[guild]["cmd"] = {} if not ctx.args: return ctx.send( embed={ "title": "Komendy cmd:", "description": "> `cmd add (komenda) (tekst)`, `cmd remove (komenda)`, `cmd info (komenda)`, `cmd list`", "color": 0xe74c3c, "footer": { "text": "<> = nazwa użytkownika, [] = wzmianka" } }) if ctx.args[0] == "add": if not len(ctx.args) >= 3: return handler.error_handler( ctx, "arguments", "cmd add (nazwa komendy) (tekst)") guilds[guild]["cmd"][ctx.args[1]] = {} guilds[guild]["cmd"][ctx.args[1]]["author"] = ctx.data["author"] guilds[guild]["cmd"][ctx.args[1]]["text"] = ctx.args[2] ctx.send("Dodano komende") elif ctx.args[0] == "remove": if not len(ctx.args) == 2: return handler.error_handler(ctx, "arguments", "cmd remove (nazwa komendy)") del guilds[guild]["cmd"][ctx.args[1]] ctx.send("Usunięto komende") elif ctx.args[0] == "info": if not len(ctx.args) == 2: return handler.error_handler(ctx, "arguments", "cmd info (nazwa komendy)") ctx.send( embed={ "title": f"Informacje o {ctx.args[1]}:", "color": 0xe74c3c, "fields": [{ "name": "Autor:", "value": f"{guilds[guild]['cmd'][ctx.args[1]]['author']['username']}#{guilds[guild]['cmd'][ctx.args[1]]['author']['discriminator']} ({guilds[guild]['cmd'][ctx.args[1]]['author']['id']})", "inline": False }, { "name": "Tekst w komendzie:", "value": guilds[guild]["cmd"][ctx.args[1]]["text"], "inline": False }] }) elif ctx.args[0] == "list": ctx.send( embed={ "title": f"Lista komend ({len(guilds[guild]['cmd'])}):", "description": "\n".join([x for x in guilds[guild]["cmd"]]), "color": 0xe74c3c }) else: return ctx.send( embed={ "title": "Komendy cmd:", "description": "> `cmd add (komenda) (tekst)`, `cmd remove (komenda)`, `cmd info (komenda)`, `cmd list`", "color": 0xe74c3c, "footer": { "text": "<> = nazwa użytkownika, [] = wzmianka" } }) functions.write_json("guilds", guilds)
def calc(ctx): if not functions.has_permission(ctx): return handler.error_handler(ctx, "nopermission", ctx.command) msg = ctx.send("```0```", other_data={ "components": [{ "type": 1, "components": [{ "type": 2, "label": "x\u02b8", "style": 2, "custom_id": "power" }, { "type": 2, "label": "%", "style": 2, "custom_id": "percent" }, { "type": 2, "label": "<-", "style": 2, "custom_id": "backspace" }, { "type": 2, "label": "C", "style": 4, "custom_id": "clear" }] }, { "type": 1, "components": [{ "type": 2, "label": "7", "style": 2, "custom_id": "7" }, { "type": 2, "label": "8", "style": 2, "custom_id": "8" }, { "type": 2, "label": "9", "style": 2, "custom_id": "9" }, { "type": 2, "label": "/", "style": 2, "custom_id": "divide" }, { "type": 2, "label": "(", "style": 2, "custom_id": "leftbracket" }] }, { "type": 1, "components": [{ "type": 2, "label": "4", "style": 2, "custom_id": "4" }, { "type": 2, "label": "5", "style": 2, "custom_id": "5" }, { "type": 2, "label": "6", "style": 2, "custom_id": "6" }, { "type": 2, "label": "*", "style": 2, "custom_id": "multiply" }, { "type": 2, "label": ")", "style": 2, "custom_id": "rightbracket" }] }, { "type": 1, "components": [{ "type": 2, "label": "1", "style": 2, "custom_id": "1" }, { "type": 2, "label": "2", "style": 2, "custom_id": "2" }, { "type": 2, "label": "3", "style": 2, "custom_id": "3" }, { "type": 2, "label": "-", "style": 2, "custom_id": "minus" }] }, { "type": 1, "components": [{ "type": 2, "label": "0", "style": 2, "custom_id": "0" }, { "type": 2, "label": ".", "style": 2, "custom_id": "dot" }, { "type": 2, "label": "=", "style": 1, "custom_id": "equal" }, { "type": 2, "label": "+", "style": 2, "custom_id": "add" }] }] }) msg = msg.json() interactions.append(("calc", ctx.data["author"]["id"], ctx.data["channel_id"], msg["id"]))