この記事は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ライフを!