#+title:  IRC and Bitlbee Interface
#+author: Howard X. Abrams
#+date:   2020-12-10
#+tags: emacs chat

A literate programming configuration file for IRC communiction.

#+begin_src emacs-lisp :exports none
  ;;; ha-irc.el --- configuration for IRC communication. -*- lexical-binding: t; -*-
  ;;
  ;; © 2020-2023 Howard X. Abrams
  ;;   Licensed under a Creative Commons Attribution 4.0 International License.
  ;;   See http://creativecommons.org/licenses/by/4.0/
  ;;
  ;; Author: Howard X. Abrams <http://gitlab.com/howardabrams>
  ;; Maintainer: Howard X. Abrams
  ;; Created: December 10, 2020
  ;;
  ;; This file is not part of GNU Emacs.
  ;;
  ;; *NB:* Do not edit this file. Instead, edit the original literate file at:
  ;;            ~/src/hamacs/ha-irc.org
  ;;       And tangle the file to recreate this one.
  ;;
  ;;; Code:
#+end_src
* Introduction
My IRC /needs/ are basic, but I'm not sure which I want to use.
** ERC
Initial variable configuration for ERC.
#+begin_src emacs-lisp
  (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)))
#+end_src

I like to make sure the text formats to the size of the window:
#+begin_src emacs-lisp
  (defun ha-erc-resize-text ()
    "Resize the ERC text to fill the current window."
    (interactive)
    (setq erc-fill-column (1- (window-width))))
#+end_src

Interesting plugins:
#+begin_src emacs-lisp
    (use-package erc-hl-nicks :after erc)
    (use-package erc-image :after erc)
#+end_src

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

#+begin_src emacs-lisp
  (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))))
#+end_src

* Key Bindings
Quick way to start and jump to my IRC world.
#+begin_src emacs-lisp :tangle no
  (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))
#+end_src

And some global keys to display them:
#+begin_src emacs-lisp
  (ha-leader "a i" `("irc" . ,(ha-tab-bar-new "irc" #'ha-erc)))
#+end_src

And a quick shortcuts to call it:
#+begin_src emacs-lisp
  (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")))))
#+end_src
* Display Configuration
Using the [[https://github.com/seagle0128/doom-modeline][Doom Modeline]] to add notifications:
#+begin_src emacs-lisp :tangle no
  (setq doom-modeline-irc t
        doom-modeline-irc-stylize 'identity)
#+end_src
* Technical Artifacts                                :noexport:
This will =provide= a code name, so that we can =require= this.

#+begin_src emacs-lisp :exports none
(provide 'ha-irc)
;;; ha-irc.el ends here
#+end_src

#+description: A literate programming configuration file for IRC.

#+property:    header-args:sh :tangle no
#+property:    header-args:emacs-lisp :tangle yes
#+property:    header-args    :results none :eval no-export :comments no mkdirp yes

#+options:     num:nil toc:t todo:nil tasks:nil tags:nil date:nil
#+options:     skip:nil author:nil email:nil creator:nil timestamp:nil
#+infojs_opt:  view:nil toc:t ltoc:t mouse:underline buttons:0 path:http://orgmode.org/org-info.js
