Updated bot to allow live reloading Updated WillieTimer with a lock to ensure two sessions are not opened, causing an error Added output for config keys Updated README.md
99 lines
4.5 KiB
Python
99 lines
4.5 KiB
Python
import asyncio
|
|
import datetime
|
|
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
|
|
self.message_pool = [
|
|
"It's 4:20! It's time to light up!",
|
|
"Willie wanted to let you know that IT'S 4:20!",
|
|
"Can you smell what the rock is cooking? No? PROBABLY BECAUSE IT'S 4:20!",
|
|
"Oh say can you see. By the blunts early light. IT'S 4:20!",
|
|
"Hey, are you busy? I just wanted to let you know IT'S 4:20!",
|
|
"You know, the funny thing about time is we often forget to pay attention to it and we miss out on things. ALMOST LIKE 4:20! LIGHT UP!"
|
|
]
|
|
|
|
@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}> {choice(self.message_pool)}")
|
|
|
|
@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 setup(bot: commands.Bot):
|
|
bot.add_cog(WillieTimer(bot))
|