この記事の内容
discord.pyのext.commands
フレームワークで表示されるhelp
コマンドの表示内容を、すべて日本語にする方法について解説します。
ext.commandsフレームワークについてもかんたんに触れていますので、discord.pyに興味のある方はご一読ください。
helpコマンドについて
ext.commandsフレームワーク
discord.pyには、ext.commandsフレームワークというものが存在します。これはBotにprefix(接頭語)を設定し、prefix+commandでBotを操作するという挙動をシンプルに実装することができる方法です。
たとえば、$hello
で出会いのあいさつ、$goodbye
で別れのあいさつをする、といったBotを作りたい場合、ext.commandsフレームワークがぴったりでしょう。
helpコマンド
ext.commandsフレームワークの優れた点として、helpコマンドを自動で実装してくれるところが挙げられます。greet
とbye
を実装すれば、自動的にhelp
コマンドが追加され、greet
とbye
の機能を説明してくれるのです。
$help
と入力すると上記のようなヘルプが表示されます。このヘルプはdiscord.pyの機能で自動生成されたもので、開発者は1行もソースコードを書いていません。
これだけではイメージがわきにくいので、サンプルを見てみましょう。
サンプルコード
from discord.ext import commands
# 実際にはここにBotトークンを入れる
token = 'token'
prefix='$'
class Greet(commands.Cog):
def __init__(self, bot):
super().__init__()
self.bot = bot
@commands.command()
async def hello(self, ctx):
"""出会いのあいさつをする"""
await ctx.send(f"どうも、{ctx.author.name}さん!")
@commands.command()
async def goodbye(self, ctx):
"""別れの挨拶をする"""
await ctx.send(f"じゃあね、{ctx.author.name}さん!")
bot = commands.Bot(command_prefix=prefix)
bot.add_cog(Greet(bot=bot))
bot.run(token)
上記のコードを見てもらうとわかるように、help
コマンドのための記述はありません。
helpコマンドは、"""~"""
で囲まれた部分をコマンドの説明として採用する(複数行のコメントがある場合は一行目のみ)ので、コメントさえ入れておけば自動的にヘルプが作られるということになります。
helpコマンドを日本語化しよう
helpコマンドのカスタマイズ方法
ヘルプコマンドの動作は、commands.HelpCommand
クラスを通して定義します。何も設定しない場合のヘルプコマンドの動作は、commands.DefaultHelpCommand
で定義されています。他にデフォルトで用意されているクラスとして、commands.MinimalHelpCommand
があります。
上記のソースコードのうち、bot
を定義している行を下記のとおり修正してみましょう。
# bot = commands.Bot(command_prefix=prefix)
bot = commands.Bot(command_prefix=prefix, help_command=commands.MinimalHelpCommand())
表示されるヘルプが、下記のとおり簡易的なものに変わります。
では、この要領で、commands.DefaultHelpCommand
をカスタマイズしたクラスをつくり、日本語に対応させていきましょう。
日本語化するためのプロパティ・関数
commands.DefaultHelpCommand
にはcommands_heading
・no_category
というプロパティがあり、これらに値を設定することで、それぞれ「Commands:」「Other」という文字列のカスタマイズをすることができます。command_attrs
プロパティの"help"
要素に値を入れることで、helpコマンド自身の説明書きShows this message
をカスタマイズすることができます。
また、get_ending_note
という関数をオーバーライドすることで、ヘルプ末尾の文字列をカスタマイズすることができます。
ややこしいので、以下にまとめます。
プロパティ・関数 | 対応する文字列 |
---|---|
commands_heading | Commands: |
no_category | No Category |
command_attrs[“help”] | Shows this message |
get_ending_note | Type $help command for more info on a command. You can also type $help category for more info on a category. |
サンプルコード
上記のプロパティ・関数をカスタマイズしたクラスを定義してみます。
commands.DefaultHelpCommand
クラスをベースにするので、これを継承したクラスを作りましょう。名前は何でもいいのですが、仮にJapaneseHelpCommand
としてみました。JapaneseHelpCommand
という名前は、任意のものにして構いません。
class JapaneseHelpCommand(commands.DefaultHelpCommand):
def __init__(self):
super().__init__()
self.commands_heading = "コマンド:"
self.no_category = "その他"
self.command_attrs["help"] = "コマンド一覧と簡単な説明を表示"
def get_ending_note(self):
return (f"各コマンドの説明: {prefix}help <コマンド名>\n"
f"各カテゴリの説明: {prefix}help <カテゴリ名>\n")
定義したJapaneseHelpCommand
を、Botの初期化時にセットします。
# bot = commands.Bot(command_prefix=prefix)
bot = commands.Bot(command_prefix=prefix, help_command=JapaneseHelpCommand())
これで、以下のように大半の部分を日本語化することができました。
オプション1: カテゴリ名を日本語化する
これはお好みですが、Greet
の定義時にname
を指定すると、Cog自体の名前を変えることができます。プログラム内でCogの名前を使うような処理を書いている場合、そちらにも影響があるので、注意しましょう。
# class Greet(commands.Cog):
class Greet(commands.Cog, name='あいさつ'):
こんな感じになります。
オプション2: コマンドを日本語化する
ここまでいくとやりすぎ感じがあるのでおまけ程度の話ですが、コマンド自体を日本語にすることもできます。
# @commands.command()
@commands.command(name="こんにちは")
async def hello(self, ctx):
...
# @commands.command()
@commands.command(name="さようなら")
async def goodbye(self, ctx):
...
動かしたらこんなかんじ。
ヘルプコマンドを動かすと以下のようになります。
サンプルコード:完成編
ここまでのすべての結果をあわせたソースコードを下記に置いておきます。
from discord.ext import commands
token = 'token'
prefix = '$'
class Greet(commands.Cog, name='あいさつ'):
def __init__(self, bot):
super().__init__()
self.bot = bot
@commands.command(name="こんにちは")
async def hello(self, ctx):
"""出会いのあいさつをする"""
await ctx.send(f"どうも、{ctx.author.name}さん!")
@commands.command(name="さようなら")
async def goodbye(self, ctx):
"""別れの挨拶をする"""
await ctx.send(f"じゃあね、{ctx.author.name}さん!")
class JapaneseHelpCommand(commands.DefaultHelpCommand):
def __init__(self):
super().__init__()
self.commands_heading = "コマンド:"
self.no_category = "その他"
self.command_attrs["help"] = "コマンド一覧と簡単な説明を表示"
def get_ending_note(self):
return (f"各コマンドの説明: {prefix}help <コマンド名>\n"
f"各カテゴリの説明: {prefix}help <カテゴリ名>\n")
bot = commands.Bot(command_prefix=prefix, help_command=JapaneseHelpCommand())
bot.add_cog(Greet(bot=bot))
bot.run(token)
まとめ
discord.pyのext.commandsフレームワークを使うと、コマンド形式のBotをかんたんに実装することができます。
helpコマンドは自動的に生成されますが、そのままだと英語です。デフォルトのものをかんたんにカスタマイズして日本語化することができます。