0
0

More than 1 year has passed since last update.

pythonでdiscordを運用するテンプレートcogsの利用

Last updated at Posted at 2022-04-05

はじめに

こちらを参照するとより正確です

インストール

discord.pyのインストール

以下のどちらかでインストールします。

github
pip install -U discord.py
python -m pip install -U discord.py

詳しくは以下を参照
https://discordpy.readthedocs.io/ja/latest/intro.html

discord-ext-botのインストール 以下のどちらかでインストールします。
github
pip install discord-ext-bot
python -m pip install discord-ext-bot

botの登録

以下からdiscord側でbotの作成を行います。

右上にある
image.png
を押して任意の名前で登録します

登録できたら右にある次のような欄からbotを選択
image.png
そしてaddbotを押してください
image.png
私の場合testで作成すると他のplayerがこの名前を使いすぎているので作成できませんと出たのでなるべくオリジナルの名前にしておくとよいでしょう。

次に
image.png
を押してTOKENを入所しておきましょう。

準備

まずはメインファイルにインポート

main.py
from discord.ext import commands
import discord
import traceback

※tracebackはなくてもよいですが、あると細かいエラーを表示してくれます。

メインクラスの作成

main.py
class main(commands.Bot):

    def __init__(self, command_prefix):
        # スーパークラスのコンストラクタに値を渡して実行。
        super().__init__(command_prefix)

super().__init__で親クラスcommands.Botcommand_prefixを渡し実行します。

一番下botが起動するように設定しよう。

main.py
if "__main__" == __name__:
    bot = main(command_prefix=commands.when_mentioned_or('任意の文字'))
    bot.run("TOKEN")

任意の文字は先頭に記入する文字
TOKENには先ほど手に入れたTOKENをいれる。

if "__main__" == __name__このファイルが呼ばれたときのみ実行(おまじない)
bot = main(command_prefix=commands.when_mentioned_or('任意の文字')) botにメインクラスを代入し、 mainクラスにcommand_prefixの値を代入して実行する。

commands.when_mentioned_or('任意の文字')このbotの実行方法である。
メンションもしくは 任意の文字が打たれた時実行される。
commands.when_mentioned_or('任意の文字')のところを丸ごと "任意の文字"に変えても実行できる。

bot.run("TOKEN") mainクラスの実行。これでbotが起動する。

Botが起動したときコンソールにメッセージを送る

先ほど作成したメインクラスに次を書き足す
main.py main.class
async def on_ready(self):
        print('-----')
        print(self.user.name)
        print(self.user.id)
        print('-----')
        await bot.change_presence(status=discord.Status.online,activity=discord.Game(f"任意の文字"))

async def on_ready(self)で実行完了時に起動されます。

await bot.change_presence(status=discord.Status.online,activity=discord.Game(f"任意の文字"))

statusdiscord.Status.onlinediscord.Status.idleを代入することでbotを退席中などに編集できる。

activity=discord.Game(f"任意の文字")でbotのアクティビティを編集できる。建設中をプレイ中

cogsを作成しよう

このままメインクラスにつらつらと書くのでもよいがcogsを作成してコマンドごとにファイルを分けよう。

まず初めにmain.pyと同じ階層にcogsフォルダーを作成するその中にcmd.py(好きな名前にしよう)ファイルを作成する。

次にcogsファイルのcmd.pyを読み込むようにmain.pyを書き換える
まずは読み込むファイルリストをインポートの下に書く。
main.py
cogslist=[
   'cogs.cmd'
]

次にメインクラスにてcogslistを読み込むようにする。

main.py main.class
for cog in cogslist:
    try:
       self.load_extension(cog)
    except Exception:
       traceback.print_exc()

注意
準備でtracebackを入れてない方はtraceback.print_exc()passに書き換えよう。

tryコマンドでエラーをはじき出しbotの実行を優先します。

self.load_extension(cog)

for ~ in ~でcogに代入されたcogslistにあるファイルを一つずつ読み込みます。

cmd.pyをかこう

cmdにもクラスを作成、インポートもする。
cmd.py
from discord.ext import commands
import discord

class TestCog(commands.Cog):

    def __init__(self, bot):
        self.bot = bot

def setup(bot):
    bot.add_cog(TestCog(bot))
def __init__(self, bot): self.bot = bot main.pyからもらったbot変数をself.botに代入してインスタンス変数(class内で使える変数)にする。
def setup(bot): bot.add_cog(TestCog(bot)) main.pyはsetup関数を覗きに来るのでここにclassを読み込むように指定する。
あとはクラス内に次のように記入をすればコマンドを作成できる。
cmd.py TestCog.class
@commands.command()
    async def test(self, ctx):
        await ctx.send("テスト成功!")

注意
毎回@commands.command()で関数はデコレータしてください。

async def test(self,ctx) この関数でコマンドを指定しています。 main.pyで指定したcommand_prefixの後にtestと入力するとこの関数が実行されます。 またこの関数の引数を増やすことでtestの後ろに半角スペース開けて入力された値を利用することもできます。

終わりに

今回はcogについての話を重点的に話しました。 コマンドの作成以外にもたくさんの機能があるのでdiscord.pyについては良く調べねば、、、 私もよくわからないことが多いのでこれから研究ですね。

参考

0
0
0

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
0
0