summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore4
-rw-r--r--brisket.hy97
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"),
+;; ))