Compare commits

...

3 Commits

2 changed files with 80 additions and 54 deletions

102
bot.py
View File

@ -9,29 +9,14 @@ from discord.ui import Modal, InputText
from discord.utils import get from discord.utils import get
from discord.ext import commands from discord.ext import commands
from dbutil import MessageDB from dbutil import MessageDB
from dbutil import StartButtonDB
from dbutil import GuildAppDB from dbutil import GuildAppDB
load_dotenv() load_dotenv()
TOKEN = os.getenv("TOKEN") TOKEN = os.getenv("TOKEN")
SERVER_NAME = os.getenv("SERVER_NAME")
CHANNEL_ID = os.getenv("CHANNEL_ID")
bot = discord.Bot(intents=discord.Intents.all()) bot = discord.Bot(intents=discord.Intents.all())
channel_id = int(CHANNEL_ID)
questions = [
"What is your Minecraft username?",
"How did you learn about CraftTopia? (If it was from a friend or a website we would like to know either who or where just to know where credit is due)",
"Have you been a part of a minecraft community before, if so, let us know what your experience was with that community.",
"How old are you?",
"Do you have a good microphone for proximity chat?",
"Do you plan on spending at least 2-3 hours a week on the server (our current definition of active)",
"What will you be able to do to help us grow and build our community?",
"Any other questions or concerns?"
]
max_questions = len(questions)
@bot.event @bot.event
async def on_ready(): async def on_ready():
@ -62,12 +47,12 @@ async def on_guild_remove(guild):
@commands.has_permissions(administrator=True) @commands.has_permissions(administrator=True)
@bot.slash_command(description = "Command used to set up the application prompt") @bot.slash_command(description = "Command used to set up the application prompt")
async def start_button(ctx): async def start_button(ctx):
embed = discord.Embed(title="**Start your application!**") view = discord.ui.View()
embed.add_field(name="Click the button below to start your application", value="", inline=False) options = SelectApplicationStartButton(max_values=1, placeholder="Select application")
embed.set_footer(text="Made by @anorak01", icon_url="https://cdn.discordapp.com/avatars/269164865480949760/a1af9962da20d5ddaa136043cf45d015?size=1024") for i in GuildAppDB.get_applications(str(ctx.guild.id)):
appStartView = ApplicationStartButtonView() options.add_option(label=i, value=i)
await ctx.response.send_message("Message set up", ephemeral=True) view.add_item(options)
await ctx.channel.send(embeds=[embed], view=appStartView) await ctx.response.send_message(view=view, ephemeral=True)
@start_button.error @start_button.error
async def on_application_command_error(ctx, error): async def on_application_command_error(ctx, error):
@ -78,6 +63,7 @@ async def on_application_command_error(ctx, error):
application = discord.SlashCommandGroup("application", "The main command to manage applications") application = discord.SlashCommandGroup("application", "The main command to manage applications")
@commands.has_permissions(administrator=True)
@application.command(description="Create application") @application.command(description="Create application")
async def create(ctx, application): async def create(ctx, application):
if len(application) < 40: if len(application) < 40:
@ -89,6 +75,7 @@ async def create(ctx, application):
else: else:
await ctx.response.send_message(f"please choose shorter name", ephemeral=True) await ctx.response.send_message(f"please choose shorter name", ephemeral=True)
@commands.has_permissions(administrator=True)
@application.command(description="Remove application") @application.command(description="Remove application")
async def remove(ctx, application): async def remove(ctx, application):
result = GuildAppDB.remove_application_entry(str(ctx.guild.id), application) result = GuildAppDB.remove_application_entry(str(ctx.guild.id), application)
@ -97,6 +84,7 @@ async def remove(ctx, application):
else: else:
await ctx.response.send_message(f"Application {application} not found") await ctx.response.send_message(f"Application {application} not found")
@commands.has_permissions(administrator=True)
@application.command(description="List all applications") @application.command(description="List all applications")
async def list(ctx): async def list(ctx):
applications = GuildAppDB.get_applications(str(ctx.guild.id)) applications = GuildAppDB.get_applications(str(ctx.guild.id))
@ -106,7 +94,7 @@ async def list(ctx):
embed.add_field(name=i, value="", inline=False) embed.add_field(name=i, value="", inline=False)
await ctx.response.send_message(embed=embed) await ctx.response.send_message(embed=embed)
@commands.has_permissions(administrator=True)
@application.command(description="Opens editor for selected application") @application.command(description="Opens editor for selected application")
async def editor(ctx): async def editor(ctx):
view = discord.ui.View() view = discord.ui.View()
@ -116,6 +104,7 @@ async def editor(ctx):
view.add_item(options) view.add_item(options)
await ctx.response.send_message(view=view, ephemeral=True) await ctx.response.send_message(view=view, ephemeral=True)
@commands.has_permissions(administrator=True)
@application.command(description="Select response channel for application") @application.command(description="Select response channel for application")
async def response_channel(ctx): async def response_channel(ctx):
view = discord.ui.View() view = discord.ui.View()
@ -125,24 +114,30 @@ async def response_channel(ctx):
view.add_item(options) view.add_item(options)
await ctx.response.send_message(view=view, ephemeral=True) await ctx.response.send_message(view=view, ephemeral=True)
'''
@application.command(description="test")
async def test(ctx):
view = SelectResponseChannelView()
await ctx.response.send_message(view=view, ephemeral=True)
@application.command(description="appl")
async def appl(ctx):
viewx = discord.ui.View()
options = SelectApplicationOptionsEditor(max_values=1)
for i in GuildAppDB.get_applications(str(ctx.guild.id)):
options.add_option(label=i, value=i)
viewx.add_item(options)
await ctx.response.send_message(view=viewx, ephemeral=True)'''
bot.add_application_command(application) # add application group commands bot.add_application_command(application) # add application group commands
def get_questions_embed(guild_id, application) -> discord.Embed:
embed = discord.Embed(title=f"Application: {application}")
questions, length = GuildAppDB.get_questions(str(guild_id), application)
for i, que in enumerate(questions):
embed.add_field(value=f"**{i+1}. {que}**", name="", inline=False)
embed.set_footer(text="Made by @anorak01", icon_url="https://cdn.discordapp.com/avatars/269164865480949760/a1af9962da20d5ddaa136043cf45d015?size=1024")
return embed
class SelectApplicationStartButton(discord.ui.Select):
async def callback(self, interaction: discord.Interaction):
self.disabled = True
embed = discord.Embed(title="**Start your application!**")
embed.add_field(name=f"Click the button below to start your application for: {self.values[0]}", value="", inline=False)
embed.set_footer(text="Made by @anorak01", icon_url="https://cdn.discordapp.com/avatars/269164865480949760/a1af9962da20d5ddaa136043cf45d015?size=1024")
appStartView = ApplicationStartButtonView()
await interaction.response.edit_message(embed=None, content="Application button created", view=None)
message = await interaction.channel.send(embed = embed, view=appStartView)
StartButtonDB.add_start_msg(str(message.id), str(self.values[0]), str(interaction.guild.id))
class SelectResponseChannelView(discord.ui.View): class SelectResponseChannelView(discord.ui.View):
@ -157,14 +152,6 @@ class SelectResponseChannelView(discord.ui.View):
GuildAppDB.set_response_channel(interaction.guild.id, ) GuildAppDB.set_response_channel(interaction.guild.id, )
await interaction.response.edit_message(content=f"Selected channel: {select.values[0].mention}", view=None) await interaction.response.edit_message(content=f"Selected channel: {select.values[0].mention}", view=None)
class SelectResponseChannel(discord.ui.Select):
def set_app_name(self, app_name):
self.app_name = app_name
async def callback(self, interaction: discord.Interaction):
self.disabled = True
GuildAppDB.set_response_channel(str(interaction.guild.id), self.app_name, str(self.values[0].id))
await interaction.response.edit_message(content=f"Selected channel: {self.values[0].mention} for application: {self.app_name}", view=None)
class SelectApplicationOptionsEditor(discord.ui.Select): class SelectApplicationOptionsEditor(discord.ui.Select):
async def callback(self, interaction: discord.Interaction): async def callback(self, interaction: discord.Interaction):
@ -182,13 +169,14 @@ class SelectApplicationOptionsRespChannel(discord.ui.Select):
view.add_item(options) view.add_item(options)
await interaction.response.edit_message(view=view) await interaction.response.edit_message(view=view)
def get_questions_embed(guild_id, application) -> discord.Embed: class SelectResponseChannel(discord.ui.Select):
embed = discord.Embed(title=f"Application: {application}") def set_app_name(self, app_name):
questions, length = GuildAppDB.get_questions(str(guild_id), application) self.app_name = app_name
for i, que in enumerate(questions):
embed.add_field(value=f"**{i+1}. {que}**", name="", inline=False) async def callback(self, interaction: discord.Interaction):
embed.set_footer(text="Made by @anorak01", icon_url="https://cdn.discordapp.com/avatars/269164865480949760/a1af9962da20d5ddaa136043cf45d015?size=1024") self.disabled = True
return embed GuildAppDB.set_response_channel(str(interaction.guild.id), self.app_name, str(self.values[0].id))
await interaction.response.edit_message(content=f"Selected channel: {self.values[0].mention} for application: {self.app_name}", view=None)
class ApplicationEditorView(discord.ui.View): class ApplicationEditorView(discord.ui.View):
def __init__(self, guild_id, application_name): def __init__(self, guild_id, application_name):
@ -350,6 +338,12 @@ class ApplicationStartButtonView(discord.ui.View):
custom_id=f"persistent:start_application", custom_id=f"persistent:start_application",
) )
async def start_app(self, button: discord.ui.Button, interaction: discord.Interaction): async def start_app(self, button: discord.ui.Button, interaction: discord.Interaction):
app_name, guild_id = StartButtonDB.get_start_msg(interaction.message.id)
print(app_name)
print(guild_id)
questions, max_questions=GuildAppDB.get_questions(guild_id, app_name)
response_channel = GuildAppDB.get_response_channel(guild_id, app_name)
user = await interaction.user.create_dm() user = await interaction.user.create_dm()
embedd = discord.Embed(title=f'CreaTopia Application', description="Hey! Your application has started. You have 300 seconds to complete it.") embedd = discord.Embed(title=f'CreaTopia Application', description="Hey! Your application has started. You have 300 seconds to complete it.")
@ -390,7 +384,7 @@ class ApplicationStartButtonView(discord.ui.View):
with open('applications.json', 'w') as f: with open('applications.json', 'w') as f:
json.dump(data, f) json.dump(data, f)
channel = bot.get_channel(channel_id) channel = bot.get_channel(int(response_channel))
embed = discord.Embed(title='Application: ' + interaction.user.display_name) embed = discord.Embed(title='Application: ' + interaction.user.display_name)
for i in range(0, max_questions): for i in range(0, max_questions):
embed.add_field(name=f'{questions[i]}', value=application[f'question{i}'], inline=False) embed.add_field(name=f'{questions[i]}', value=application[f'question{i}'], inline=False)

View File

@ -25,6 +25,29 @@ class MessageDB():
cur.execute(f"DELETE FROM app_msg_db WHERE msg_id={msg_id}") cur.execute(f"DELETE FROM app_msg_db WHERE msg_id={msg_id}")
con.commit() con.commit()
class StartButtonDB():
def add_start_msg(msg_id: str, app_name: str, guild_id: str) -> None:
data = (msg_id, app_name, guild_id)
con = sqlite3.connect("applications.db")
cur = con.cursor()
cur.execute("INSERT INTO app_start_db VALUES (?, ?, ?)", data)
con.commit()
def get_start_msg(msg_id: str) -> tuple[str, str]:
con = sqlite3.connect("applications.db")
cur = con.cursor()
cur.execute("SELECT app_name, guild_id FROM app_start_db WHERE msg_id=?", (str(msg_id), ))
#print(cur.fetchone())
app_name, guild_id = cur.fetchone()
return app_name, guild_id
def remove_start_msg(msg_id: str) -> None:
con = sqlite3.connect("applications.db")
cur = con.cursor()
cur.execute(f"DELETE FROM app_start_db WHERE msg_id={msg_id}")
con.commit()
class GuildAppDB(): class GuildAppDB():
def create_guild(guild_id: str, guild_name: str) -> None: def create_guild(guild_id: str, guild_name: str) -> None:
applications = {} applications = {}
@ -116,6 +139,15 @@ class GuildAppDB():
else: else:
return "error on set response channel: application not found" return "error on set response channel: application not found"
def get_response_channel(guild_id: str, application_name: str) -> str:
con = sqlite3.connect("applications.db")
cur = con.cursor()
cur.execute("SELECT applications_blob FROM app_guildapp_db WHERE guild_id=(?)", (guild_id, ))
application_blob = cur.fetchone()
applications = pickle.loads(application_blob[0])
if application_name in applications.keys():
return applications[application_name]["resp_channel"]
def add_question(guild_id: str, application_name: str, question: str) -> str: def add_question(guild_id: str, application_name: str, question: str) -> str:
con = sqlite3.connect("applications.db") con = sqlite3.connect("applications.db")
cur = con.cursor() cur = con.cursor()