Discord.py keyword argüman bu fonksiyonda tam olarak nasıl kullanılmalı?

import discord
from discord.ext import commands,tasks
import os

intents = discord.Intents(messages=True, guilds=True, reactions=True, members=True, presences=True, guild_messages=True)

client = commands.Bot(command_prefix="!dc ", intents=intents)

@client.command()
async def send_timed_msg(ctx,*args):  #Bu fonksiyon send_timed_messages fonksiyonunu çalıştıcak.
    text = ""
    for x in args:
        text = text + " " + x
    await send_timed_messages.start(text)


   
@client.command()
async def change_interval(*, minutes): #Bu fonksiyon ile de belli bir loopta dönen mesajın kaç dk da bir gönderileceğini değiştirebiliyoruz.


    send_timed_messages.change_interval(minutes= minutes) #Hatayı bu satırdan alıyorum

@tasks.loop(minutes= 0.06,count= 2)  # Bu ifade ile birlikte aşağıdaki methodumuz loop'a giriyor ve belirttiğimiz aralıklarla tekrar çalışıyor.
async def send_timed_messages(msg,time=0,count=0):  # count ifadesine verdiğimiz sayı kadar fonksiyon çalıştığında,fonksiyon çalışmayı durdurur
    for x in client.get_all_channels():
        if x.id == 886984276342620170:  #Mesajı göndermek istediğim kanalın id'si
            await x.send(msg)


client.run(myToken)

Selamlar herkese,birşey sormak istiyorum.Şimdi ben yukarıdaki kodu çalıştırdığımızda şu hatayı alıyorum:‘Command raised an exception: TypeError: change_interval() takes 0 positional arguments but 1 was given.’ Bu kütüphaneye görediscord.py deki bu fonksiyon.Galiba tam olarak keyword ve positional argümanları anlayamadım.Hatayı nasıl çözebilirim yardımcı olabilir misiniz?

Merhaba, anladığım kadarıyla send_timed_msg komutuyla bir text alıp onu belli aralıkla yazdırmak isityorsun. Bunun için sadece tasks.loop decorator’ını kullanman yeterli. Parametre olarak verdiğin zamana göre o aralığı ayarlıyacaktır. change_interval kullanmaya çalışman kafa karışıklığından kaynaklı sanırım.

Kodu şu şekilde düzenledim

import discord
from discord.ext import commands,tasks
import os

intents = discord.Intents(messages=True, guilds=True, reactions=True, members=True, presences=True, guild_messages=True)

client = commands.Bot(command_prefix="!dc ", intents=intents)

@client.command()
async def send_timed_msg(ctx,*args):  #Bu fonksiyon send_timed_messages fonksiyonunu çalıştıcak.
    text = " ".join(args) # for döngüsü yerine join metodunu kullanabilirsin https://python-istihza.yazbel.com/karakter_dizilerinin_metotlari2.html#join
    await send_timed_messages.start(text)

@tasks.loop(seconds=20, count=3)  # Bu ifade ile birlikte aşağıdaki methodumuz loop'a giriyor ve belirttiğimiz aralıklarla tekrar çalışıyor.
async def send_timed_messages(msg):  # count ifadesine verdiğimiz sayı kadar fonksiyon çalıştığında,fonksiyon çalışmayı durdurur
    for x in client.get_all_channels():
        if x.id == 886984276342620170:  #Mesajı göndermek istediğim kanalın id'si
            await x.send(msg)


client.run(myToken)

Kodu test etmedim, daha önceden discord.py ile bot yazmıştım ama tasks’ı hiç kullanmadım, hata alma ihitmalin var. Ama sonuç olarak change_interval ile bi işin yok, sadece tasks.loop decorator’ını kullan.

@ibrahimcetin Öncelikle cevabınız için teşşekkür ederim.change_interval methodunu kullanıcı bu zaman aralıklarını değiştirmek isterse diye yapmış olup başarılı olamamıştım.Yani amacım kullanıcının istediği zaman aralığında mesaj göndermesiydi(Örneğin birine ya da bir kanala 1 saatte bir kendi istediği mesajı göndermesi gibi).Eğer bu methodun çalışmasında yardımcı olursanız çok sevinirim :slight_smile: Kolay gelsin

Decoratorları @ ile kullanmak zorunda değilsin fonksiyon gibi de kullanabilirsin.

import discord
from discord.ext import commands, tasks
import os

intents = discord.Intents(
    messages=True,
    guilds=True,
    reactions=True,
    members=True,
    presences=True,
    guild_messages=True,
)

client = commands.Bot(command_prefix="!dc ", intents=intents)

scheduled_messages = []


async def send_timed_messages(ctx, text):
    if ctx.channel.id == 886984276342620170:  # Mesajı göndermek istediğim kanalın id'si
        await ctx.send(text)


@client.command()
async def send_timed_msg(ctx, *args):
    interval = int(args[0])
    count = int(args[1])
    text = " ".join(args[2:])

    task = tasks.loop(seconds=interval, count=count)(send_timed_messages) # decorator'ı fonksiyon gibi kullanıyoruz
    task.start(ctx, text) # task'ı başlatıyoruz


client.run("TOKEN")

Örnek olarak !dc send_timed_messages 3 5 hello world yazarsan 3 saniyede bir hello world yazacaktır ve bunu 5 defa yapacaktır.

En temel haliyle yazdım. Geri kalan gelirştirmeyi sana bırakıyorum.

1 Beğeni

Bu arada şuna göz atmanı öneririm

1 Beğeni

@ibrahimcetin Çok teşşekkür ederim.Decoratorlar hakkında bu bilgiyi unutmuştum teşşekkürler tekrardan