about summary refs log tree commit diff
path: root/web/panettone/src/irc.lisp
diff options
context:
space:
mode:
authoreta <eta@theta.eu.org>2020-11-08T18·38+0000
committereta <eta@theta.eu.org>2020-11-08T19·02+0000
commit2e2bdf9c6ce1cd66ba5cfe1a42786a6f486b7969 (patch)
tree7e982ea0754491efd795c3f60b57d4f8c8df057d /web/panettone/src/irc.lisp
parent1442c5c8ac07a08d279d87e1f0659f7e563da038 (diff)
feat(panettone): announce newly created issues using irccat r/1877
- The new PANETTONE.IRC package contains the SEND-IRC-NOTIFICATION function,
  which opens a new TCP socket to irccat (if it's running and configured) in
  order to announce the creation of new issues.
- The IRCCATHOST and IRCCATPORT environment variables must be set for this to
  work.
- Additionally, the ISSUECHANNEL environment variable may be used to direct
  announcements at a given channel (otherwise it'll just use the first one).

Change-Id: I429a66f24d0f80ed10db173d6af7105fb1d3d023
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2077
Tested-by: BuildkiteCI
Reviewed-by: glittershark <grfn@gws.fyi>
Diffstat (limited to 'web/panettone/src/irc.lisp')
-rw-r--r--web/panettone/src/irc.lisp24
1 files changed, 24 insertions, 0 deletions
diff --git a/web/panettone/src/irc.lisp b/web/panettone/src/irc.lisp
new file mode 100644
index 0000000000..a54112811f
--- /dev/null
+++ b/web/panettone/src/irc.lisp
@@ -0,0 +1,24 @@
+;;;; Using irccat to send IRC notifications
+
+(in-package :panettone.irc)
+
+(defun get-irccat-config ()
+  "Reads the IRCCATHOST and IRCCATPORT environment variables, and returns them as two values if they both exist (otherwise, returns NIL)."
+  (destructuring-bind (host port)
+      (mapcar #'uiop:getenvp '("IRCCATHOST" "IRCCATPORT"))
+    (when (and host port)
+      (values host (parse-integer port)))))
+
+(defun send-irc-notification (body &key channel)
+  "Sends BODY to the IRC channel CHANNEL (starting with #), if an IRCCat server is configured (using the IRCCATHOST and IRCCATPORT environment variables)
+If CHANNEL is NIL, sends the BODY to the first channel configured in the IRCCat configuration.
+May signal a condition if sending fails."
+  (multiple-value-bind (irchost ircport)
+      (get-irccat-config)
+    (when irchost
+      (let ((socket (socket-connect irchost ircport)))
+        (unwind-protect
+             (progn
+               (format (socket-stream socket) "~@[~A ~]~A~%" channel body)
+               (finish-output (socket-stream socket)))
+          (ignore-errors (socket-close socket)))))))