# coding=utf-8 # Copyright 2008-9, Sean B. Palmer, inamidst.com # Copyright 2012, Elsie Powell, embolalia.com # Licensed under the Eiffel Forum License 2. try: import pytz except ImportError: pytz = None from module import commands, example, OP from tools.time import ( get_timezone, format_time, validate_format, validate_timezone ) from config.types import StaticSection, ValidatedAttribute class TimeSection(StaticSection): tz = ValidatedAttribute( 'tz', parse=validate_timezone, serialize=validate_timezone, default='UTC' ) """Default time zone (see http://sopel.chat/tz)""" time_format = ValidatedAttribute( 'time_format', parse=validate_format, default='%Y-%m-%d - %T%Z' ) """Default time format (see http://strftime.net)""" def configure(config): config.define_section('clock', TimeSection) config.clock.configure_setting( 'tz', 'Preferred time zone (http://sopel.chat/tz)') config.clock.configure_setting( 'time_format', 'Preferred time format (http://strftime.net)') def setup(bot): bot.config.define_section('clock', TimeSection) @commands('t', 'time') @example('.t America/New_York') def f_time(bot, trigger): """Returns the current time.""" if trigger.group(2): zone = get_timezone(bot.db, bot.config, trigger.group(2).strip(), None, None) if not zone: bot.say('Could not find timezone %s.' % trigger.group(2).strip()) return else: zone = get_timezone(bot.db, bot.config, None, trigger.nick, trigger.sender) time = format_time(bot.db, bot.config, zone, trigger.nick, trigger.sender) bot.say(time) @commands('settz', 'settimezone') @example('.settz America/New_York') def update_user(bot, trigger): """ Set your preferred time zone. Most timezones will work, but it's best to use one from http://sopel.chat/tz """ if not pytz: bot.reply("Sorry, I don't have timezone support installed.") else: tz = trigger.group(2) if not tz: bot.reply("What timezone do you want to set? Try one from " "http://sopel.chat/tz") return if tz not in pytz.all_timezones: bot.reply("I don't know that time zone. Try one from " "http://sopel.chat/tz") return bot.db.set_nick_value(trigger.nick, 'timezone', tz) if len(tz) < 7: bot.say("Okay, {}, but you should use one from http://sopel.chat/tz " "if you use DST.".format(trigger.nick)) else: bot.reply('I now have you in the %s time zone.' % tz) @commands('gettz', 'gettimezone') @example('.gettz [nick]') def get_user_tz(bot, trigger): """ Gets a user's preferred time zone, will show yours if no user specified """ if not pytz: bot.reply("Sorry, I don't have timezone support installed.") else: nick = trigger.group(2) if not nick: nick = trigger.nick nick = nick.strip() tz = bot.db.get_nick_value(nick, 'timezone') if tz: bot.say('%s\'s time zone is %s.' % (nick, tz)) else: bot.say('%s has not set their time zone' % nick) @commands('settimeformat', 'settf') @example('.settf %Y-%m-%dT%T%z') def update_user_format(bot, trigger): """ Sets your preferred format for time. Uses the standard strftime format. You can use http://strftime.net or your favorite search engine to learn more. """ tformat = trigger.group(2) if not tformat: bot.reply("What format do you want me to use? Try using" " http://strftime.net to make one.") return tz = get_timezone(bot.db, bot.config, None, trigger.nick, trigger.sender) # Get old format as back-up old_format = bot.db.get_nick_value(trigger.nick, 'time_format') # Save the new format in the database so we can test it. bot.db.set_nick_value(trigger.nick, 'time_format', tformat) try: timef = format_time(db=bot.db, zone=tz, nick=trigger.nick) except: bot.reply("That format doesn't work. Try using" " http://strftime.net to make one.") # New format doesn't work. Revert save in database. bot.db.set_nick_value(trigger.nick, 'time_format', old_format) return bot.reply("Got it. Your time will now appear as %s. (If the " "timezone is wrong, you might try the settz command)" % timef) @commands('gettimeformat', 'gettf') @example('.gettf [nick]') def get_user_format(bot, trigger): """ Gets a user's preferred time format, will show yours if no user specified """ nick = trigger.group(2) if not nick: nick = trigger.nick nick = nick.strip() # Get old format as back-up format = bot.db.get_nick_value(nick, 'time_format') if format: bot.say("%s's time format: %s." % (nick, format)) else: bot.say("%s hasn't set a custom time format" % nick) @commands('setchanneltz', 'setctz') @example('.setctz America/New_York') def update_channel(bot, trigger): """ Set the preferred time zone for the channel. """ if bot.privileges[trigger.sender][trigger.nick] < OP: return elif not pytz: bot.reply("Sorry, I don't have timezone support installed.") else: tz = trigger.group(2) if not tz: bot.reply("What timezone do you want to set? Try one from " "http://sopel.chat/tz") return if tz not in pytz.all_timezones: bot.reply("I don't know that time zone. Try one from " "http://sopel.chat/tz") return bot.db.set_channel_value(trigger.sender, 'timezone', tz) if len(tz) < 7: bot.say("Okay, {}, but you should use one from http://sopel.chat/tz " "if you use DST.".format(trigger.nick)) else: bot.reply( 'I now have {} in the {} time zone.'.format(trigger.sender, tz)) @commands('getchanneltz', 'getctz') @example('.getctz [channel]') def get_channel_tz(bot, trigger): """ Gets the preferred channel timezone, or the current channel timezone if no channel given. """ if not pytz: bot.reply("Sorry, I don't have timezone support installed.") else: channel = trigger.group(2) if not channel: channel = trigger.sender channel = channel.strip() timezone = bot.db.get_channel_value(channel, 'timezone') if timezone: bot.say('%s\'s timezone: %s' % (channel, timezone)) else: bot.say('%s has no preferred timezone' % channel) @commands('setchanneltimeformat', 'setctf') @example('.setctf %Y-%m-%dT%T%z') def update_channel_format(bot, trigger): """ Sets your preferred format for time. Uses the standard strftime format. You can use http://strftime.net or your favorite search engine to learn more. """ if bot.privileges[trigger.sender][trigger.nick] < OP: return tformat = trigger.group(2) if not tformat: bot.reply("What format do you want me to use? Try using" " http://strftime.net to make one.") tz = get_timezone(bot.db, bot.config, None, None, trigger.sender) # Get old format as back-up old_format = bot.db.get_channel_value(trigger.sender, 'time_format') # Save the new format in the database so we can test it. bot.db.set_channel_value(trigger.sender, 'time_format', tformat) try: timef = format_time(db=bot.db, zone=tz, channel=trigger.sender) except: bot.reply("That format doesn't work. Try using" " http://strftime.net to make one.") # New format doesn't work. Revert save in database. bot.db.set_channel_value(trigger.sender, 'time_format', old_format) return bot.db.set_channel_value(trigger.sender, 'time_format', tformat) bot.reply("Got it. Times in this channel will now appear as %s " "unless a user has their own format set. (If the timezone" " is wrong, you might try the settz and channeltz " "commands)" % timef) @commands('getchanneltimeformat', 'getctf') @example('.getctf [channel]') def get_channel_format(bot, trigger): """ Gets the channel's preferred time format, will return current channel's if no channel name is given """ channel = trigger.group(2) if not channel: channel = trigger.sender channel = channel.strip() tformat = bot.db.get_channel_value(channel, 'time_format') if tformat: bot.say('%s\'s time format: %s' % (channel, tformat)) else: bot.say('%s has no preferred time format' % channel)