juju/plugins/watered.py

127 lines
4.1 KiB
Python

from datetime import datetime, timedelta
import json
import random
from os import listdir
import time
import pinhook.plugin
verbs = [
'wriggles slightly',
'sighs cutely',
'wriggles',
'smiles',
]
class IgnoredUsers:
def __init__(self):
if 'date/nowater.txt' not in listdir():
open('date/nowater.txt', 'w').close()
@property
def users(self):
with open('date/nowater.txt', 'r') as w:
u = [i.strip() for i in w.readlines() if i.strip()]
return u
ignored = IgnoredUsers()
@pinhook.plugin.command('&botany', help_text='look up a plant to see if it has been watered (yourself by default)')
def run(msg):
who = msg.nick
if msg.arg:
nick = msg.arg
else:
nick = msg.nick
if who == nick:
greeting = '{}: Your'.format(who)
else:
greeting = '{}: {}\'s'.format(who, nick)
try:
with open('/home/{}/.botany/{}_plant_data.json'.format(nick, nick)) as plant_json:
plant = json.load(plant_json)
except FileNotFoundError:
return pinhook.plugin.message('{}: Are you sure {} has a plant in our beautiful garden?'.format(who, nick))
try:
with open('/home/{}/.botany/visitors.json'.format(nick)) as visitors_json:
visitors = json.load(visitors_json)
if visitors:
last_visit = visitors[-1]['timestamp']
visitor = visitors[-1]['user']
else:
last_visit = 0
visitor = ''
except FileNotFoundError:
last_visit = 0
visitor = ''
if last_visit > plant['last_watered']:
last_watered = last_visit
else:
last_watered = plant['last_watered']
visitor = nick
last_watered = datetime.utcfromtimestamp(last_watered)
water_diff = datetime.now() - last_watered
if plant['is_dead'] or water_diff.days >= 5:
condolences = ['RIP', 'Press F to Pay Respects']
return pinhook.plugin.message('{} {} is dead. {}'.format(greeting, plant['description'], random.choice(condolences)))
elif water_diff.days == 0:
hours = str(round(water_diff.seconds / 3600))
water_time = ''
if hours == '0':
water_time = str(round(water_diff.seconds / 60)) + ' minutes'
elif hours == '1':
water_time = '1 hour'
else:
water_time = hours + ' hours'
msg = '{} {} was watered today! (About {} ago by {})'.format(
greeting, plant['description'], water_time, visitor)
return pinhook.plugin.message(msg)
elif 1 <= water_diff.days:
days = str(water_diff.days)
w_days = ''
if days == '1':
w_days = '1 day'
else:
w_days = days + ' days'
hours = str(round(water_diff.seconds / 3600))
w_hours = ''
if hours == '0':
w_hours = ''
elif hours == '1':
w_hours = ' and 1 hour'
else:
w_hours = ' and {} hours'.format(hours)
msg = "{} {} hasn't been watered today! (Last watered about {}{} ago by {})".format(
greeting, plant['description'], w_days, w_hours, visitor)
return pinhook.plugin.message(msg)
@pinhook.plugin.command('&water', help_text='water a plant (yours by default)')
def water(msg):
if msg.arg == msg.botnick:
return pinhook.plugin.action(random.choice(verbs))
elif msg.arg in ignored.users:
return None
elif not msg.arg:
nick = msg.nick
else:
nick = msg.arg
try:
filename = '/home/{}/.botany/visitors.json'.format(nick)
with open(filename) as v:
visitors = json.load(v)
visitors.append({'timestamp': int(time.time()), 'user': 'ju'})
with open(filename, 'w') as v:
json.dump(visitors, v, indent=2)
with open('/home/{}/.botany/{}_plant_data.json'.format(nick, nick)) as plant_json:
desc = json.load(plant_json)['description']
return pinhook.plugin.action("waters {}'s {}".format(nick, desc))
except Exception as e:
msg.logger.error(e)
return pinhook.plugin.message("{}: could not find plant for {}".format(msg.nick, nick))