Cogs

Ada di mana ketika anda membuat bot dan anda ingin mengorganisir koleksi perintah, listener, dan sebuah status dalam satu kelas. Cogs dapat membantu anda melakukan hal itu.

Singkatnya:

Harus dicatat bahwa cogs biasanya digunakan bersamaan dengan Ekstensi.

Contoh

Contoh ini akan mendefinisasikan kategori Greetings untuk perintah anda, dengan perintah bernama hello dan juga listener untuk memantau Event.

class Greetings(commands.Cog):
    def __init__(self, bot):
        self.bot = bot
        self._last_member = None

    @commands.Cog.listener()
    async def on_member_join(self, member):
        channel = member.guild.system_channel
        if channel is not None:
            await channel.send(f'Welcome {member.mention}.')

    @commands.command()
    async def hello(self, ctx, *, member: discord.Member = None):
        """Says hello"""
        member = member or ctx.author
        if self._last_member is None or self._last_member.id != member.id:
            await ctx.send(f'Hello {member.name}~')
        else:
            await ctx.send(f'Hello {member.name}... This feels familiar.')
        self._last_member = member

Beberapa catatan teknis untuk dipertimbangkan:

  • Semua listener harus ditandakan dengan dekorator, listener().

  • Nama cog akan otomatis diambil dari nama kelas tetapi dapat diubah secara manual. Lihat Opsi Meta.

  • Semua perintah harus mengawali semua parameter dengan self untuk dapat menggunakan semua attribut yang dipakai untuk mengatur status.

Pendaftaran Cog

Ketika anda mendifinisasikan cog, anda juga harus memberitau bot untuk mendaftarkan cog tersebut agar bisa digunakan. Kita bisa lakukan dengan fungsi add_cog().

bot.add_cog(Greetings(bot))

Ini akan mengaitkan cog dengan bot, menambah semua perintah dan listener secara otomatis.

Perlu diketahui modul ini menggunakan nama cog sebagai referensi, dan kita juga bisa mengubahnya melalui Opsi Meta. Jadi jika kita ingin menghapus cog, kita harus melakukan hal berikut.

bot.remove_cog('Greetings')

Memakai Cogs

Kita juga bisa mengambil cog dengan namanya, seperti kita menghapus dengan namanya. Ini membolehkan kita untuk berkomunikasi antar perintah untuk menyebar data. Contoh:

class Economy(commands.Cog):
    ...

    async def withdraw_money(self, member, money):
        # implementation here
        ...

    async def deposit_money(self, member, money):
        # implementation here
        ...

class Gambling(commands.Cog):
    def __init__(self, bot):
        self.bot = bot

    def coinflip(self):
        return random.randint(0, 1)

    @commands.command()
    async def gamble(self, ctx, money: int):
        """Gambles some money."""
        economy = self.bot.get_cog('Economy')
        if economy is not None:
            await economy.withdraw_money(ctx.author, money)
            if self.coinflip() == 1:
                await economy.deposit_money(ctx.author, money * 1.5)

Metode Spesial

Ketika cog mulai jadi rumit dan lebih banyak perintah, ada kalanya kita ingin mengkustomisasi bagaimana bot atau cog akan bekerja.

Anda dapat mengubah fungsi berikut:

Anda dapat mengunjungi referensi untuk info lebih lanjut.

Opsi Meta

Didalam cog, terdapat sebuah metadata untuk kelas Cog, yaitu commands.CogMeta, di mana kita dapat mengatur bagaiman cog akan bekerja. Untuk melakukannya, kita harus memberikan parameter ke bagian definisi kelas. Sebagai contoh, untuk mengatur nama cog kita dapat memberikan parameter name ke argument dengan cara berikut:

class MyCog(commands.Cog, name='My Cog'):
    pass

Untuk melihat opsi yang dapat anda atur, silakan lihat dokumentasi commands.CogMeta.

Inspeksi

Karena cogs merupakan tipe kelas, kita dapat menggunakan beberapa fungsi untuk memeriksa berbagai macam attribut pada cog.

Untuk mendapatkan list perintah, kita dapat menggunakan Cog.get_commands().

>>> cog = bot.get_cog('Greetings')
>>> commands = cog.get_commands()
>>> print([c.name for c in commands])

Jika kita ingin mendapatkan subperintah, kita bisa menggunakan generator Cog.walk_commands().

>>> print([c.qualified_name for c in cog.walk_commands()])

Untuk melakukan hal yang sama untuk listener, kita dapat mengambilnya dengan Cog.get_listeners(). Ini akan mengembalikan tuples -- dengan elemen pertama adalah nama listener dan yang kedua adalah fungsinya.

>>> for name, func in cog.get_listeners():
...     print(name, '->', func)