2021-07-21 09:48:23 -04:00

361 lines
15 KiB
C#

using Discord;
using Discord.Commands;
using Discord.Rest;
using Discord.WebSocket;
using NerdsTeaserBot.Misc;
using NerdsTeaserBot.Modules.Attributes;
using NerdsTeaserBot.Modules.Models;
using Nerd_STF.Extensions;
using Nerd_STF.File.Saving;
using Nerd_STF.Lists;
using System;
using System.Net.Http;
using System.Threading.Tasks;
using static Discord.Format;
using static NerdsTeaserBot.Const;
namespace NerdsTeaserBot.Modules.Commands
{
[Name("Bot")]
[Summary("Commands about the bot and it's data")]
public class BotModule : ModuleBase<SocketCommandContext>
{
[Command("commandinfo")]
[Summary("Info about a specific command")]
public async Task CommandInfo([Summary("The command to show info about")] [Remainder] string command)
{
CommandService comms = Internals.commands;
List<CommandInfo> cmds = new List<CommandInfo>(comms.Commands).FindAll(x => !new List<Attribute>(x.Attributes).Contains(y => y.GetType() == typeof(HiddenFromListAttribute)));
List<CommandInfo> cmdS = cmds.FindAll(x => x.Name.ToLower() == command.ToLower());
bool ded = false;
if (cmdS is null) ded = true;
else if (cmdS.Length == 0) ded = true;
if (ded)
{
LogModule.LogMessage(LogSeverity.Error, "There is no command found with that name.");
return;
}
foreach (CommandInfo cmd in cmdS)
{
EmbedBuilder e = new()
{
Color = Colors.DefaultColor,
Timestamp = DateTime.Now,
Title = "Info about n;" + cmd.Name,
};
string summary = "No Summary Provided";
if (cmd.Summary != "" && cmd.Summary != null) summary = cmd.Summary;
e.AddField("Summary", Code(summary), true);
e.AddField("Module", Code(cmd.Module.Name), true);
List<string> aliases = new List<string>(cmd.Aliases).FindAll(x => x.ToLower() != cmd.Name.ToLower());
bool pass = false;
if (aliases is null) pass = true;
else if (aliases.Length == 0) pass = true;
if (!pass)
{
string alias = "";
foreach (string s in aliases) alias += Code(s) + ", ";
e.AddField("Aliases", alias.Remove(alias.Length - 2), true);
}
List<ParameterInfo> param = new List<ParameterInfo>(cmd.Parameters).FindAll(x => !new List<Attribute>(x.Attributes).Contains(y => y.GetType() == typeof(HiddenFromListAttribute)));
e.AddField("Parameter Count:", Code(param.Length.ToString()));
foreach (ParameterInfo par in param)
{
string add = "";
string summaryP = "No Summary Provided";
if (par.Summary != "" && par.Summary != null) summaryP = par.Summary;
add += "_Summary: _" + Code(summaryP) + "\n";
add += "_Optional: _" + "`" + par.IsOptional;
if (par.IsOptional)
{
add += " (Default: ";
if (par.Type == typeof(string)) add += '"' + par.DefaultValue.ToString() + '"';
else add += par.DefaultValue;
add += ")";
}
add += "`\n";
add += "_Parameter Type: _" + Code(par.Type.Name);
e.AddField("Parameter: " + par.Name + "", add);
}
await ReplyAsync("", false, e.Build());
}
}
[Command("commands")]
[Summary("List of command modules, or commands of a module")]
public async Task Commands([Summary("The module name to show commands for. Leave empty to show all modules.")] string module = "")
{
CommandService comms = Internals.commands;
List<ModuleInfo> modules = new List<ModuleInfo>(comms.Modules).FindAll(x => !new List<Attribute>(x.Attributes).Contains(y => y.GetType() == typeof(HiddenFromListAttribute)));
List<CommandInfo> commands = new List<CommandInfo>(comms.Commands).FindAll(x => !new List<Attribute>(x.Attributes).Contains(y => y.GetType() == typeof(HiddenFromListAttribute)));
if (commands.Contains(x => x.Name.ToLower() == module.ToLower())) LogModule.LogMessage(LogSeverity.Warning, "A command has been found with the name " + Bold(Code(module.ToLower())) + ". Did you mean to use the command " + Code("n;commandinfo " + module.ToLower()) + "?");
EmbedBuilder e = new()
{
Color = Colors.DefaultColor,
Description = "",
Timestamp = DateTime.Now,
Title = "",
};
if (module == "") ShowModules();
else
{
ModuleInfo info = modules.FindOrDefault(x => x.Name.ToLower() == module.ToLower());
if (info == null)
{
LogModule.LogMessage(LogSeverity.Error, "No module is found with that name.");
return;
}
else ShowCommands(info);
}
void ShowCommands(ModuleInfo module)
{
List<CommandInfo> cmds = new List<CommandInfo>(module.Commands).FindAll(x => !new List<Attribute>(x.Attributes).Contains(y => y.GetType() == typeof(HiddenFromListAttribute)));
e.Title = "Showing " + cmds.Length + " Command";
if (modules.Length != 1) e.Title += "s";
bool pass = false;
if (cmds is null) pass = true;
else if (cmds.Length == 0) pass = true;
if (pass) e.Description = Italics("There are no commands in this module currently avaliable.");
else
{
foreach (CommandInfo cmd in cmds)
{
string summary = "No Summary Provided";
if (cmd.Summary != "" && cmd.Summary != null) summary = cmd.Summary;
e.Description += Bold(Code(cmd.Name)) + " - " + Bold(cmd.Summary) + "\n";
}
e.Description += "\n*" + cmds.Length + " Total Command";
if (cmds.Length != 1) e.Description += "s";
e.Description += "*";
}
}
void ShowModules()
{
e.Title = "Showing " + modules.Length + " Command Module";
if (modules.Length != 1) e.Title += "s";
bool pass = false;
if (modules is null) pass = true;
else if (modules.Length == 0) pass = true;
if (pass) e.Description = Italics("There are no command modules currently avaliable.");
else
{
int commandsL = 0;
foreach (ModuleInfo module in modules)
{
int length = new List<CommandInfo>(module.Commands).Length;
string summary = "No Summary Provided";
if (module.Summary != "" && module.Summary != null) summary = module.Summary;
e.Description += "**" + Code(module.Name) + " *(" + length + " cmd";
if (length != 1) e.Description += "s)";
e.Description += "*** - " + Bold(summary) + "\n";
commandsL += length;
}
e.Description += "\n*" + commandsL + " Total Command";
if (commandsL != 1) e.Description += "s";
e.Description += "*";
}
}
await ReplyAsync("", false, e.Build());
}
[Command("credits")]
[Summary("The list of people who deserve mentions")]
public async Task Credits()
{
EmbedBuilder e = new()
{
Color = Colors.DefaultColor,
Description = Italics("There are currently " + Code(Static.Credits.Length.ToString()) + " honerable mentions."),
Timestamp = DateTime.Now,
Title = "Honerable Mentions for " + Username,
};
foreach (Credit c in Static.Credits)
{
SocketUser usr = Context.Client.GetUser(c.id);
e.AddField(usr.Username + "#" + usr.Discriminator, Code(c.reason));
}
await ReplyAsync("", false, e.Build());
}
[Command("help")]
[Summary("Basic info about the bot")]
public async Task Help()
{
EmbedBuilder e = new()
{
Color = Colors.DefaultColor,
Timestamp = DateTime.Now,
Title = "Basic Info on " + Username
};
e.AddField("What am I?", "I am a bot used to maintain the backend of a server, Nerd's Teasers.", true);
e.AddField("What can I do?", "I can control automod, tags, moderation tools, teaser info, and more.", true);
e.AddField("What is my prefix?", "My prefix is " + Code("n;") + ". Use " + Code("n;info") + " for more advanced info, or " + Code("n;commands") + " for a list of command modules.", true);
await ReplyAsync("", false, e.Build());
}
[Command("info")]
[Summary("In-depth info about the bot")]
public async Task Info()
{
EmbedBuilder e = new()
{
Color = Colors.DefaultColor,
ThumbnailUrl = Context.Client.CurrentUser.GetAvatarUrl(ImageFormat.Auto, 512),
Timestamp = DateTime.Now,
Title = "In-Depth info about " + Username,
};
SocketSelfUser self = Internals.client.CurrentUser;
e.AddField("Full Name", Code(FullName), true);
e.AddField("Client ID", Code(ID.ToString()), true);
e.AddField("Mention", "<@" + ID + ">", true);
e.AddField("Created At", Code(self.CreatedAt.DateTime.ToString()), true);
e.AddField("Program Language", Code("C-Sharp (C#)"), true);
e.AddField("Program APIs", Code(".NET 5.0") + "\n" + Code("Discord.NET (Experimental) v2.3.8 (API v6)"), true);
string version = "Cannot detect Bot Version (No Changelog Provided)";
if (new List<SocketGuildChannel>(Context.Guild.Channels).Contains(x => x.Id == Data.misc.Data.changelogChannel))
{
IMessage msg = new List<IMessage>(await Internals.client.GetGuild(Context.Guild.Id).GetTextChannel(Data.misc.Data.changelogChannel).GetMessagesAsync(1).FlattenAsync())[0];
int start = -1, end = msg.Content.Length;
for (int i = 0; i < msg.Content.Length; i++)
{
if (msg.Content[i] == 'v') start = i;
else if (start != -1 && (msg.Content[i] == ' ' || msg.Content[i] == '*'))
{
end = i;
break;
}
}
if (start == -1) start = 0;
version = msg.Content[start..end];
}
e.AddField("Version: ", Code(version), true);
List<SocketRole> roles = new(Context.Guild.GetUser(self.Id).Roles);
roles.Remove(Context.Guild.EveryoneRole);
string roleS = "";
foreach (SocketRole role in roles) roleS += role.Mention + ", ";
e.AddField("Assigned Roles: ", roleS.Remove(roleS.Length - 2));
await ReplyAsync("", false, e.Build());
}
[Command("leave")]
[RequireOwner]
[Summary("Runs through all servers the bot is in and checks them to the list of approved servers.")]
public async Task Leave()
{
List<SocketGuild> left = new();
foreach (SocketGuild g in Context.Client.Guilds) if (await PermittedServerHandler(g)) left.Add(g);
if (left.Length == 0)
{
LogModule.LogMessage(LogSeverity.Error, "No Servers Left");
return;
}
EmbedBuilder e = new()
{
Color = Colors.DefaultColor,
Description = "",
Timestamp = DateTime.Now,
Title = "Left " + left.Length + " Unapproved Servers",
};
foreach (SocketGuild g in left) e.Description += Code(g.Name) + " (Owner: <@" + g.Id + ">)";
await ReplyAsync("", false, e.Build());
}
[Command("ping")]
[Summary("Pings the bot, and returns helpful info about that ping")]
public async Task Ping()
{
EmbedBuilder e = new()
{
Color = Colors.DefaultColor,
Description = Italics("You have just called for the ping time of " + Code(Username)),
Timestamp = DateTime.Now,
Title = ":ping_pong: Pong",
};
e.AddField("Estimated Server Latency", Code(Context.Client.Latency + " Milliseconds") +
"\n" + Italics("Should be around " + Code("100 - 300")), true);
e.AddField("Round-Trip Ping Time", Code((DateTime.UtcNow - Context.Message.CreatedAt.UtcDateTime).TotalMilliseconds.ToString("0") + " Milliseconds") +
"\n" + Italics("Should be around " + Code("2000 - 4000")), true);
e.AddField("Uptime", "This bot has been online since " + Code(Internals.upTime.Humanize(true, true)) +
"\n" + Italics("(" + (DateTime.Now - Internals.upTime).Humanize(ignoreMilliseconds: true)) + ")", true);
await ReplyAsync("", false, e.Build());
}
[Command("test")]
[Summary("Does whatever is currently being tested")]
public async Task Test()
{
await ReplyAsync("eat ass, chump");
}
// end commands
public static async Task<bool> PermittedServerHandler(SocketGuild guild)
{
bool not = !Data.misc.Data.allowedServers.Contains(guild.Id);
if (not)
{
EmbedBuilder e = new()
{
Color = Color.Red,
Description = "This server is not a part of the list of approved servers. Please come into contact with <@478210457816006666> to add it",
Timestamp = DateTime.Now,
Title = "Server Cannot be Joined",
};
await guild.DefaultChannel.SendMessageAsync("", false, e.Build());
await guild.LeaveAsync();
}
return not;
}
}
}