Skip to content

Latest commit

 

History

History
164 lines (135 loc) · 5.24 KB

README.org

File metadata and controls

164 lines (135 loc) · 5.24 KB

app/irc

Table of Contents

Description

This module turns Emacs into an IRC client, capable of OS notifications.

Module Flags

This module provides no flags.

Plugins

Prerequisites

This module requires gnutls for secure IRC connections to work.

macOS

brew install gnutls

Debian / Ubuntu

apt install gnutls-bin

Arch Linux

pacman -S gnutls

NixOS

environment.systemPackages = [ pkgs.gnutls ];

Features

An IRC Client in Emacs

To connect to IRC you can invoke the =irc function using M-x or your own custom keybinding.

commanddescription
=ircConnect to IRC and all configured servers

When in a circe buffer these keybindings will be available.

commandkeydescription
+irc/tracking-next-bufferSPC m aSwitch to the next active buffer
circe-command-JOINSPC m jJoin a channel
+irc/send-messageSPC m mSend a private message
circe-command-NAMESSPC m nList the names of the current channel
circe-command-PARTSPC m pPart the current channel
+irc/quitSPC m QKill the current circe session and workgroup
circe-reconnectSPC m RReconnect the current server

Configuration

Use set-irc-server! SERVER PLIST to configure IRC servers. Its second argument (a plist) takes the same arguments as circe-network-options.

;; if you omit =:host=, ~SERVER~ will be used instead.
(after! circe
  (set-irc-server! "chat.freenode.net"
    `(:tls t
      :port 6697
      :nick "doom"
      :sasl-username "myusername"
      :sasl-password "mypassword"
      :channels ("#emacs"))))

However, it is a obviously a bad idea to store your password in plaintext, so here are 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 pass module you get an elisp API through which to access your password store.

set-irc-server! accepts a plist can use functions instead of strings. +pass-get-user and +pass-get-secret can help here:

(set-irc-server! "chat.freenode.net"
  `(:tls t
    :port 6697
    :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-server! "chat.freenode.net"
  `(:tls t
    :port 6697
    :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!

Note that +pass-get-user tries to find your username by looking for the fields listed in +pass-user-fields (by default login, user=, username= and email)=). An example configuration looks like

mysecretpassword
username: myusername

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-server! "chat.freenode.net"
  '(:tls t
    :port 6697
    :nick "doom"
    :sasl-password my-nickserver-password
    :channels ("#emacs")))

Troubleshooting