about summary refs log tree commit diff
path: root/web/panettone/src/irc.lisp
diff options
context:
space:
mode:
Diffstat (limited to 'web/panettone/src/irc.lisp')
-rw-r--r--web/panettone/src/irc.lisp26
1 files changed, 26 insertions, 0 deletions
diff --git a/web/panettone/src/irc.lisp b/web/panettone/src/irc.lisp
new file mode 100644
index 000000000000..c94b0d2f4bea
--- /dev/null
+++ b/web/panettone/src/irc.lisp
@@ -0,0 +1,26 @@
+;;;; 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"
+  (destructuring-bind (host port)
+      (mapcar #'uiop:getenvp '("IRCCATHOST" "IRCCATPORT"))
+    (if (and host port)
+        (values host (parse-integer port))
+        (values "localhost" 4722))))
+
+(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).
+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)))))))