54 lines
1.7 KiB
Python
54 lines
1.7 KiB
Python
import asyncio
|
|
import logging
|
|
import typing as t
|
|
from datetime import datetime
|
|
|
|
import discord
|
|
from discord.ext import tasks
|
|
from redbot.core.i18n import Translator
|
|
|
|
from ..abc import MixinMeta
|
|
|
|
log = logging.getLogger("red.vrt.levelup.tasks.weekly")
|
|
_ = Translator("LevelUp", __file__)
|
|
|
|
loop_kwargs = {"minutes": 5}
|
|
if discord.version_info >= (2, 4, 0):
|
|
loop_kwargs["name"] = "LevelUp.weekly_reset_check"
|
|
|
|
|
|
class WeeklyTask(MixinMeta):
|
|
@tasks.loop(**loop_kwargs)
|
|
async def weekly_reset_check(self):
|
|
now = datetime.now().timestamp()
|
|
guild_ids = list(self.db.configs.keys())
|
|
jobs: t.List[asyncio.Task] = []
|
|
for guild_id in guild_ids:
|
|
guild = self.bot.get_guild(guild_id)
|
|
if not guild:
|
|
continue
|
|
conf = self.db.configs[guild_id]
|
|
if not conf.weeklysettings.on:
|
|
continue
|
|
if not conf.users_weekly:
|
|
continue
|
|
if not conf.weeklysettings.autoreset:
|
|
continue
|
|
last_reset = conf.weeklysettings.last_reset
|
|
next_reset = conf.weeklysettings.next_reset
|
|
# Skip if stats were wiped less than an hour ago
|
|
if now - last_reset < 3600:
|
|
continue
|
|
# If we're within 6 minutes of the reset time, reset now
|
|
if next_reset - now > 360:
|
|
continue
|
|
jobs.append(self.reset_weekly(guild))
|
|
|
|
if jobs:
|
|
await asyncio.gather(*jobs)
|
|
|
|
@weekly_reset_check.before_loop
|
|
async def before_weekly_reset_check(self):
|
|
await self.bot.wait_until_red_ready()
|
|
await asyncio.sleep(10)
|
|
log.info("Starting weekly reset check loop")
|