import json from glob import glob from time import time_ns import datetime import os from pwd import getpwuid import sys from subprocess import run import tempfile from math import floor from re import compile home = os.path.expanduser("~/.bink") our_path = "/town/our/data/.bink" filters = [] filters_path = os.path.expanduser("~/.binkfilters") max_body_length = 64_000 helptext = """see https://git.tilde.town/nebula/bink for details --help or -h: show this message --pipe or -p: use stdin as post content. ex `echo "hello!" | town bink --pipe` --dump or -d: print all posts in a json object""" try: os.mkdir(home) except FileExistsError: pass try: os.mkdir(our_path) except FileExistsError: pass except FileNotFoundError: our_path = None try: with open(filters_path, "r") as f: filters = json.load(f) except FileNotFoundError: with open(filters_path, "w") as f: json.dump(filters, f) try: editor = os.environ["EDITOR"] except KeyError: editor = "nano" def create_post(body): with open(f"{home}/{time_ns()}", "w", encoding="UTF-8") as f: f.write(body) def file_object(path, our=False): split = path.split("/") # example input: /home/nebula/.bink/999 # output: (999, "nebula", "/home/nebula/.bink/999") return (int(split[-1]), split[2] if not our else "our", path) def glob_posts(path): return [ file_object(post_path) for post_path in glob(path) if os.path.isfile(post_path) and not os.path.islink(post_path) ] def generate_feed(before=None, count=200): posts = glob_posts("/home/**/.bink/*") if our_path: posts += glob_posts(f"{our_path}/*") for post in posts.copy(): if post[1] in filters: posts.remove(post) if before: posts = [post for post in posts if post[0] < before] posts.sort(key=lambda x: x[0], reverse=True) blogs = [] for time, user, path in posts[:count]: # try: with open(path, "r", encoding="UTF-8") as f: body = f.read() # except obj = { "user": user, "time": time, "body": body[:max_body_length], } blogs.append(obj) return blogs if len(sys.argv) > 1: if sys.argv[1] in ("--help", "-h"): print(helptext) exit(0) elif sys.argv[1] in ("--dump", "-d"): with open("/dev/stdout", "w") as f: json.dump(generate_feed(), f) exit(0) elif sys.argv[1] in ("--pipe", "-p"): try: with open("/dev/stdin", "r", encoding="UTF-8") as f: body = f.read().strip() if body: create_post(body) exit(0) except KeyboardInterrupt: exit(0) else: create_post(" ".join(sys.argv[1:])) exit(0) import urwid current_user = getpwuid(os.getuid()).pw_name name_re = compile(f"(?