WebSim AI - Advanced Custom Timer with JSON Storage and Usage Guide

Python Code for Advanced Custom Timer with JSON Storage:

import pygame
import sys
import time
import json
import os

pygame.init()

# Screen setup
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("WebSim AI - Advanced Custom Timer with JSON Storage")

# Colors
BLACK = (0, 0, 0)
GREEN = (0, 255, 0)
WHITE = (255, 255, 255)

# Fonts
font = pygame.font.Font(None, 32)
large_font = pygame.font.Font(None, 48)

# Timer variables
custom_timers = {}
active_timer = None
timer_start_time = 0
current_phase = ""

# Input box
input_box = pygame.Rect(50, HEIGHT - 70, WIDTH - 100, 40)
user_input = ""
input_active = False

# JSON file for storing timers
TIMERS_FILE = "custom_timers.json"

def save_timers():
    with open(TIMERS_FILE, 'w') as f:
        json.dump(custom_timers, f)

def load_timers():
    global custom_timers
    if os.path.exists(TIMERS_FILE):
        with open(TIMERS_FILE, 'r') as f:
            custom_timers = json.load(f)

def draw_text(text, font, color, x, y):
    text_surface = font.render(text, True, color)
    text_rect = text_surface.get_rect()
    text_rect.center = (x, y)
    screen.blit(text_surface, text_rect)

def process_user_input(input_text):
    global active_timer, timer_start_time, current_phase, custom_timers

    input_text = input_text.lower().strip()
    
    if input_text.startswith("set timer"):
        parts = input_text[9:].split("|")
        if len(parts) == 7:
            keyphrase, start_response, start_seconds, middle_response, middle_seconds, end_response, end_seconds = [p.strip() for p in parts]
            custom_timers[keyphrase] = {
                "keyphrase": keyphrase,
                "start": {"response": start_response, "duration": int(start_seconds)},
                "middle": {"response": middle_response, "duration": int(middle_seconds)},
                "end": {"response": end_response, "duration": int(end_seconds)}
            }
            save_timers()
            return f"Custom timer '{keyphrase}' set successfully and saved to JSON file."
        else:
            return "Invalid timer format. Use: set timer keyphrase | start response | start seconds | middle response | middle seconds | end response | end seconds"
    
    elif input_text in custom_timers:
        active_timer = custom_timers[input_text]
        timer_start_time = time.time()
        current_phase = "start"
        return f"Starting timer: {input_text}"
    
    elif input_text == "list timers":
        return "Available timers: " + ", ".join(custom_timers.keys())
    
    else:
        return "Command not recognized. Try setting a timer, starting an existing one, or use 'list timers' to see available timers."

def update_timer():
    global active_timer, current_phase

    if active_timer:
        elapsed_time = time.time() - timer_start_time
        total_duration = (active_timer["start"]["duration"] + 
                          active_timer["middle"]["duration"] + 
                          active_timer["end"]["duration"])
        
        if current_phase == "start" and elapsed_time >= active_timer["start"]["duration"]:
            current_phase = "middle"
        elif current_phase == "middle" and elapsed_time >= active_timer["start"]["duration"] + active_timer["middle"]["duration"]:
            current_phase = "end"
        elif elapsed_time >= total_duration:
            active_timer = None
            current_phase = ""
            return "Timer completed!"
        
        remaining_time = max(0, total_duration - elapsed_time)
        return f"{active_timer['keyphrase']}: {int(remaining_time)} seconds remaining"
    return ""

# Load existing timers from JSON file
load_timers()

running = True
clock = pygame.time.Clock()

while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        
        if event.type == pygame.MOUSEBUTTONDOWN:
            if input_box.collidepoint(event.pos):
                input_active = True
            else:
                input_active = False
        
        if event.type == pygame.KEYDOWN:
            if input_active:
                if event.key == pygame.K_RETURN:
                    response = process_user_input(user_input)
                    user_input = ""
                elif event.key == pygame.K_BACKSPACE:
                    user_input = user_input[:-1]
                else:
                    user_input += event.unicode

    screen.fill(BLACK)
    
    # Draw input box
    pygame.draw.rect(screen, GREEN, input_box, 2)
    text_surface = font.render(user_input, True, GREEN)
    screen.blit(text_surface, (input_box.x + 5, input_box.y + 5))

    # Draw timer status
    timer_status = update_timer()
    if timer_status:
        draw_text(timer_status, font, GREEN, WIDTH // 2, 50)

    # Draw current phase message
    if active_timer and current_phase:
        phase_message = active_timer[current_phase]["response"]
        draw_text(phase_message, large_font, GREEN, WIDTH // 2, HEIGHT // 2)

    pygame.display.flip()
    clock.tick(60)

pygame.quit()
sys.exit()
        

How to Set and Use Timers:

  1. Setting a Timer:
    set timer [keyphrase] | [start response] | [start seconds] | [middle response] | [middle seconds] | [end response] | [end seconds]

    Example:

    set timer pomodoro | Start working! | 1500 | Take a short break | 300 | Session complete | 5

    This sets a Pomodoro timer with a 25-minute work session, 5-minute break, and 5-second completion notice.

  2. Starting a Timer:

    Simply type the keyphrase of the timer you want to start. For example:

    pomodoro
  3. Listing Available Timers:

    To see all available timers, type:

    list timers

The timers you set will be automatically saved to "custom_timers.json" in the same directory as the script, ensuring they're available in future sessions.

Note:

Make sure to run this script in a directory where you have write permissions, as it needs to create and modify the "custom_timers.json" file to store your timers.