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