今回のテーマは、「実装編」ということで、3つの機能を実装します。
ボットの機能として、「画像の投稿(別ファイルも)」「ボイスチャンネルの出入り通知」「新規ユーザーへのロール付与」の実装方法を説明します。
必要なボットの設定、コードの詳細など丁寧に説明しますので、頑張ってついてきて下さい!
まだ、導入編をやっていないという方は、以下の記事から先に読んでみてください。
Discordを開発者モードにしてID取得できるようにしよう!
Discordの設定を開発者モードにすることで、チャンネルやユーザーなどのIDを取得できるようになります。
自分のアイコンの歯車マークから設定します。
詳細設定を開き、開発者モードをオンにします。
これで設定完了です。試しにチャンネルを右クリックしてみましょう。
IDをコピーが出現するようになります。このIDを利用してチャンネルやロールなどを指定してプログラムを書くことができます。
Discordボットに画像を投稿させてみよう!
画像の送信は、ほとんどメッセージの送信と同じ方法で実装できます。
画像をボットに投稿させてみよう!
以下のコードを実行することで、「$image」をチャットに打つことでボットが、「image.jpg」を投稿します。
import discord
client = discord.Client()
#■ログインの確認
@client.event
async def on_ready():
print(f'We have logged in as {client.user}')
#■非同期処理
@client.event
async def on_message(message):
if message.author == client.user:
return
#画像を
if message.content.startswith('$image'):
await message.channel.send(file=discord.File("image.jpg"))
#■自分のbotのトークンを設定する
#Botが起動します。
client.run('自分のbotのトークン')
file=discord.File(“ファイル名”)を利用することで、ファイルを投稿することができます。
画像以外のファイルを投稿することもできます。
await message.channel.send(file=discord.File("image.jpg"))
画像以外のファイルも投稿してみよう!
画像以外のファイルも同様の方法で投稿することもできます。
await message.channel.send(file=discord.File("新しいテキスト ドキュメント.txt"))
Intentsを設定して新規メンバーにロールを付与してみよう!
一部のイベントを利用するには「intetns」の設定が必要です。
「intents」を利用することで、「一部のイベントを受け取り、一部のイベントは受け取らない」という設定ができます。
また、一部のイベントには、この「intents」の設定が必要なものがあり、今回利用する「on_member_join」には必須の設定になります。
Botにintentsの設定をしよう!
「intents」を利用するにはまず、「Developers portal」からintentsを許可する設定にする必要があります。
Botの中にある「Privileged Gateway Intents」の項目2つにチェックを入れましょう。
Deepl翻訳
特権的なゲートウェイインテント
ゲートウェイインテントの中には、あなたのボットが認証されている場合に承認が必要となるものがあります。ボットが認証されていない場合、以下のインテントを切り替えてアクセスすることができます。
プレゼンスインテント
プレゼンスアップデートイベントを受信するために必要なボットです。
注意:あなたのボットが100台以上のサーバーに達した場合、この項目は検証および承認が必要になります。詳しくはこちら
サーバーメンバーズインテント
GUILD_MEMBERSに記載されているイベントを受信するためにボットに必要です。
注:ボットが100台以上のサーバーに到達した場合、確認と承認が必要になります。詳しくはこちら
これで準備は完了しました。早速コーディングしてみましょう!
ロールを付与するコーディングをしてみよう!
以下のコーディングを行うことで、新規ユーザーに対してロールを付与します。
import discord
#■intentsを取得し設定する
intents= discord.Intents.all()
client = discord.Client(intents=intents)
token = '自分のトークンを設定する'
'開発者モードで取得したロールのIDを設定する
ID_ROLE_MEMBER = 945959233030070292
#■ログインの確認
@client.event
async def on_ready():
print(f'We have logged in as {client.user}')
#■新規ユーザーへロールを付与する
@client.event
async def on_member_join(member):
# 用意したIDから Role オブジェクトを取得
role = member.guild.get_role(ID_ROLE_MEMBER)
# 新規ユーザーに対してロールを付与
await member.add_roles(role)
#■自分のbotのトークンを設定する
#Botが起動します。
client.run(token)
実行し、新規ユーザーがサーバーに参加した場合に、ロールが付与されるか確認してみましょう!
ロール付与をするコードの説明
以下、ソースの説明になります。
#■intentsを取得し設定する
intents= discord.Intents.all()
client = discord.Client(intents=intents)
「client」オブジェクトに「intents」オブジェクトを設定しています。
'開発者モードで取得したロールのIDを設定する
ID_ROLE_MEMBER = 945959233030070292
任意のロールIDを設定します。
ロールのIDは、Discordの「サーバー設定」→「ロール」から取得したいロールを右クリックして、IDをコピーを押すことで取得できます。
#■新規ユーザーへロールを付与する
@client.event
async def on_member_join(member):
# 用意したIDから Role オブジェクトを取得
role = member.guild.get_role(ID_ROLE_MEMBER)
# 新規ユーザーに対してロールを付与
await member.add_roles(role)
「on_member_join」を利用し、新規参加者に対して実行します。
ロールIDからロールオブジェクトを取得し、新規ユーザーに対してロールを付与します。
メンバーのボイスチャンネル出入り時に通知してみよう!
ボイスチャンネル入ったときにメッセージを通知してみます。
ボイスチャンネルの出入りを取得するコーディング
「on_voice_state_update」を利用することでボイスチャンネルの出入り時にイベントを発生させることができます。
import discord
#■intentsを取得し設定する
intents=discord.Intents.all()
client = discord.Client(intents=intents)
token = '自分のトークンを設定する'
#通知させたいテキストチャンネルIDを設定して下さい。
textChannelId = 通知させたいテキストチャンネルid
#■ログインの確認
@client.event
async def on_ready():
print(f'We have logged in as {client.user}')
@client.event
async def on_voice_state_update(member, before, after):
if (before.channel != after.channel):
alert_channel = client.get_channel(textChannelId)
if before.channel is None:
msg = f'{member.nick} が {after.channel.name} に参加しました。'
await alert_channel.send(msg)
elif after.channel is None:
msg = f'{member.nick} が {before.channel.name} から退出しました。'
await alert_channel.send(msg)
#■自分のbotのトークンを設定する
#Botが起動します。
client.run(token)
実際に出入りしてコードが動作するか確認してみましょう!
ボイスチャンネルの出入りコードの説明
#通知させたいテキストチャンネルIDを設定して下さい。
textChannelId = 通知させたいテキストチャンネルid
開発者モードで取得したチャンネルIDを設定します。
設定したチャンネルに対して通知されます。
@client.event
async def on_voice_state_update(member, before, after):
if (before.channel != after.channel):
alert_channel = client.get_channel(textChannelId)
if before.channel is None:
msg = f'{member.nick} が {after.channel.name} に参加しました。'
await alert_channel.send(msg)
elif after.channel is None:
msg = f'{member.nick} が {before.channel.name} から退出しました。'
await alert_channel.send(msg)
「on_voice_state_update」を利用して、ボイチャンネルの出入りを取得します。
■パラメータの説明
- member … voice状態の変わった「member」
- before(VoiceState) … 更新前の「VoiceState」
- after(VoiceState) … 更新後の「VoiceState」
if (before.channel != after.channel):
VoiceStateに変更があったかを判定します。
alert_channel = client.get_channel(textChannelId)
上記で設定したチャンネルIDから投稿先のチャンネルオブジェクトを取得します。
if before.channel is None:
msg = f'{member.nick} が {after.channel.name} に参加しました。'
await alert_channel.send(msg)
以前のVoiceStateの状態がVoiceチャンネル未参加の場合に、
「{ニックネーム}が{参加したボイスチャンネル}に参加しました。」
と通知します。
elif after.channel is None:
msg = f'{member.nick} が {before.channel.name} から退出しました。'
await alert_channel.send(msg)
移動後のVoiceStateがボイスチャンネルに参加していない場合、
「{ニックネーム}が{参加したボイスチャンネル}から退出しました。」
を通知します。
まとめ
今回、Discordボットに実装できる機能、その設定を紹介しました。
- 開発者モードの設定方法
- 画像、その他のファイルの投稿方法
- 新規メンバーへのロール付与方法
- ボイスチャンネルの出入り時の通知方法
前回の導入編から少し難しくなりましたが、実装できたでしょうか?
Discordのボットの機能を充実させていくことでボットへの愛着も湧いてくると思います。
今後もDiscordのボット機能を実装する記事を書いていきますので、ぜひ一緒に実装してみましょう!
今回の記事が、皆さんの技術力向上に繋がれば嬉しいです!
以上、おつかれさまでした!