この記事はdiscord.py commandフレームワークを使用している方向けです。
そういえば知ってますか?
この記事はDiscord Botアドカレの7日目の記事らしいんです。
もうクリスマスですね、、
クリスマスも終わってますね、、
何それ美味しいの
いわゆるカスタムprefixとは、botは通常どのサーバーでもprefixが変わらないのに対して、サーバーごとにprefixを動的に設定できる機能のことを指します。
botが多数導入されていて、prefixが被ってしまう場合に割と有用です。
実装方法
commands.Botのcommand_prefixは通常、文字列やstrのlistで渡しますが、commands.Bot, discord.Messageを引数に取る関数を渡すこともできます。
この仕様を用いてprefixを動的に設定していきます。
保存方法
さて、prefixをどう保存するかですが、.jsonファイルやデータベースを用いるのもいいですが、今回はよりお手軽にするためにニックネームに保存したいと思います。[hoge]botの名前みたいな感じ。(この場合hogeがprefix)
実装
自分は下記のように実装しました。
import discord
from discord.ext import commands
def _prefix_callable(bot: commands.Bot, msg: discord.Message) -> str:
if msg.guild is None: # dmの場合
return "/"
else:
if msg.guild.me.nick is None:
return "/"
nick = msg.guild.me.display_name
result = nick.replace("[", "").replace(f"]{bot.user.name}", "")
return result
bot = commands.Bot(command_prefix=_prefix_callable)
bot.run("TOKEN")
dmの場合はprefixが被ることはないので(そもそも他にbotがいない)、if msg.guild is None で分岐して/ を返しています。
また、if msg.guild.me.nick is None: でニックネームが設定されていない(=カスタムprefixが設定されていない)場合に/ を返しています。
さて、ここからが本題です。カスタムprefixが設定されている場合に、どう処理しているかについて解説します。
仮にbotの名前をhoge、ニックネームを[prefix]hogeとしておきます。
まず、msg.guild.meでbot自身のMemberオブジェクトを取得し、.display_nameでニックネームを取得しnickに格納しています。
そしてnickから[と]hogeをreplaceし、prefixという文字列を取得します。
最後にこれをreturnしておしまい!
最後に
今回はだいぶ雑な記事になってしまいすみません、、
次回からしっかりしますのでお許しを
カスタムprefixを使用していいdiscord botライフを!