From 55ce486dee1ff4001b1e75bca525d753eb7c7cb6 Mon Sep 17 00:00:00 2001 From: Jake Funke Date: Wed, 7 Mar 2018 23:07:32 -0800 Subject: [PATCH] Can check visitors now --- botany.py | 39 ++++++++++++++++++++-------- menu_screen.py | 69 ++++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 87 insertions(+), 21 deletions(-) diff --git a/botany.py b/botany.py index 5f377b5..c55ce1a 100755 --- a/botany.py +++ b/botany.py @@ -145,12 +145,23 @@ class Plant(object): # must water plant first day self.watered_timestamp = int(time.time())-(24*3600)-1 self.watered_24h = False + # visitors are coming + self.visitors = [] + # TODO: manually checking for pending visitors + # TODO: clear visitors when checking + self.weekly_visitors = {} + # TODO: clear weekly visitors on sunday 00:00:00 def migrate_properties(self): # Migrates old data files to new if not hasattr(self, 'generation'): self.generation = 1 + if not hasattr(self, 'visitors'): + self.visitors = [] + if not hasattr(self, 'weekly_visitors'): + self.weekly_visitors = {} + def parse_plant(self): # Converts plant data to human-readable format output = "" @@ -204,24 +215,32 @@ class Plant(object): botany_dir = os.path.join(user_dir,'.botany') visitor_filepath = os.path.join(botany_dir,'visitors.json') guest_data = {'latest_timestamp': 0, 'visitors': []} - visitors = [] if os.path.isfile(visitor_filepath): with open(visitor_filepath, 'rw') as visitor_file: data = json.load(visitor_file) for element in data: - if element['user'] not in guest_data['visitors']: - guest_data['visitors'].append(element['user']) + if element['user'] not in self.visitors: + self.visitors.append(element['user']) + # counter for weekly visitors + if element['user'] not in self.weekly_visitors: + self.weekly_visitors[element['user']] = 1 + else: + self.weekly_visitors[element['user']] += 1 if element['timestamp'] > guest_data['latest_timestamp']: guest_data['latest_timestamp'] = element['timestamp'] - os.remove(visitor_filepath) - return guest_data + # TODO: reenable emptying of visitor file + # TODO: create + # visitor_file.truncate() + # json.dump([], visitor_file) + else: + with open(visitor_filepath, mode='w') as f: + json.dump([], f) + return guest_data['latest_timestamp'] def water_check(self): - guest_data = self.guest_check() - if guest_data['visitors']: - if guest_data['latest_timestamp'] > self.watered_timestamp: - self.watered_timestamp = guest_data['latest_timestamp'] - + latest_visitor_timestamp = self.guest_check() + if latest_visitor_timestamp > self.watered_timestamp: + self.watered_timestamp = latest_visitor_timestamp self.time_delta_watered = int(time.time()) - self.watered_timestamp if self.time_delta_watered <= (24 * 3600): return True diff --git a/menu_screen.py b/menu_screen.py index 476c600..8fe97fa 100644 --- a/menu_screen.py +++ b/menu_screen.py @@ -5,6 +5,8 @@ import traceback import threading import time import random +import getpass +import json class CursedMenu(object): #TODO: name your plant @@ -481,19 +483,21 @@ class CursedMenu(object): def clear_info_pane(self): # Clears bottom part of screen - clear_bar = " " * (self.maxx-2) + "\n" - clear_block = clear_bar * (self.maxy - 15) - for y, line in enumerate(clear_block.splitlines(), 2): - self.screen.addstr(y+12, 2, line, curses.A_NORMAL) + clear_bar = " " * (self.maxx - 3) + this_y = 12 + while this_y < self.maxy: + self.screen.addstr(this_y, 2, clear_bar, curses.A_NORMAL) + this_y += 1 self.screen.refresh() - def draw_info_text(self, info_text): + def draw_info_text(self, info_text, y_offset = 0): # print lines of text to info pane at bottom of screen if type(info_text) is str: info_text = info_text.splitlines() - for y, line in enumerate(info_text, 2): - self.screen.addstr(y+12, 2, line, curses.A_NORMAL) + this_y = y+12 + y_offset + if this_y < self.maxy: + self.screen.addstr(this_y, 2, line, curses.A_NORMAL) self.screen.refresh() def harvest_confirmation(self): @@ -518,10 +522,32 @@ class CursedMenu(object): pass self.clear_info_pane() + def build_visitor_output(self, visitors): + visitor_block = "" + visitor_line = "" + for visitor in visitors[:-1]: + if visitor_block.count('\n') > self.maxy-12: + visitor_block += "and more" + break + if len(visitor_line + visitor) > self.maxx-4: + visitor_block += '\n' + visitor_line = "" + visitor_block += str(visitor) + ', ' + visitor_line += str(visitor) + ', ' + else: + visitor_block += "& " + str(visitors[-1]) + visitor_line += "& " + str(visitors[-1]) + + + return visitor_block def visit_handler(self): - self.clear_info_pane() self.draw_info_text("whose plant would you like to visit?") self.screen.addstr(15, 2, '~') + if self.plant.visitors: + self.draw_info_text("you've been visited by: ", 4) + visitor_text = self.build_visitor_output(self.plant.visitors) + self.draw_info_text(visitor_text, 5) + guest_garden = "" user_input = 0 while user_input != 10: @@ -536,14 +562,35 @@ class CursedMenu(object): self.screen.addstr(15, 3, str(guest_garden)) self.screen.refresh() # test if user exists and has botany directory and file - guest_path = "/home/{}/.botany/{}_plant.dat".format(guest_garden, guest_garden) - if os.path.isfile(guest_path): - self.screen.addstr(16, 2, "...you watered ~" + str(guest_garden) + "'s plant...") + home_folder = os.path.dirname(os.path.expanduser("~")) + guest_json = home_folder + "/{}/.botany/{}_plant_data.json".format(guest_garden, guest_garden) + guest_plant_description = "" + if os.path.isfile(guest_json): + with open(guest_json) as f: + visitor_data = json.load(f) + guest_plant_description = visitor_data['description'] + guest_visitor_file = home_folder + "/{}/.botany/visitors.json".format(guest_garden, guest_garden) + if os.path.isfile(guest_visitor_file): + self.water_on_visit(guest_visitor_file) + self.screen.addstr(16, 2, "...you watered ~{}'s {}...".format(str(guest_garden), guest_plant_description)) + # you watered their x plant else: self.screen.addstr(16, 2, "i can't seem to find directions to {}...".format(guest_garden)) self.screen.getch() self.clear_info_pane() + def water_on_visit(self, guest_visitor_file): + # check if path exists + # if not exists create and dump json in + # if exists open and append to file + visitor_data = {} + guest_data = {'user': getpass.getuser(), 'timestamp': int(time.time())} + if os.path.isfile(guest_visitor_file): + with open(guest_visitor_file) as f: + visitor_data = json.load(f) + visitor_data.append(guest_data) + with open(guest_visitor_file, mode='w') as f: + f.write(json.dumps(visitor_data, indent=2)) def handle_request(self, request): # Menu options call functions here