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を格納してもよさそう