[discord.py] helpコマンドの表示内容を日本語化する

この記事の内容

discord.pyext.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コマンドを自動で実装してくれるところが挙げられます。greetbyeを実装すれば、自動的にhelpコマンドが追加され、greetbyeの機能を説明してくれるのです。


$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_headingno_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コマンドは自動的に生成されますが、そのままだと英語です。デフォルトのものをかんたんにカスタマイズして日本語化することができます。