doomemacs/modules/app/irc
Henrik Lissner 2bc67d8387 bump: :app :checkers :config :emacs :term :tools :ui
Alexander-Miller/treemacs@a6f9e9f1ce -> Alexander-Miller/treemacs@63e2bc207a
Silex/docker.el@9bcefbe54d -> Silex/docker.el@4fc69969b1
akermu/emacs-libvterm@2b1392cb2b -> akermu/emacs-libvterm@2681120b77
bdarcus/bibtex-actions@6e3a194c3a -> bdarcus/bibtex-actions@08c6ca0e5b
dash-docs-el/dash-docs@dafc8fc9f1 -> dash-docs-el/dash-docs@29848b6b34
dgutov/diff-hl@992559f98a -> dgutov/diff-hl@40c89a7b0d
dimitri/switch-window@2801d9b3a9 -> dimitri/switch-window@8d9fe251d8
editorconfig/editorconfig-emacs@e10fa22b13 -> editorconfig/editorconfig-emacs@2ab86dc9a8
ema2159/centaur-tabs@9c7c936e4e -> ema2159/centaur-tabs@8b4249c405
emacs-circe/circe@d6f1fa1864 -> emacs-circe/circe@77e16de3b9
emacs-lsp/lsp-treemacs@905cc74726 -> emacs-lsp/lsp-treemacs@d82df44d63
emacsorphanage/osx-trash@0f1dc052d0 -> emacsorphanage/osx-trash@af74a2055a
emacsorphanage/quickrun@35e91f4b6c -> emacsorphanage/quickrun@78317951cd
flycheck/flycheck@21d52264aa -> flycheck/flycheck@784f184cdd
hlissner/emacs-doom-themes@9e2680b918 -> hlissner/emacs-doom-themes@65fb964f36
https://git.savannah.gnu.org/git/emms.git@6e0aaaf4c559 -> https://git.savannah.gnu.org/git/emms.git@c42fab572846
ideasman42/emacs-spell-fu@1abcb5594e -> ideasman42/emacs-spell-fu@10823ae58f
ideasman42/emacs-undo-fu@e0ad06b5ef -> ideasman42/emacs-undo-fu@34b27c01da
joostkremers/writeroom-mode@b648b34017 -> joostkremers/writeroom-mode@7f4ec92404
kidd/org-gcal.el@4c2616a4f8 -> kidd/org-gcal.el@80e6f9501f
magnars/expand-region.el@4b8322774d -> magnars/expand-region.el@95a773bd8f
millejoh/emacs-ipython-notebook@09af85821e -> millejoh/emacs-ipython-notebook@0600c286bd
mohkale/consult-eglot@a6aeb6fa07 -> mohkale/consult-eglot@28a09cc839
noctuid/link-hint.el@09ba5727d8 -> noctuid/link-hint.el@d3c5bacc9c
rolandwalker/nav-flash@55786c9582 -> rolandwalker/nav-flash@2e31f32085
skeeto/elfeed@243add9e74 -> skeeto/elfeed@162d7d545e
szermatt/emacs-bash-completion@65e54c6f9c -> szermatt/emacs-bash-completion@c5eaeed156
tarsius/hl-todo@5ac0076cfe -> tarsius/hl-todo@42f744ffb5
tecosaur/emacs-everywhere@64ba2e3f30 -> tecosaur/emacs-everywhere@da88fa2d04
tkf/emacs-request@f3a5b4352e -> tkf/emacs-request@2b68b3ca54
tmalsburg/helm-bibtex@a0d32ab167 -> tmalsburg/helm-bibtex@b85662081d
yoshiki/yaml-mode@3a57058468 -> yoshiki/yaml-mode@63b637f846
yqrashawn/fd-dired@c223aee30a -> yqrashawn/fd-dired@458464771b
2021-09-15 17:47:17 +02:00
..
autoload completion/selectrum -> completion/vertico, part 3 2021-07-25 02:52:04 +03:00
config.el completion/selectrum -> completion/vertico, part 2 2021-07-25 02:51:15 +03:00
packages.el bump: :app :checkers :config :emacs :term :tools :ui 2021-09-15 17:47:17 +02:00
README.org app/irc: Swap examples to cite libera.chat 2021-05-29 00:21:39 -07:00

app/irc

Description

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

Module Flags

This module provides no flags.

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.

command description
=irc Connect to IRC and all configured servers

When in a circe buffer these keybindings will be available.

command key description
+irc/tracking-next-buffer SPC m a Switch to the next active buffer
circe-command-JOIN SPC m j Join a channel
+irc/send-message SPC m m Send a private message
circe-command-NAMES SPC m n List the names of the current channel
circe-command-PART SPC m p Part the current channel
+irc/quit SPC m Q Kill the current circe session and workgroup
circe-reconnect SPC m R Reconnect 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! "irc.libera.chat"
    `(: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! "irc.libera.chat"
  `(:tls t
    :port 6697
    :nick "doom"
    :sasl-username ,(+pass-get-user   "irc/libera.chat")
    :sasl-password ,(+pass-get-secret "irc/libera.chat")
    :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! "irc.libera.chat"
  `(:tls t
    :port 6697
    :nick "doom"
    :sasl-username ,(+pass-get-user "irc/libera.chat")
    :sasl-password (lambda (&rest _) (+pass-get-secret "irc/libera.chat"))
    :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.libera.chat"))

(set-irc-server! "irc.libera.chat"
  '(:tls t
    :port 6697
    :nick "doom"
    :sasl-password my-nickserver-password
    :channels ("#emacs")))

TODO Troubleshooting