diff options
| -rw-r--r-- | .gitignore | 4 | ||||
| -rw-r--r-- | brisket.hy | 97 |
2 files changed, 101 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8ab8d6d --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +__pycache__/ + +# Environments +.venv diff --git a/brisket.hy b/brisket.hy new file mode 100644 index 0000000..7d45d36 --- /dev/null +++ b/brisket.hy @@ -0,0 +1,97 @@ +(import [os.path [expanduser]]) +(import [sys [argv exit stderr]]) +(import re) +(import [nntplib [NNTP-SSL]]) +(import [subprocess [Popen PIPE]]) + +(require [hy.contrib.walk [let]]) + +(setv *auth-source* (expanduser "~/.authinfo.gpg")) +(setv *recognized-commands* ["describe-group" + "help" + "list-group" + "list-groups"]) + +(defn help [&rest args] + "Display the documentation for a command to stdout." + (unless (= (len args) 1) + (err (.format "usage: help [command]")) + (return)) + + (let [command (first args)] + (unless (in command *recognized-commands*) + (err (.format "unrecognized command: {}" command)) + (exit 1)) + + (let [handler (get (globals) (.replace command "-" "_"))] + (print (. handler __doc__))))) + +(defn get-user-info [host] + (let [process (Popen ["gpg" "-q" "-d" *auth-source*] :stdout PIPE) + output (first (.communicate process))] + (for [line output] + (when (.startswith line (.format "machine {}" host)) + (return line))))) + +(defn err [&rest args] + "Displays ARGS to stdout." + (.write stderr (+ (first args) "\n") #* (rest args))) + +(when (= __name__ "__main__") + (unless (>= (len argv) 2) + (err (.format "usage: {} [command] [args]" (first argv))) + (err "recognized commands:") + (for [command *recognized-commands*] + (err (.format " - {}" command))) + (exit 1)) + + (let [command (nth argv 1)] + (unless (in command *recognized-commands*) + (err (.format "unrecognized command: {}" command)) + (exit 1)) + + ;; Special case for 'help', as it's the one command that doesn't require a + ;; connection to the NNTP server. + (if (= command "help") + (help #* (drop 2 argv)) + (with [session (NNTP_SSL HOST :user USER :password PASSWORD)] + ;; Otherwise, pull the function out of the global namespace. + (let [handler (get (globals) (.replace command "-" "_"))] + (handler #* (drop 2 argv))))))) + +;; # To-be-converted Python +;; +;; +;; def list_groups(n, *args): +;; pattern = args[0] if len(args) >= 1 else None +;; +;; _, groups = n.list() +;; +;; for group in groups: +;; if pattern is None or re.match(pattern, group.group): +;; print(group.group) +;; +;; def describe_group(n, *args): +;; if len(args) < 1: +;; err("usage: describe-group [group]") +;; return +;; +;; _, descs = n.descriptions(args[0]) +;; +;; for desc in descs: +;; print(desc) +;; +;; def list_group(n, *args): +;; if len(args) < 1: +;; err("usage: list-group [group]") +;; return +;; +;; _, _, first, last, _ = n.group(args[0]) +;; _, overviews = n.over((first, last)) +;; +;; for article_num, overview in overviews: +;; print("\"{}\" by {} on {}".format( +;; overview.get("subject"), +;; overview.get("from"), +;; overview.get("date"), +;; )) |