doomemacs/modules/app/irc
Henrik Lissner 1e81a35461
Minimize dependence on map!
This is in preparation for general.el integration coming in 2.1.1. It is
very likely that map! will change (and even more, be split into several
macros). Not much, but change none-the-less. Specifically, the state
keywords (e.g. :nvi, :n, :i) will be removed in favor of a :state
property that takes a list, e.g. (normal visual insert).

In any case, both map! and general are also relatively expensive
compared to define-key and evil-define-key* (and the new define-key!
macro), so use that when we can.

This also means changes to either API won't affect Doom's modules in the
long term.
2018-06-03 15:46:00 +02:00
..
autoload
config.el
packages.el
README.org

: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")))