見出し画像

C# での Discord Bot 作り方


始めに

discordのbotを作り始めるまでをまとめました

環境構成

VSCode
VSCode拡張機能C#
.Net9.0
Discord.NET
Microsoft.Extensions.DependencyInjection
Discordアカウント

制作までの手順

  1. C#プロジェクトを作る

  2. nugetでDiscord.NETとMicrosoft.Extention.DependencyInjectionをインストールする

  3. コピペ

  4. Discordの開発者画面に行きBotを作成する

  5. トークンを取得しプログラムに書く

  6. 動くか確認

  7. Azureにデプロイ //まだやっていない

Bot制作

C#プロジェクトを作る

dotnet new console -f net9.0 --use-program-main --name FirstBot
cd FirstBot
code .

ここで一回実行しといたほうがいい

nugetでDiscord.NETとMicrosoft.Extention.DependencyInjectionをローカルにインストールする

dotnet add package Microsoft.Extensions.DependencyInjection --package-directory packages
dotnet add package Discord.NET --package-directory packages

とりあえずコピペ

//Program.cs
using Discord;
using Discord.Commands;
using Discord.WebSocket;
using System.Reflection;
using Microsoft.Extensions.DependencyInjection;

namespace FirstBot;

class Program
{
    const string Token = "自分が取得したトークンをここに書く";
    DiscordSocketClient Client;
    CommandService Commands;
    ServiceProvider Services;
    static void Main(string[] args) => new Program().MainAsync().GetAwaiter().GetResult();
    public async Task MainAsync()
    {

        var config = new DiscordSocketConfig
        {
            LogLevel = LogSeverity.Info,
            GatewayIntents = GatewayIntents.AllUnprivileged | GatewayIntents.MessageContent//これがないと会話を取得できない!!!!
        };
        //今回はログ出す。
        Client = new DiscordSocketClient(config);
        Client.Log += Log;
        Client.MessageReceived += MessageReceived;

        //Microsoft.Extensions.DependencyInjectionを調べてみよう
        Commands = new CommandService();
        Services = new ServiceCollection().BuildServiceProvider();
        await Commands.AddModulesAsync(Assembly.GetEntryAssembly(), Services);

        await Client.LoginAsync(TokenType.Bot, Token);
        await Client.StartAsync();
        await Task.Delay(-1);
    }

    //ログ吐き出し!
    private Task Log(LogMessage message)
    {
        Console.WriteLine(message.ToString());
        return Task.CompletedTask;
    }

    private async Task MessageReceived(SocketMessage messageParam)
    {
        var message = messageParam as SocketUserMessage;

        if (message == null)
        {
            return;
        }
        Console.WriteLine(message.Content);
        if (message.Author.IsBot)
        {
            return;
        }

        int argPos = 0;

        //コマンドかどうか判定
        if (!(message.HasCharPrefix('!', ref argPos)))
        {
            return;
        }

        var context = new CommandContext(Client, message);
        //コマンド実行
        var result = await Commands.ExecuteAsync(context, argPos, Services);

        if (!result.IsSuccess)
        {
            await context.Channel.SendMessageAsync(result.ErrorReason);
        }
    }
}

もう一つC#のファイルCommandClass.csを作る

//CommandClass.cs
using Discord.Commands;

namespace SecondBot;

public class CommandClass : ModuleBase
{
    [Command("hi")]
    public async Task Reply()
    {
        await ReplyAsync("hello");
    }
}

これで一応Botのプログラムは完成した。
これは"!hi"というと"hello"と返してくれるBotである
基本的にCommandClass.csを拡張してBotを作成しProgram.csはいじらなくてよい


Discordの開発者画面に行きBotを作成する

ここに飛び始めようを押す




左上のApplicationを押し画面が変わるのでその後右上の青いボタンのNew Applicationをおす

名前を決めて作る


作成出来たらBotを選択

トークンを取得する
またここで表示されたトークンはコピーしてProgram.csに張り付ける

次にOAuth2に移動する

OAuth2 URL Generatorでbotを選び次に権限を指定する(今回は適当にAdministratorとする)とURLが表示される
URLにアクセスしサーバーへ追加する(管理者権限を持っているサーバーでないと無理)

トークンをProgram.csに張り付ける

const string Token = "自分が取得したトークンをここに書く";

動くか確認

うごいたらOK

Azureにデプロイ

このプログラムを実行している間しかbotは動かない。
常時動かすためにAzureとかGasとかにデプロイをする。

コマンドの追加

echoコマンドを追加してみた。
!echo あああ
とコマンドを打つと
あああ
と返してくる

//CommandClass.cs
using Discord.Commands;

namespace SecondBot;

public class CommandClass : ModuleBase
{
    [Command("hi")]
    public async Task Reply()
    {
        await ReplyAsync("hello");
    }

  [Command("echo")]
  public async Task Reply(string str)
    {
        await ReplyAsync(str);
    }
}

参考文献

↓ 発展的な内容


いいなと思ったら応援しよう!