embark on a journey

rewrite
Nate Smith 2023-12-09 15:55:19 -08:00
parent ad0d78e133
commit bc843b27cc
1 changed files with 104 additions and 0 deletions

104
main.py 100755
View File

@ -0,0 +1,104 @@
#!/usr/bin/env python3
import datetime
from os import path
from getpass import getuser
import os
from datetime import timezone
import sqlite3
import sys
from typing import Optional, Tuple, TypeVar
BOTANY_DIR = ".botany"
dt = datetime.datetime
def now() -> dt:
return dt.now(timezone.utc)
# flavor dict keys
# - color
# - rarity
# - species
# - mutation
PLOT_SCHEMA = """
CREATE TABLE IF NOT EXISTS plot (
-- Each row is a plant
id INTEGER PRIMARY KEY,
created TEXT DEFAULT (strftime('%Y-%m-%dT%H:%M', 'now', 'localtime')),
watered TEXT DEFAULT (strftime('%Y-%m-%dT%H:%M', 'now', 'localtime')),
generation INTEGER,
flavor JSON
)
"""
VISITORS_SCHEMA = """
CREATE TABLE IF NOT EXISTS visitors (
-- Each row is a visit from another user
id INTEGER PRIMARY KEY,
name TEXT,
when TEXT DEFAULT (strftime('%Y-%m-%dT%H:%M', 'now', 'localtime')),
)
"""
# TODO code for generating a global garden database (finds all most recent plants for users on system and fills a sqlite3 db with computed values)
def mkdir(p: str) -> Optional[Exception]:
if not path.isdir(p):
try:
os.makedirs(p)
except Exception as e:
return Exception(f"failed to create {p}: {e}")
return None
def mkdb(p: str, sql: str) -> Optional[Exception]:
try:
conn = sqlite3.connect(p)
c = conn.cursor()
c.execute(sql)
conn.close()
except Exception as e:
return Exception(f"failed to initialize {p}: {e}")
return None
def setup() -> Optional[Exception]:
bdir = path.expanduser(path.join("~", BOTANY_DIR))
e = mkdir(bdir)
if e is not None:
return e
dbdir = path.join(bdir, "db")
e = mkdir(dbdir)
if e is not None:
return e
plotdb_path = path.join(bdir, "db/plot.db")
# TODO test manually to see what kind of permissions fuckery we need
e = mkdb(plotdb_path, PLOT_SCHEMA)
if e is not None:
return e
visitordb_path = path.join(bdir, "db/visitors.db")
e = mkdb(visitordb_path, VISITORS_SCHEMA)
if e is not None:
return e
return None
def main() -> Optional[Exception]:
username = getuser()
e = setup()
if e is not None:
return e
# TODO restore plant from disk
return None
if __name__ == "__main__":
ret = 0
e = main()
if e is not None:
print(e)
ret = 1
sys.exit(ret)