import asyncio import datetime import random import discord from random import choice from discord.ext import commands from discord.ext.tasks import loop from BotResources import write_config_file class WillieTimer(commands.Cog): def __init__(self, bot): #, mention_group='Superadmins', channel_id=757379843792044102): self.bot = bot self.mention_group = str(self.bot.Default_Mention_Group) self.channel_id = int(self.bot.Default_Channel_ID) self.lock = False @loop(minutes=1) async def bg_timer(self): await self.bot.wait_until_ready() seconds_until_next_minute = int(60 - int(datetime.datetime.now().strftime('%S'))) if not seconds_until_next_minute <= 2: await asyncio.sleep(seconds_until_next_minute) if datetime.datetime.now().strftime('%H:%M') in ("04:20", "16:20"): print(f"It's {datetime.datetime.now().strftime('%H:%M:%S')}!") channel = self.bot.get_channel(id=self.channel_id) await channel.send(f"<@&{self.bot_get_role().id}> {self.get_random_phrase()}") @commands.command(help="Use this command to start the background task to wait for 4:20", brief="Starts the 4:20 clock") async def start420(self, ctx, *, member: discord.Member = None): member = member or ctx.author.display_name if not self.lock: await ctx.send(f"Thanks {member}, Willie will be in touch soon...") self.lock = True self.bg_timer.start() else: await ctx.send(f"I already told Willie {member}, if you want me to tell him to stop, @ me and say 'stop420'") @commands.command(help="", brief="Stops the 4:20 clock") async def stop420(self, ctx, *, member: discord.Member = None): member = member or ctx.author.display_name if self.lock: await ctx.send(f"Ok {member}, Willie will go back to writing music...") self.bg_timer.stop() self.lock = False else: await ctx.send(f"{member} I haven't told Willie yet. If you want me to, @ me and say 'start420'") @commands.command(help="Example '@Greada chchn 757379843792044102'", brief="Change the channel the bot chats in at 4:20") async def chchn(self, ctx, message, *, member: discord.Member = None): member = member or ctx.author.display_name try: message = int(message) if message and len(str(message)) == len(str(self.channel_id)): self.channel_id = message await ctx.send(f"Ok {member}, I'll let Willie know to reach you in " f"{self.bot.get_channel(id=self.channel_id)}") print(message) write_config_file(Channel_ID=self.channel_id) except Exception as e: print(f"Exception in chchn:\t{e}") await ctx.send(f"{member}, {message} is not a valid channel ID, please try again") pass @commands.command(help="Example '@Greada chmtn 'Willies Friends'", brief="Use this command to change who the bot mentions at 4:20") async def chmtn(self, ctx, message, *, member: discord.Member = None): member = member or ctx.author.display_name try: message = str(message) if message: self.mention_group = message await ctx.send(f"Ok {member}, I'll let Willie know to tell {self.bot_get_role()}") print(message) write_config_file(mention_group=self) except Exception as e: print(f"Exception in chmtn:\t{e}") await ctx.send(f"{member}, {message} is not a valid role, please try again") pass def bot_get_role(self): channel = self.bot.get_channel(id=self.channel_id) guild = channel.guild role = discord.utils.get(guild.roles, name=self.mention_group) return role def get_random_phrase(self): selected_phrase = None with open('./Phrases.txt', 'r') as phrase_file: phrases = phrase_file.readlines() selected_phrase = choice(phrases) if selected_phrase is not None: return selected_phrase def setup(bot: commands.Bot): bot.add_cog(WillieTimer(bot))