0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Discord上で一定時間経過後,自動でメッセージを削除するBOTを作成する

Posted at

気軽に思ったことを投稿できるチャネルが欲しいな

Discord上で,時間経過でメッセージが消えるチャネルを作成することで,
チャットをすることの敷居が下がるかなと考えて,
サーバー活性化のためにBOTを作成しようと思った.

技術スタック

  • C#
  • Docker
  • Discord

やったこと

DiscordBotを作成する.

Dicrod Developer Portalにアクセス

自分のアカウントでログインを済ませたら,
Applicationタブ->NewApplicationを押すと,以下の画面が表示されるので,
Botの名前を入れてCreate.
{760F7D6B-6853-4ABD-A523-BF591B19BF4B}.png
作成が完了したら,
OAuth2タブ->Oauth2 URL Generatorで,
Botにチェックを入れた後,
Manage MessagesとRead Message Historyの2つにチェックを入れて,
生成されたリンクから自分のサーバーに招待する.

最後にTOKENを取得します.(次以降で必要にあるのでどこかにメモしておくと良いです.)
BotタブからRESET TOKENを選択します.するとTOKENが表示されます.
Bot Permissionsは先程と同じ項目にチェックを入れてください.

wsl上でC#プロジェクトを作成する.

※wslにする必要はないかも.私はこのBotを将来的にデーモン化したいから一応wslに.

dotnet new console -n TweetManager(←任意のプロジェクト名)
cd TweetManager
dotnet add package Discord.Net --version 3.16.0

作成されたProgram.csに処理を記述していく.

Program.cs
using Discord;
using Discord.WebSocket;
using System;
using System.Threading.Tasks;

class Program{
    private DiscordSocketClient _client = new DiscordSocketClient();
    private ulong _targetChannelId = チャネルのID;

    public static Task Main(string[] args) => new Program().MainAsync();

    public async Task MainAsync(){
        _client = new DiscordSocketClient();

        _client.Log += Log;
        _client.Ready += OnReadyAsync;

        string token = "TOKEN";//ここにディスコードのTOKENを入れる
        await _client.LoginAsync(TokenType.Bot,token);
        await _client.StartAsync();
        
        await Task.Delay(-1); 
    }

    private async Task OnReadyAsync(){
        Console.WriteLine("Bot is connected!");

        var channel = _client.GetChannel(_targetChannelId) as IMessageChannel;

        if(channel != null){
            await Task.Run(async () =>{
                while(true){
                    var messages = await channel.GetMessagesAsync().FlattenAsync();
                    var now = DateTimeOffset.UtcNow;

                    foreach(var message in messages){
                        //12時間経過していたら削除する.
                        if(message.Timestamp < now.AddHours(-12)){
                            Console.WriteLine("メッセージを削除します。");
                            await channel.DeleteMessageAsync(message);
                        }
                    }
                    //1hごとにチェックを入れる
                    await Task.Delay(TimeSpan.FromHours(1));
                }
            });
        }
    }

    private Task Log(LogMessage msg){
        Console.WriteLine(msg.ToString());
        return Task.CompletedTask;
    }
}

Program.csにチャネルIDとトークンを代入したら完了.
チャネルIDはディスコードのチャネルを右クリックでIDを取れます.

これらが完了したら以下のコマンドを実行してください.

dotnet run

これでBotの制作自体はおしまいです.
この状態では,Botが常駐している状態ではないので,PCを起動するたびにコマンドを打たないといけないので,次回はデーモン化などに挑戦していきます.

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?