insert2-cogs/rolebuttons.py
2024-08-11 15:32:39 -04:00

138 lines
No EOL
5.7 KiB
Python

import nextcord
from nextcord.ext import commands
from nextcord import TextInputStyle
from random import randint
import aiosqlite as sqlite3
import aiohttp
from urllib.parse import urlparse
import os
buttonlist = []
class RoleView(nextcord.ui.View):
def __init__(self,bot):
super().__init__(timeout=None)
self.bot = bot
for b in buttonlist:
b.callback = self.buttoncallback
self.add_item(b)
async def buttoncallback(self, interaction: nextcord.Interaction) -> None:
role = interaction.guild.get_role(int(interaction.data["custom_id"].split(":")[1]))
if role in interaction.user.roles:
await interaction.user.remove_roles(role, reason=f"{interaction.user.name} used role button")
await interaction.response.send_message(f"Removed <@&{role.id}> from you!", ephemeral=True, allowed_mentions=nextcord.AllowedMentions.none())
else:
await interaction.user.add_roles(role, reason=f"{interaction.user.name} used role button")
await interaction.response.send_message(f"Added <@&{role.id}> to you!", ephemeral=True, allowed_mentions=nextcord.AllowedMentions.none())
return
async def on_error(self, error: nextcord.DiscordException, item: nextcord.ui.Item, interaction: nextcord.Interaction):
error = traceback.format_exc()
print(error, file=sys.stderr)
message = f"```py\n{error[-1800:]}\n```\n Contact <@{self.bot.owner_id}> if the error persists"
try:
await interaction.send(message, ephemeral=True)
except:
try:
await interaction.followup.send(message, ephemeral=True)
except:
await interaction.response.send_message(message, ephemeral=True)
class rolebutton(commands.Cog):
def __init__(self, bot: commands.Bot):
self.bot = bot
#errors if first loaded but is needed after
try:
self.bot.add_view(RoleView(self.bot))
except:
pass
@commands.Cog.listener('on_ready')
async def roleready(self):
for g in self.bot.guilds:
res = await self.bot.cur.execute(f"SELECT roleid FROM rolebutton WHERE serverid = {g.id}")
res = await res.fetchall()
buttonlist.clear()
for [r] in res:
role = g.get_role(int(r))
button = nextcord.ui.Button(label=role.name, style=nextcord.ButtonStyle.gray, custom_id=f"rolebutton:{role.id}")
buttonlist.append(button)
self.bot.add_view(RoleView(self.bot))
@nextcord.slash_command(
name="rolebuttons",
description="modify role buttons",
default_member_permissions=nextcord.Permissions(manage_roles=True),
)
async def rolebuttons(self, interaction: nextcord.Interaction):
return
self.bot.roleguild = interaction.guild
await interaction.response.send_message(view=RoleView(self.bot))
@nextcord.message_command(
name="Refresh Role Buttons",
default_member_permissions=nextcord.Permissions(manage_roles=True),
)
@nextcord.ext.application_checks.has_permissions(manage_roles=True)
async def rolerefresh(self, interaction: nextcord.Interaction, message: nextcord.Message):
if message.author.id != self.bot.application_id:
await interaction.response.send_message("I can't edit that message", ephemeral=True)
return
res = await self.bot.cur.execute(f"SELECT roleid FROM rolebutton WHERE serverid = {interaction.guild.id}")
res = await res.fetchall()
buttonlist.clear()
for [r] in res:
role = interaction.guild.get_role(int(r))
button = nextcord.ui.Button(label=role.name, style=nextcord.ButtonStyle.gray, custom_id=f"rolebutton:{role.id}")
buttonlist.append(button)
await message.edit(view=RoleView(self.bot))
await interaction.response.send_message("Edited!", ephemeral=True)
@rolebuttons.subcommand(
name="create",
description="Create a role message",
)
@nextcord.ext.application_checks.has_permissions(manage_roles=True)
async def rolecreate(self, interaction: nextcord.Interaction, content: str):
res = await self.bot.cur.execute(f"SELECT roleid FROM rolebutton WHERE serverid = {interaction.guild.id}")
res = await res.fetchall()
buttonlist.clear()
for [r] in res:
role = interaction.guild.get_role(int(r))
role.name
button = nextcord.ui.Button(label=role.name, style=nextcord.ButtonStyle.gray, custom_id=f"rolebutton:{role.id}")
buttonlist.append(button)
await interaction.channel.send(content=content, view=RoleView(self.bot))
await interaction.response.send_message("Done", ephemeral=True)
@rolebuttons.subcommand(
name="add",
description="add a role to the selection message",
)
async def roleadd(self, interaction: nextcord.Interaction, role: nextcord.Role):
await self.bot.cur.execute(f"""
INSERT INTO rolebutton VALUES
({interaction.guild_id}, {role.id})
""")
await self.bot.db.commit()
await interaction.response.send_message("Done", ephemeral=True)
@rolebuttons.subcommand(
name="remove",
description="remove a role from the selection message",
)
async def roleremove(self, interaction: nextcord.Interaction, role: nextcord.Role):
await self.bot.cur.execute(f"""
DELETE FROM rolebutton WHERE serverid = {interaction.guild.id} AND roleid = {role.id}
""")
await self.bot.db.commit()
await interaction.response.send_message("Done", ephemeral=True)
def setup(bot: commands.Bot):
bot.add_cog(rolebutton(bot))