IRC and Bitlbee Interface

Table of Contents

A literate programming configuration file for IRC communiction.

Introduction

My IRC needs are basic, but I’m not sure which I want to use.

ERC

Initial variable configuration for ERC.

(use-package erc
  :config
  (setq erc-nick "howard-abrams"
        erc-user-full-name "Howard Abrams"
        erc-server "irc.libera.chat")

  (seq-let (username password) (auth-source-user-and-password "irc.libera.chat")
    (setq erc-session-username username
          erc-session-password password
          erc-password password))

  (setq erc-prompt ">>"
        erc-prompt-for-nickserv-password nil
        erc-auto-query 'bury
        erc-join-buffer 'bury
        erc-interpret-mirc-color t
        erc-rename-buffers t
        erc-hide-list '("JOIN" "PART" "QUIT")
        erc-track-enable-keybindings nil
        erc-track-visibility nil ; Only use the selected frame for visibility
        erc-fill-column 120
        erc-fill-function 'erc-fill-static
        erc-fill-static-center 20
        erc-timestamp-only-if-changed-flag nil
        ;; erc-timestamp-format "%H:%M"
        erc-autojoin-channels-alist '((".*" "#emacs" "#org-mode"))
        erc-quit-reason (lambda (s) (or s "Fading out..."))
        erc-modules
        '(autoaway autojoin button completion fill irccontrols keep-place
                   list match menu move-to-prompt netsplit networks noncommands
                   readonly ring stamp track hl-nicks)))

I like to make sure the text formats to the size of the window:

(defun ha-erc-resize-text ()
  "Resize the ERC text to fill the current window."
  (interactive)
  (setq erc-fill-column (1- (window-width))))

Interesting plugins:

(use-package erc-hl-nicks :after erc)
(use-package erc-image :after erc)

ZNC Server

I’m using my own ZNC server, and I need to log in with a password stored in my GPG auth storage:

(defun ha-erc-reconnect-password ()
  "Send the reconnection password string."
  (interactive)

  (let* ((auth-results (auth-source-search :host "howardabrams.com" :port 7777 :max 1))
         (auth-first   (first auth-results))
         (username     (plist-get auth-first :user))
         (password     (funcall (plist-get auth-first :secret))))
    (erc-cmd-QUOTE (format "PASS %s:%s" username password))))

Key Bindings

Quick way to start and jump to my IRC world.

(defun ha-irc ()
  (interactive)
  (erc :server "irc.libera.chat" :port 6667 :full-name erc-user-full-name
         :nick erc-nick :user erc-session-username :password erc-session-password))

And some global keys to display them:

(ha-leader "a i" `("irc" . ,(ha-app-perspective "irc" #'ha-erc)))

And a quick shortcuts to call it:

(use-package major-mode-hydra
  :after erc
  :config
  (major-mode-hydra-define erc-mode nil
    ("Server"
     (("r" erc-server-reconnect "reconnect")
      ("p" ha-erc-reconnect-password "send password"))
     "Channel"
     (("o" erc-track-switch-buffer "next channel")
      ("j" erc-join-channel "join channel")
      ("w" ha-erc-resize-text "resize text")))))

Display Configuration

Using the Doom Modeline to add notifications:

(setq doom-modeline-irc t
      doom-modeline-irc-stylize 'identity)