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:
Setiap cog merupakan kelas Python yang merupakan turunan dari kelas
commands.Cog
.Setiap perintah ditandakan dengan dekorator
commands.command()
.Setiap listener ditandakan dengan dekorator
commands.Cog.listener()
.Cogs dapat diregistrasi dengan memanggil fungsi
Bot.add_cog()
.Cogs juga dapat dihapus dengan memanggil fungsi
Bot.remove_cog()
.
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)