t_nakasu
@t_nakasu

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

ギルド内でのコマンド実行にメンションが必要な原因が不明

解決したいこと

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

No Answers yet.

Your answer might help someone💌