2021-07-21 10:58:35 -04:00

168 lines
5.8 KiB
C#

using Discord;
using Discord.Commands;
using Discord.WebSocket;
using Microsoft.Extensions.DependencyInjection;
using NerdsTeaserBot.Misc;
using NerdsTeaserBot.Modules;
using NerdsTeaserBot.Modules.Commands;
using System;
using System.IO;
using System.Reflection;
using System.Threading.Tasks;
using static NerdsTeaserBot.Const;
namespace NerdsTeaserBot
{
public class Internals
{
internal static DiscordSocketClient client;
internal static CommandService commands;
internal static SocketCommandContext context;
internal static SocketUserMessage message;
internal static ServiceProvider services;
internal static DateTime upTime;
public static void Main() => RunBotAsync().GetAwaiter().GetResult();
public static async Task RunBotAsync()
{
if (File.Exists(Data.consts.Path)) Data.consts.Load();
commands = new(new()
{
CaseSensitiveCommands = false,
DefaultRunMode = RunMode.Async,
IgnoreExtraArgs = false,
LogLevel = LogSeverity.Info,
SeparatorChar = ' ',
ThrowOnError = true,
});
client = new(new()
{
AlwaysAcknowledgeInteractions = true,
AlwaysDownloadUsers = true,
ConnectionTimeout = 10000,
DefaultRetryMode = RetryMode.AlwaysFail,
ExclusiveBulkDelete = true,
GuildSubscriptions = true,
LargeThreshold = 250,
LogLevel = LogSeverity.Info,
MaxWaitBetweenGuildAvailablesBeforeReady = 250,
MessageCacheSize = 50,
RateLimitPrecision = RateLimitPrecision.Millisecond,
UseSystemClock = false,
});
services = new ServiceCollection().AddSingleton(client).AddSingleton(commands).BuildServiceProvider();
LoadBackground();
LoadHandles();
await commands.AddModulesAsync(Assembly.GetEntryAssembly(), services);
await client.LoginAsync(TokenType.Bot, Hidden.token);
await client.StartAsync();
upTime = DateTime.Now;
await Task.Delay(-1);
}
internal static void LoadHandles()
{
// client.ChannelCreated += LogModule.ChannelCreatedHandler;
// client.ChannelDestroyed += LogModule.ChannelDeletedHandler;
// client.ChannelUpdated += LogModule.ChannelModifiedHandler;
client.InteractionCreated += ButtonModule.ButtonHandler;
client.JoinedGuild += BotModule.ServerJoinedDMHandler;
client.Log += LogHandler;
// client.MessagesBulkDeleted += LogModule.MessagesPurgedHandler;
// client.MessageDeleted += LogModule.MessageDeletedHandler;
client.MessageReceived += MessageHandler;
client.MessageReceived += ModmailModule.ModmailHandler;
// client.MessageUpdated += LogModule.MessageEditedHandler;
// client.RoleCreated += LogModule.RoleCreatedHandler;
// client.RoleDeleted += LogModule.RoleDeletedHandler;
// client.RoleUpdated += LogModule.RoleModifiedHandler;
// client.GuildUpdated += LogModule.GuildModifiedHandler;
// client.UserBanned += LogModule.UserBannedHandler;
// client.UserJoined += LogModule.UserJoinedHandler;
client.UserJoined += MessagingModule.UserJoinedHandler;
// client.UserLeft += LogModule.UserLeftHandler;
client.UserLeft += MessagingModule.UserLeftHandler;
// client.UserUnbanned += LogModule.UserUnbannedHandler;
// client.UserUpdated += LogModule.UserModifiedHandler;
HandlesModule.OnUserMessageRecieved += LevelModule.LevelHandler;
HandlesModule.OnUserMessageRecieved += TagModule.TagHandler;
HandlesModule.OnAnyUserMessageRecieved += VariableModule.AutopublishHandler;
}
internal static void LoadBackground()
{
_ = BackgroundModule.StatusHandler();
_ = BackgroundModule.MuteHandler();
}
internal static Task LogHandler(LogMessage arg)
{
Console.WriteLine(arg);
if (arg.Severity != LogSeverity.Warning && arg.Severity != LogSeverity.Info) LogModule.LogMessage(arg);
return Task.CompletedTask;
}
public static async Task MessageHandler(SocketMessage arg)
{
if (arg is SocketUserMessage msg)
{
message = msg;
context = new SocketCommandContext(client, message);
if (message.Channel.GetType() == typeof(SocketDMChannel)) return;
Data.TryLoadAll(context.Guild.Id);
if (!context.Guild.HasAllMembers) await context.Guild.DownloadUsersAsync();
int argPos = 0;
if (message.Author.Id == ID)
{
await HandlesModule.OnAnyUserMessageRecieved.Invoke(message);
return;
}
if (message.HasStringPrefix(Data.misc.Data.prefix, ref argPos) || message.HasMentionPrefix(client.CurrentUser, ref argPos))
{
IResult result = await commands.ExecuteAsync(context, argPos, services);
if (!result.IsSuccess) await LogHandler(new LogMessage(LogSeverity.Error, "", result.ErrorReason));
Log.Write(LogItem(context.User) + " has executed command: '" + message.Content + "'");
}
await HandlesModule.OnAnyUserMessageRecieved.Invoke(message);
await HandlesModule.OnUserMessageRecieved.Invoke(message);
Data.SaveAll(context.Guild.Id);
}
}
}
}