import json from glob import glob from time import time_ns import datetime import os from sys import argv home = os.path.expanduser("~/.bink") max_body_length = 64_000 try: os.mkdir(home) except FileExistsError: pass def create_post(body): with open(f"{home}/{time_ns()}", "w", encoding="UTF-8") as f: f.write(body) def file_object(path): split = path.split("/") # example input: /home/nebula/.bink/999 # output: (999, "nebula", "/home/nebula/.bink/999") return (int(split[-1]), split[2], path) def generate_feed(before=None, count=50): posts = [file_object(path) for path in glob("/home/**/.bink/*")] 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 "dump" in argv: with open("/dev/stdout", "w") as f: json.dump(generate_feed(), f) exit() import urwid class App(object): def __init__(self): self.walker = urwid.SimpleFocusListWalker([ self.post_to_widget(post) for post in generate_feed() ]) self.loop = urwid.MainLoop( urwid.ListBox(self.walker) ) def post_to_widget(self, post): time = post["time"] / 1_000_000_000 stamp = datetime.datetime.fromtimestamp(time) return urwid.Pile([ urwid.Text([f"~{post['user']}", " @ ", stamp.strftime("%H:%M (%A, %B %d, %Y)")]), urwid.Text(post["body"]), urwid.Divider() ]) app = App() try: app.loop.run() except KeyboardInterrupt: app.loop.stop() exit()