discordにオリジナルbotを作る③

discordにオリジナルbotを作る③

前回discordにオリジナルbotを作る!② – 趣味ブログ (shumi-blog.com)は1年以上前でしたが、ネタがあったので更新したいと思います

今回は、メッセージにリアクションするとロールが付与されるという機能を持ったbotを作ります
(追記)+サーバー参加時にDMを送る、リアクションを消すとロールが解除される機能を追加しました

環境
Python 3.9.13
discord.py 2.2.2

目次

メッセージにリアクションするとロールが付与される機能

今回はそんなに難しいことはしていないので、いきなりソースコードを乗っけちゃいます

import discord

client = discord.Client(intents=discord.Intents.all())


@client.event
async def on_ready():
    print("on_ready")

@client.event
async def on_raw_reaction_add(payload):
    if payload.message_id == "メッセージのID":
        await payload.member.add_roles(payload.member.guild.get_role("付与したいロールのID"))

client.run("トークン")

上のコードは最低限の働きしかしないものになっているので、これを改良しながら使ってみてください

補足

メッセージID等はDiscord側の設定で開発者として~~みたいな設定にすると右クリックで取得できるようになります(たしか)

改良案

上のコードは、どんなリアクションに対してもロールを付与するようになっているので、リアクションによって付与するロールを変化させるという改良案があります
ってか多分普通はそうやって使う

payloadの中身は以下のようになっています

<
RawReactionActionEvent 
message_id=
user_id=
channel_id=
guild_id=
emoji=<PartialEmoji animated= name= id=> 
event_type=
member=<Member id= name= discriminator= bot= nick= guild=<Guild id= name= shard_id= chunked= member_count=>>
>

おそらくemojiの部分からリアクションの種類が取得できるので、そこで場合分けをするといいのではないかな??と思います

payload.emoji.name とかで取得できるのではないかな

これで、公式Discord鯖みたいなロール付与botが作成できました

では皆さんよきbotライフを

(追記)

せっかくなので、botをさらに高機能化してみました

リアクションを削除すると、ロールも削除される機能

ソースコード

@client.event
async def on_raw_reaction_remove(payload)://リアクションが削除されたら呼び出される
    if payload.message_id == "リアクションをつけてほしいメッセージのID(int型)":
        emoji_name = payload.emoji.name//絵文字の名前を取得
        guild = client.get_guild(payload.guild_id)//サーバー情報を取得
        channel = guild.get_channel(”ログ等を送りたいチャンネルのID(int型)")//チャンネル情報を取得
        member = guild.get_member(payload.user_id)//メンバー情報を取得
        if emoji_name == "リアクション絵文字の名前(str型)":
            for role in member.roles://メンバーが持っているロールをリスト形式で取得
                if role.id == "削除したいロールのID(int型)"://削除したいロールを持っていたら
                    await member.remove_roles(guild.get_role(削除したいロールのID(int型)))//ロールを削除
                    await channel.send(guild.get_role(削除したいロールのID(int型)).name + "を" + member.name + "から削除しました")//ログを送る
        elif emoji_name == "リアクション絵文字の名前(str型)":
            for role in member.roles:
                if role.id == 削除したいロールのID(int型):
                    await member.remove_roles(guild.get_role(削除したいロールのID(int型)))
                    await channel.send(guild.get_role(削除したいロールのID(int型)).name + "を" + member.name + "から削除しました")”ログ等を送りたいチャンネルのID(int型)”

とりあえず必要なものは
・リアクションをつけてほしいメッセージのID
・ログ等を送りたい場合、そのチャンネルのID
・削除したいロールのID
ですかね

まぁそこら辺はお好みで

サーバー参加時にDMを送る機能

ソースコード

@client.event
async def on_member_join(member)://サーバーに参加したときに呼び出される
    await member.send(content = "サーバー参加時にDMを送る\nチャンネル説明とか?")//サーバー参加時にDMで送りたいメッセージ
    await client.get_channel(ログ等を送りたいチャンネルのID(int型)).send(member.name + "が参加しました")//ログの送信

必要なものは
・ログ等を送りたい場合、そのチャンネルのID
くらいですかね

ここに貼ったソースコードには直接IDを入れるみたいになってますが、グローバル変数かなんかにIDを格納してもよさそう

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です