35
25

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Python】discord.pyが開発終了ということなのでpycordに乗り換えよう

Last updated at Posted at 2021-12-17

1. はじめに

当記事は、Discord API の Pythonラッパー「discord.py」の開発終了を受けて、
今後どのように Pythonを使用してDiscorsd Botを作れば良いかについて解説したものです。

discord.pyの開発終了についてはこちらを確認してください。
Discorsd Botの作り方/discord.pyの使い方については#関連記事をご覧ください。

また、**Python・discord.pyの経験のある方を対象としています。**予めご了承ください。

2. 何故「pycord」を選ぶのか

discord.pyの主な代替ライブラリとして、

などが挙げられます。
これらは全て discord.pyをフォークして開発の進められているライブラリのため、
現時点で標準の機能にはあまり差がないように感じました。

そのため、ライブラリの移行を考えている方が気になっていそうと考えた

  • Application Commands (スラッシュコマンド)が実装できるかどうか
  • discord.pyからの 書き換え量がどれくらいか
  • GitHubのスター数

を基準に調べ、どのライブラリが良いかを選びました。

ライブラリ GitHubスター数 Application Commands discord.pyからの書き換え
pycord 約1200 普通
nextcord 約500 × 多い
disnake 約250 多い
(記事執筆時 2021/12/17 現在)

まず、nextcordには 現時点でApplication Commandsが実装されていませんでした。
今後、Message Content Intentを使用するのに申請が必要になる為、nextcordはあまりおすすめできません。

disnakeは pycordと比べると書き換えの量が多く、Application Commandsの実装もpycordに比べ少し複雑でした。
そのため、当記事では pycord に乗り換える方法についてを解説します。

3. pycordのインストール

$ pip install git+https://github.com/Pycord-Development/pycord

今回はApplication Commandsを実装するため、GitHubから直接インストールします。

4. Application Commandsの実装

4.0. コードの基本形

discordbot.py
import discord

bot = discord.Bot()

# ここにコードを記述

bot.run('DISCORD_BOT_TOKEN')

'DISCORD_BOT_TOKEN' には、自分のBOTのTOKENを入れてください。

4.1. コマンドの実装(オプションなし)

discordbot.py
@bot.slash_command(guild_ids=[...])
async def ping(ctx):
    await ctx.respond('pong')

image-pp.png
これだけで画像のような ping/pong のコマンドを実装できます。
サーバー専用コマンドの場合は [...] にそのサーバーのIDを入れてください。
全体のコマンドの場合 guild_ids=[...] は必要ありませんが、コマンドの登録までに1時間弱かかるようです。
参考:examples/app_commands/slash_basic.py

4.2. コマンドの実装(オプションあり)

discordbot.py
from discord.commands import Option

@bot.slash_command(guild_ids=[...])
async def hello(
    ctx,
    name: Option(str, '名前を入力してください'),
    gender: Option(str, '性別を選択してください', choices=['男性', '女性', 'その他']),
    age: Option(int, '年齢を入力してください', required=False, default=18),
):
    await ctx.respond(f'こんにちは、{name}さん')

オプション(引数)を追加する場合は from discord.commands import Option を追加する必要があります。
参考:examples/app_commands/slash_options.py

4.3. オートコンプリートの実装

discordbot.py
from discord.commands import Option

COLORS = ['red', 'orange', 'yellow', 'green', 'blue', 'indigo', 'violet']

async def get_colors(ctx):
    return [color for color in COLORS if color.startswith(ctx.value)]

@bot.slash_command(guild_ids=[...])
async def color(
    ctx,
    color: Option(str, '色を選択してください', autocomplete=get_colors),
):
    await ctx.respond(f'{color}が選択されました')

入力した値によって選択肢が変化するサジェスト機能を実装できます。
参考:examples/app_commands/slash_autocomplete.py

5. おわりに

この記事を読み、PythonでのApplication Commandsの実装に魅力を感じなかった方は、他の言語のライブラリも触ってみることをおすすめします。有名なものだと、discord.jsもApplication Commandsに対応しています。

また、Discord APIやそのラッパーについて質問・議論をしたい方はDiscordのコミュニティに参加することをおすすめします。
ROM専でもかなり有益な情報を得ることが可能なため、コミュニケーションが苦手という方も参加だけしておいて損はないです。

私のおすすめコミュニティはこちら

私が初学者の頃からお世話になっているコミュニティです。
BOTを使った独自の質問システムが存在します。ぜひ参加してみてください。
(質問専用のサーバーではありませんのでご注意ください)

6. 関連記事

35
25
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
35
25

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?