#!/usr/bin/python # coding=utf-8 # ------------------------------------- # Imports # ------------------------------------- import time import sys # ------------------------------------- # Globals # ------------------------------------- debug_enabled = False prompt = '>> ' delimiter_character = '-' delimiter_length = 126 delimiter = delimiter_character * delimiter_length state_not_started = 1 state_in_progress = 2 state_paused = 3 menu_new_grind_loop = {'name': '[N]ew Loop', 'hotkey': 'n', 'action': 'action_new_loop'} menu_pause_grind_loop = {'name': '[P]ause Loop', 'hotkey': 'p', 'action': 'action_pause_loop'} menu_unpause_grind_loop = {'name': '[U]npause Loop', 'hotkey': 'u', 'action': 'action_unpause_loop'} menu_end_grind_loop = {'name': '[E]nd Loop', 'hotkey': 'e', 'action': 'action_end_loop'} menu_stats = {'name': 'Display [S]tats', 'hotkey': 's', 'action': 'action_stats'} menu_reset = {'name': '[R]eset Stats', 'hotkey': 'r', 'action': 'action_reset'} menu_help = {'name': '[H]elp', 'hotkey': 'h', 'action': 'action_help'} menu_exit = {'name': 'E[x]it', 'hotkey': 'x', 'action': 'action_exit'} loop_not_started_options = { 'valid_states': [state_not_started], 'options': [menu_new_grind_loop, menu_stats, menu_reset, menu_help, menu_exit] } loop_in_progress_options = { 'valid_states': [state_in_progress], 'options': [menu_pause_grind_loop, menu_end_grind_loop, menu_stats, menu_reset, menu_help, menu_exit] } loop_paused_options = { 'valid_states': [state_paused], 'options': [menu_unpause_grind_loop, menu_stats, menu_reset, menu_help, menu_exit] } stats = dict() state_map = { state_not_started: 'Loop not Started', state_in_progress: 'Loop in Progress', state_paused: 'Loop Paused' } day_night_map = { 'd': 'day', 'n': 'night' } # ------------------------------------- def menu_handler(options): # ------------------------------------- global stats while stats['status'] in options['valid_states']: print delimiter debug(stats) print 'Status >> [Status] %-31s [Exp] %-18.3f' % (state_map[stats['status']], stats['session_data']['total_exp']) print ' >> [Loops] %-11d [Exp/Loop] %-8.03f [Loops»Level] %-11.3f' % (stats['session_data']['number_of_loops'], stats['session_data']['exp_per_loop'], stats['session_data']['total_loops_till_level']) print ' >> [Hours] %s [Exp/Hour] %-8.03f [Hours»Level] %s' % (format_time(stats['session_data']['time_in_seconds']), stats['session_data']['exp_per_second'] * 3600, format_time(stats['session_data']['total_seconds_till_level'])) menu_string = '' for counter, option in enumerate(options['options'], 1): if len(menu_string) > 0: menu_string += ' | ' menu_string += '%s' % (option['name']) print delimiter print 'Commands >> ' + menu_string print delimiter input_validated = False while not input_validated: user_input = raw_input(prompt) for option in options['options']: if user_input.strip().lower() == option['hotkey'].strip().lower(): input_validated = True eval(option['action'] + '()') if not input_validated and len(user_input.strip()) != 0: print 'Invalid input:', user_input # ------------------------------------- def main_menu(): # ------------------------------------- reset_stats() menu_handler(loop_not_started_options) # ------------------------------------- def action_exit(): # ------------------------------------- # TODO: Capture Ctrl-C action_stats() sys.exit(0) # ------------------------------------- def action_help(): # ------------------------------------- print 'TODO: Add help screen' # ------------------------------------- def action_reset(): # ------------------------------------- action_stats() print 'Session data reset' print reset_stats() # ------------------------------------- def action_stats(): # ------------------------------------- global stats print print '[ Session Statistics ]' print debug(stats['session_data']) print '%-15s | %12s | %12s | %12s' % ('Statistic', 'Total', 'Day', 'Night') print '%-15s | %12s | %12s | %12s' % ('-' * 15, '-' * 12, '-' * 12, '-' * 12) print '%-15s | %12.03f | %12.03f | %12.03f' % ('Exp Gained', stats['session_data']['total_exp'], stats['session_data']['total_day_exp'], stats['session_data']['total_night_exp']) print '%-15s | %12d | %12d | %12d' % ('Number of Loops', stats['session_data']['number_of_loops'], stats['session_data']['number_of_day_loops'], stats['session_data']['number_of_night_loops']) print '%-15s | %12.03f | %12.03f | %12.03f' % ('Exp/Loop', stats['session_data']['exp_per_loop'], stats['session_data']['exp_per_day_loop'], stats['session_data']['exp_per_night_loop']) print '%-15s | %12.03f | %12.03f | %12.03f' % ('Loops to Level', stats['session_data']['total_loops_till_level'], stats['session_data']['day_loops_till_level'], stats['session_data']['night_loops_till_level']) print '%-15s | %12s | %12s | %12s' % ('Time in Hours', format_time(stats['session_data']['time_in_seconds']), format_time(stats['session_data']['time_in_day_seconds']), format_time(stats['session_data']['time_in_night_seconds'])) print '%-15s | %12.03f | %12.03f | %12.03f' % ('Exp/Hour', stats['session_data']['exp_per_second'] * 3600, stats['session_data']['exp_per_day_second'] * 3600, stats['session_data']['exp_per_night_second'] * 3600) print '%-15s | %12s | %12s | %12s' % ('Hours to Level', format_time(stats['session_data']['total_seconds_till_level']), format_time(stats['session_data']['day_seconds_till_level']), format_time(stats['session_data']['night_seconds_till_level'])) print print '[ Loop Statistics ]' print print '%3s | %-22s | %-22s | %11s | %11s | %8s | %8s | %8s | %-9s' % ('#', 'Start Time', 'End Time', 'Loop Time', 'Pause Time', 'Start XP', 'End XP', 'Net XP', 'Day/Night') print '%3s | %-22s | %-22s | %11s | %11s | %8s | %8s | %8s | %-9s' % ('-' * 3, '-' * 22, '-' * 22, '-' * 11, '-' * 11, '-' * 8, '-' * 8, '-' * 8, '-' * 9) for counter, data in enumerate(stats['loop_data'], 1): debug(data) print '%3d | %-22s | %-22s | %11s | %11s | %7.3f%% | %7.3f%% | %7.3f%% | %s' % (counter, format_datetime(data['loop_start_time']), format_datetime(data['loop_end_time']), format_time(data['loop_time']), format_time(data['loop_pause_time']), data['loop_start_exp'], data['loop_end_exp'], data['loop_exp'], day_night_map[data['loop_day_night']]) if not stats['loop_data']: print 'Nothing to see here. Move along.' print # ------------------------------------- def action_new_loop(): # ------------------------------------- global stats start_exp = raw_input('Starting XP% : ') day_night = raw_input('(D)ay/(N)ight : ') print 'TODO: Validations here' print stats['status'] = state_in_progress stats['cache']['loop_start_time'] = time.time() stats['cache']['loop_day_night'] = day_night stats['cache']['loop_start_exp'] = float(start_exp) menu_handler(loop_in_progress_options) # ------------------------------------- def action_end_loop(): # ------------------------------------- global stats end_exp = raw_input('Ending XP% : ') print 'TODO: Validations here' stats['status'] = state_not_started stats['cache']['loop_end_time'] = time.time() stats['cache']['loop_end_exp'] = float(end_exp) stats['cache']['loop_time'] = stats['cache']['loop_end_time'] - stats['cache']['loop_start_time'] - stats['cache']['loop_pause_time'] stats['cache']['loop_exp'] = stats['cache']['loop_end_exp'] - stats['cache']['loop_start_exp'] stats['loop_data'].append(stats['cache']) print print '[ Loop Statistics ]' print print 'Loop Start Time : %s' % format_datetime(stats['cache']['loop_start_time']) print 'Loop End Time : %s' % format_datetime(stats['cache']['loop_end_time']) print 'Loop Total Time : %s' % format_time(stats['cache']['loop_time']) print 'Loop Pause Time : %s' % format_time(stats['cache']['loop_pause_time']) print 'Loop Start Exp : %.3f%%' % stats['cache']['loop_start_exp'] print 'Loop End Exp : %.3f%%' % stats['cache']['loop_end_exp'] print 'Loop Net Exp : %.3f%%' % stats['cache']['loop_exp'] print 'Day/Night : %s' % day_night_map[stats['cache']['loop_day_night']] print reset_stats_cache() update_session_data() # ------------------------------------- def action_pause_loop(): # ------------------------------------- global stats print 'Loop paused' print stats['cache']['loop_pause_start_time'] = time.time() stats['status'] = state_paused menu_handler(loop_paused_options) # ------------------------------------- def action_unpause_loop(): # ------------------------------------- global stats print 'Loop paused' print stats['cache']['loop_pause_time'] = time.time() - stats['cache']['loop_pause_start_time'] stats['cache']['loop_pause_start_time'] = None stats['status'] = state_in_progress # --------------------------------- def debug(*args, **kwargs): # --------------------------------- if debug_enabled: debug_string = '' for arg in args: debug_string += unicode(arg) + ' ' print debug_string # ------------------------------------- def reset_stats(): # ------------------------------------- global stats stats = { 'status': state_not_started, 'session_start_time': time.time(), 'session_end_time': 0.0, 'cache': {}, 'loop_data': [], 'session_data': {} } reset_stats_cache() reset_stats_session() # ------------------------------------- def reset_stats_cache(): # ------------------------------------- global stats stats['cache'] = { 'loop_start_time': 0.0, 'loop_end_time': 0.0, 'loop_time': 0.0, 'loop_day_night': '', 'loop_pause_start_time': 0.0, 'loop_pause_time': 0.0, 'loop_start_exp': 0.0, 'loop_end_exp': 0.0, 'loop_exp': 0.0 } # ------------------------------------- def reset_stats_session(): # ------------------------------------- global stats stats['session_data'] = { 'number_of_loops': 0, 'number_of_day_loops': 0, 'number_of_night_loops': 0, 'total_exp': 0.0, 'total_day_exp': 0.0, 'total_night_exp': 0.0, 'exp_per_loop': 0.0, 'exp_per_day_loop': 0.0, 'exp_per_night_loop': 0.0, 'total_loops_till_level': 0.0, 'day_loops_till_level': 0.0, 'night_loops_till_level': 0.0, 'time_in_seconds': 0.0, 'time_in_day_seconds': 0.0, 'time_in_night_seconds': 0.0, 'exp_per_second': 0.0, 'exp_per_day_second': 0.0, 'exp_per_night_second': 0.0, 'total_seconds_till_level': 0.0, 'day_seconds_till_level': 0.0, 'night_seconds_till_level': 0.0, } # ------------------------------------- def update_session_data(): # ------------------------------------- global stats stats['session_data']['number_of_loops'] = 0 stats['session_data']['number_of_day_loops'] = 0 stats['session_data']['number_of_night_loops'] = 0 stats['session_data']['time_in_seconds'] = 0 stats['session_data']['time_in_day_seconds'] = 0.0 stats['session_data']['time_in_night_seconds'] = 0.0 stats['session_data']['total_exp'] = 0.0 stats['session_data']['total_day_exp'] = 0.0 stats['session_data']['total_night_exp'] = 0.0 for data in stats['loop_data']: if data['loop_day_night'] == 'd': stats['session_data']['number_of_day_loops'] += 1 stats['session_data']['time_in_day_seconds'] += data['loop_time'] stats['session_data']['total_day_exp'] += data['loop_exp'] elif data['loop_day_night'] == 'n': stats['session_data']['number_of_night_loops'] += 1 stats['session_data']['time_in_night_seconds'] += data['loop_time'] stats['session_data']['total_night_exp'] += data['loop_exp'] stats['session_data']['number_of_loops'] = stats['session_data']['number_of_day_loops'] + stats['session_data']['number_of_night_loops'] stats['session_data']['time_in_seconds'] = stats['session_data']['time_in_day_seconds'] + stats['session_data']['time_in_night_seconds'] stats['session_data']['total_exp'] = stats['session_data']['total_day_exp'] + stats['session_data']['total_night_exp'] stats['session_data']['exp_per_loop'] = float(stats['session_data']['total_exp']) / float(stats['session_data']['number_of_loops']) if stats['session_data']['number_of_loops'] > 0 else 0.0 stats['session_data']['exp_per_day_loop'] = float(stats['session_data']['total_day_exp']) / float(stats['session_data']['number_of_day_loops']) if stats['session_data']['number_of_day_loops'] > 0 else 0.0 stats['session_data']['exp_per_night_loop'] = float(stats['session_data']['total_night_exp']) / float(stats['session_data']['number_of_night_loops']) if stats['session_data']['number_of_night_loops'] > 0 else 0.0 stats['session_data']['total_loops_till_level'] = (100.0 - stats['loop_data'][-1]['loop_end_exp']) / float(stats['session_data']['exp_per_loop']) if stats['session_data']['number_of_loops'] > 0 else 0.0 stats['session_data']['day_loops_till_level'] = (100.0 - stats['loop_data'][-1]['loop_end_exp']) / float(stats['session_data']['exp_per_day_loop']) if stats['session_data']['number_of_day_loops'] > 0 else 0.0 stats['session_data']['night_loops_till_level'] = (100.0 - stats['loop_data'][-1]['loop_end_exp']) / float(stats['session_data']['exp_per_night_loop']) if stats['session_data']['number_of_night_loops'] > 0 else 0.0 stats['session_data']['exp_per_second'] = float(stats['session_data']['total_exp']) / float(stats['session_data']['time_in_seconds']) if stats['session_data']['time_in_seconds'] > 0 else 0.0 stats['session_data']['exp_per_day_second'] = float(stats['session_data']['total_day_exp']) / float(stats['session_data']['time_in_day_seconds']) if stats['session_data']['time_in_day_seconds'] > 0 else 0.0 stats['session_data']['exp_per_night_second'] = float(stats['session_data']['total_night_exp']) / float(stats['session_data']['time_in_night_seconds']) if stats['session_data']['time_in_night_seconds'] > 0 else 0.0 stats['session_data']['total_seconds_till_level'] = (100.0 - stats['loop_data'][-1]['loop_end_exp']) / float(stats['session_data']['exp_per_second']) if stats['session_data']['time_in_seconds'] > 0 else 0.0 stats['session_data']['day_seconds_till_level'] = (100.0 - stats['loop_data'][-1]['loop_end_exp']) / float(stats['session_data']['exp_per_day_second']) if stats['session_data']['time_in_day_seconds'] > 0 else 0.0 stats['session_data']['night_seconds_till_level'] = (100.0 - stats['loop_data'][-1]['loop_end_exp']) / float(stats['session_data']['exp_per_night_second']) if stats['session_data']['time_in_night_seconds'] > 0 else 0.0 # ------------------------------------- def format_datetime(time_in_seconds): # ------------------------------------- return time.strftime("%d-%b-%Y @ %H:%M:%S", time.localtime(time_in_seconds)) # ------------------------------------- def format_time(time_in_seconds, millsecond_precision=0, use_days=False): # ------------------------------------- if hasattr(time_in_seconds, '__len__'): return [format_time(s) for s in time_in_seconds] minutes, seconds = divmod(time_in_seconds, 60) hours, minutes = divmod(minutes, 60) if use_days: days, hours = divmod(hours, 24) if millsecond_precision > 0: pattern = '%%02dh %%02dm %%0%d.%dfs' % (millsecond_precision + 3, millsecond_precision) else: pattern = r'%02dh %02dm %02ds' if use_days: pattern = '%02dd ' % days + pattern return pattern % (hours, minutes, seconds) # ------------------------------------- if __name__ == "__main__": # ------------------------------------- main_menu()
Run
Reset
Share
Import
Link
Embed
Language▼
English
中文
Python Fiddle
Python Cloud IDE
Follow @python_fiddle
Browser Version Not Supported
Due to Python Fiddle's reliance on advanced JavaScript techniques, older browsers might have problems running it correctly. Please download the latest version of your favourite browser.
Chrome 10+
Firefox 4+
Safari 5+
IE 10+
Let me try anyway!
url:
Go
Python Snippet
Stackoverflow Question