Updated stuff to be the right version and fixed some commands
This commit is contained in:
parent
c299c869f1
commit
04134e9fb2
26 changed files with 359 additions and 348 deletions
|
@ -27,13 +27,13 @@
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="DSharpPlus" Version="4.2.0" />
|
<PackageReference Include="DSharpPlus" Version="4.4.0-nightly-01249" />
|
||||||
<PackageReference Include="DSharpPlus.Interactivity" Version="4.2.0" />
|
<PackageReference Include="DSharpPlus.Interactivity" Version="4.4.0-nightly-01249" />
|
||||||
<PackageReference Include="DSharpPlus.SlashCommands" Version="4.2.0" />
|
<PackageReference Include="DSharpPlus.SlashCommands" Version="4.4.0-nightly-01249" />
|
||||||
<PackageReference Include="Gress" Version="2.0.1" />
|
<PackageReference Include="Gress" Version="2.0.1" />
|
||||||
<PackageReference Include="JsonExtensions" Version="1.2.0" />
|
<PackageReference Include="JsonExtensions" Version="1.2.0" />
|
||||||
<PackageReference Include="MiniRazor.CodeGen" Version="2.2.1" />
|
<PackageReference Include="MiniRazor.CodeGen" Version="2.2.1" />
|
||||||
<PackageReference Include="MySql.Data" Version="8.0.30" />
|
<PackageReference Include="MySqlConnector" Version="2.2.5" />
|
||||||
<PackageReference Include="Newtonsoft.Json.Bson" Version="1.0.1" />
|
<PackageReference Include="Newtonsoft.Json.Bson" Version="1.0.1" />
|
||||||
<PackageReference Include="Polly" Version="7.2.3" />
|
<PackageReference Include="Polly" Version="7.2.3" />
|
||||||
<PackageReference Include="Superpower" Version="3.0.0" />
|
<PackageReference Include="Superpower" Version="3.0.0" />
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using DSharpPlus.Entities;
|
using DSharpPlus.Entities;
|
||||||
using DSharpPlus.SlashCommands;
|
using DSharpPlus.SlashCommands;
|
||||||
using DSharpPlus.SlashCommands.Attributes;
|
using DSharpPlus.SlashCommands.Attributes;
|
||||||
|
@ -20,7 +20,7 @@ public class AddCategoryCommand : ApplicationCommandModule
|
||||||
}, true);
|
}, true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (string.IsNullOrWhiteSpace(title))
|
if (string.IsNullOrWhiteSpace(title))
|
||||||
{
|
{
|
||||||
await command.CreateResponseAsync(new DiscordEmbedBuilder
|
await command.CreateResponseAsync(new DiscordEmbedBuilder
|
||||||
|
@ -40,7 +40,7 @@ public class AddCategoryCommand : ApplicationCommandModule
|
||||||
}, true);
|
}, true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Database.TryGetCategory(title, out Database.Category _))
|
if (Database.TryGetCategory(title, out Database.Category _))
|
||||||
{
|
{
|
||||||
await command.CreateResponseAsync(new DiscordEmbedBuilder
|
await command.CreateResponseAsync(new DiscordEmbedBuilder
|
||||||
|
@ -51,7 +51,7 @@ public class AddCategoryCommand : ApplicationCommandModule
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(Database.AddCategory(title, category.Id))
|
if (Database.AddCategory(title, category.Id))
|
||||||
{
|
{
|
||||||
await command.CreateResponseAsync(new DiscordEmbedBuilder
|
await command.CreateResponseAsync(new DiscordEmbedBuilder
|
||||||
{
|
{
|
||||||
|
|
|
@ -48,7 +48,7 @@ public class AddCommand : ApplicationCommandModule
|
||||||
}, true);
|
}, true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
await command.Channel.AddOverwriteAsync(member, Permissions.AccessChannels);
|
await command.Channel.AddOverwriteAsync(member, Permissions.AccessChannels);
|
||||||
|
|
|
@ -9,8 +9,8 @@ public class AddMessageCommand : ApplicationCommandModule
|
||||||
{
|
{
|
||||||
[SlashRequireGuild]
|
[SlashRequireGuild]
|
||||||
[SlashCommand("addmessage", "Adds a new message for the 'say' command.")]
|
[SlashCommand("addmessage", "Adds a new message for the 'say' command.")]
|
||||||
public async Task OnExecute(InteractionContext command,
|
public async Task OnExecute(InteractionContext command,
|
||||||
[Option("Identifier", "The identifier word used in the /say command.")] string identifier,
|
[Option("Identifier", "The identifier word used in the /say command.")] string identifier,
|
||||||
[Option("Message", "The message the /say command will return.")] string message)
|
[Option("Message", "The message the /say command will return.")] string message)
|
||||||
{
|
{
|
||||||
if (string.IsNullOrEmpty(message))
|
if (string.IsNullOrEmpty(message))
|
||||||
|
@ -33,7 +33,7 @@ public class AddMessageCommand : ApplicationCommandModule
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(Database.AddMessage(identifier, command.Member.Id, message))
|
if (Database.AddMessage(identifier, command.Member.Id, message))
|
||||||
{
|
{
|
||||||
await command.CreateResponseAsync(new DiscordEmbedBuilder
|
await command.CreateResponseAsync(new DiscordEmbedBuilder
|
||||||
{
|
{
|
||||||
|
|
|
@ -3,7 +3,7 @@ using System.Threading.Tasks;
|
||||||
using DSharpPlus.Entities;
|
using DSharpPlus.Entities;
|
||||||
using DSharpPlus.SlashCommands;
|
using DSharpPlus.SlashCommands;
|
||||||
using DSharpPlus.SlashCommands.Attributes;
|
using DSharpPlus.SlashCommands.Attributes;
|
||||||
using MySql.Data.MySqlClient;
|
using MySqlConnector;
|
||||||
|
|
||||||
namespace Breadcraft.Commands;
|
namespace Breadcraft.Commands;
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
@ -28,7 +28,7 @@ public class AdminCommands : ApplicationCommandModule
|
||||||
|
|
||||||
// Get all channels in all guilds the bot is part of
|
// Get all channels in all guilds the bot is part of
|
||||||
List<DiscordChannel> allChannels = new List<DiscordChannel>();
|
List<DiscordChannel> allChannels = new List<DiscordChannel>();
|
||||||
foreach (KeyValuePair<ulong,DiscordGuild> guild in Breadcraft.discordClient.Guilds)
|
foreach (KeyValuePair<ulong, DiscordGuild> guild in Breadcraft.discordClient.Guilds)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
@ -56,7 +56,7 @@ public class AdminCommands : ApplicationCommandModule
|
||||||
}, true);
|
}, true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
List<DiscordEmbedBuilder> embeds = new List<DiscordEmbedBuilder>();
|
List<DiscordEmbedBuilder> embeds = new List<DiscordEmbedBuilder>();
|
||||||
foreach (string message in Utilities.ParseListIntoMessages(listItems))
|
foreach (string message in Utilities.ParseListIntoMessages(listItems))
|
||||||
{
|
{
|
||||||
|
@ -67,7 +67,7 @@ public class AdminCommands : ApplicationCommandModule
|
||||||
Description = message
|
Description = message
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add the footers
|
// Add the footers
|
||||||
for (int i = 0; i < embeds.Count; i++)
|
for (int i = 0; i < embeds.Count; i++)
|
||||||
{
|
{
|
||||||
|
@ -76,7 +76,7 @@ public class AdminCommands : ApplicationCommandModule
|
||||||
Text = $"Page {i + 1} / {embeds.Count}"
|
Text = $"Page {i + 1} / {embeds.Count}"
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
List<Page> listPages = new List<Page>();
|
List<Page> listPages = new List<Page>();
|
||||||
foreach (DiscordEmbedBuilder embed in embeds)
|
foreach (DiscordEmbedBuilder embed in embeds)
|
||||||
{
|
{
|
||||||
|
@ -85,7 +85,7 @@ public class AdminCommands : ApplicationCommandModule
|
||||||
|
|
||||||
await command.Interaction.SendPaginatedResponseAsync(true, command.User, listPages);
|
await command.Interaction.SendPaginatedResponseAsync(true, command.User, listPages);
|
||||||
}
|
}
|
||||||
|
|
||||||
[SlashRequireGuild]
|
[SlashRequireGuild]
|
||||||
[SlashCommand("setticket", "Turns a channel into a ticket WARNING: Anyone will be able to delete the channel using /close.")]
|
[SlashCommand("setticket", "Turns a channel into a ticket WARNING: Anyone will be able to delete the channel using /close.")]
|
||||||
public async Task SetTicket(InteractionContext command, [Option("User", "(Optional) The owner of the ticket.")] DiscordUser user = null)
|
public async Task SetTicket(InteractionContext command, [Option("User", "(Optional) The owner of the ticket.")] DiscordUser user = null)
|
||||||
|
@ -122,7 +122,7 @@ public class AdminCommands : ApplicationCommandModule
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
[SlashRequireGuild]
|
[SlashRequireGuild]
|
||||||
[SlashCommand("unsetticket", "Deletes a ticket from the ticket system without deleting the channel.")]
|
[SlashCommand("unsetticket", "Deletes a ticket from the ticket system without deleting the channel.")]
|
||||||
public async Task UnsetTicket(InteractionContext command, [Option("TicketID", "(Optional) Ticket to unset. Uses the channel you are in by default.")] long ticketID = 0)
|
public async Task UnsetTicket(InteractionContext command, [Option("TicketID", "(Optional) Ticket to unset. Uses the channel you are in by default.")] long ticketID = 0)
|
||||||
|
@ -140,7 +140,7 @@ public class AdminCommands : ApplicationCommandModule
|
||||||
Description = "This channel is not a ticket!"
|
Description = "This channel is not a ticket!"
|
||||||
}, true);
|
}, true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -164,7 +164,7 @@ public class AdminCommands : ApplicationCommandModule
|
||||||
Color = DiscordColor.Green,
|
Color = DiscordColor.Green,
|
||||||
Description = "Channel has been undesignated as a ticket."
|
Description = "Channel has been undesignated as a ticket."
|
||||||
});
|
});
|
||||||
|
|
||||||
// Log it if the log channel exists
|
// Log it if the log channel exists
|
||||||
DiscordChannel logChannel = command.Guild.GetChannel(Config.logChannel);
|
DiscordChannel logChannel = command.Guild.GetChannel(Config.logChannel);
|
||||||
if (logChannel != null)
|
if (logChannel != null)
|
||||||
|
@ -185,7 +185,7 @@ public class AdminCommands : ApplicationCommandModule
|
||||||
}, true);
|
}, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
[SlashCommand("reload", "Reloads the bot config.")]
|
[SlashCommand("reload", "Reloads the bot config.")]
|
||||||
public async Task Reload(InteractionContext command)
|
public async Task Reload(InteractionContext command)
|
||||||
{
|
{
|
||||||
|
|
|
@ -37,7 +37,7 @@ public class AssignCommand : ApplicationCommandModule
|
||||||
}, true);
|
}, true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if ticket exists in the database
|
// Check if ticket exists in the database
|
||||||
if (!Database.TryGetOpenTicket(command.Channel.Id, out Database.Ticket ticket))
|
if (!Database.TryGetOpenTicket(command.Channel.Id, out Database.Ticket ticket))
|
||||||
{
|
{
|
||||||
|
@ -85,7 +85,7 @@ public class AssignCommand : ApplicationCommandModule
|
||||||
Description = "You have been assigned to a support ticket: " + command.Channel.Mention
|
Description = "You have been assigned to a support ticket: " + command.Channel.Mention
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
catch (UnauthorizedException) {}
|
catch (UnauthorizedException) { }
|
||||||
}
|
}
|
||||||
|
|
||||||
// Log it if the log channel exists
|
// Log it if the log channel exists
|
||||||
|
|
|
@ -33,8 +33,8 @@ public class CloseCommand : ApplicationCommandModule
|
||||||
Color = DiscordColor.Cyan,
|
Color = DiscordColor.Cyan,
|
||||||
Description = "Are you sure you wish to close this ticket? You cannot re-open it again later."
|
Description = "Are you sure you wish to close this ticket? You cannot re-open it again later."
|
||||||
})
|
})
|
||||||
.AddComponents(new DiscordButtonComponent(ButtonStyle.Danger, "breadcraft_closeconfirm", "Confirm"));
|
.AddComponents(new DiscordButtonComponent(ButtonStyle.Danger, "bcsupport_closeconfirm", "Confirm"));
|
||||||
|
|
||||||
|
|
||||||
await command.CreateResponseAsync(confirmation);
|
await command.CreateResponseAsync(confirmation);
|
||||||
}
|
}
|
||||||
|
@ -44,7 +44,7 @@ public class CloseCommand : ApplicationCommandModule
|
||||||
await interaction.CreateResponseAsync(InteractionResponseType.DeferredMessageUpdate);
|
await interaction.CreateResponseAsync(InteractionResponseType.DeferredMessageUpdate);
|
||||||
ulong channelID = interaction.Channel.Id;
|
ulong channelID = interaction.Channel.Id;
|
||||||
string channelName = interaction.Channel.Name;
|
string channelName = interaction.Channel.Name;
|
||||||
|
|
||||||
// Check if ticket exists in the database
|
// Check if ticket exists in the database
|
||||||
if (!Database.TryGetOpenTicket(channelID, out Database.Ticket ticket))
|
if (!Database.TryGetOpenTicket(channelID, out Database.Ticket ticket))
|
||||||
{
|
{
|
||||||
|
@ -55,7 +55,7 @@ public class CloseCommand : ApplicationCommandModule
|
||||||
}));
|
}));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Build transcript
|
// Build transcript
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
@ -86,7 +86,7 @@ public class CloseCommand : ApplicationCommandModule
|
||||||
await using FileStream file = new FileStream(Transcriber.GetPath(ticket.id), FileMode.Open, FileAccess.Read);
|
await using FileStream file = new FileStream(Transcriber.GetPath(ticket.id), FileMode.Open, FileAccess.Read);
|
||||||
DiscordMessageBuilder message = new DiscordMessageBuilder();
|
DiscordMessageBuilder message = new DiscordMessageBuilder();
|
||||||
message.WithEmbed(embed);
|
message.WithEmbed(embed);
|
||||||
message.WithFiles(new Dictionary<string, Stream> { { Transcriber.GetFilename(ticket.id), file } });
|
message.AddFiles(new Dictionary<string, Stream> { { Transcriber.GetFilename(ticket.id), file } });
|
||||||
|
|
||||||
await logChannel.SendMessageAsync(message);
|
await logChannel.SendMessageAsync(message);
|
||||||
}
|
}
|
||||||
|
@ -104,17 +104,17 @@ public class CloseCommand : ApplicationCommandModule
|
||||||
{
|
{
|
||||||
DiscordMember staffMember = await interaction.Guild.GetMemberAsync(ticket.creatorID);
|
DiscordMember staffMember = await interaction.Guild.GetMemberAsync(ticket.creatorID);
|
||||||
await using FileStream file = new FileStream(Transcriber.GetPath(ticket.id), FileMode.Open, FileAccess.Read);
|
await using FileStream file = new FileStream(Transcriber.GetPath(ticket.id), FileMode.Open, FileAccess.Read);
|
||||||
|
|
||||||
DiscordMessageBuilder message = new DiscordMessageBuilder();
|
DiscordMessageBuilder message = new DiscordMessageBuilder();
|
||||||
message.WithEmbed(embed);
|
message.WithEmbed(embed);
|
||||||
message.WithFiles(new Dictionary<string, Stream> { { Transcriber.GetFilename(ticket.id), file } });
|
message.AddFiles(new Dictionary<string, Stream> { { Transcriber.GetFilename(ticket.id), file } });
|
||||||
|
|
||||||
await staffMember.SendMessageAsync(message);
|
await staffMember.SendMessageAsync(message);
|
||||||
}
|
}
|
||||||
catch (NotFoundException) { }
|
catch (NotFoundException) { }
|
||||||
catch (UnauthorizedException) { }
|
catch (UnauthorizedException) { }
|
||||||
}
|
}
|
||||||
|
|
||||||
Database.ArchiveTicket(ticket);
|
Database.ArchiveTicket(ticket);
|
||||||
|
|
||||||
await interaction.EditOriginalResponseAsync(new DiscordWebhookBuilder().AddEmbed(new DiscordEmbedBuilder
|
await interaction.EditOriginalResponseAsync(new DiscordWebhookBuilder().AddEmbed(new DiscordEmbedBuilder
|
||||||
|
@ -124,7 +124,7 @@ public class CloseCommand : ApplicationCommandModule
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
|
||||||
await Task.Delay(3000);
|
await Task.Delay(3000);
|
||||||
|
|
||||||
// Delete the channel and database entry
|
// Delete the channel and database entry
|
||||||
await interaction.Channel.DeleteAsync("Ticket closed.");
|
await interaction.Channel.DeleteAsync("Ticket closed.");
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using DSharpPlus;
|
using DSharpPlus;
|
||||||
|
@ -26,21 +26,21 @@ public class CreateButtonPanelCommand : ApplicationCommandModule
|
||||||
}, true);
|
}, true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
verifiedCategories = verifiedCategories.OrderBy(x => x.name).ToList();
|
verifiedCategories = verifiedCategories.OrderBy(x => x.name).ToList();
|
||||||
|
|
||||||
int nrOfButtons = 0;
|
int nrOfButtons = 0;
|
||||||
for (int nrOfButtonRows = 0; nrOfButtonRows < 5 && nrOfButtons < verifiedCategories.Count; nrOfButtonRows++)
|
for (int nrOfButtonRows = 0; nrOfButtonRows < 5 && nrOfButtons < verifiedCategories.Count; nrOfButtonRows++)
|
||||||
{
|
{
|
||||||
List<DiscordButtonComponent> buttonRow = new List<DiscordButtonComponent>();
|
List<DiscordButtonComponent> buttonRow = new List<DiscordButtonComponent>();
|
||||||
|
|
||||||
for (; nrOfButtons < 5 * (nrOfButtonRows + 1) && nrOfButtons < verifiedCategories.Count; nrOfButtons++)
|
for (; nrOfButtons < 5 * (nrOfButtonRows + 1) && nrOfButtons < verifiedCategories.Count; nrOfButtons++)
|
||||||
{
|
{
|
||||||
buttonRow.Add(new DiscordButtonComponent(ButtonStyle.Primary, "breadcraft_newticketbutton " + verifiedCategories[nrOfButtons].id, verifiedCategories[nrOfButtons].name));
|
buttonRow.Add(new DiscordButtonComponent(ButtonStyle.Primary, "bcsupport_newticketbutton " + verifiedCategories[nrOfButtons].id, verifiedCategories[nrOfButtons].name));
|
||||||
}
|
}
|
||||||
builder.AddComponents(buttonRow);
|
builder.AddComponents(buttonRow);
|
||||||
}
|
}
|
||||||
|
|
||||||
await command.Channel.SendMessageAsync(builder);
|
await command.Channel.SendMessageAsync(builder);
|
||||||
await command.CreateResponseAsync(new DiscordEmbedBuilder
|
await command.CreateResponseAsync(new DiscordEmbedBuilder
|
||||||
{
|
{
|
||||||
|
@ -48,17 +48,17 @@ public class CreateButtonPanelCommand : ApplicationCommandModule
|
||||||
Description = "Successfully created message, make sure to run this command again if you add new categories to the bot."
|
Description = "Successfully created message, make sure to run this command again if you add new categories to the bot."
|
||||||
}, true);
|
}, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static async Task OnButtonUsed(DiscordInteraction interaction)
|
public static async Task OnButtonUsed(DiscordInteraction interaction)
|
||||||
{
|
{
|
||||||
await interaction.CreateResponseAsync(InteractionResponseType.DeferredChannelMessageWithSource, new DiscordInteractionResponseBuilder().AsEphemeral());
|
await interaction.CreateResponseAsync(InteractionResponseType.DeferredChannelMessageWithSource, new DiscordInteractionResponseBuilder().AsEphemeral());
|
||||||
|
|
||||||
if (!ulong.TryParse(interaction.Data.CustomId.Replace("breadcraft_newticketbutton ", ""), out ulong categoryID) || categoryID == 0)
|
if (!ulong.TryParse(interaction.Data.CustomId.Replace("bcsupport_newticketbutton ", ""), out ulong categoryID) || categoryID == 0)
|
||||||
{
|
{
|
||||||
Logger.Warn("Invalid ID: " + interaction.Data.CustomId.Replace("breadcraft_newticketbutton ", ""));
|
Logger.Warn("Invalid ID: " + interaction.Data.CustomId.Replace("bcsupport_newticketbutton ", ""));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
(bool success, string message) = await NewCommand.OpenNewTicket(interaction.User.Id, interaction.ChannelId, categoryID);
|
(bool success, string message) = await NewCommand.OpenNewTicket(interaction.User.Id, interaction.ChannelId, categoryID);
|
||||||
|
|
||||||
if (success)
|
if (success)
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using DSharpPlus;
|
using DSharpPlus;
|
||||||
|
@ -17,7 +17,7 @@ public class CreateSelectionBoxPanelCommand : ApplicationCommandModule
|
||||||
DiscordMessageBuilder builder = new DiscordMessageBuilder()
|
DiscordMessageBuilder builder = new DiscordMessageBuilder()
|
||||||
.WithContent(" ")
|
.WithContent(" ")
|
||||||
.AddComponents(await GetSelectComponents(command, message ?? "Open new ticket..."));
|
.AddComponents(await GetSelectComponents(command, message ?? "Open new ticket..."));
|
||||||
|
|
||||||
await command.Channel.SendMessageAsync(builder);
|
await command.Channel.SendMessageAsync(builder);
|
||||||
await command.CreateResponseAsync(new DiscordEmbedBuilder
|
await command.CreateResponseAsync(new DiscordEmbedBuilder
|
||||||
{
|
{
|
||||||
|
@ -25,25 +25,25 @@ public class CreateSelectionBoxPanelCommand : ApplicationCommandModule
|
||||||
Description = "Successfully created message, make sure to run this command again if you add new categories to the bot."
|
Description = "Successfully created message, make sure to run this command again if you add new categories to the bot."
|
||||||
}, true);
|
}, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static async Task<List<DiscordSelectComponent>> GetSelectComponents(InteractionContext command, string placeholder)
|
public static async Task<List<DiscordSelectComponent>> GetSelectComponents(InteractionContext command, string placeholder)
|
||||||
{
|
{
|
||||||
List<Database.Category> verifiedCategories = await Utilities.GetVerifiedChannels();
|
List<Database.Category> verifiedCategories = await Utilities.GetVerifiedChannels();
|
||||||
|
|
||||||
if (verifiedCategories.Count == 0) return new List<DiscordSelectComponent>();
|
if (verifiedCategories.Count == 0) return new List<DiscordSelectComponent>();
|
||||||
|
|
||||||
verifiedCategories = verifiedCategories.OrderBy(x => x.name).ToList();
|
verifiedCategories = verifiedCategories.OrderBy(x => x.name).ToList();
|
||||||
List<DiscordSelectComponent> selectionComponents = new List<DiscordSelectComponent>();
|
List<DiscordSelectComponent> selectionComponents = new List<DiscordSelectComponent>();
|
||||||
int selectionOptions = 0;
|
int selectionOptions = 0;
|
||||||
for (int selectionBoxes = 0; selectionBoxes < 5 && selectionOptions < verifiedCategories.Count; selectionBoxes++)
|
for (int selectionBoxes = 0; selectionBoxes < 5 && selectionOptions < verifiedCategories.Count; selectionBoxes++)
|
||||||
{
|
{
|
||||||
List<DiscordSelectComponentOption> categoryOptions = new List<DiscordSelectComponentOption>();
|
List<DiscordSelectComponentOption> categoryOptions = new List<DiscordSelectComponentOption>();
|
||||||
|
|
||||||
for (; selectionOptions < 25 * (selectionBoxes + 1) && selectionOptions < verifiedCategories.Count; selectionOptions++)
|
for (; selectionOptions < 25 * (selectionBoxes + 1) && selectionOptions < verifiedCategories.Count; selectionOptions++)
|
||||||
{
|
{
|
||||||
categoryOptions.Add(new DiscordSelectComponentOption(verifiedCategories[selectionOptions].name, verifiedCategories[selectionOptions].id.ToString()));
|
categoryOptions.Add(new DiscordSelectComponentOption(verifiedCategories[selectionOptions].name, verifiedCategories[selectionOptions].id.ToString()));
|
||||||
}
|
}
|
||||||
selectionComponents.Add(new DiscordSelectComponent("breadcraft_newticketselector" + selectionBoxes, placeholder, categoryOptions, false, 0, 1));
|
selectionComponents.Add(new DiscordSelectComponent("bcsupport_newticketselector" + selectionBoxes, placeholder, categoryOptions, false, 0, 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
return selectionComponents;
|
return selectionComponents;
|
||||||
|
@ -52,7 +52,7 @@ public class CreateSelectionBoxPanelCommand : ApplicationCommandModule
|
||||||
public static async Task OnSelectionMenuUsed(DiscordInteraction interaction)
|
public static async Task OnSelectionMenuUsed(DiscordInteraction interaction)
|
||||||
{
|
{
|
||||||
if (interaction.Data.Values == null || interaction.Data.Values.Length <= 0) return;
|
if (interaction.Data.Values == null || interaction.Data.Values.Length <= 0) return;
|
||||||
|
|
||||||
if (!ulong.TryParse(interaction.Data.Values[0], out ulong categoryID) || categoryID == 0) return;
|
if (!ulong.TryParse(interaction.Data.Values[0], out ulong categoryID) || categoryID == 0) return;
|
||||||
|
|
||||||
await interaction.CreateResponseAsync(InteractionResponseType.DeferredChannelMessageWithSource, new DiscordInteractionResponseBuilder().AsEphemeral());
|
await interaction.CreateResponseAsync(InteractionResponseType.DeferredChannelMessageWithSource, new DiscordInteractionResponseBuilder().AsEphemeral());
|
||||||
|
|
|
@ -15,7 +15,7 @@ public class ListAssignedCommand : ApplicationCommandModule
|
||||||
public async Task OnExecute(InteractionContext command, [Option("User", "(Optional) User to list tickets for.")] DiscordUser user = null)
|
public async Task OnExecute(InteractionContext command, [Option("User", "(Optional) User to list tickets for.")] DiscordUser user = null)
|
||||||
{
|
{
|
||||||
DiscordUser listUser = user == null ? command.User : user;
|
DiscordUser listUser = user == null ? command.User : user;
|
||||||
|
|
||||||
if (!Database.TryGetAssignedTickets(listUser.Id, out List<Database.Ticket> assignedTickets))
|
if (!Database.TryGetAssignedTickets(listUser.Id, out List<Database.Ticket> assignedTickets))
|
||||||
{
|
{
|
||||||
await command.CreateResponseAsync(new DiscordEmbedBuilder
|
await command.CreateResponseAsync(new DiscordEmbedBuilder
|
||||||
|
@ -42,7 +42,7 @@ public class ListAssignedCommand : ApplicationCommandModule
|
||||||
Description = message
|
Description = message
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add the footers
|
// Add the footers
|
||||||
for (int i = 0; i < embeds.Count; i++)
|
for (int i = 0; i < embeds.Count; i++)
|
||||||
{
|
{
|
||||||
|
@ -51,7 +51,7 @@ public class ListAssignedCommand : ApplicationCommandModule
|
||||||
Text = $"Page {i + 1} / {embeds.Count}"
|
Text = $"Page {i + 1} / {embeds.Count}"
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
List<Page> listPages = new List<Page>();
|
List<Page> listPages = new List<Page>();
|
||||||
foreach (DiscordEmbedBuilder embed in embeds)
|
foreach (DiscordEmbedBuilder embed in embeds)
|
||||||
{
|
{
|
||||||
|
|
|
@ -24,7 +24,7 @@ public class ListCommand : ApplicationCommandModule
|
||||||
{
|
{
|
||||||
listItems.Add("**" + ticket.DiscordRelativeTime() + ":** <#" + ticket.channelID + ">\n");
|
listItems.Add("**" + ticket.DiscordRelativeTime() + ":** <#" + ticket.channelID + ">\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (string message in Utilities.ParseListIntoMessages(listItems))
|
foreach (string message in Utilities.ParseListIntoMessages(listItems))
|
||||||
{
|
{
|
||||||
openEmbeds.Add(new DiscordEmbedBuilder
|
openEmbeds.Add(new DiscordEmbedBuilder
|
||||||
|
@ -33,11 +33,11 @@ public class ListCommand : ApplicationCommandModule
|
||||||
Description = message
|
Description = message
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add the titles
|
// Add the titles
|
||||||
for (int i = 0; i < openEmbeds.Count; i++)
|
for (int i = 0; i < openEmbeds.Count; i++)
|
||||||
{
|
{
|
||||||
openEmbeds[i].Title = $"Open tickets ({i+1}/{openEmbeds.Count})";
|
openEmbeds[i].Title = $"Open tickets ({i + 1}/{openEmbeds.Count})";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -49,7 +49,7 @@ public class ListCommand : ApplicationCommandModule
|
||||||
{
|
{
|
||||||
listItems.Add("**" + ticket.DiscordRelativeTime() + ":** Ticket " + ticket.id.ToString("00000") + "\n");
|
listItems.Add("**" + ticket.DiscordRelativeTime() + ":** Ticket " + ticket.id.ToString("00000") + "\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (string message in Utilities.ParseListIntoMessages(listItems))
|
foreach (string message in Utilities.ParseListIntoMessages(listItems))
|
||||||
{
|
{
|
||||||
closedEmbeds.Add(new DiscordEmbedBuilder
|
closedEmbeds.Add(new DiscordEmbedBuilder
|
||||||
|
@ -62,7 +62,7 @@ public class ListCommand : ApplicationCommandModule
|
||||||
// Add the titles
|
// Add the titles
|
||||||
for (int i = 0; i < closedEmbeds.Count; i++)
|
for (int i = 0; i < closedEmbeds.Count; i++)
|
||||||
{
|
{
|
||||||
closedEmbeds[i].Title = $"Closed tickets ({i+1}/{closedEmbeds.Count})";
|
closedEmbeds[i].Title = $"Closed tickets ({i + 1}/{closedEmbeds.Count})";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -77,7 +77,7 @@ public class ListCommand : ApplicationCommandModule
|
||||||
Text = $"Page {i + 1} / {embeds.Count}"
|
Text = $"Page {i + 1} / {embeds.Count}"
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
if (embeds.Count == 0)
|
if (embeds.Count == 0)
|
||||||
{
|
{
|
||||||
await command.CreateResponseAsync(new DiscordEmbedBuilder
|
await command.CreateResponseAsync(new DiscordEmbedBuilder
|
||||||
|
@ -87,7 +87,7 @@ public class ListCommand : ApplicationCommandModule
|
||||||
});
|
});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
List<Page> listPages = new List<Page>();
|
List<Page> listPages = new List<Page>();
|
||||||
foreach (DiscordEmbedBuilder embed in embeds)
|
foreach (DiscordEmbedBuilder embed in embeds)
|
||||||
{
|
{
|
||||||
|
|
|
@ -39,7 +39,7 @@ public class ListOpen : ApplicationCommandModule
|
||||||
Description = message
|
Description = message
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add the footers
|
// Add the footers
|
||||||
for (int i = 0; i < embeds.Count; i++)
|
for (int i = 0; i < embeds.Count; i++)
|
||||||
{
|
{
|
||||||
|
@ -48,13 +48,13 @@ public class ListOpen : ApplicationCommandModule
|
||||||
Text = $"Page {i + 1} / {embeds.Count}"
|
Text = $"Page {i + 1} / {embeds.Count}"
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
List<Page> listPages = new List<Page>();
|
List<Page> listPages = new List<Page>();
|
||||||
foreach (DiscordEmbedBuilder embed in embeds)
|
foreach (DiscordEmbedBuilder embed in embeds)
|
||||||
{
|
{
|
||||||
listPages.Add(new Page("", embed));
|
listPages.Add(new Page("", embed));
|
||||||
}
|
}
|
||||||
|
|
||||||
await command.Interaction.SendPaginatedResponseAsync(true, command.User, listPages);
|
await command.Interaction.SendPaginatedResponseAsync(true, command.User, listPages);
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -40,7 +40,7 @@ public class ListUnassignedCommand : ApplicationCommandModule
|
||||||
Description = message
|
Description = message
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add the footers
|
// Add the footers
|
||||||
for (int i = 0; i < embeds.Count; i++)
|
for (int i = 0; i < embeds.Count; i++)
|
||||||
{
|
{
|
||||||
|
@ -49,7 +49,7 @@ public class ListUnassignedCommand : ApplicationCommandModule
|
||||||
Text = $"Page {i + 1} / {embeds.Count}"
|
Text = $"Page {i + 1} / {embeds.Count}"
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
List<Page> listPages = new List<Page>();
|
List<Page> listPages = new List<Page>();
|
||||||
foreach (DiscordEmbedBuilder embed in embeds)
|
foreach (DiscordEmbedBuilder embed in embeds)
|
||||||
{
|
{
|
||||||
|
|
|
@ -9,6 +9,7 @@ using DSharpPlus.SlashCommands;
|
||||||
using DSharpPlus.SlashCommands.Attributes;
|
using DSharpPlus.SlashCommands.Attributes;
|
||||||
|
|
||||||
namespace Breadcraft.Commands;
|
namespace Breadcraft.Commands;
|
||||||
|
|
||||||
public class NewCommand : ApplicationCommandModule
|
public class NewCommand : ApplicationCommandModule
|
||||||
{
|
{
|
||||||
[SlashRequireGuild]
|
[SlashRequireGuild]
|
||||||
|
@ -28,7 +29,7 @@ public class NewCommand : ApplicationCommandModule
|
||||||
case 1:
|
case 1:
|
||||||
await command.DeferAsync(true);
|
await command.DeferAsync(true);
|
||||||
(bool success, string message) = await OpenNewTicket(command.User.Id, command.Channel.Id, verifiedCategories[0].id);
|
(bool success, string message) = await OpenNewTicket(command.User.Id, command.Channel.Id, verifiedCategories[0].id);
|
||||||
|
|
||||||
if (success)
|
if (success)
|
||||||
{
|
{
|
||||||
await command.FollowUpAsync(new DiscordFollowupMessageBuilder().AddEmbed(new DiscordEmbedBuilder
|
await command.FollowUpAsync(new DiscordFollowupMessageBuilder().AddEmbed(new DiscordEmbedBuilder
|
||||||
|
@ -66,17 +67,17 @@ public class NewCommand : ApplicationCommandModule
|
||||||
for (int nrOfButtonRows = 0; nrOfButtonRows < 5 && nrOfButtons < verifiedCategories.Count; nrOfButtonRows++)
|
for (int nrOfButtonRows = 0; nrOfButtonRows < 5 && nrOfButtons < verifiedCategories.Count; nrOfButtonRows++)
|
||||||
{
|
{
|
||||||
List<DiscordButtonComponent> buttonRow = new List<DiscordButtonComponent>();
|
List<DiscordButtonComponent> buttonRow = new List<DiscordButtonComponent>();
|
||||||
|
|
||||||
for (; nrOfButtons < 5 * (nrOfButtonRows + 1) && nrOfButtons < verifiedCategories.Count; nrOfButtons++)
|
for (; nrOfButtons < 5 * (nrOfButtonRows + 1) && nrOfButtons < verifiedCategories.Count; nrOfButtons++)
|
||||||
{
|
{
|
||||||
buttonRow.Add(new DiscordButtonComponent(ButtonStyle.Primary, "breadcraft_newcommandbutton " + verifiedCategories[nrOfButtons].id, verifiedCategories[nrOfButtons].name));
|
buttonRow.Add(new DiscordButtonComponent(ButtonStyle.Primary, "bcsupport_newcommandbutton " + verifiedCategories[nrOfButtons].id, verifiedCategories[nrOfButtons].name));
|
||||||
}
|
}
|
||||||
builder.AddComponents(buttonRow);
|
builder.AddComponents(buttonRow);
|
||||||
}
|
}
|
||||||
|
|
||||||
await command.CreateResponseAsync(builder.AsEphemeral());
|
await command.CreateResponseAsync(builder.AsEphemeral());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static async Task CreateSelector(InteractionContext command, List<Database.Category> verifiedCategories)
|
public static async Task CreateSelector(InteractionContext command, List<Database.Category> verifiedCategories)
|
||||||
{
|
{
|
||||||
verifiedCategories = verifiedCategories.OrderBy(x => x.name).ToList();
|
verifiedCategories = verifiedCategories.OrderBy(x => x.name).ToList();
|
||||||
|
@ -85,26 +86,26 @@ public class NewCommand : ApplicationCommandModule
|
||||||
for (int selectionBoxes = 0; selectionBoxes < 5 && selectionOptions < verifiedCategories.Count; selectionBoxes++)
|
for (int selectionBoxes = 0; selectionBoxes < 5 && selectionOptions < verifiedCategories.Count; selectionBoxes++)
|
||||||
{
|
{
|
||||||
List<DiscordSelectComponentOption> categoryOptions = new List<DiscordSelectComponentOption>();
|
List<DiscordSelectComponentOption> categoryOptions = new List<DiscordSelectComponentOption>();
|
||||||
|
|
||||||
for (; selectionOptions < 25 * (selectionBoxes + 1) && selectionOptions < verifiedCategories.Count; selectionOptions++)
|
for (; selectionOptions < 25 * (selectionBoxes + 1) && selectionOptions < verifiedCategories.Count; selectionOptions++)
|
||||||
{
|
{
|
||||||
categoryOptions.Add(new DiscordSelectComponentOption(verifiedCategories[selectionOptions].name, verifiedCategories[selectionOptions].id.ToString()));
|
categoryOptions.Add(new DiscordSelectComponentOption(verifiedCategories[selectionOptions].name, verifiedCategories[selectionOptions].id.ToString()));
|
||||||
}
|
}
|
||||||
selectionComponents.Add(new DiscordSelectComponent("breadcraft_newcommandselector" + selectionBoxes, "Open new ticket...", categoryOptions, false, 0, 1));
|
selectionComponents.Add(new DiscordSelectComponent("bcsupport_newcommandselector" + selectionBoxes, "Open new ticket...", categoryOptions, false, 0, 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
await command.CreateResponseAsync(new DiscordInteractionResponseBuilder().AddComponents(selectionComponents).AsEphemeral());
|
await command.CreateResponseAsync(new DiscordInteractionResponseBuilder().AddComponents(selectionComponents).AsEphemeral());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static async Task OnCategorySelection(DiscordInteraction interaction)
|
public static async Task OnCategorySelection(DiscordInteraction interaction)
|
||||||
{
|
{
|
||||||
string stringID;
|
string stringID;
|
||||||
switch (interaction.Data.ComponentType)
|
switch (interaction.Data.ComponentType)
|
||||||
{
|
{
|
||||||
case ComponentType.Button:
|
case ComponentType.Button:
|
||||||
stringID = interaction.Data.CustomId.Replace("breadcraft_newcommandbutton ", "");
|
stringID = interaction.Data.CustomId.Replace("bcsupport_newcommandbutton ", "");
|
||||||
break;
|
break;
|
||||||
case ComponentType.Select:
|
case ComponentType.StringSelect:
|
||||||
if (interaction.Data.Values == null || interaction.Data.Values.Length <= 0) return;
|
if (interaction.Data.Values == null || interaction.Data.Values.Length <= 0) return;
|
||||||
stringID = interaction.Data.Values[0];
|
stringID = interaction.Data.Values[0];
|
||||||
break;
|
break;
|
||||||
|
@ -114,9 +115,9 @@ public class NewCommand : ApplicationCommandModule
|
||||||
default:
|
default:
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ulong.TryParse(stringID, out ulong categoryID) || categoryID == 0) return;
|
if (!ulong.TryParse(stringID, out ulong categoryID) || categoryID == 0) return;
|
||||||
|
|
||||||
await interaction.CreateResponseAsync(InteractionResponseType.DeferredMessageUpdate, new DiscordInteractionResponseBuilder().AsEphemeral());
|
await interaction.CreateResponseAsync(InteractionResponseType.DeferredMessageUpdate, new DiscordInteractionResponseBuilder().AsEphemeral());
|
||||||
|
|
||||||
(bool success, string message) = await OpenNewTicket(interaction.User.Id, interaction.ChannelId, categoryID);
|
(bool success, string message) = await OpenNewTicket(interaction.User.Id, interaction.ChannelId, categoryID);
|
||||||
|
@ -138,7 +139,7 @@ public class NewCommand : ApplicationCommandModule
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static async Task<(bool, string)> OpenNewTicket(ulong userID, ulong commandChannelID, ulong categoryID)
|
public static async Task<(bool, string)> OpenNewTicket(ulong userID, ulong commandChannelID, ulong categoryID)
|
||||||
{
|
{
|
||||||
// Check if user is blacklisted
|
// Check if user is blacklisted
|
||||||
|
@ -180,7 +181,7 @@ public class NewCommand : ApplicationCommandModule
|
||||||
{
|
{
|
||||||
return (false, "Error: Could not find you on the Discord server.");
|
return (false, "Error: Could not find you on the Discord server.");
|
||||||
}
|
}
|
||||||
|
|
||||||
DiscordChannel ticketChannel = null;
|
DiscordChannel ticketChannel = null;
|
||||||
|
|
||||||
try
|
try
|
||||||
|
@ -213,7 +214,7 @@ public class NewCommand : ApplicationCommandModule
|
||||||
Logger.Error("Exception occurred trying to modify channel: " + e);
|
Logger.Error("Exception occurred trying to modify channel: " + e);
|
||||||
Logger.Error("JsomMessage: " + e.JsonMessage);
|
Logger.Error("JsomMessage: " + e.JsonMessage);
|
||||||
}
|
}
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
await ticketChannel.AddOverwriteAsync(member, Permissions.AccessChannels);
|
await ticketChannel.AddOverwriteAsync(member, Permissions.AccessChannels);
|
||||||
|
@ -256,7 +257,7 @@ public class NewCommand : ApplicationCommandModule
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Log it if the log channel exists
|
// Log it if the log channel exists
|
||||||
DiscordChannel logChannel = category.Guild.GetChannel(Config.logChannel);
|
DiscordChannel logChannel = category.Guild.GetChannel(Config.logChannel);
|
||||||
if (logChannel != null)
|
if (logChannel != null)
|
||||||
|
@ -265,11 +266,11 @@ public class NewCommand : ApplicationCommandModule
|
||||||
{
|
{
|
||||||
Color = DiscordColor.Green,
|
Color = DiscordColor.Green,
|
||||||
Description = "Ticket " + ticketChannel.Mention + " opened by " + member.Mention + ".\n",
|
Description = "Ticket " + ticketChannel.Mention + " opened by " + member.Mention + ".\n",
|
||||||
Footer = new DiscordEmbedBuilder.EmbedFooter {Text = "Ticket " + ticketID}
|
Footer = new DiscordEmbedBuilder.EmbedFooter { Text = "Ticket " + ticketID }
|
||||||
};
|
};
|
||||||
await logChannel.SendMessageAsync(logMessage);
|
await logChannel.SendMessageAsync(logMessage);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (true, "Ticket opened, " + member.Mention + "!\n" + ticketChannel.Mention);
|
return (true, "Ticket opened, " + member.Mention + "!\n" + ticketChannel.Mention);
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -63,7 +63,7 @@ public class RandomAssignCommand : ApplicationCommandModule
|
||||||
Description = "You have been randomly assigned to a support ticket: " + command.Channel.Mention
|
Description = "You have been randomly assigned to a support ticket: " + command.Channel.Mention
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
catch (UnauthorizedException) {}
|
catch (UnauthorizedException) { }
|
||||||
}
|
}
|
||||||
|
|
||||||
// Log it if the log channel exists
|
// Log it if the log channel exists
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using DSharpPlus.Entities;
|
using DSharpPlus.Entities;
|
||||||
using DSharpPlus.SlashCommands;
|
using DSharpPlus.SlashCommands;
|
||||||
using DSharpPlus.SlashCommands.Attributes;
|
using DSharpPlus.SlashCommands.Attributes;
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
using DSharpPlus.Entities;
|
using DSharpPlus.Entities;
|
||||||
using DSharpPlus.SlashCommands;
|
using DSharpPlus.SlashCommands;
|
||||||
using DSharpPlus.SlashCommands.Attributes;
|
using DSharpPlus.SlashCommands.Attributes;
|
||||||
using MySql.Data.MySqlClient;
|
using MySqlConnector;
|
||||||
|
|
||||||
namespace Breadcraft.Commands;
|
namespace Breadcraft.Commands;
|
||||||
|
|
||||||
|
|
|
@ -56,12 +56,12 @@ public class SayCommand : ApplicationCommandModule
|
||||||
}, true);
|
}, true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
await command.CreateResponseAsync(new DiscordEmbedBuilder
|
await command.CreateResponseAsync(new DiscordEmbedBuilder
|
||||||
{
|
{
|
||||||
Color = DiscordColor.Cyan,
|
Color = DiscordColor.Cyan,
|
||||||
Description = message.message.Replace("\\n", "\n")
|
Description = message.message.Replace("\\n", "\n")
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -2,7 +2,7 @@
|
||||||
using DSharpPlus.Entities;
|
using DSharpPlus.Entities;
|
||||||
using DSharpPlus.SlashCommands;
|
using DSharpPlus.SlashCommands;
|
||||||
using DSharpPlus.SlashCommands.Attributes;
|
using DSharpPlus.SlashCommands.Attributes;
|
||||||
using MySql.Data.MySqlClient;
|
using MySqlConnector;
|
||||||
|
|
||||||
namespace Breadcraft.Commands;
|
namespace Breadcraft.Commands;
|
||||||
|
|
||||||
|
@ -32,7 +32,7 @@ public class SetSummaryCommand : ApplicationCommandModule
|
||||||
update.Prepare();
|
update.Prepare();
|
||||||
update.ExecuteNonQuery();
|
update.ExecuteNonQuery();
|
||||||
update.Dispose();
|
update.Dispose();
|
||||||
|
|
||||||
await command.CreateResponseAsync(new DiscordEmbedBuilder
|
await command.CreateResponseAsync(new DiscordEmbedBuilder
|
||||||
{
|
{
|
||||||
Color = DiscordColor.Green,
|
Color = DiscordColor.Green,
|
||||||
|
|
|
@ -15,12 +15,12 @@ public class StatusCommand : ApplicationCommandModule
|
||||||
long closedTickets = Database.GetNumberOfClosedTickets();
|
long closedTickets = Database.GetNumberOfClosedTickets();
|
||||||
|
|
||||||
DiscordEmbed botInfo = new DiscordEmbedBuilder()
|
DiscordEmbed botInfo = new DiscordEmbedBuilder()
|
||||||
.WithAuthor("BreadCraft-staff/Breadcraft-Support @ GitHub", "https://github.com/BreadCraft-staff/Breadcraft-Support", "https://cdn.discordapp.com/attachments/765441543100170271/905694651573489674/german_breadcraft.png")
|
.WithAuthor("BreadCraft-staff/Breadcraft-Support @ GitHub", "https://github.com/BreadCraft-staff/Breadcraft-Support", "https://cdn.discordapp.com/attachments/765441543100170271/905694651573489674/german_breadcraft.png")
|
||||||
.WithTitle("Bot information")
|
.WithTitle("Bot information")
|
||||||
.WithColor(DiscordColor.Cyan)
|
.WithColor(DiscordColor.Cyan)
|
||||||
.AddField("Version:", Breadcraft.GetVersion())
|
.AddField("Version:", Breadcraft.GetVersion())
|
||||||
.AddField("Open tickets:", openTickets + "", true)
|
.AddField("Open tickets:", openTickets + "", true)
|
||||||
.AddField("Closed tickets:", closedTickets + " ", true);
|
.AddField("Closed tickets:", closedTickets + " ", true);
|
||||||
await command.CreateResponseAsync(botInfo);
|
await command.CreateResponseAsync(botInfo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,7 +12,7 @@ public class ToggleActiveCommand : ApplicationCommandModule
|
||||||
public async Task OnExecute(InteractionContext command, [Option("User", "(Optional) Staff member to toggle activity for.")] DiscordUser user = null)
|
public async Task OnExecute(InteractionContext command, [Option("User", "(Optional) Staff member to toggle activity for.")] DiscordUser user = null)
|
||||||
{
|
{
|
||||||
DiscordUser staffUser = user == null ? command.User : user;
|
DiscordUser staffUser = user == null ? command.User : user;
|
||||||
|
|
||||||
// Check if ticket exists in the database
|
// Check if ticket exists in the database
|
||||||
if (!Database.TryGetStaff(staffUser.Id, out Database.StaffMember staffMember))
|
if (!Database.TryGetStaff(staffUser.Id, out Database.StaffMember staffMember))
|
||||||
{
|
{
|
||||||
|
|
|
@ -45,7 +45,7 @@ public class TranscriptCommand : ApplicationCommandModule
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// If the ticket is still open, generate a new fresh transcript
|
// If the ticket is still open, generate a new fresh transcript
|
||||||
if (Database.TryGetOpenTicketByID((uint)ticketID, out ticket) && ticket?.creatorID == command.Member.Id)
|
if (Database.TryGetOpenTicketByID((uint)ticketID, out ticket) && ticket?.creatorID == command.Member.Id)
|
||||||
|
@ -82,7 +82,7 @@ public class TranscriptCommand : ApplicationCommandModule
|
||||||
if (logChannel != null)
|
if (logChannel != null)
|
||||||
{
|
{
|
||||||
await using FileStream file = new FileStream(Transcriber.GetPath(ticket.id), FileMode.Open, FileAccess.Read);
|
await using FileStream file = new FileStream(Transcriber.GetPath(ticket.id), FileMode.Open, FileAccess.Read);
|
||||||
|
|
||||||
DiscordMessageBuilder message = new DiscordMessageBuilder();
|
DiscordMessageBuilder message = new DiscordMessageBuilder();
|
||||||
message.WithEmbed(new DiscordEmbedBuilder
|
message.WithEmbed(new DiscordEmbedBuilder
|
||||||
{
|
{
|
||||||
|
@ -90,7 +90,7 @@ public class TranscriptCommand : ApplicationCommandModule
|
||||||
Description = "Ticket " + ticket.id.ToString("00000") + " transcript generated by " + command.Member.Mention + ".\n",
|
Description = "Ticket " + ticket.id.ToString("00000") + " transcript generated by " + command.Member.Mention + ".\n",
|
||||||
Footer = new DiscordEmbedBuilder.EmbedFooter { Text = '#' + command.Channel.Name }
|
Footer = new DiscordEmbedBuilder.EmbedFooter { Text = '#' + command.Channel.Name }
|
||||||
});
|
});
|
||||||
message.WithFiles(new Dictionary<string, Stream> { { Transcriber.GetFilename(ticket.id), file } });
|
message.AddFiles(new Dictionary<string, Stream> { { Transcriber.GetFilename(ticket.id), file } });
|
||||||
|
|
||||||
await logChannel.SendMessageAsync(message);
|
await logChannel.SendMessageAsync(message);
|
||||||
}
|
}
|
||||||
|
@ -99,14 +99,14 @@ public class TranscriptCommand : ApplicationCommandModule
|
||||||
{
|
{
|
||||||
// Send transcript in a direct message
|
// Send transcript in a direct message
|
||||||
await using FileStream file = new FileStream(Transcriber.GetPath(ticket.id), FileMode.Open, FileAccess.Read);
|
await using FileStream file = new FileStream(Transcriber.GetPath(ticket.id), FileMode.Open, FileAccess.Read);
|
||||||
|
|
||||||
DiscordMessageBuilder directMessage = new DiscordMessageBuilder();
|
DiscordMessageBuilder directMessage = new DiscordMessageBuilder();
|
||||||
directMessage.WithEmbed(new DiscordEmbedBuilder
|
directMessage.WithEmbed(new DiscordEmbedBuilder
|
||||||
{
|
{
|
||||||
Color = DiscordColor.Green,
|
Color = DiscordColor.Green,
|
||||||
Description = "Transcript generated!\n"
|
Description = "Transcript generated!\n"
|
||||||
});
|
});
|
||||||
directMessage.WithFiles(new Dictionary<string, Stream> { { Transcriber.GetFilename(ticket.id), file } });
|
directMessage.AddFiles(new Dictionary<string, Stream> { { Transcriber.GetFilename(ticket.id), file } });
|
||||||
|
|
||||||
await command.Member.SendMessageAsync(directMessage);
|
await command.Member.SendMessageAsync(directMessage);
|
||||||
}
|
}
|
||||||
|
@ -119,7 +119,7 @@ public class TranscriptCommand : ApplicationCommandModule
|
||||||
}));
|
}));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
await command.EditResponseAsync(new DiscordWebhookBuilder().AddEmbed(new DiscordEmbedBuilder
|
await command.EditResponseAsync(new DiscordWebhookBuilder().AddEmbed(new DiscordEmbedBuilder
|
||||||
{
|
{
|
||||||
Color = DiscordColor.Green,
|
Color = DiscordColor.Green,
|
||||||
|
|
|
@ -89,7 +89,7 @@ internal static class Config
|
||||||
hostName = json.SelectToken("database.address")?.Value<string>() ?? "";
|
hostName = json.SelectToken("database.address")?.Value<string>() ?? "";
|
||||||
port = json.SelectToken("database.port")?.Value<int>() ?? 3306;
|
port = json.SelectToken("database.port")?.Value<int>() ?? 3306;
|
||||||
database = json.SelectToken("database.name")?.Value<string>() ?? "breadcraftsupport";
|
database = json.SelectToken("database.name")?.Value<string>() ?? "breadcraftsupport";
|
||||||
username = json.SelectToken("database.user")?.Value<string>() ?? "breadcraftsupport";
|
username = json.SelectToken("database.user")?.Value<string>() ?? "bcstaff";
|
||||||
password = json.SelectToken("database.password")?.Value<string>() ?? "";
|
password = json.SelectToken("database.password")?.Value<string>() ?? "";
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -2,7 +2,7 @@
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using DSharpPlus;
|
using DSharpPlus;
|
||||||
using MySql.Data.MySqlClient;
|
using MySqlConnector;
|
||||||
|
|
||||||
namespace Breadcraft;
|
namespace Breadcraft;
|
||||||
|
|
||||||
|
|
|
@ -14,262 +14,272 @@ namespace Breadcraft;
|
||||||
|
|
||||||
internal static class EventHandler
|
internal static class EventHandler
|
||||||
{
|
{
|
||||||
internal static Task OnReady(DiscordClient client, ReadyEventArgs e)
|
internal static Task OnReady(DiscordClient client, ReadyEventArgs e)
|
||||||
{
|
{
|
||||||
Logger.Log("Client is ready to process events.");
|
Logger.Log("Client is ready to process events.");
|
||||||
|
|
||||||
// Checking activity type
|
// Checking activity type
|
||||||
if (!Enum.TryParse(Config.presenceType, true, out ActivityType activityType))
|
if (!Enum.TryParse(Config.presenceType, true, out ActivityType activityType))
|
||||||
{
|
{
|
||||||
Logger.Log("Presence type '" + Config.presenceType + "' invalid, using 'Playing' instead.");
|
Logger.Log("Presence type '" + Config.presenceType + "' invalid, using 'Playing' instead.");
|
||||||
activityType = ActivityType.Playing;
|
activityType = ActivityType.Playing;
|
||||||
}
|
}
|
||||||
|
|
||||||
client.UpdateStatusAsync(new DiscordActivity(Config.presenceText, activityType), UserStatus.Online);
|
client.UpdateStatusAsync(new DiscordActivity(Config.presenceText, activityType), UserStatus.Online);
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static Task OnGuildAvailable(DiscordClient _, GuildCreateEventArgs e)
|
internal static Task OnGuildAvailable(DiscordClient _, GuildCreateEventArgs e)
|
||||||
{
|
{
|
||||||
Logger.Log("Guild available: " + e.Guild.Name);
|
Logger.Log("Guild available: " + e.Guild.Name);
|
||||||
|
|
||||||
IReadOnlyDictionary<ulong, DiscordRole> roles = e.Guild.Roles;
|
IReadOnlyDictionary<ulong, DiscordRole> roles = e.Guild.Roles;
|
||||||
|
|
||||||
foreach ((ulong roleID, DiscordRole role) in roles)
|
foreach ((ulong roleID, DiscordRole role) in roles)
|
||||||
{
|
{
|
||||||
Logger.Log(role.Name.PadRight(40, '.') + roleID);
|
Logger.Log(role.Name.PadRight(40, '.') + roleID);
|
||||||
}
|
}
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static Task OnClientError(DiscordClient _, ClientErrorEventArgs e)
|
internal static Task OnClientError(DiscordClient _, ClientErrorEventArgs e)
|
||||||
{
|
{
|
||||||
Logger.Error("Client exception occured:\n" + e.Exception);
|
Logger.Error("Client exception occured:\n" + e.Exception);
|
||||||
switch (e.Exception)
|
switch (e.Exception)
|
||||||
{
|
{
|
||||||
case BadRequestException ex:
|
case BadRequestException ex:
|
||||||
Logger.Error("JSON Message: " + ex.JsonMessage);
|
Logger.Error("JSON Message: " + ex.JsonMessage);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static async Task OnMessageCreated(DiscordClient client, MessageCreateEventArgs e)
|
internal static async Task OnMessageCreated(DiscordClient client, MessageCreateEventArgs e)
|
||||||
{
|
{
|
||||||
if (e.Author.IsBot)
|
if (e.Author.IsBot)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if ticket exists in the database and ticket notifications are enabled
|
// Check if ticket exists in the database and ticket notifications are enabled
|
||||||
if (!Database.TryGetOpenTicket(e.Channel.Id, out Database.Ticket ticket) || !Config.ticketUpdatedNotifications)
|
if (!Database.TryGetOpenTicket(e.Channel.Id, out Database.Ticket ticket) || !Config.ticketUpdatedNotifications)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sends a DM to the assigned staff member if at least a day has gone by since the last message and the user sending the message isn't staff
|
// Sends a DM to the assigned staff member if at least a day has gone by since the last message and the user sending the message isn't staff
|
||||||
IReadOnlyList<DiscordMessage> messages = await e.Channel.GetMessagesAsync(2);
|
IReadOnlyList<DiscordMessage> messages = await e.Channel.GetMessagesAsync(2);
|
||||||
if (messages.Count > 1 && messages[1].Timestamp < DateTimeOffset.UtcNow.AddDays(Config.ticketUpdatedNotificationDelay * -1) && !Database.IsStaff(e.Author.Id))
|
if (messages.Count > 1 && messages[1].Timestamp < DateTimeOffset.UtcNow.AddDays(Config.ticketUpdatedNotificationDelay * -1) && !Database.IsStaff(e.Author.Id))
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
DiscordMember staffMember = await e.Guild.GetMemberAsync(ticket.assignedStaffID);
|
DiscordMember staffMember = await e.Guild.GetMemberAsync(ticket.assignedStaffID);
|
||||||
await staffMember.SendMessageAsync(new DiscordEmbedBuilder
|
await staffMember.SendMessageAsync(new DiscordEmbedBuilder
|
||||||
{
|
{
|
||||||
Color = DiscordColor.Green,
|
Color = DiscordColor.Green,
|
||||||
Description = "A ticket you are assigned to has been updated: " + e.Channel.Mention
|
Description = "A ticket you are assigned to has been updated: " + e.Channel.Mention
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
catch (NotFoundException) { }
|
catch (NotFoundException) { }
|
||||||
catch (UnauthorizedException) { }
|
catch (UnauthorizedException) { }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static async Task OnCommandError(SlashCommandsExtension commandSystem, SlashCommandErrorEventArgs e)
|
internal static async Task OnCommandError(SlashCommandsExtension commandSystem, SlashCommandErrorEventArgs e)
|
||||||
{
|
{
|
||||||
switch (e.Exception)
|
switch (e.Exception)
|
||||||
{
|
{
|
||||||
case SlashExecutionChecksFailedException checksFailedException:
|
case SlashExecutionChecksFailedException checksFailedException:
|
||||||
{
|
{
|
||||||
foreach (SlashCheckBaseAttribute attr in checksFailedException.FailedChecks)
|
foreach (SlashCheckBaseAttribute attr in checksFailedException.FailedChecks)
|
||||||
{
|
{
|
||||||
await e.Context.Channel.SendMessageAsync(new DiscordEmbedBuilder
|
await e.Context.Channel.SendMessageAsync(new DiscordEmbedBuilder
|
||||||
{
|
{
|
||||||
Color = DiscordColor.Red,
|
Color = DiscordColor.Red,
|
||||||
Description = ParseFailedCheck(attr)
|
Description = ParseFailedCheck(attr)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
case BadRequestException ex:
|
|
||||||
Logger.Error("Command exception occured:\n" + e.Exception);
|
|
||||||
Logger.Error("JSON Message: " + ex.JsonMessage);
|
|
||||||
return;
|
|
||||||
|
|
||||||
default:
|
case BadRequestException ex:
|
||||||
{
|
Logger.Error("Command exception occured:\n" + e.Exception);
|
||||||
Logger.Error("Exception occured: " + e.Exception.GetType() + ": " + e.Exception);
|
Logger.Error("JSON Message: " + ex.JsonMessage);
|
||||||
await e.Context.Channel.SendMessageAsync(new DiscordEmbedBuilder
|
return;
|
||||||
{
|
|
||||||
Color = DiscordColor.Red,
|
|
||||||
Description = "Internal error occured, please report this to the developer."
|
|
||||||
});
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
internal static async Task OnMemberAdded(DiscordClient client, GuildMemberAddEventArgs e)
|
default:
|
||||||
{
|
{
|
||||||
if (!Database.TryGetOpenTickets(e.Member.Id, out List<Database.Ticket> ownTickets))
|
Logger.Error("Exception occured: " + e.Exception.GetType() + ": " + e.Exception);
|
||||||
{
|
await e.Context.Channel.SendMessageAsync(new DiscordEmbedBuilder
|
||||||
return;
|
{
|
||||||
}
|
Color = DiscordColor.Red,
|
||||||
|
Description = "Internal error occured, please report this to the developer."
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
foreach (Database.Ticket ticket in ownTickets)
|
internal static async Task OnMemberAdded(DiscordClient client, GuildMemberAddEventArgs e)
|
||||||
{
|
{
|
||||||
try
|
if (!Database.TryGetOpenTickets(e.Member.Id, out List<Database.Ticket> ownTickets))
|
||||||
{
|
{
|
||||||
DiscordChannel channel = await client.GetChannelAsync(ticket.channelID);
|
return;
|
||||||
if (channel?.GuildId == e.Guild.Id)
|
}
|
||||||
{
|
|
||||||
await channel.SendMessageAsync(new DiscordEmbedBuilder
|
|
||||||
{
|
|
||||||
Color = DiscordColor.Green,
|
|
||||||
Description = "User '" + e.Member.Username + "#" + e.Member.Discriminator + "' has rejoined the server, and has been re-added to the ticket."
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception) { /* ignored */ }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
internal static async Task OnMemberRemoved(DiscordClient client, GuildMemberRemoveEventArgs e)
|
foreach (Database.Ticket ticket in ownTickets)
|
||||||
{
|
{
|
||||||
if (Database.TryGetOpenTickets(e.Member.Id, out List<Database.Ticket> ownTickets))
|
try
|
||||||
{
|
{
|
||||||
foreach(Database.Ticket ticket in ownTickets)
|
DiscordChannel channel = await client.GetChannelAsync(ticket.channelID);
|
||||||
{
|
if (channel?.GuildId == e.Guild.Id)
|
||||||
try
|
{
|
||||||
{
|
try
|
||||||
DiscordChannel channel = await client.GetChannelAsync(ticket.channelID);
|
{
|
||||||
if (channel?.GuildId == e.Guild.Id)
|
await channel.AddOverwriteAsync(e.Member, Permissions.AccessChannels);
|
||||||
{
|
await channel.SendMessageAsync(new DiscordEmbedBuilder
|
||||||
await channel.SendMessageAsync(new DiscordEmbedBuilder
|
{
|
||||||
{
|
Color = DiscordColor.Green,
|
||||||
Color = DiscordColor.Red,
|
Description = "User '" + e.Member.Username + "#" + e.Member.Discriminator + "' has rejoined the server, and has been re-added to the ticket."
|
||||||
Description = "User '" + e.Member.Username + "#" + e.Member.Discriminator + "' has left the server."
|
});
|
||||||
});
|
}
|
||||||
}
|
catch (DiscordException ex)
|
||||||
}
|
{
|
||||||
catch (Exception) { /* ignored */ }
|
Logger.Error("Exception occurred trying to add channel permissions: " + ex);
|
||||||
}
|
Logger.Error("JsomMessage: " + ex.JsonMessage);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Database.TryGetAssignedTickets(e.Member.Id, out List<Database.Ticket> assignedTickets) && Config.logChannel != 0)
|
}
|
||||||
{
|
}
|
||||||
DiscordChannel logChannel = await client.GetChannelAsync(Config.logChannel);
|
catch (Exception) { /* ignored */ }
|
||||||
if (logChannel != null)
|
}
|
||||||
{
|
}
|
||||||
foreach (Database.Ticket ticket in assignedTickets)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
DiscordChannel channel = await client.GetChannelAsync(ticket.channelID);
|
|
||||||
if (channel?.GuildId == e.Guild.Id)
|
|
||||||
{
|
|
||||||
await logChannel.SendMessageAsync(new DiscordEmbedBuilder
|
|
||||||
{
|
|
||||||
Color = DiscordColor.Red,
|
|
||||||
Description = "Assigned staff member '" + e.Member.Username + "#" + e.Member.Discriminator + "' has left the server: <#" + channel.Id + ">"
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception) { /* ignored */ }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
internal static async Task OnComponentInteractionCreated(DiscordClient client, ComponentInteractionCreateEventArgs e)
|
internal static async Task OnMemberRemoved(DiscordClient client, GuildMemberRemoveEventArgs e)
|
||||||
{
|
{
|
||||||
try
|
if (Database.TryGetOpenTickets(e.Member.Id, out List<Database.Ticket> ownTickets))
|
||||||
{
|
{
|
||||||
switch (e.Interaction.Data.ComponentType)
|
foreach (Database.Ticket ticket in ownTickets)
|
||||||
{
|
{
|
||||||
case ComponentType.Button:
|
try
|
||||||
switch (e.Id)
|
{
|
||||||
{
|
DiscordChannel channel = await client.GetChannelAsync(ticket.channelID);
|
||||||
case "breadcraft_closeconfirm":
|
if (channel?.GuildId == e.Guild.Id)
|
||||||
await CloseCommand.OnConfirmed(e.Interaction);
|
{
|
||||||
return;
|
await channel.SendMessageAsync(new DiscordEmbedBuilder
|
||||||
case {} when e.Id.StartsWith("breadcraft_newcommandbutton"):
|
{
|
||||||
await NewCommand.OnCategorySelection(e.Interaction);
|
Color = DiscordColor.Red,
|
||||||
return;
|
Description = "User '" + e.Member.Username + "#" + e.Member.Discriminator + "' has left the server."
|
||||||
case {} when e.Id.StartsWith("breadcraft_newticketbutton"):
|
});
|
||||||
await CreateButtonPanelCommand.OnButtonUsed(e.Interaction);
|
}
|
||||||
return;
|
}
|
||||||
case "right":
|
catch (Exception) { /* ignored */ }
|
||||||
return;
|
}
|
||||||
case "left":
|
}
|
||||||
return;
|
|
||||||
case "rightskip":
|
if (Database.TryGetAssignedTickets(e.Member.Id, out List<Database.Ticket> assignedTickets) && Config.logChannel != 0)
|
||||||
return;
|
{
|
||||||
case "leftskip":
|
DiscordChannel logChannel = await client.GetChannelAsync(Config.logChannel);
|
||||||
return;
|
if (logChannel != null)
|
||||||
case "stop":
|
{
|
||||||
return;
|
foreach (Database.Ticket ticket in assignedTickets)
|
||||||
default:
|
{
|
||||||
Logger.Warn("Unknown button press received! '" + e.Id + "'");
|
try
|
||||||
return;
|
{
|
||||||
}
|
DiscordChannel channel = await client.GetChannelAsync(ticket.channelID);
|
||||||
case ComponentType.Select:
|
if (channel?.GuildId == e.Guild.Id)
|
||||||
switch (e.Id)
|
{
|
||||||
{
|
await logChannel.SendMessageAsync(new DiscordEmbedBuilder
|
||||||
case {} when e.Id.StartsWith("breadcraft_newcommandselector"):
|
{
|
||||||
await NewCommand.OnCategorySelection(e.Interaction);
|
Color = DiscordColor.Red,
|
||||||
return;
|
Description = "Assigned staff member '" + e.Member.Username + "#" + e.Member.Discriminator + "' has left the server: <#" + channel.Id + ">"
|
||||||
case {} when e.Id.StartsWith("breadcraft_newticketselector"):
|
});
|
||||||
await CreateSelectionBoxPanelCommand.OnSelectionMenuUsed(e.Interaction);
|
}
|
||||||
return;
|
}
|
||||||
default:
|
catch (Exception) { /* ignored */ }
|
||||||
Logger.Warn("Unknown selection box option received! '" + e.Id + "'");
|
}
|
||||||
return;
|
}
|
||||||
}
|
}
|
||||||
case ComponentType.ActionRow:
|
}
|
||||||
Logger.Warn("Unknown action row received! '" + e.Id + "'");
|
|
||||||
return;
|
internal static async Task OnComponentInteractionCreated(DiscordClient client, ComponentInteractionCreateEventArgs e)
|
||||||
case ComponentType.FormInput:
|
{
|
||||||
Logger.Warn("Unknown form input received! '" + e.Id + "'");
|
try
|
||||||
return;
|
{
|
||||||
default:
|
switch (e.Interaction.Data.ComponentType)
|
||||||
Logger.Warn("Unknown interaction type received! '" + e.Interaction.Data.ComponentType + "'");
|
{
|
||||||
break;
|
case ComponentType.Button:
|
||||||
}
|
switch (e.Id)
|
||||||
}
|
{
|
||||||
catch (DiscordException ex)
|
case "bcsupport_closeconfirm":
|
||||||
{
|
await CloseCommand.OnConfirmed(e.Interaction);
|
||||||
Logger.Error("Interaction Exception occurred: " + ex);
|
return;
|
||||||
Logger.Error("JsomMessage: " + ex.JsonMessage);
|
case { } when e.Id.StartsWith("bcsupport_newcommandbutton"):
|
||||||
}
|
await NewCommand.OnCategorySelection(e.Interaction);
|
||||||
catch (Exception ex)
|
return;
|
||||||
{
|
case { } when e.Id.StartsWith("bcsupport_newticketbutton"):
|
||||||
Logger.Error("Interaction Exception occured: " + ex.GetType() + ": " + ex);
|
await CreateButtonPanelCommand.OnButtonUsed(e.Interaction);
|
||||||
}
|
return;
|
||||||
}
|
case "right":
|
||||||
|
return;
|
||||||
private static string ParseFailedCheck(SlashCheckBaseAttribute attr)
|
case "left":
|
||||||
{
|
return;
|
||||||
return attr switch
|
case "rightskip":
|
||||||
{
|
return;
|
||||||
SlashRequireDirectMessageAttribute => "This command can only be used in direct messages!",
|
case "leftskip":
|
||||||
SlashRequireOwnerAttribute => "Only the server owner can use that command!",
|
return;
|
||||||
SlashRequirePermissionsAttribute => "You don't have permission to do that!",
|
case "stop":
|
||||||
SlashRequireBotPermissionsAttribute => "The bot doesn't have the required permissions to do that!",
|
return;
|
||||||
SlashRequireUserPermissionsAttribute => "You don't have permission to do that!",
|
default:
|
||||||
SlashRequireGuildAttribute => "This command has to be used in a Discord server!",
|
Logger.Warn("Unknown button press received! '" + e.Id + "'");
|
||||||
_ => "Unknown Discord API error occured, please try again later."
|
return;
|
||||||
};
|
}
|
||||||
}
|
case ComponentType.StringSelect:
|
||||||
|
switch (e.Id)
|
||||||
|
{
|
||||||
|
case { } when e.Id.StartsWith("bcsupport_newcommandselector"):
|
||||||
|
await NewCommand.OnCategorySelection(e.Interaction);
|
||||||
|
return;
|
||||||
|
case { } when e.Id.StartsWith("bcsupport_newticketselector"):
|
||||||
|
await CreateSelectionBoxPanelCommand.OnSelectionMenuUsed(e.Interaction);
|
||||||
|
return;
|
||||||
|
default:
|
||||||
|
Logger.Warn("Unknown selection box option received! '" + e.Id + "'");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
case ComponentType.ActionRow:
|
||||||
|
Logger.Warn("Unknown action row received! '" + e.Id + "'");
|
||||||
|
return;
|
||||||
|
case ComponentType.FormInput:
|
||||||
|
Logger.Warn("Unknown form input received! '" + e.Id + "'");
|
||||||
|
return;
|
||||||
|
default:
|
||||||
|
Logger.Warn("Unknown interaction type received! '" + e.Interaction.Data.ComponentType + "'");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (DiscordException ex)
|
||||||
|
{
|
||||||
|
Logger.Error("Interaction Exception occurred: " + ex);
|
||||||
|
Logger.Error("JsomMessage: " + ex.JsonMessage);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Logger.Error("Interaction Exception occured: " + ex.GetType() + ": " + ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string ParseFailedCheck(SlashCheckBaseAttribute attr)
|
||||||
|
{
|
||||||
|
return attr switch
|
||||||
|
{
|
||||||
|
SlashRequireDirectMessageAttribute => "This command can only be used in direct messages!",
|
||||||
|
SlashRequireOwnerAttribute => "Only the server owner can use that command!",
|
||||||
|
SlashRequirePermissionsAttribute => "You don't have permission to do that!",
|
||||||
|
SlashRequireBotPermissionsAttribute => "The bot doesn't have the required permissions to do that!",
|
||||||
|
SlashRequireUserPermissionsAttribute => "You don't have permission to do that!",
|
||||||
|
SlashRequireGuildAttribute => "This command has to be used in a Discord server!",
|
||||||
|
_ => "Unknown Discord API error occured, please try again later."
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
Loading…
Reference in a new issue