diff --git a/scripts/tolkien_cli.py b/scripts/tolkien_cli.py new file mode 100755 index 0000000..9963ecd --- /dev/null +++ b/scripts/tolkien_cli.py @@ -0,0 +1,94 @@ +#!/usr/bin/env python3 +import sys, os, argparse, datetime, subprocess +ROOT=os.path.dirname(os.path.dirname(__file__)) +CAMPAIGNS_DIR=os.path.join(ROOT,'campaings') + +def git_commit_and_push(msg): + subprocess.run(['git','add','-A'],cwd=ROOT,check=True) + subprocess.run(['git','commit','-m',msg],cwd=ROOT,check=True) + subprocess.run(['git','push','origin','main'],cwd=ROOT,check=True) + +def ensure_dirs(pg_name): + base=os.path.join(CAMPAIGNS_DIR,pg_name) + os.makedirs(os.path.join(base,'npc'),exist_ok=True) + os.makedirs(os.path.join(base,'facts'),exist_ok=True) + os.makedirs(os.path.join(base,'seasons'),exist_ok=True) + os.makedirs(os.path.join(base,'sessions'),exist_ok=True) + return base + +def create_new(args): + pg=args.name + base=ensure_dirs(pg) + readme=os.path.join(base,'README.md') + setting=os.path.join(base,'SETTING.md') + pgfile=os.path.join(base,'PG.md') + ts=datetime.datetime.utcnow().strftime('%Y%m%dT%H%M%SZ') + session=os.path.join(base,'sessions',f'session-{ts}.md') + if not os.path.exists(readme): + with open(readme,'w') as f: + f.write(f"# {pg}\n\nactive: true\n\nsummary: |\n TODO: short description\n") + if not os.path.exists(setting): + with open(setting,'w') as f: + f.write("# SETTING\n\nDescribe the world here.\n") + if not os.path.exists(pgfile): + with open(pgfile,'w') as f: + f.write("# PG\n\nPlayer character sheet.\n") + with open(session,'w') as f: + f.write(f"# Session {ts}\n\nPlayer: \n\n") + print('created',base,'session',session) + git_commit_and_push(f'tolkien: new campaign {pg}') + +def list_active(args): + res=[] + if not os.path.isdir(CAMPAIGNS_DIR): + print('no campaigns dir') + return + for name in os.listdir(CAMPAIGNS_DIR): + p=os.path.join(CAMPAIGNS_DIR,name,'README.md') + if os.path.exists(p): + with open(p) as f: + content=f.read() + active='active: true' in content + summary_lines=[l for l in content.splitlines() if l.strip().startswith('summary:')] + res.append((name,active)) + for r in res: + print(r[0],'ACTIVE' if r[1] else 'inactive') + + +def close_session(args): + pg=args.name + base=os.path.join(CAMPAIGNS_DIR,pg) + sessions=os.path.join(base,'sessions') + if not os.path.isdir(sessions): + print('no sessions for',pg); return + files=sorted(os.listdir(sessions)) + if not files: + print('no session files'); return + last=files[-1] + path=os.path.join(sessions,last) + # simple recap: list new files under npc/facts/seasons (untracked detection omitted) + # Append a closing note + with open(path,'a') as f: + f.write('\n\n---\nSession closed by tolkien.\n') + git_commit_and_push(f'tolkien: close session {pg} {last}') + print('closed',path) + +parser=argparse.ArgumentParser() +subparsers=parser.add_subparsers() + +p_new=subparsers.add_parser('new') +p_new.add_argument('name') +p_new.set_defaults(func=create_new) + +p_list=subparsers.add_parser('restore') +p_list.set_defaults(func=list_active) + +p_close=subparsers.add_parser('close') +p_close.add_argument('name') +p_close.set_defaults(func=close_session) + +if __name__=='__main__': + args=parser.parse_args() + if not hasattr(args,'func'): + parser.print_help(); sys.exit(1) + args.func(args)