Compare commits

...

4 Commits

Author SHA1 Message Date
Anorak_1 53ca312fd9 removed test command 2023-07-14 21:48:24 +02:00
Anorak_1 e16411d0ef reworked accept/decline 2023-07-14 21:47:41 +02:00
Anorak_1 ab5de280b8 added dotenv to requirements.txt 2023-07-14 21:47:26 +02:00
Anorak_1 6b49db536a added some files to .gitignore 2023-07-14 21:47:00 +02:00
3 changed files with 153 additions and 1 deletions

2
.gitignore vendored
View File

@ -160,3 +160,5 @@ cython_debug/
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
#.idea/
applications.json
applications.db

149
bot.py
View File

@ -0,0 +1,149 @@
# db - msg_id, user_id, guild_id
import discord
import os
import json
import sqlite3
from dotenv import load_dotenv
from discord.ui import Modal, InputText
load_dotenv()
TOKEN = os.getenv("TOKEN")
SERVER_NAME = os.getenv("SERVER_NAME")
bot = discord.Bot(intents=discord.Intents.all())
channel_id = 867010119127400458
questions = {
1: "What is your Minecraft username?",
2: "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)",
3: "Have you been a part of a minecraft community before, if so, let us know what your experience was with that community.",
4: "How old are you?",
5: "Do you have a good microphone for proximity chat?",
6: "Do you plan on spending at least 2-3 hours a week on the server (our current definition of active)",
7: "What will you be able to do to help us grow and build our community?",
8: "Any other questions or concerns?"
}
max_questions = len(questions)
@bot.event
async def on_ready():
bot.add_view(ApplicationButtonsView())
print(f"Logged in as {bot.user}")
@bot.slash_command(description = "Command used to apply", guild_ids = [866630736445702184])
async def apply(ctx):
message = ctx.message
await ctx.response.send_message(content="Application started", ephemeral=True)
user = await ctx.author.create_dm()
await user.send("Hey! Your application has started. You have 300 seconds to complete it.")
application = {'userId': ctx.author.id}
for i in range(1, max_questions+1):
embed = discord.Embed(title=f'Question [{i}/{max_questions}]', description=questions[i])
await user.send(embed=embed)
response = await bot.wait_for('message', check=lambda m: m.author == ctx.author and m.channel == user, timeout=300)
application[f'question{i}'] = response.content
try:
with open('applications.json', 'r') as f:
data = json.load(f)
except (FileNotFoundError, json.JSONDecodeError):
data = []
data.append(application)
with open('applications.json', 'w') as f:
json.dump(data, f)
channel = bot.get_channel(channel_id)
embed = discord.Embed(title='Application: ' + ctx.author.display_name)
for i in range(1, max_questions+1):
embed.add_field(name=f'Question {i}: ', value=application[f'question{i}'], inline=False)
embed.set_footer(text=f"Applicant ID: {ctx.author.id}")
appView = ApplicationButtonsView()
msg = await channel.send(embed=embed, view=appView)
print(msg.id)
data = (msg.id, ctx.author.id, ctx.guild.id)
con = sqlite3.connect("applications.db")
cur = con.cursor()
cur.execute(f"INSERT INTO app_msg_db VALUES (?, ?, ?)", data)
con.commit()
await user.send('Thank you for applying!')
class ApplicationButtonsView(discord.ui.View):
def __init__(self):
super().__init__(timeout=None)
@discord.ui.button(
label="Accept",
style=discord.ButtonStyle.green,
custom_id=f"persistent:accept",
)
async def accept(self, button: discord.ui.Button, interaction: discord.Interaction):
self.disable_all_items()
print(interaction.message.id)
msg_id = str(interaction.message.id)
con = sqlite3.connect("applications.db")
cur = con.cursor()
cur.execute(f"SELECT user_id, guild_id FROM app_msg_db WHERE msg_id={msg_id}")
user_id, guild_id = cur.fetchone()
#await interaction.response.send_message(f"Accepted {user_id}, guild {guild_id}", ephemeral=True)
modal = ApplicationModal(title=f"Accepting: {bot.get_user(user_id).display_name}")
modal.set_action("acc")
modal.add_item(discord.ui.InputText(label=f"Reason: "))
await interaction.response.send_modal(modal)
await interaction.followup.edit_message(message_id = interaction.message.id, view=self)
@discord.ui.button(
label="Decline",
style=discord.ButtonStyle.red,
custom_id=f"persistent:decline",
)
async def decline(self, button: discord.ui.Button, interaction: discord.Interaction):
self.disable_all_items()
print(interaction.message.id)
msg_id = str(interaction.message.id)
con = sqlite3.connect("applications.db")
cur = con.cursor()
cur.execute(f"SELECT user_id, guild_id FROM app_msg_db WHERE msg_id={msg_id}")
user_id, guild_id = cur.fetchone()
#await interaction.response.send_message(f"Declined {user_id}, guild {guild_id}", ephemeral=True)
modal = ApplicationModal(title=f"Declining: {bot.get_user(user_id).display_name}")
modal.set_action("dec")
modal.add_item(discord.ui.InputText(label=f"Reason: "))
await interaction.response.send_modal(modal)
await interaction.followup.edit_message(message_id = interaction.message.id, view=self)
class ApplicationModal(discord.ui.Modal):
def set_action(self, action):
self.action = action
async def callback(self, interaction: discord.Interaction):
reason = self.children[0].value
msg_id = str(interaction.message.id)
con = sqlite3.connect("applications.db")
cur = con.cursor()
cur.execute(f"SELECT user_id, guild_id FROM app_msg_db WHERE msg_id={msg_id}")
user_id, guild_id = cur.fetchone()
if self.action == "acc":
user = await bot.get_user(user_id).create_dm()
await user.send(f"You have been accepted to the CreatTopia Minecraft server!")
await user.send(f"Reason: {reason}")
await interaction.response.send_message(content="Application accepted", ephemeral=True)
if self.action == "dec":
user = await bot.get_user(user_id).create_dm()
await user.send(f"You have been declined access to the CreatTopia Minecraft server.")
await user.send(f"Reason: {reason}")
await interaction.response.send_message(content="Application declined", ephemeral=True)
bot.run(TOKEN)

View File

@ -1 +1,2 @@
py-cord == 2.4.1
py-cord == 2.4.1
python-dotenv