154 lines
No EOL
5.7 KiB
C#
154 lines
No EOL
5.7 KiB
C#
using System;
|
|
using System.IO;
|
|
using System.Reflection;
|
|
using System.Threading.Tasks;
|
|
using DSharpPlus;
|
|
using DSharpPlus.Interactivity;
|
|
using DSharpPlus.Interactivity.Enums;
|
|
using DSharpPlus.Interactivity.Extensions;
|
|
using DSharpPlus.SlashCommands;
|
|
using Microsoft.Extensions.Logging;
|
|
using SupportChild.Commands;
|
|
|
|
namespace SupportChild;
|
|
|
|
internal static class SupportChild
|
|
{
|
|
// Sets up a dummy client to use for logging
|
|
private static readonly DiscordConfiguration config = new()
|
|
{
|
|
Token = "DUMMY_TOKEN",
|
|
TokenType = TokenType.Bot,
|
|
MinimumLogLevel = LogLevel.Debug,
|
|
AutoReconnect = true,
|
|
Intents = DiscordIntents.All,
|
|
LogTimestampFormat = "yyyy-MM-dd HH:mm:ss",
|
|
LogUnknownEvents = false
|
|
};
|
|
|
|
public static DiscordClient discordClient { get; private set; } = new(config);
|
|
|
|
private static SlashCommandsExtension commands = null;
|
|
|
|
private static void Main()
|
|
{
|
|
MainAsync().GetAwaiter().GetResult();
|
|
}
|
|
|
|
private static async Task MainAsync()
|
|
{
|
|
Logger.Log("Starting " + Assembly.GetEntryAssembly()?.GetName().Name + " version " + GetVersion() + "...");
|
|
try
|
|
{
|
|
Reload();
|
|
|
|
// Block this task until the program is closed.
|
|
await Task.Delay(-1);
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
Logger.Fatal("Fatal error:\n" + e);
|
|
Console.ReadLine();
|
|
}
|
|
}
|
|
|
|
public static string GetVersion()
|
|
{
|
|
Version version = Assembly.GetEntryAssembly()?.GetName().Version;
|
|
return version?.Major + "." + version?.Minor + "." + version?.Build + (version?.Revision == 0 ? "" : "-" + (char)(64 + version?.Revision ?? 0));
|
|
}
|
|
|
|
public static async void Reload()
|
|
{
|
|
if (discordClient != null)
|
|
{
|
|
await discordClient.DisconnectAsync();
|
|
discordClient.Dispose();
|
|
}
|
|
|
|
Logger.Log("Loading config \"" + Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + "config.yml\"");
|
|
Config.LoadConfig();
|
|
|
|
// Check if token is unset
|
|
if (Config.token is "<add-token-here>" or "")
|
|
{
|
|
Logger.Fatal("You need to set your bot token in the config and start the bot again.");
|
|
throw new ArgumentException("Invalid Discord bot token");
|
|
}
|
|
|
|
// Database connection and setup
|
|
try
|
|
{
|
|
Logger.Log("Connecting to database... (" + Config.hostName + ":" + Config.port + ")");
|
|
Database.SetConnectionString(Config.hostName, Config.port, Config.database, Config.username, Config.password);
|
|
Database.SetupTables();
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
Logger.Fatal("Could not set up database tables, please confirm connection settings, status of the server and permissions of MySQL user. Error: " + e);
|
|
throw;
|
|
}
|
|
|
|
Logger.Log("Setting up Discord client...");
|
|
|
|
// Setting up client configuration
|
|
config.Token = Config.token;
|
|
config.MinimumLogLevel = Config.logLevel;
|
|
|
|
discordClient = new DiscordClient(config);
|
|
|
|
Logger.Log("Hooking events...");
|
|
discordClient.Ready += EventHandler.OnReady;
|
|
discordClient.GuildAvailable += EventHandler.OnGuildAvailable;
|
|
discordClient.ClientErrored += EventHandler.OnClientError;
|
|
discordClient.MessageCreated += EventHandler.OnMessageCreated;
|
|
discordClient.GuildMemberAdded += EventHandler.OnMemberAdded;
|
|
discordClient.GuildMemberRemoved += EventHandler.OnMemberRemoved;
|
|
discordClient.ComponentInteractionCreated += EventHandler.OnComponentInteractionCreated;
|
|
|
|
discordClient.UseInteractivity(new InteractivityConfiguration
|
|
{
|
|
PaginationBehaviour = PaginationBehaviour.Ignore,
|
|
PaginationDeletion = PaginationDeletion.DeleteMessage,
|
|
Timeout = TimeSpan.FromMinutes(15)
|
|
});
|
|
|
|
Logger.Log("Registering commands...");
|
|
commands = discordClient.UseSlashCommands();
|
|
|
|
commands.RegisterCommands<AddCategoryCommand>();
|
|
commands.RegisterCommands<AddCommand>();
|
|
commands.RegisterCommands<AddMessageCommand>();
|
|
commands.RegisterCommands<AddStaffCommand>();
|
|
commands.RegisterCommands<AssignCommand>();
|
|
commands.RegisterCommands<BlacklistCommand>();
|
|
commands.RegisterCommands<CloseCommand>();
|
|
commands.RegisterCommands<CreateButtonPanelCommand>();
|
|
commands.RegisterCommands<CreateSelectionBoxPanelCommand>();
|
|
commands.RegisterCommands<ListAssignedCommand>();
|
|
commands.RegisterCommands<ListCommand>();
|
|
commands.RegisterCommands<ListOpen>();
|
|
commands.RegisterCommands<ListUnassignedCommand>();
|
|
commands.RegisterCommands<MoveCommand>();
|
|
commands.RegisterCommands<NewCommand>();
|
|
commands.RegisterCommands<RandomAssignCommand>();
|
|
commands.RegisterCommands<RemoveCategoryCommand>();
|
|
commands.RegisterCommands<RemoveMessageCommand>();
|
|
commands.RegisterCommands<RemoveStaffCommand>();
|
|
commands.RegisterCommands<SayCommand>();
|
|
commands.RegisterCommands<SetSummaryCommand>();
|
|
commands.RegisterCommands<StatusCommand>();
|
|
commands.RegisterCommands<SummaryCommand>();
|
|
commands.RegisterCommands<ToggleActiveCommand>();
|
|
commands.RegisterCommands<TranscriptCommand>();
|
|
commands.RegisterCommands<UnassignCommand>();
|
|
commands.RegisterCommands<UnblacklistCommand>();
|
|
commands.RegisterCommands<AdminCommands>();
|
|
|
|
Logger.Log("Hooking command events...");
|
|
commands.SlashCommandErrored += EventHandler.OnCommandError;
|
|
|
|
Logger.Log("Connecting to Discord...");
|
|
await discordClient.ConnectAsync();
|
|
}
|
|
} |