C# での Discord Bot 作り方
始めに
discordのbotを作り始めるまでをまとめました
環境構成
VSCode
VSCode拡張機能C#
.Net9.0
Discord.NET
Microsoft.Extensions.DependencyInjection
Discordアカウント
制作までの手順
C#プロジェクトを作る
nugetでDiscord.NETとMicrosoft.Extention.DependencyInjectionをインストールする
コピペ
Discordの開発者画面に行きBotを作成する
トークンを取得しプログラムに書く
動くか確認
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);
}
}
参考文献
↓ 発展的な内容