diff --git a/briefing b/briefing index 135cef4..460b748 100755 --- a/briefing +++ b/briefing @@ -449,15 +449,46 @@ def show_task_detail(nid): print(f"\n {DIM}URL: https://teacup.nodie.co.za/?sn={node.get('nodesid')}{RESET}") -def interactive_mode(tasks): - """Interactive prompt — type a task number to see details.""" - # Build lookup - task_ids = set() - for t in tasks: - task_ids.add(str(t['nodesid'])) +def fetch_and_render(range_days, client): + """Fetch briefing data from API and render it. Returns tasks list.""" + url = f"{BASE_URL}/briefing?range={range_days}" + if client: + url += f"&client={client}" + result = subprocess.run( + ["curl", "-s", "-H", f"Authorization: Bearer {API_KEY}", url], + capture_output=True, text=True + ) + + if not result.stdout.strip(): + print(f"{RED}Empty response from API{RESET}") + return [] + + try: + data = json.loads(result.stdout) + except json.JSONDecodeError: + print(f"{RED}Invalid JSON response{RESET}") + print(result.stdout[:500]) + return [] + + if not data.get("success"): + print(f"{RED}API error: {data.get('message', 'Unknown')}{RESET}") + return [] + + raw = data["data"] + + render_summary(raw.get('summary', {}), int(range_days)) + render_calendar(raw.get('calendar', {})) + render_tasks(raw.get('tasks', [])) + render_commits(raw.get('git_commits', {})) + + return raw.get('tasks', []) + + +def interactive_mode(tasks, range_days, client): + """Interactive prompt — type a task number for details, 'r' to refresh.""" print(f"\n{BOLD}{CYAN}{'─' * 60}{RESET}") - print(f"{DIM}Type a task number for details, or 'q' to quit{RESET}") + print(f"{DIM}Commands: task number | r = refresh | q = quit{RESET}") print(f"{BOLD}{CYAN}{'─' * 60}{RESET}") while True: @@ -470,13 +501,22 @@ def interactive_mode(tasks): if not inp or inp.lower() in ('q', 'quit', 'exit'): break + # Refresh + if inp.lower() in ('r', 'refresh'): + print(f"\n{DIM}Refreshing...{RESET}\n") + tasks = fetch_and_render(range_days, client) + print(f"\n{BOLD}{CYAN}{'─' * 60}{RESET}") + print(f"{DIM}Commands: task number | r = refresh | q = quit{RESET}") + print(f"{BOLD}{CYAN}{'─' * 60}{RESET}") + continue + # Strip # prefix if present inp = inp.lstrip('#') if inp.isdigit(): show_task_detail(int(inp)) else: - print(f" {DIM}Enter a task number (e.g. 3047) or 'q' to quit{RESET}") + print(f" {DIM}Commands: task number | r = refresh | q = quit{RESET}") def main(): @@ -489,42 +529,11 @@ def main(): if args: client = args[0] - url = f"{BASE_URL}/briefing?range={range_days}" - if client: - url += f"&client={client}" - - result = subprocess.run( - ["curl", "-s", "-H", f"Authorization: Bearer {API_KEY}", url], - capture_output=True, text=True - ) - - if not result.stdout.strip(): - print(f"{RED}Empty response from API{RESET}") - sys.exit(1) - - try: - data = json.loads(result.stdout) - except json.JSONDecodeError: - print(f"{RED}Invalid JSON response{RESET}") - print(result.stdout[:500]) - sys.exit(1) - - if not data.get("success"): - print(f"{RED}API error: {data.get('message', 'Unknown')}{RESET}") - sys.exit(1) - - raw = data["data"] - - # Render from raw JSON data - render_summary(raw.get('summary', {}), int(range_days)) - render_calendar(raw.get('calendar', {})) - render_tasks(raw.get('tasks', [])) - render_commits(raw.get('git_commits', {})) + tasks = fetch_and_render(range_days, client) # Interactive mode - tasks = raw.get('tasks', []) - if tasks and sys.stdin.isatty(): - interactive_mode(tasks) + if sys.stdin.isatty(): + interactive_mode(tasks, range_days, client) if __name__ == "__main__":