ギルド内でのコマンド実行にメンションが必要な原因が不明
解決したいこと
Discordのボット開発にて、オリジナルコマンドを実装しようとしているのですが、
ギルドチャット内だとコマンドにメンションが必要になってしまう原因がよくわかりません。
例)
bot個人宛のチャットの場合
!ping
↓
pong
ギルドチャットの場合
@[bot] ping
↓
pong
発生している問題・エラー
public async Task MainAsync()
{
var socketConfig = new DiscordSocketConfig
{
GatewayIntents = GatewayIntents.AllUnprivileged | GatewayIntents.GuildMembers | GatewayIntents.GuildBans
};
// ServiceProviderインスタンス生成
_provider = CreateProvider();
// コマンド生成
_commands = new CommandService();
// client生成
_client = new DiscordSocketClient();
_client.MessageReceived += _MessageRecieved;
// コマンド追加
await _commands.AddModulesAsync(Assembly.GetEntryAssembly(), _provider);
// Botにログイン
await _client.LoginAsync(TokenType.Bot, EntryPoint._config.token);
// 常駐処理開始
await _client.StartAsync();
// タスクを常駐
await Task.Delay(-1);
}
private static async Task _MessageRecieved(SocketMessage iMsgParam)
{
var msg = iMsgParam as SocketUserMessage;
if (null == msg || msg.Author.IsBot)
{
return;
}
_logger.WriteLog(LogLevel.TRACE, $"{msg.Channel.Name} {msg.Author.Username}: {msg}");
int argPos = 0;
// ユーザーからのコマンドメッセージを処理
// !コマンドの確認・実行
if (isMyCommand(msg, ref argPos))
{
_logger.WriteLog(LogLevel.TRACE, $"msg: {msg}");
_logger.WriteLog(LogLevel.TRACE, $"argPos: {argPos}");
await ExcecuteMyCommand(msg, argPos);
}
// /コマンドの場合は
// SlashCommandExecutedからコールバック
}
public static bool isMyCommand(SocketUserMessage iMsg, ref int iArgpos)
{
bool retStatus = false;
// !つきまたはbotへのメンション
if ((iMsg.HasCharPrefix('!', ref iArgpos) || iMsg.HasMentionPrefix(_client.CurrentUser, ref iArgpos)))
{
retStatus = true;
}
return retStatus;
}
private static async Task ExcecuteMyCommand(SocketUserMessage iMsg, int iArgpos)
{
var context = new SocketCommandContext(_client, iMsg);
try
{
var result = await _commands.ExecuteAsync(context, iArgpos, services: null);
_logger.WriteLog(LogLevel.TRACE, $"context: {context}");
if (!result.IsSuccess)
{
await context.Channel.SendMessageAsync($"ERROR: {result.ErrorReason}");
}
}
catch (Exception e)
{
_logger.WriteLog(LogLevel.ERROR, e.ToString());
}
}
public class PingCmd : ModuleBase<SocketCommandContext>
{
/// <summary>
/// pingの発言があった場合、pongを返します
/// </summary>
/// <returns></returns>
[Command("ping")]
[Summary("return pong.")]
public async Task CommandAction()
{
await ReplyAsync("pong");
}
}
自分で試したこと
色々調べてみましたがこのあたりの仕組みが良くわかりませんでした。
0