#はじめに
###投稿者の自己紹介
どうもまぬおです!discord.pyでBotを開発しています。よろしくお願いします
###お知らせ
Discord Bot Advent Calendar 2020
この記事はDiscord Bot Advent Calendarの2日目の記事です。ほかの方の投稿もぜひご覧になってください
1日目にも投稿しています。たくさんのViewありがとうございました!
良ければ、LGTMもよろしくお願いします!
###今回のテーマ
ボイスチャンネル2つ、テキストチャンネル1つが含まれたカテゴリをロビーとみなし、コマンドでそのロビーを作成するBotを作成します。良ければ最後までご覧ください
また、この記事はある程度Botを開発したことがある中級者向けの記事になっています。Botの開発を始める方法などは書きませんので注意してください
初心者の方には、別の方が書いていただいた初心者向けの記事があります
ボクもこの記事からDiscord Bot開発を勉強し始めましたのでおすすめです!
##予備知識
今回の処理に使う予備知識を先に紹介します
###テキストチャンネルを作成する
テキストチャンネルは、文字で会話するチャンネルです
テキストチャンネル作成の関数はGuildが持っています
#テキストチャンネルを作成する
await Guild.create_text_channel("テキストチャンネル")
###ボイスチャンネルを作成する
ボイスチャンネルは、声で会話するチャンネルです。VCとも言いますね
ボイスチャンネルもGuildの関数で作成します
#ボイスチャンネルを作成する
await Guild.create_voice_channel("ボイスチャンネル")
###カテゴリを作成する
カテゴリは、チャンネルのグループ分けを行う仕組みです
チャンネル作成と同様にGuildの関数で作成します
#カテゴリを作成する
await Guild.create_category("カテゴリ")
###各チャンネルをカテゴリに内包する
これにはいくつか方法がありますので、場合によって使い分けます
まずはそれぞれを作成して後から設定する方法です。すでにあるチャンネルにカテゴリを設定するときに使えますね
#チャンネルを作成する
TextChannel = await Guild.create_text_channel("テキストチャンネル")
VoiceChannel = await Guild.create_voice_channel("ボイスチャンネル")
#カテゴリを作成する
Category = await Guild.create_category("カテゴリ")
#カテゴリに内包する
await TextChannel.edit(category = Category)
await VoiceChannel.edit(category = Category)
次に、チャンネル作成時にカテゴリを設定する方法です。
# カテゴリを作成する
Category = await Guild.create_category("カテゴリ")
# チャンネルの作成時にカテゴリを設定する
await Guild.create_text_channel("テキストチャンネル", category = Category)
await Guild.create_voice_channel("ボイスチャンネル", category = Category)
最後にカテゴリからチャンネルを作成する方法です。これが一番直感的でわかりやすいかもしれません
A shortcut method to Guild.create_text_channel() to create a TextChannel in the category.
A shortcut method to Guild.create_voice_channel() to create a VoiceChannel in the category.
今回はこの方法を使います
# カテゴリを作成する
Category = await Guild.create_category("カテゴリ")
# チャンネルの作成時にカテゴリを設定する
await Category.create_text_channel("テキストチャンネル")
await Category.create_voice_channel("ボイスチャンネル")
##実装
###コマンドの受け付けを確認する
discord.pyでコマンドを受け付ける方法はいくつかありますが、今回は一番簡単なdiscord.ext.commands
を使った方法でいきます
discord.ext.commands
を使うと、コマンドの文字列をそのまま関数名にできるので簡単ですね。コマンドに続く文字列も取得できます
ロビー作成のコマンドは!lobby ロビー名
にしました
まずは、コマンドがちゃんと実装できているか確認するためにprint()でロビー名を出力してみます
import discord
from discord.ext import commands
TOKEN = "TOKEN"
client = commands.Bot(command_prefix = "!")
@client.command()
async def lobby(ctx, arg):
LobbyName = arg
print(LobbyName)
client.run(TOKEN)
わかりにくいですが出力の様子です。ちゃんと指定したロビー名を取得できています
###コマンドの処理を実装する
それでは、実際に今回のBotのコードを書いていきます
コマンドの中の処理を変更し、ボイスチャンネル2つ、テキストチャンネル1つが含まれたカテゴリが作成される処理を記述します
import discord
from discord.ext import commands
TOKEN = "TOKEN"
client = commands.Bot(command_prefix = "!")
@client.command()
async def lobby(ctx, arg):
LobbyName = arg
Guild = ctx.guild
# カテゴリを作成する
Category = await Guild.create_category(LobbyName)
# チャンネルの作成時にカテゴリを設定する
await Category.create_text_channel("テキストチャンネル")
await Category.create_voice_channel("ボイスチャンネル1")
await Category.create_voice_channel("ボイスチャンネル2")
client.run(TOKEN)
結果はこんな感じです。コマンドで指定した名前のロビーが作成できていますね
ちなみに
discord.ext.commands.errors.CommandInvokeError: Command raised an exception: Forbidden: 403 Forbidden (error code: 50013): Missing Permissions
のエラーが出た場合は権限が足りていません
Manage Channels
の権限をBotに与えると解決します
##おわりに
###増え続けるロビー
みなさんお気づきかと思いますが、今回の実装ではロビーを削除する機能がありませんので無尽蔵にロビーが増え続けます
削除するコマンドは、次回以降に紹介するかもしれません(しないかも)
チャンネルを作成する処理は、他の処理と組み合わせると便利な機能になりやすいです。ぜひ今回紹介した処理を参考にしてください
###おわりのあいさつ
ここまで読んでいただき、ありがとうございました
この記事がみなさんの開発に役立つと幸いです
それでは良いDiscord Bot開発ライフを!
###各種バージョン
Python3 : 3.6.9
Discord.py : 1.5.1