;;; oni-circe.el --- Circe configuration -*- lexical-binding: t; -*- ;; Copyright (C) 2019 Tom Willemse ;; Author: Tom Willemse ;; Keywords: local ;; Version: 2022.0826.235722 ;; Package-Requires: (circe oni-lui circe-serenity olivetti) ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation, either version 3 of the License, or ;; (at your option) any later version. ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; You should have received a copy of the GNU General Public License ;; along with this program. If not, see . ;;; Commentary: ;; Configuration for the Circe IRC client. Add the following to your init file ;; in case you want to use this configuration: ;; ;; (with-eval-after-load 'circe (require 'oni-circe)) ;;; Code: (require 'circe) (require 'circe-color-nicks) (require 'circe-serenity) (defun oni-circe-get-password-for (host) "Create a function that will get a password for HOST. The returned function will look for the password in .authinfo, which may be encrypted." (lambda (_) (let ((found (nth 0 (auth-source-search :max 1 :host host :require '(:secret))))) (when found (let ((secret (plist-get found :secret))) (if (functionp secret) (funcall secret) secret)))))) (unless (assoc "Libera Chat" circe-network-defaults) (add-to-list 'circe-network-defaults '("Libera Chat" :host "irc.libera.chat" :port (6667 . 6697) :tls t :nickserv-mask "^NickServ!NickServ@services\\.libera\\.chat$" :nickserv-identify-challenge "This nickname is registered." :nickserv-identify-command "PRIVMSG NickServ :IDENTIFY {nick} {password}" :nickserv-identify-confirmation "^You are now identified for \x02.*\x02\\.$" :nickserv-ghost-command "PRIVMSG NickServ :GHOST {nick} {password}" :nickserv-ghost-confirmation "has been ghosted\\.$\\|is not online\\.$"))) (add-to-list 'circe-network-options `("Freenode" :nick "ryuslash" :channels ("#mowedline" "#ninthfloor" "#dispass" "#emacs-circe" "#chicken" "#org-mode" "#guix" :after-auth "#linuxvoice" "#conkeror" "#emacs") :nickserv-password ,(oni-circe-get-password-for "irc.freenode.net"))) (add-to-list 'circe-network-options `("Twitch" :use-tls nil :nick "ryuslash" :host "irc.twitch.tv" :pass ,(oni-circe-get-password-for "irc.twitch.tv") :port 6667)) (add-to-list 'circe-network-options `("Libera Chat" :nick "ryuslash" :channels ("#guix" "#org-mode" "#guile-steel" "#guile" :after-auth "#emacs") :nickserv-password ,(oni-circe-get-password-for "irc.libera.chat"))) (enable-circe-color-nicks) (enable-circe-serenity) ;;; Polybar ;; This was originally written by retroj in his own configuration and shared ;; with me from when I was using mowedline. I've adapted the code to work for ;; polybar instead and renamed all of the functions. (defvar oni-circe-tracking-buffers nil) (defvar oni-circe-tracking-timer nil) (defun oni-circe-colorize (s) "Turn any color description of S into one that Polybar understands." (cond ((stringp s) (string-trim s)) ((eq ':propertize (car s)) (let ((s (cadr s)) (face (plist-get (cddr s) 'face))) (if face (format "%%{F%s}%s%%{F-}" (face-foreground face) (substring-no-properties s)) s))) (t ""))) (defun oni-circe-update-polybar () "Send a command to Polybar to update my Circe widget." (setq oni-circe-tracking-timer nil) (shell-command (format "polybar-msg action circe send %s" (shell-quote-argument (if (stringp oni-circe-tracking-buffers) (oni-circe-colorize oni-circe-tracking-buffers) (mapconcat #'oni-circe-colorize oni-circe-tracking-buffers)))))) (defun oni-circe-tracking-clear () (shell-command "polybar-msg action circe send \"\"")) ; (defun oni-circe-polybar-tracking (orig-fun &rest args) "Update my external status bar when tracking computes a new status line. Also suppress tracking in the mode-line. Since tracking-status may be called many times in quick succession, for example on a make-frame-visible event, we use a short timer to only call the updater once within a minimum duration." (setq oni-circe-tracking-buffers (apply orig-fun args)) (when oni-circe-tracking-timer (cancel-timer oni-circe-tracking-timer)) (setq oni-circe-tracking-timer (run-at-time 0.2 nil #'oni-circe-update-polybar)) nil) (advice-add 'tracking-status :around #'oni-circe-polybar-tracking) (add-hook 'circe-channel-mode-hook 'olivetti-mode) (add-hook 'kill-emacs-hook 'oni-circe-tracking-clear) (provide 'oni-circe) ;;; oni-circe.el ends here