LoginSignup
4
6

More than 3 years have passed since last update.

【Discord.py】チャンネルを持ったカテゴリを作成する

Last updated at Posted at 2020-12-01

はじめに

投稿者の自己紹介

どうもまぬおです!discord.pyでBotを開発しています。よろしくお願いします

お知らせ

Discord Bot Advent Calendar 2020
この記事はDiscord Bot Advent Calendarの2日目の記事です。ほかの方の投稿もぜひご覧になってください

1日目にも投稿しています。たくさんのViewありがとうございました!
良ければ、LGTMもよろしくお願いします!

今回のテーマ

ボイスチャンネル2つ、テキストチャンネル1つが含まれたカテゴリをロビーとみなし、コマンドでそのロビーを作成するBotを作成します。良ければ最後までご覧ください

また、この記事はある程度Botを開発したことがある中級者向けの記事になっています。Botの開発を始める方法などは書きませんので注意してください
初心者の方には、別の方が書いていただいた初心者向けの記事があります
ボクもこの記事からDiscord Bot開発を勉強し始めましたのでおすすめです!

PythonでDiscordBotを書く方法

予備知識

今回の処理に使う予備知識を先に紹介します

テキストチャンネルを作成する

テキストチャンネルは、文字で会話するチャンネルです
テキストチャンネル作成の関数は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)

わかりにくいですが出力の様子です。ちゃんと指定したロビー名を取得できています
result.gif

コマンドの処理を実装する

それでは、実際に今回の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)

結果はこんな感じです。コマンドで指定した名前のロビーが作成できていますね
result2.gif
ちなみに
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

4
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
6