Conectandose al IRC con GNU Emacs y ERC.

⚠️ Actualización Octubre 2025:
Freenode dejó de existir en 2021 tras un hostile takeover de la red (anuncio del staff original). La comunidad de software libre migró masivamente a Libera.Chat, una nueva red fundada por el staff original de Freenode. Este artículo ha sido actualizado para reflejar la configuración moderna.

Redes IRC actuales para FLOSS:

  • Libera.Chat – Reemplazo oficial de Freenode para proyectos de software libre (anuncio oficial)
  • OFTC – Red oficial de Debian y otros proyectos

Referencias sobre la migración:

GNU Emacs viene de base con el paquete ERC para poder conectarnos al IRC.

En este artículo publicamos como automatizar el proceso de conectarnos a las redes de Freenode Libera.Chat y OFTC, autenticación de nuestro nick con NickServ, y entrar en los canales que definamos.

A su vez, para más seguridad, las claves van a ser encriptadas con GPG.

Se asume que previamente:

  • Se ha configurado GPG en el sistema
  • Los usuarios han sido registrados en los respectivos NickServ de cada servidor de IRC

1. Crear el fichero .authinfo

machine irc.freenode.net login **** password ****

machine irc.libera.chat login **** password ****
machine irc.oftc.net login **** password ****

Nota: omitimos los valores reales del nick y el password.

2. Encriptar el fichero .authinfo

Desde Emacs:

M-x epa-encrypt-file

Seleccionamos .authinfo

Esto creará el fichero .authinfo.gpg

Nota 1: El módulo que hace posible esto se llama EasyPG.
Nota 2: A partir de ahora, podemos borrar .authinfo. Cada vez que Emacs abra el fichero .authinfo.gpg lo desencriptará automáticamente para poder editarlo y lo encriptará al guardar.

3. Automatizar la conexión a los servidores de ERC

📁 ¿Dónde poner esta configuración?

Doom Emacs:
Añade el código en ~/.doom.d/config.el
Después ejecuta: doom sync y reinicia Emacs

Spacemacs:
Añade el código en ~/.spacemacs dentro de la función dotspacemacs/user-config

Emacs Vanilla (sin distribución):
Añade el código en ~/.emacs o ~/.emacs.d/init.el

use-package (recomendado para configuración modular):
Crea un archivo separado como ~/.emacs.d/lisp/setup-erc.el y cárgalo desde tu init.el con:
(load "~/.emacs.d/lisp/setup-erc.el")

Configuración Básica

;; Lectura de las claves encriptadas en .authinfo.gpg
(setq auth-sources
      '((:source "~/.authinfo.gpg")))

(setq erc-autojoin-timing 'ident)
(setq erc-prompt-for-nickserv-password nil)

Entrada automática a los canales de cada servidor IRC

(setq erc-autojoin-channels-alist
      '(("freenode.net" "#emacs-es" "#debian" "#nethack"
         "libera.chat" "#emacs-es" "#debian" "#nethack" "#emacs" "#guix" "#lisp")
        ("oftc.net" "#debian-next" "#oftc" 
                    "#debian-mentors"      ; Para aspirantes Debian Maintainer
                    "#debian-devel"        ; Desarrollo general Debian
                    "#debian-multimedia"   ; Paquetes multimedia
                    "#debian-qa"           ; Quality Assurance
                    "#debian-es")))        ; Comunidad Debian española

Identificación con cada servidor

Cambiar el valor del nick apropiadamente en cada caso.

(erc-tls :server "irc.freenode.net" :port 6697 :nick "****")
(erc-tls :server "irc.libera.chat" :port 6697 :nick "****")
(erc-tls :server "irc.oftc.net" :port 6697 :nick "****")

4. Usar certificado personal con OFTC (alternativa a NickServ)

📁 Ubicación del certificado:
Los archivos keyfile y certfile generalmente se guardan en:
~/.ssl/oftc/ o ~/.config/ssl/oftc/

Reemplaza /path/to/your/keyfile y /path/to/your/certfile con las rutas reales, por ejemplo:
("/home/tuusuario/.ssl/oftc/nick.key" "/home/tuusuario/.ssl/oftc/nick.crt")

Como alternativa a la validación por clave o password, existe la posibilidad de usar certificados para conectarse al servidor.

Para usar un certificado con OFTC: https://www.oftc.net/NickServ/CertFP/

Las instrucciones para versiones Emacs 27 o 28 están aquí: https://www.emacswiki.org/emacs/ErcSSL

Creamos el certificado tal como se indica en la página de oftc.net y añadimos esto a nuestros ficheros init de emacs:

(with-eval-after-load 'erc

  ;; erc hack for gnutls for client cert.
  (defvar *uconf/erc-certs* nil
    "erc client certs used by gnutls package for :keylist.")

  ;; copied from the gnutls lib but set :keylist to client certs.
  ;; this function is called from `open-network-stream' with :type tls.
  (defun uconf/open-gnutls-stream (name buffer host service &optional nowait)
    (let ((process (open-network-stream
                    name buffer host service
                    :nowait nowait
                    :tls-parameters
                    (and nowait
                         (cons 'gnutls-x509pki
                               (gnutls-boot-parameters
                                :type 'gnutls-x509pki
                                :keylist *uconf/erc-certs* ;;added parameter to pass the cert.
                                :hostname (puny-encode-domain host)))))))
      (if nowait
          process
        (gnutls-negotiate :process process
                          :type 'gnutls-x509pki
                          :keylist *uconf/erc-certs* ;;added parameter to pass the cert.
                          :hostname (puny-encode-domain host)))))

  ;; only set the global variable when used from `erc-tls'.
  (defun uconf/erc-open-tls-stream (name buffer host port)
    (unwind-protect
        (progn
          (setq *uconf/erc-certs*
                '(("/path/to/your/keyfile" "/path/to/your/certfile")))
          (open-network-stream name buffer host port
                               :nowait t
                               :type 'tls))
      (setq *uconf/erc-certs* nil)))

  (advice-add 'open-gnutls-stream :override #'uconf/open-gnutls-stream)
  (advice-add 'erc-open-tls-stream :override #'uconf/erc-open-tls-stream)
  )

Configuración Avanzada (Opcional)

💡 Nota sobre configuración modular:

Para Doom Emacs:
Toda esta configuración avanzada va en ~/.doom.d/config.el

Para organización limpia (cualquier Emacs):
Puedes crear un archivo separado ~/.emacs.d/erc-config.el con toda la configuración de ERC y cargarlo desde tu init principal:

;; En tu ~/.emacs o ~/.doom.d/config.el
(when (file-exists-p "~/.emacs.d/erc-config.el")
  (load "~/.emacs.d/erc-config.el"))

Esto mantiene tu configuración modular y fácil de mantener.

Logging y Tracking Mejorado

;; Guardar logs de conversaciones
(setq erc-log-channels-directory "~/.erc/logs/"
      erc-save-buffer-on-part t
      erc-save-queries-on-quit t
      erc-log-write-after-send t
      erc-log-write-after-insert t)

;; Tracking mejorado - ignora mensajes de sistema
(setq erc-track-exclude-types '("JOIN" "NICK" "PART" "QUIT" "MODE"
                                 "324" "329" "332" "333" "353" "477")
      erc-track-enable-keybindings t
      erc-track-visibility nil)

;; Timestamps visibles
(setq erc-timestamp-format "[%H:%M]"
      erc-insert-timestamp-function 'erc-insert-timestamp-left)

Función de Conexión Rápida

(defun my/erc-connect ()
  "Connect to IRC servers."
  (interactive)
  ;; Libera.Chat (reemplaza Freenode)
  (erc-tls :server "irc.libera.chat" :port 6697 :nick "tu-nick")
  
  ;; OFTC (para Debian)
  (erc-tls :server "irc.oftc.net" :port 6697 :nick "tu-nick"))

;; Keybinding para conexión rápida
(global-set-key (kbd "C-c e c") 'my/erc-connect)

Canales Recomendados para Debian Maintainers

En OFTC (irc.oftc.net):

  • #debian-mentors – Aspirantes a Debian Developer/Maintainer
  • #debian-devel – Desarrollo general de Debian
  • #debian-multimedia – Paquetes multimedia (relevante para Stremio, VLC, etc)
  • #debian-qa – Quality Assurance y testing
  • #debian-es – Comunidad Debian hispanohablante
  • #debian-next – Testing y Sid

En Libera.Chat (irc.libera.chat):

  • #emacs – Comunidad Emacs general
  • #emacs-es – Comunidad Emacs hispanohablante
  • #lisp – Common Lisp
  • #guix – GNU Guix

Referencias y Recursos

Comentarios

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Creative Commons License
Except where otherwise noted, the content on this site is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.