287bb33d77
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.
70 lines
2.6 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|