Untitled
unknown
plain_text
a year ago
12 kB
14
Indexable
import nextcord
from nextcord.ext import commands
from nextcord.ui import Button, View
import asyncio
from datetime import datetime
import pytz
# Global dictionary to track open tickets (consider persisting this in a database for real usage)
open_tickets = {}
class CloseButton(Button):
def __init__(self, bot, ticket_channel, message_id, original_user, ticket_type):
super().__init__(label="Close 🔒", style=nextcord.ButtonStyle.primary)
self.bot = bot
self.ticket_channel = ticket_channel
self.message_id = message_id
self.original_user = original_user
self.ticket_type = ticket_type
self.error_emoji = "<:error:1271946673890791506>"
self.success_emoji = "<:success:1271946714605162516>"
async def callback(self, interaction: nextcord.Interaction):
await interaction.response.defer()
if interaction.user == self.original_user:
if self.ticket_channel.name.startswith("closed-"):
await interaction.followup.send(f"{self.error_emoji} Ticket already closed.", ephemeral=True)
return
await self.ticket_channel.set_permissions(interaction.user, view_channel=False)
await self.ticket_channel.edit(name=f"closed-{self.ticket_channel.name.split('-')[1]}")
embed = nextcord.Embed(title="", description=f"{self.success_emoji} This ticket has been closed. For further assistance, please open a new ticket.", color=nextcord.Color.green())
await interaction.followup.send(embed=embed)
embed = nextcord.Embed(title="", description="``` Ticket Control Panel ```", color=None)
view = View()
view.add_item(ModeratorButton(self.bot, "📝 Create Log", "create_log", self.ticket_type, self.original_user, self.ticket_channel, style=nextcord.ButtonStyle.success))
view.add_item(ModeratorButton(self.bot, "⛔ Delete", "delete", self.ticket_type, self.original_user, self.ticket_channel, style=nextcord.ButtonStyle.danger))
await self.ticket_channel.send(embed=embed, view=view)
open_tickets.pop(interaction.user.id, None)
else:
await interaction.followup.send(f"{self.error_emoji} You don't have permission to close this ticket.", ephemeral=True)
class ModeratorButton(Button):
def __init__(self, bot, label, action, ticket_type, original_user, ticket_channel, style=nextcord.ButtonStyle.primary):
super().__init__(label=label, style=style)
self.bot = bot
self.action = action
self.ticket_type = ticket_type
self.original_user = original_user
self.ticket_channel = ticket_channel
self.error_emoji = "<:error:1271946673890791506>"
self.success_emoji = "<:success:1271946714605162516>"
async def callback(self, interaction: nextcord.Interaction):
print(f"ModeratorButton callback - Action: {self.action}, Ticket Type: {self.ticket_type}, Original User: {self.original_user}")
if interaction.user.guild_permissions.administrator:
if self.action == "create_log":
embed = nextcord.Embed(title="", description="**Input your log notes below. These will be added to the Ticket Record.**", color=None)
await interaction.response.send_message(embed=embed)
def check(m):
return m.author == interaction.user and m.channel == interaction.channel
try:
message = await self.bot.wait_for('message', check=check, timeout=300.0)
except asyncio.TimeoutError:
await interaction.followup.send("You took too long to provide notes. Please try again.", ephemeral=True)
return
records_channel_id = 1275991900637106226
records_channel = self.bot.get_channel(records_channel_id)
if not records_channel:
await interaction.followup.send("Could not find the records channel.", ephemeral=True)
return
embed_color = nextcord.Color.blue() if self.ticket_type == "Suggestion" else nextcord.Color.red() if self.ticket_type == "Report" else nextcord.Color.green()
embed = nextcord.Embed(
title="🎟️ Ticket Record",
color=embed_color,
timestamp=datetime.now() # This sets the default timestamp in the embed
)
embed.add_field(name="Server Name:", value=self.original_user.mention, inline=True)
embed.add_field(name="User Name:", value=f"`{self.original_user.display_name}`", inline=False)
embed.add_field(name="Ticket Type:", value=f"`{self.ticket_type}`", inline=False)
embed.add_field(name="Logged By:", value=interaction.user.mention, inline=False)
embed.add_field(name="Notes:", value=message.content or "No additional notes provided.", inline=False)
embed.set_thumbnail(url=self.original_user.avatar.url)
embed.set_footer(text=f"User ID: {self.original_user.id}")
print(f"Sending embed to records channel with Ticket Type: {self.ticket_type}") # Debug print
await records_channel.send(embed=embed)
embed = nextcord.Embed(title="", description=f"{self.success_emoji} **The Ticket Record has been created successfully.**", color=nextcord.Color.green())
await interaction.followup.send(embed=embed)
elif self.action == "delete":
# Handle the delete action
await self.ticket_channel.delete(reason="Ticket deleted by a moderator.")
await interaction.response.send_message(f"{self.success_emoji} Ticket has been deleted.", ephemeral=True)
else:
await interaction.response.send_message(f"{self.error_emoji} You don't have permission to perform this action.", ephemeral=True)
class TicketButton(Button):
def __init__(self, bot, label, description, ticket_type, style):
super().__init__(label=label, style=style)
self.bot = bot
self.ticket_type = ticket_type
async def callback(self, interaction: nextcord.Interaction):
await interaction.response.defer()
user = interaction.user
category_id = 1276279397904547981 # Replace with your category ID
category = interaction.guild.get_channel(category_id)
if not category or not isinstance(category, nextcord.CategoryChannel):
await interaction.followup.send(f"{self.error_emoji} Unable to find the specified category.", ephemeral=True)
return
channel_name = f"{self.ticket_type.lower().replace(' ', '-')}-{user.name.lower()}"
if user.id in open_tickets and open_tickets[user.id] == self.ticket_type.lower().replace(' ', '-'):
await interaction.followup.send("You already have a similar ticket open. Please close that ticket to open a new one.", ephemeral=True)
return
open_tickets[user.id] = self.ticket_type.lower().replace(' ', '-')
embed_title = "<:mmm:774710180708352021> Thanks for opening a ticket!"
embed_color = nextcord.Color.green() # Default color
if self.ticket_type == "Question":
embed_title = "<:mmm:774710180708352021> We're here to answer any questions you may have!"
embed_color = nextcord.Color.green()
elif self.ticket_type == "Report":
embed_title = "<:mmm:774710180708352021> We take all reports very seriously!"
embed_color = nextcord.Color.red()
elif self.ticket_type == "Suggestion":
embed_title = "<:mmm:774710180708352021> We'd love to hear your suggestions!"
embed_color = nextcord.Color.blue()
admin_role = interaction.guild.get_role(496548368974348293) # Replace with the actual role ID for "Mac Miller Memoir"
# Initially set the admin role to None, temporarily preventing it from having permissions
overwrites = {
interaction.guild.default_role: nextcord.PermissionOverwrite(view_channel=False),
user: nextcord.PermissionOverwrite(view_channel=True, send_messages=True),
interaction.guild.me: nextcord.PermissionOverwrite(view_channel=True, send_messages=True),
}
ticket_channel = await interaction.guild.create_text_channel(
name=channel_name,
category=category,
overwrites=overwrites
)
await ticket_channel.send(f"{user.mention}\n-")
embed = nextcord.Embed(title=embed_title, description="", color=embed_color)
embed.add_field(name="", value="", inline=False)
embed.add_field(name="Please type your message below.", value="Once your message is sent, one of our <@&496549370544652309>'s will respond to you shortly.", inline=False)
embed.add_field(name="", value="", inline=False)
embed.add_field(name="", value="`To close this ticket, press the Close 🔒 button.`", inline=False)
close_button = CloseButton(self.bot, ticket_channel, message_id=None, original_user=user, ticket_type=self.ticket_type)
view = View()
view.add_item(close_button)
sent_message = await ticket_channel.send(embed=embed, view=view)
close_button.message_id = sent_message.id
self.bot.loop.create_task(self.auto_delete_channel(ticket_channel, user))
def check(m):
return m.author == user and m.channel == ticket_channel
message = await self.bot.wait_for('message', check=check)
# Once the user sends their first message, update the permissions to allow the admin role to view the channel
print(f"Ticket Type for user {user.name}: {self.ticket_type}")
await ticket_channel.set_permissions(admin_role, view_channel=True, send_messages=True, read_message_history=True)
if self.ticket_type == "Suggestion":
await ticket_channel.send("<@&496549370544652309>")
elif self.ticket_type in ["Report", "Question"]:
moderator_role = interaction.guild.get_role(496549370544652309)
await ticket_channel.set_permissions(moderator_role, view_channel=True, send_messages=True, read_message_history=True)
await ticket_channel.send("<@&496549370544652309>")
async def auto_delete_channel(self, channel, user):
await asyncio.sleep(3600) # Wait for 60 minutes
async for message in channel.history(limit=1):
if message.author == user:
return
await channel.delete(reason="No activity for 60 minutes.")
class TicketView(View):
def __init__(self, bot):
super().__init__()
self.add_item(TicketButton(bot, "❔ Questions", "Other support.", "Question", nextcord.ButtonStyle.success))
self.add_item(TicketButton(bot, "🚨 Report", "Report an issue.", "Report", nextcord.ButtonStyle.danger))
self.add_item(TicketButton(bot, "💡 Server Suggestion", "Suggest something.", "Suggestion", nextcord.ButtonStyle.primary))
class SupportTicketCog(commands.Cog):
def __init__(self, bot):
self.bot = bot
@nextcord.slash_command(name="support", description="🔒 Create the Support Ticket embed.", default_member_permissions=nextcord.Permissions(administrator=True))
async def support(self, interaction: nextcord.Interaction):
embed = nextcord.Embed(title="MMM Support Menu", description="Select the type of support ticket you'd like to open.", color=nextcord.Color.gold())
embed.add_field(name="", value="\n\nYour ticket will open in another channel.", inline=False)
embed.set_thumbnail(url=interaction.guild.icon.url)
view = TicketView(self.bot)
await interaction.response.send_message(embed=embed, view=view)
def setup(bot):
bot.add_cog(SupportTicketCog(bot))
Editor is loading...
Leave a Comment