happybot/timezone.py

102 lines
2.8 KiB
Python

#!/usr/bin/env python3
import re
from subprocess import Popen, PIPE
import pickle
import pytz
from datetime import datetime
from sys import argv
def cmd(*args):
proc = Popen(args, stdout=PIPE)
while True:
line = proc.stdout.readline()
if line:
try:
yield str(line[:-1], 'utf-8', 'ignore')
except:
pass
else:
break
data_file = '/home/zgrep/offtopiabday/timezone-offtopia.pickle'
def get_data():
global data_file
with open(data_file, 'rb') as fh:
return pickle.load(fh)
def save_data(data):
global data_file
with open(data_file, 'wb') as fh:
return pickle.dump(data, fh)
def get_time(n):
nl = n.lower()
data = get_data()
if nl in data:
tz = data[nl]
return 'time(' + n + ') = ' + tz.fromutc(datetime.now()).strftime('%a, %Y-%m-%d %H:%M:%S %Z.')
return n + '.tz = undefined'
def set_tz(n, s):
data = get_data()
nl = n.lower()
try:
tz = pytz.timezone(s)
except pytz.exceptions.UnknownTimeZoneError:
if s.lower() in ('none', 'false', 'delete', '', 'undefined'):
if nl in data:
del data[nl]
save_data(data)
return n + '.tz = undefined'
return n + '.tz = undefined'
return 'tz(' + s + ') = InvalidTimezone'
except:
return 'ERR: NaN IS A NUMBER.'
data[nl] = tz
save_data(data)
return n + '.tz = ' + s + '; ' + get_time(n)
def main():
if len(argv) == 3:
print(get_time(argv[2]))
exit()
if len(argv) != 2:
print('Usage:', argv[0], '#channel')
exit(1)
chan = '/home/zgrep/offtopiabday/irc.freenode.net/' + argv[1]
for line in cmd('tail', '-n', '0', '-f', chan + '/out'):
date, time, nick, line = line.split(' ', 3)
nick = nick[1:-1]
if nick in ('happybot', 'hatebot', '!', '-!-'):
continue
m = re.match(r'(?:@?(?:happybot|hatebot)[:,]? )?tz ?= ?(.+)$', line)
if m:
reply = set_tz(nick, m.group(1))
with open(chan + '/in', 'w') as fh:
fh.write(reply + '\n')
continue
for i, (r, o) in enumerate((
(r'time\((\S+)\);?', True),
(r'\(time (\S+)\)', True),
(r'time\[(\S+)\];?', True),
(r'(\S+)\.time', True),
(r'time (\S+)', False)),
):
m = r'@?(?:happy|hate)(bot)[:,]? '
if o: m = r'(?:' + m + r')?'
m = re.match(m + r + r'$', line)
if m: break
if m:
reply = get_time(m.group(2))
with open(chan + '/in', 'w') as fh:
fh.write(nick + ': ' + reply + '\n')
continue
if __name__ == '__main__':
main()