RegexBot/Module/ModCommands/Commands/Say.cs
Noikoio 287bb33d77 Removed manual module name setting
Modules will now be named based on their existing class name.
Their respective configuration sections are now also defined by the
same value. Documentation has been updated to reflect this.
2018-03-21 23:51:50 -07:00

70 lines
2.6 KiB
C#

using Discord.WebSocket;
using Newtonsoft.Json.Linq;
using System;
using System.Threading.Tasks;
namespace Noikoio.RegexBot.Module.ModCommands.Commands
{
class Say : Command
{
// No configuration at the moment.
// TODO: Whitelist/blacklist - to limit which channels it can "say" into
public Say(ModCommands l, string label, JObject conf) : base(l, label, conf) {
DefaultUsageMsg = $"{this.Trigger} [channel] [message]\n"
+ "Displays the given message exactly as specified to the given channel.";
}
#region Strings
const string ChannelRequired = ":x: You must specify a channel.";
const string MessageRequired = ":x: You must specify a message.";
const string TargetNotFound = ":x: Unable to find given channel.";
#endregion
public override async Task Invoke(SocketGuild g, SocketMessage msg)
{
string[] line = msg.Content.Split(new char[] { ' ' }, 3, StringSplitOptions.RemoveEmptyEntries);
if (line.Length <= 1)
{
await SendUsageMessageAsync(msg.Channel, ChannelRequired);
return;
}
if (line.Length <= 2 || string.IsNullOrWhiteSpace(line[2]))
{
await SendUsageMessageAsync(msg.Channel, MessageRequired);
return;
}
var ch = GetTextChannelFromString(g, line[1]);
if (ch == null) await SendUsageMessageAsync(msg.Channel, TargetNotFound);
await ch.SendMessageAsync(line[2]);
}
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;
}
}
}