5
2

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.

Discord BotAdvent Calendar 2020

Day 7

discord.pyでカスタムprefixを実装しよう!

Last updated at Posted at 2020-12-26

この記事は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)

実装

自分は下記のように実装しました。

main.py
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から[]hogereplaceし、prefixという文字列を取得します。
最後にこれをreturnしておしまい!

最後に

今回はだいぶ雑な記事になってしまいすみません、、
次回からしっかりしますのでお許しを

カスタムprefixを使用していいdiscord botライフを!

5
2
1

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
5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?