doomemacs/modules/app/irc
2018-04-02 08:08:13 +02:00
..
autoload Remove blank autoload files 2017-11-05 01:16:35 +01:00
config.el Add: app/irc: include disconnect hook code 2018-04-02 08:08:13 +02:00
packages.el
README.org Standardize module READMEs 2017-08-21 20:13:31 +02:00

:app irc

This module turns adds an IRC client to Emacs (circe) with native notifications (circe-notifications).

Dependencies

This module has no dependencies, besides gnutls-cli or openssl for secure connections.

Configure

Use the :irc setting to configure IRC servers. Its second argument (a plist) takes the same arguments as circe-network-options.

(set! :irc "chat.freenode.net"
    `(:tls t
      :nick "doom"
      :sasl-username "myusername"
      :sasl-password "mypassword"
      :channels ("#emacs")))

It is a obviously a bad idea to store auth-details in plaintext, so here are some ways to avoid that:

Pass: the unix password manager

Pass is my tool of choice. I use it to manage my passwords. If you activate the :tools password-store module you get an elisp API through which to access your password store.

:irc's plist can use functions instead of strings. +pass-get-user and +pass-get-secret can help here:

(set! :irc "chat.freenode.net"
    `(:tls t
      :nick "doom"
      :sasl-username ,(+pass-get-user   "irc/freenode.net")
      :sasl-password ,(+pass-get-secret "irc/freenode.net")
      :channels ("#emacs")))

But wait, there's more! This stores your password in a public variable which could be accessed or appear in backtraces. Not good! So we go a step further:

(set! :irc "chat.freenode.net"
    `(:tls t
      :nick "doom"
      :sasl-username ,(+pass-get-user "irc/freenode.net")
      :sasl-password (lambda (&rest _) (+pass-get-secret "irc/freenode.net"))
      :channels ("#emacs")))

And you're good to go!

Emacs' auth-source API

auth-source is built into Emacs. As suggested in the circe wiki, you can store (and retrieve) encrypted passwords with it.

(setq auth-sources '("~/.authinfo.gpg"))

(defun my-fetch-password (&rest params)
  (require 'auth-source)
  (let ((match (car (apply #'auth-source-search params))))
    (if match
        (let ((secret (plist-get match :secret)))
          (if (functionp secret)
              (funcall secret)
            secret))
      (error "Password not found for %S" params))))

(defun my-nickserv-password (server)
  (my-fetch-password :user "forcer" :host "irc.freenode.net"))

(set! :irc "chat.freenode.net"
    '(:tls t
      :nick "doom"
      :sasl-password my-nickserver-password
      :channels ("#emacs")))