From d9d4033f0e34ebb0465b569a386f977288ee6098 Mon Sep 17 00:00:00 2001 From: Chris Darnell Date: Tue, 20 Apr 2021 05:47:10 -0700 Subject: [PATCH] Added classes for Self Roles, Level Roles, Role Group management. Added base SelfRole methods. Redid part of the Guild Settings to be more easily workable, although harder to read. Added a few notes on a few objects. --- StarsiegeBot/BotSettings.cs | 163 +++++++++++++++++++++++++++++++----- StarsiegeBot/Program.cs | 3 +- 2 files changed, 145 insertions(+), 21 deletions(-) diff --git a/StarsiegeBot/BotSettings.cs b/StarsiegeBot/BotSettings.cs index 6f7b43f..9606c87 100644 --- a/StarsiegeBot/BotSettings.cs +++ b/StarsiegeBot/BotSettings.cs @@ -23,6 +23,7 @@ using System.Threading; namespace StarsiegeBot { [Group("bot")] + [RequireGuild] [Description("Allows, viewing and editing settings on the bot.")] class BotSettings : BaseCommandModule { @@ -44,9 +45,9 @@ namespace StarsiegeBot item.UseSelfRoles = false; item.AllowRolesPurchase = false; item.UseAutoRoles = false; - item.LevelRoles = new Dictionary(); + item.LevelRoles = new Dictionary>(); item.Prefixes = new List(); - item.SelfRoles = new Dictionary(); + item.SelfRoles = new Dictionary>(); item.Prefixes.Add(">"); // this line... is a test line. @@ -72,7 +73,8 @@ namespace StarsiegeBot } } - [Group("Prefix")] + [Group("Prefix"), Aliases("p", "prefixes")] + [Description("Shows the list of prefixes specific to this server.")] class BotPrefix : BotSettings { [GroupCommand] @@ -82,7 +84,7 @@ namespace StarsiegeBot // store the Guild ID as a string. string guild = ctx.Guild.Id.ToString(); // if this server doesnt have a settings for whatever reason, let them know... why am i not creating it? - if (! GuildSettings.ContainsKey(guild)) + if (!GuildSettings.ContainsKey(guild)) { await ctx.RespondAsync("No guild settings found."); } @@ -92,43 +94,164 @@ namespace StarsiegeBot var server = GuildSettings[guild]; DiscordEmbedBuilder embed = new DiscordEmbedBuilder { - Description = $"{ctx.Guild.Name} Settings." + Description = $"{ctx.Guild.Name} Prefixes." }; - embed.AddField("Prefix(es)", server.Prefixes.ToString()); - embed.AddField("Use Global Prefix", server.UseGlobalPrefix.ToString(), true); - embed.AddField("Self Roles Enabled", server.UseSelfRoles.ToString(), true); - embed.AddField("Level Roles Enabled", server.UseLevelRoles.ToString(), true); - embed.AddField("Self Role Buy", server.AllowRolesPurchase.ToString(), true); + + int count = 1; + // for each prefix, list it in the embed as a field. Show a count. + foreach (string item in GuildSettings[guild].Prefixes) + { + embed.AddField($"Prefix {count}", item, true); + count++; + } + await ctx.RespondAsync(embed); } } [Command("Add")] [Description("Adds a new prefix to the Server's list of prefixes.")] - public async Task AddNewPrefix (CommandContext ctx, string prefix) + public async Task AddNewPrefix(CommandContext ctx, string prefix) { await ctx.TriggerTypingAsync(); - GuildSettings[ctx.Guild.Id.ToString()].Prefixes.Add(prefix); - await ctx.RespondAsync($"Added `{prefix}` as a command prefix."); + string gId = ctx.Guild.Id.ToString(); + // add the prefix to the server specific settings. + if (GuildSettings[gId].Prefixes.Count < 25) + { + GuildSettings[gId].Prefixes.Add(prefix); + await ctx.RespondAsync($"Added `{prefix}` as a command prefix."); + } + else + { + await ctx.RespondAsync("There is a maximum of 25 prefixes allowed."); + } } [Command("delete"), Aliases("del")] [Description("Removes the specified prefix from accepted prefixes.")] - public async Task RemovePrefix (CommandContext ctx, string prefix) + public async Task RemovePrefix(CommandContext ctx, string prefix) { await ctx.TriggerTypingAsync(); - GuildSettings.Remove(prefix); + string gId = ctx.Guild.Id.ToString(); + // they have only one prefix and disallow global prefixes, dont let them delete the prefix. + if (GuildSettings[gId].Prefixes.Count == 1 && !GuildSettings[gId].UseGlobalPrefix) + { + await ctx.RespondAsync("Can't remove the last usable prefix from the bot. Add a new prefix, or enable Global Prefix."); + return; + } + // they pass the vibe check, delete the prefix. + GuildSettings[ctx.Guild.Id.ToString()].Prefixes.Remove(prefix); await ctx.RespondAsync($"Removed `{prefix}` as a command prefix."); } - [Command("global"), Aliases("g")] + [Command("global")] [Description("View or edit the status of allowing Global Prefix(es).")] - public async Task UseGlobalPrefixes(CommandContext ctx, bool isEnabled) + public async Task UseGlobalPrefixes(CommandContext ctx) { await ctx.TriggerTypingAsync(); + await ctx.RespondAsync($"Global Prefix usage has been turned **{(GuildSettings[ctx.Guild.Id.ToString()].UseGlobalPrefix ? "on" : "off")}**"); + } + [Command("global"), Aliases("g")] + [Description("View or edit the status of allowing Global Prefix(es).")] + public async Task UseGlobalPrefixes(CommandContext ctx, [Description("True or False")] bool isEnabled) + { + await ctx.TriggerTypingAsync(); + // check to make sure that they aren't trying to turn off global prefixes with out first adding a server sepcific prefix. + int prefixCount = GuildSettings[ctx.Guild.Id.ToString()].Prefixes.Count; + if (prefixCount <= 0 && !isEnabled) + { + await ctx.RespondAsync("You have to add at least one server prefix before you can turn off Global Prefux usage."); + return; + } + // they passed teh vibe check, let them turn off global prefixes. GuildSettings[ctx.Guild.Id.ToString()].UseGlobalPrefix = isEnabled; - await ctx.RespondAsync($"Global Prefix usage has been turned **{(isEnabled ? "on":"off")}**"); + await ctx.RespondAsync($"Global Prefix usage has been turned **{(isEnabled ? "on" : "off")}**"); + } + [Command("global")] + public async Task UseGlobalPrefixes(CommandContext ctx, [Description("0 is off, 1 is on.")] int isEnabled) + { + // since we're just allowing the user to use different ways to turn this function on and off... Redirect the work load there. + if (isEnabled >= 1) + { + await UseGlobalPrefixes(ctx, true); + } + else + { + await UseGlobalPrefixes(ctx, false); + } + } + [Command("global")] + public async Task UseGlobalPrefixes(CommandContext ctx, [Description("ON or OFF")] string isEnabled) + { + // since we're just trying to make the end user's life easier by different means of turning this on/off. redirect work load that way. + if (isEnabled.ToLower() == "on") + { + await UseGlobalPrefixes(ctx, true); + } + else if (isEnabled.ToLower() == "off") + { + await UseGlobalPrefixes(ctx, false); + } + else + { + // they wanna be smart, and we don't wanna, tell them that. + await ctx.RespondAsync("Please specify ON or OFF"); + } + } + } + + [Group("SelfRoles"), Aliases(new[] {"sr", "self"})] + class SelfRoles : BotSettings + { + public SelfRoles() + { } + + [Command("add")] + public async Task AddSelfRole(CommandContext ctx, DiscordRole role, string group = null) + { + await ctx.TriggerTypingAsync(); + } + + [Command("join")] + public async Task JoinSelfRole(CommandContext ctx, DiscordRole role) + { + await ctx.TriggerTypingAsync(); + } + + [Command("leave")] + public async Task LeaveSelfRole(CommandContext ctx, DiscordRole role) + { + await ctx.TriggerTypingAsync(); + } + + [Command("delete")] + public async Task DeleteSelfRole(CommandContext ctx, DiscordRole role, string group = null) + { + await ctx.TriggerTypingAsync(); + } + } + + [Group("LevelRoles"), Aliases(new[] {"lr","level"})] + class LevelRoles : BotSettings + { + public LevelRoles() + { + + } + } + + [Group("group")] + class RoleGroups : BotSettings + { + public RoleGroups() + { + + } + + // todo: add groups + // todo: remove groups. + // Do we delete the roles in this group or move them to another group? } } @@ -141,7 +264,7 @@ namespace StarsiegeBot public bool AllowRolesPurchase { get; set; } public bool UseAutoRoles { get; set; } public List Prefixes { get; set; } - public Dictionary SelfRoles { get; set; } - public Dictionary LevelRoles { get; set; } + public Dictionary> SelfRoles { get; set; } + public Dictionary> LevelRoles { get; set; } } } diff --git a/StarsiegeBot/Program.cs b/StarsiegeBot/Program.cs index f13b890..5af5b27 100644 --- a/StarsiegeBot/Program.cs +++ b/StarsiegeBot/Program.cs @@ -65,7 +65,7 @@ namespace StarsiegeBot if (args.Length > 0) BotName = args[0].ToLower(); else - BotName = "ssp"; + BotName = "sspdev"; BotEventId = new EventId(276, BotName); } @@ -281,6 +281,7 @@ namespace StarsiegeBot private Task Event_CommandErrored(CommandsNextExtension ext, CommandErrorEventArgs e) { // let's log the error details + e.Context.Client.Logger.LogError(BotEventId, $"{e.Context.User.Username} tried executing '{e.Command?.QualifiedName ?? ""}' but it errored: {e.Exception.GetType()}: {e.Exception.Message ?? ""}", DateTime.Now); return Task.CompletedTask; }