Added 'say' command type

This commit is contained in:
Noikoio 2017-10-15 17:22:21 -07:00
parent 3f376605f2
commit 0cbe074151
3 changed files with 78 additions and 2 deletions

View file

@ -42,7 +42,8 @@ namespace Noikoio.RegexBot.Feature.ModTools
{ {
// Define all command types and their corresponding Types here // Define all command types and their corresponding Types here
{ "ban", typeof(Commands.Ban) }, { "ban", typeof(Commands.Ban) },
{ "kick", typeof(Commands.Kick) } { "kick", typeof(Commands.Kick) },
{ "say", typeof(Commands.Say) }
}); });
public static CommandBase CreateInstance(ModTools root, JProperty def) public static CommandBase CreateInstance(ModTools root, JProperty def)

View file

@ -0,0 +1,75 @@
using Discord;
using Discord.WebSocket;
using Newtonsoft.Json.Linq;
using System;
using System.Threading.Tasks;
namespace Noikoio.RegexBot.Feature.ModTools.Commands
{
class Say : CommandBase
{
public Say(ModTools l, string label, JObject conf) : base(l, label, conf) { }
// TODO: Whitelist/blacklist - to limit which channels it can "say" into
public override async Task Invoke(SocketGuild g, SocketMessage msg)
{
string[] line = msg.Content.Split(new char[] { ' ' }, 3, StringSplitOptions.RemoveEmptyEntries);
if (line.Length <= 1)
{
await SendUsageMessage(msg, ":x: You must specify a channel.");
return;
}
if (line.Length <= 2 || string.IsNullOrWhiteSpace(line[2]))
{
await SendUsageMessage(msg, ":x: You must specify a message.");
return;
}
var ch = GetTextChannelFromString(g, line[1]);
if (ch == null) await SendUsageMessage(msg, ":x: Unable to find given channel.");
await ch.SendMessageAsync(line[2]);
}
private async Task SendUsageMessage(SocketMessage m, string message)
{
string desc = $"{this.Command} [channel] [message]\n";
desc += "Displays the given message exactly as specified to the given channel.";
var usageEmbed = new EmbedBuilder()
{
Title = "Usage",
Description = desc
};
await m.Channel.SendMessageAsync(message ?? "", embed: usageEmbed);
}
private SocketTextChannel GetTextChannelFromString(SocketGuild g, string input)
{
// Method 1: Check for channel mention
// Note: SocketGuild.GetTextChannel(ulong) returns null if no match.
var m = ChannelMention.Match(input);
if (m.Success)
{
ulong channelId = ulong.Parse(m.Groups["snowflake"].Value);
return g.GetTextChannel(channelId);
}
// Method 2: Check if specified in string, scan manually
if (input.StartsWith('#'))
{
input = input.Substring(1);
if (input.Length <= 0) return null;
foreach (var c in g.Channels)
{
if (string.Equals(c.Name, input, StringComparison.InvariantCultureIgnoreCase))
{
return c as SocketTextChannel;
}
}
}
return null;
}
}
}

View file

@ -4,7 +4,7 @@
<OutputType>Exe</OutputType> <OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.0</TargetFramework> <TargetFramework>netcoreapp2.0</TargetFramework>
<RootNamespace>Noikoio.RegexBot</RootNamespace> <RootNamespace>Noikoio.RegexBot</RootNamespace>
<AssemblyVersion>2.1.0.0</AssemblyVersion> <AssemblyVersion>2.1.1.0</AssemblyVersion>
<Description>Highly configurable Discord moderation bot</Description> <Description>Highly configurable Discord moderation bot</Description>
<Authors>Noikoio</Authors> <Authors>Noikoio</Authors>
<Company /> <Company />