111 lines
3.9 KiB
Python
111 lines
3.9 KiB
Python
import datetime as dt
|
|
|
|
import twitchio
|
|
from twitchio.ext import commands
|
|
|
|
from meta import CrocBot, LionCog, LionContext, LionBot
|
|
from utils.lib import strfdelta, utc_now, parse_dur
|
|
|
|
from . import logger
|
|
|
|
|
|
class TimeCog(LionCog):
|
|
def __init__(self, bot: LionBot):
|
|
self.bot = bot
|
|
self.crocbot: CrocBot = bot.crocbot
|
|
|
|
async def cog_load(self):
|
|
self._load_twitch_methods(self.crocbot)
|
|
|
|
async def cog_unload(self):
|
|
self._unload_twitch_methods(self.crocbot)
|
|
|
|
async def get_timezone_for(self, profile):
|
|
timezone = None
|
|
discords = await profile.discord_accounts()
|
|
if discords:
|
|
userid = discords[0].userid
|
|
luser = await self.bot.core.lions.fetch_user(userid)
|
|
if luser:
|
|
timezone = luser.config.timezone.value
|
|
return timezone
|
|
|
|
def get_timestr(self, tz, brief=False):
|
|
"""
|
|
Get the current time in the given timezone, using a fixed format string.
|
|
"""
|
|
format_str = "%H:%M, %d/%m/%Y" if brief else "%I:%M %p (%Z) on %a, %d/%m/%Y"
|
|
now = dt.datetime.now(tz=tz)
|
|
return now.strftime(format_str)
|
|
|
|
async def time_diff(self, tz, auth_tz, name, brief=False):
|
|
"""
|
|
Get a string representing the time difference between the user's timezone and the given one.
|
|
"""
|
|
if auth_tz is None or tz is None:
|
|
return None
|
|
author_time = dt.datetime.now(tz=auth_tz)
|
|
other_time = dt.datetime.now(tz=tz)
|
|
timediff = other_time.replace(tzinfo=None) - author_time.replace(tzinfo=None)
|
|
diffsecs = round(timediff.total_seconds())
|
|
|
|
if diffsecs == 0:
|
|
return ", the same as {}!".format(name)
|
|
|
|
modifier = "behind" if diffsecs > 0 else "ahead"
|
|
diffsecs = abs(diffsecs)
|
|
|
|
hours, remainder = divmod(diffsecs, 3600)
|
|
mins, _ = divmod(remainder, 60)
|
|
|
|
hourstr = "{} hour{} ".format(hours, "s" if hours > 1 else "") if hours else ""
|
|
minstr = "{} minutes ".format(mins) if mins else ""
|
|
joiner = "and " if (hourstr and minstr) else ""
|
|
return ". {} is {}{}{}{}, at {}.".format(
|
|
name, hourstr, joiner, minstr, modifier, self.get_timestr(auth_tz, brief=brief)
|
|
)
|
|
|
|
@commands.command(name='time', aliases=['ti'])
|
|
async def time_cmd(self, ctx, *, args: str=''):
|
|
"""
|
|
Current usage is
|
|
!time
|
|
!time <target user>
|
|
|
|
Planned:
|
|
!time set ...
|
|
!time at ...
|
|
"""
|
|
authprofile = await self.bot.get_cog('ProfileCog').fetch_profile_twitch(ctx.author)
|
|
authtz = await self.get_timezone_for(authprofile)
|
|
|
|
if args:
|
|
target_tw = await self.crocbot.seek_user(args)
|
|
if target_tw is None:
|
|
return await ctx.reply(f"Couldn't find user '{args}'!")
|
|
target = await self.bot.get_cog('ProfileCog').fetch_profile_twitch(target_tw)
|
|
targettz = await self.get_timezone_for(target)
|
|
name = await target.get_name()
|
|
if targettz is None:
|
|
return await ctx.reply(
|
|
f"{name} hasn't set their timezone! Ask them to set it with '/my timezone' on discord."
|
|
)
|
|
else:
|
|
target = None
|
|
targettz = None
|
|
name = None
|
|
if authtz is None:
|
|
return await ctx.reply(
|
|
"You haven't set your timezone! Set it on discord by linking your Twitch account with `/profiles link twitch`, and then using `/my timezone`"
|
|
)
|
|
|
|
timestr = self.get_timestr(targettz if target else authtz)
|
|
name = name or await authprofile.get_name()
|
|
|
|
if target:
|
|
tdiffstr = await self.time_diff(targettz, authtz, await authprofile.get_name())
|
|
msg = f"The current time for {name} is {timestr}{tdiffstr}"
|
|
else:
|
|
msg = f"The current time for {name} is {timestr}"
|
|
await ctx.reply(msg)
|