Coglar ve Birden Fazla Özellik

Önceki derslerden öğrendiğin ile bir bot yapabildin, fakat kodlar çok karıştı! Bütün özellikler birbirinin içine girdi, tek bir fonksiyonda 200 satır kod, 5 özellik var! Nasıl düzeltiriz bunu?

Cevabın tabiki coglar! Discord.py'nin içinde gelen, bot özelliklerini ayırma sistemi.

Bu sistem, her özelliği ayrı bir coga ayırarak, botunu daha kolay bir şekilde kodlayabilmeni sağlıyor.

Şimdi, diyelim iki komudumuz var. !a ve !b. Bu komutlar, farklı özelliklerin komutları. Şu anda bildiklerin ile ikisini aynı dosyaya koyabilir, botunu yapabilirsin tabi, ama bir yerden sonra 10 özellik aynı dosyada olunca, sıkıntılar başlıyor.

Şu kod üzerinden başlayacağız:

import discord
from discord.ext import commands

bot = commands.Bot(
        command_prefix="!",
        description="Cog örneği bot",
)

@bot.command()
async def a(ctx):
    await ctx.send("Özellik A")

@bot.command()
async def b(ctx):
    await ctx.send("Özellik B")

@bot.event
async def on_ready():
    print("Hazırız")

bot.run("TOKEN")

Şimdi, ilk başta bot klasörümüzün içinde iki tane klasör açalım: birinin adı a, birinin adı b olsun. Tabi senin yapmak isteyeceğin şey büyük ihtimalle bunlara daha mantıklı isimler vermek olacaktır.

Şimdi, ikisinin de içine ozellik.py diye bir dosya açalım. İsmi gerçekten fark etmez, ama ben şimdilik özellik diyor olacağım.

a klasörüne gir, ve içindeki ozellik.py'yi favori kod editörün ile aç. Açınca, ilk yapmak istediğimiz şey, bir cog yaratmak olacaktır. Bunu, yeni bir sınıf açarak yapabiliriz.

from discord.ext import commands

class AOzelligi(commands.Cog):

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

Burada, basit bir cog oluşturmuş oluyorsunuz. Hiç bir şey yapmıyor, ama var. Şimdi, buna özellik eklemeden önce, bota bağlayalım, ne dersiniz

Cogu Bota Bağlamak

Bir cog'u botunuza bağlamanın en iyi yolu, extension mekanizmasını kullanmaktır.

Bunu yapabilmek için, ozellik.py dosyasında, her şeyin dışına setup isimli bir fonksiyon açmanız gerekmektedir. Fonksiyona, tek bir argüman, bot, koymanız gerekmektedir.

def setup(bot):
    pass

Bu fonksiyonun içinde, botumuza cog'umuzu ekleyebiliriz:

def setup(bot):
    bot.add_cog(AOzelligi(bot))

Şimdi, ana bot dosyamıza gelelim (token'i bulundurduğumuz dosyaya), ve bot.run("TOKEN") satırından önce, şu satırları ekleyelim:

bot.load_extension("a.ozellik")
bot.load_extension("b.ozellik")

Burada, bottan a.ozellik (a/ozellik.py) ve b.ozellik (b/ozellik.py) dosyalarını yüklemesini istedik.

Bu satırlar, dosyaları otomatik olarak yükleyip, içindeki setup(bot) fonksiyonunu çağıracaktır.

Coglara İşlev Vermek

Tamamdır, coglarımızı bota yükletiyoruz, fakat içleri bomboş, nasıl içlerine bir şeyler ekleyebiliriz?

Güzel soru! Ve hemen cevaplayalım:

ozellik.py dosyalarımızı açalım, ikisinde de bir cog class'ı olduğuna emin olalım, ve gel, içlerine bir event, bir de komut ekleyelim.

a/ozellik.py:

from discord.ext import commands

class AOzelligi(commands.Cog):

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

    @commands.Cog.listener()
    async def on_member_join(self, member):
        await member.send("Sunucumuza Hoş Geldin!")

b/ozellik.py:

from discord.ext import commands

class BOzelligi(commands.Cog):

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

    @commands.command()
    async def b(self, ctx):
        await ctx.send("Özellik B")

Artık fazla anlatılacak bir şey de yok, direkt olarak anlaşılması lazım neyin ne olduğu.

@commands.Cog.listener(), önceden gördüğün @bot.event ile aynı.
@commands.command() ise önceden gördüğün @bot.command() ile aynı.

Şimdi botu çalıştırırsan, bütün özelliklerin çalıştığını göreceksin!

Coglar hakkında daha fazla bilgi almak için Discord.py dökümentasyonuna bakabilirsin!

Son Güncelleme: 7/12/2019, 11:32:28 PM