ホエールテック株式会社 ホエールテック株式会社

  • ブログ

Discord botでロールを作成・付与する(discord.js)

異業種からエンジニアに転職してそろそろ1年が経とうとしているkiidaです。
その間に飼っている犬は6ヶ月を超えてどんどん大きくなり、ついでに反抗期に突入しています。
私もそれぐらいのスピード感で成長したいものです。

さて、今回は表題の通り、Discord Botでのロールの作成・付与についてまとめます。

作ったもの

今回紹介するBotの機能は以下です。
・スラッシュコマンドでロールを作成する
・メンバー参加時にロールを付与する

今回はスラッシュコマンドの登録方法や、Discord.jsの環境構築などは触れません。(日本語で詳細に解説されている記事が既にたくさんあるので)

目的

ゲームでのギルドの運営や、eスポーツの大会運営などで、discord botを使用してロールの振り分けを自動的に行う

スラッシュコマンドでロールを作成する

ソースは以下です。

const { Client, Events, GatewayIntentBits, PermissionsBitField } = require('discord.js');
const client = new Client({ intents: [GatewayIntentBits.Guilds] });

// 登録しているコマンド
const RollCreateCommand = require('./commands/roll-create.js');

// インタラクション受信時にコールされるイベント
client.on(Events.InteractionCreate, async interaction => {

    // インタラクションがスラッシュコマンドの場合
    if (interaction.isChatInputCommand()){

        if (interaction.commandName === RollCreateCommand.data.name) {
            try {

                // TestRoleが作成済みか確認
                if (!interaction.guild.roles.cache.find(role => role.name === 'TestRole')) {
                    // インタラクションされたサーバーにロールを作成
                    const role = await interaction.guild.roles.create({
                        name: 'TestRole',
                        color: '#593695',
                        permissions: [PermissionsBitField.Flags.SendMessages, PermissionsBitField.Flags.ViewChannel],
                    });
                } else {
                    console.log("TestRoleは既に存在しています");
                }
            
                await interaction.reply('Role created and added successfully!');
            } catch (error) {
                console.error('Error creating or adding role:', error);
                await interaction.reply('Error creating or adding role. Please check the logs.');
            }
        }
    }
});

上記のコードでは’TestRole’という名前のロールを作成しています。
colorにはカラーコードを指定することができます。
permissionsはロールの権限指定しています。
権限フラグについての詳細は以下公式ドキュメントに詳しく記載されています。
https://discord.com/developers/docs/topics/permissions#permissions-bitwise-permission-flags

上記ソースコードはロールの作成のみに絞っていますが、今回私が作成したbotでは、botが参照しているチャンネルのメッセージから作成するロールのリストを取得、ループして作成しています。

また、ロールは同名の作成が可能なので、必要であればロール名で存在チェックをするとよいでしょう。

メンバー参加時にロールを付与する

ソースは以下です。

const { Client, Events, GatewayIntentBits } = require('discord.js');

// intentsにGuildMembersを追加
const client = new Client({ intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildMembers] });

// メンバー参加時にコールされるイベント
client.on("guildMemberAdd", member => {
    // メンバー参加時に特定のチャンネルにメッセージを送信
    const channel = member.guild.channels.cache.get("チャンネルID")
    channel.send(`${member.user}が参加しました!`);

    // メンバーに付与するロールを取得
    const role = member.guild.roles.cache.find(role => role.name === 'TestRole')

    // ロールが見つかったら付与
    if (role) {
        try {
            member.roles.add(role)
            channel.send(`${member.user}にロールを付与しました!`);
        } catch (error) {
            console.error('ロールの付与に失敗しました', error);
        }
    }
});

上記のコードでは先ほど作成したTestRoleというロールをメンバー参加時に自動的に付与しています。
ここから、詳細に条件を指定することで、自動的にロールを振り分けることができます。
例えば、
member.user.username
のようにすると参加したユーザーのIDが取得できるので、ロール作成時と同様に事前にリストを作成しておき、リストからIDで一致するユーザーと振り分けるロール名を取得することで自動振り分けが可能です。

終わりに

今回は触れませんでしたが、Discordはスプレッドシートと連携することもできます。
Nitroを使用していない場合1メッセージにつき2000文字が最大文字数となっていますが、今回のように、discordのidと振り分けたいロール名のリスト程度であればメッセージとして管理者やbotしか見れないチャンネルに保持しておくことができるので、botアプリにあまり依存せず、データを管理することができます。

他にはbotの使用例として
・試合時間の10分前に自動で試合参加者に通知
・ロールごとに参加権限を分けたボイスチャンネルの作成

などなど

そこまで実装するのであればdiscord.pyの方が情報が多そうではありますが

以上kiidaでした。

kiida
kiida
エンジニア
2023年入社のエンジニア2年生です。
容赦ない「わからないこと」に囲まれながら、異業種スキルで前進あるのみ。
90%から100%への果てしなく遠い道のり。ほぼOKではOK出ない一貫した先輩たちの暑くるしい後ろ姿。

趣味は読書。愛読書は、伊坂幸太郎や円城塔。
Github上の多様なソースコードも愛読書に加わりつつある今日この頃。
採用情報
お問い合わせ