166 lines
7.1 KiB
Python
166 lines
7.1 KiB
Python
import discord, asyncio, pymongo, os
|
|
from discord.ext import commands
|
|
from dotenv import load_dotenv
|
|
from discord.ui import Button, button, View
|
|
|
|
from dotenv import load_dotenv
|
|
load_dotenv()
|
|
|
|
def is_enabled(self):
|
|
client = pymongo.MongoClient(os.getenv("mongo_url"))
|
|
db = client.servers
|
|
coll = db.settings
|
|
|
|
if coll.find_one({"_id": {"guild_id": self.guild.id, "commands":"ticket"}}):
|
|
command = coll.find_one({"_id": {"guild_id": self.guild.id, "commands":"ticket"}})
|
|
command_enabled = command["enabled"] # True or False
|
|
if command_enabled:
|
|
return True
|
|
else:
|
|
return False
|
|
else:
|
|
return True
|
|
|
|
async def send_log(title: str, guild: discord.Guild, description: str, color: discord.Color):
|
|
log_channel = discord.utils.get(guild.channels, name="ticket-logs")
|
|
embed = discord.Embed(
|
|
title=title,
|
|
description=description,
|
|
color=color
|
|
)
|
|
|
|
await log_channel.send(embed=embed)
|
|
|
|
class CreateButton(View):
|
|
def __init__(self):
|
|
super().__init__(timeout=None)
|
|
|
|
@button(label="Create Ticket", style=discord.ButtonStyle.blurple, emoji="🎫", custom_id="ticketopen")
|
|
async def ticket(self, interaction: discord.Interaction, button: Button):
|
|
await interaction.response.defer(ephemeral=True)
|
|
category: discord.CategoryChannel = discord.utils.get(interaction.guild.categories, name="OPENED TICKETS")
|
|
for ch in category.text_channels:
|
|
if ch.topic == f"{interaction.user.id} DO NOT CHANGE THE TOPIC OF THIS CHANNEL!":
|
|
await interaction.followup.send("You already have a ticket open! Ticket located in {0}".format(ch.mention), ephemeral=True)
|
|
return
|
|
|
|
# make a dictionary that increases by one everytime a ticket is created
|
|
if not category:
|
|
category = await interaction.guild.create_category_channel("OPENED TICKETS")
|
|
counter = 0
|
|
else:
|
|
counter = len(category.text_channels)
|
|
|
|
|
|
|
|
r1: discord.Role = discord.utils.get(interaction.guild.roles, name="Ticket Master")
|
|
overwrites = {
|
|
interaction.guild.default_role: discord.PermissionOverwrite(read_messages=False),
|
|
r1: discord.PermissionOverwrite(read_messages=True, send_messages=True, manage_messages=True),
|
|
interaction.user: discord.PermissionOverwrite(read_messages=True, send_messages=True),
|
|
interaction.guild.me: discord.PermissionOverwrite(read_messages=True, send_messages=True)
|
|
}
|
|
channel = await category.create_text_channel(
|
|
# the name of the channel should be ticket- and then a counter that increases everytime a ticket is opened
|
|
name=f"{interaction.user}-{counter + 1}",
|
|
topic=f"{interaction.user.id} DO NOT CHANGE THE TOPIC OF THIS CHANNEL!",
|
|
overwrites=overwrites
|
|
)
|
|
|
|
em = discord.Embed(description="Someone will be here to assist you shortly.\nTo close this ticket react with 🔒",color=interaction.user.color)
|
|
em.set_footer(text="Powered by Blob", icon_url=interaction.guild.me.avatar)
|
|
|
|
await channel.send(f"{interaction.user.mention} Welcome to your ticket.\n\nPlease don't ping staff, they will be here soon.\n\n",embed=em, view=CloseButton())
|
|
await interaction.followup.send(f"Ticket created in {channel.mention}", ephemeral=True)
|
|
await send_log(
|
|
title="Ticket Created",
|
|
description=f"Created by: {interaction.user.mention}",
|
|
color=discord.Color.green(),
|
|
guild=interaction.guild
|
|
)
|
|
|
|
class CloseButton(View):
|
|
def __init__(self):
|
|
super().__init__(timeout=None)
|
|
|
|
@button(label="Close Ticket", style=discord.ButtonStyle.red, custom_id="closeticket", emoji="🔒")
|
|
async def close(self, interaction: discord.Interaction, button: Button):
|
|
await interaction.response.defer(ephemeral=True)
|
|
await interaction.channel.send("Closing this ticket in 5 seconds")
|
|
|
|
await asyncio.sleep(5)
|
|
|
|
category: discord.CategoryChannel = discord.utils.get(interaction.guild.categories, name="CLOSED TICKETS")
|
|
r1: discord.Role = discord.utils.get(interaction.guild.roles, name="Ticket Master")
|
|
overwrites = {
|
|
interaction.guild.default_role: discord.PermissionOverwrite(read_messages=False),
|
|
r1: discord.PermissionOverwrite(read_messages=True, send_messages=True, manage_messages=True),
|
|
interaction.guild.me: discord.PermissionOverwrite(read_messages=True, send_messages=True)
|
|
}
|
|
|
|
await interaction.channel.edit(category=category, overwrites=overwrites)
|
|
await interaction.channel.send(
|
|
embed = discord.Embed(
|
|
title="Ticket Closed",
|
|
description="This ticket has been closed\n\nTicket closed by {0}".format(interaction.user.mention),
|
|
color=interaction.user.color
|
|
),
|
|
view=TrashButton()
|
|
)
|
|
await send_log(
|
|
title="Ticket Closed",
|
|
description=f"Closed by: {interaction.user.mention}",
|
|
color=discord.Color.yellow(),
|
|
guild=interaction.guild
|
|
)
|
|
|
|
class TrashButton(View):
|
|
def __init__(self):
|
|
super().__init__(timeout=None)
|
|
|
|
@button(label="Trash Ticket", style=discord.ButtonStyle.red, custom_id="trash", emoji="🗑️")
|
|
async def trash(self, interaction: discord.Interaction, button: Button):
|
|
await interaction.response.defer(ephemeral=True)
|
|
await interaction.channel.send("Deleting ticket in 3 seconds")
|
|
await asyncio.sleep(3)
|
|
|
|
await interaction.channel.delete()
|
|
|
|
await send_log(
|
|
title="Ticket Deleted",
|
|
description=f"Deleted by: {interaction.user.mention}",
|
|
color=discord.Color.red(),
|
|
guild=interaction.guild
|
|
)
|
|
|
|
class ticket(commands.Cog):
|
|
def __init__(self, bot):
|
|
self.bot = bot
|
|
|
|
@commands.Cog.listener()
|
|
async def on_ready(self):
|
|
print('Tickets Online')
|
|
|
|
@commands.hybrid_command(name="ticket", description="Create a ticket")
|
|
@commands.has_permissions(administrator=True)
|
|
@commands.check(is_enabled)
|
|
async def ticket(self, ctx):
|
|
if not discord.utils.get(ctx.guild.categories, name="OPENED TICKETS"):
|
|
await ctx.guild.create_category(name="OPENED TICKETS")
|
|
if not discord.utils.get(ctx.guild.categories, name="CLOSED TICKETS"):
|
|
await ctx.guild.create_category(name="CLOSED TICKETS")
|
|
if not discord.utils.get(ctx.guild.roles, name="Ticket Master"):
|
|
await ctx.guild.create_role(name="Ticket Master")
|
|
if not discord.utils.get(ctx.guild.channels, name="ticket-logs"):
|
|
await ctx.guild.create_text_channel(name="ticket-logs")
|
|
await ctx.send(
|
|
embed=discord.Embed(
|
|
description="Click the button below to create a ticket",
|
|
color=ctx.author.color
|
|
),
|
|
view=CreateButton()
|
|
)
|
|
|
|
async def setup(bot):
|
|
await bot.add_cog(ticket(bot))
|