Rensjuh
Rensjuh

Reputation: 71

How to send a message every x minutes?

fotddict = {}
 
@client.event
async def on_ready():
  global fotddict
  with open("factoftheday.json", "r") as f:
      fotddict = json.load(f)
 
@client.command()
@commands.has_permissions(administrator=True)
async def fotd(ctx, channel : discord.TextChannel=None):
 
  if channel is None:
    embe=discord.Embed(title="<:redcross:781952086454960138>Error", description="**Please pass in all required arguments!**\nNeed help?** https://dsc.gg/otaysupport**", color=0x7289da)
    await ctx.send(embed=embe)
  
  else:
    #are you sure embed
    msg = await ctx.send(embed=embed)
 
    def checkifnotbotfact(reaction, user):
        return user != client.user
 
    await msg.add_reaction('💡')
 
    reaction, user = await client.wait_for("reaction_add", timeout=60.0, check=checkifnotbotfact)
 
    if str(reaction.emoji) == "💡": 
      
    #confirm embed
 
      global fotddict
      fotddict[str(ctx.guild.id)] = channel.id
 
      with open("factoftheday.json", "w") as f:
          json.dump(fotddict, f)
 
@tasks.loop(seconds=10)
async def factsend(member):
    x = randfacts.getFact()
    channel_id = fotddict[str(member.guild.id)]
    embed = discord.Embed(title="💡Fact of the day!", description=x, color=0x7289da)
    await client.get_channel(channel_id).send(embed=embed)
 
@factsend.before_loop
async def before():
  factsend.start()
  await client.wait_until_ready()

Problem: This is my fact of the day command, it adds the channel id + guild id in a json file (so that isnt the problem). I think the problem is the loop, since that is the part that im not sure of if thats correct.

Goal: Bot sends a message with a fact every 24 hours (Task is set to 10 seconds for test purposes)

Upvotes: 0

Views: 490

Answers (2)

Baptiste
Baptiste

Reputation: 306

Firstly your @factsend.before_loop function is called just before the loop execution, so you have to start the loop in other place, not in the function. So you have to deplace factsend.start() outside of this function.

The corriged code will be:

@client.event
async def on_ready():
  global fotddict
  with open("factoftheday.json", "r") as f:
      fotddict = json.load(f)
 
@client.command()
@commands.has_permissions(administrator=True)
async def fotd(ctx, channel : discord.TextChannel=None):
 
  if channel is None:
    embe=discord.Embed(title="<:redcross:781952086454960138>Error", description="**Please pass in all required arguments!**\nNeed help?** https://dsc.gg/otaysupport**", color=0x7289da)
    await ctx.send(embed=embe)
  
  else:
    #are you sure embed
    msg = await ctx.send(embed=embed)
 
    def checkifnotbotfact(reaction, user):
        return user != client.user
 
    await msg.add_reaction('💡')
 
    reaction, user = await client.wait_for("reaction_add", timeout=60.0, check=checkifnotbotfact)
 
    if str(reaction.emoji) == "💡": 
      
    #confirm embed
 
      global fotddict
      fotddict[str(ctx.guild.id)] = channel.id
 
      with open("factoftheday.json", "w") as f:
          json.dump(fotddict, f)
 
@tasks.loop(seconds=10)
async def factsend(member):
    x = randfacts.getFact()
    channel_id = fotddict[str(member.guild.id)]
    embed = discord.Embed(title="💡Fact of the day!", description=x, color=0x7289da)
    await client.get_channel(channel_id).send(embed=embed)
 
@factsend.before_loop
async def before():
  await client.wait_until_ready()

factsend.start() #deplaced outside of the function

Have a nice day!

Upvotes: 2

Cristian
Cristian

Reputation: 303

If you are going to leave the bot running locally (or host it somewhere), then you should use Advance Python Scheduler

from apscheduler.schedulers.blocking import BlockingScheduler

#Code goes Here

scheduler = BlockingScheduler()
scheduler.add_job(function_name_you_want_to_run(), 'interval', hours=24)
scheduler.start()

Upvotes: -1

Related Questions