summary refs log tree commit diff stats
path: root/lisp/acdw-erc.el
diff options
context:
space:
mode:
Diffstat (limited to 'lisp/acdw-erc.el')
-rw-r--r--lisp/acdw-erc.el228
1 files changed, 0 insertions, 228 deletions
diff --git a/lisp/acdw-erc.el b/lisp/acdw-erc.el deleted file mode 100644 index beea24b..0000000 --- a/lisp/acdw-erc.el +++ /dev/null
@@ -1,228 +0,0 @@
1;;; acdw-erc.el -*- lexical-binding: t; coding: utf-8-unix -*-
2
3;; Author: Case Duckworth <(rot13-string "npqj@npqj.arg")>
4;; Created: 24 May 2021
5;; Keywords: configuration
6;; URL: https://tildegit.org/acdw/emacs
7
8;; This file is NOT part of GNU Emacs.
9
10;;; License:
11;; Everyone is permitted to do whatever with this software, without
12;; limitation. This software comes without any warranty whatsoever,
13;; but with two pieces of advice:
14;; - Don't hurt yourself.
15;; - Make good choices.
16
17;;; Commentary:
18;; `acdw-erc' is a dumping ground for functions and stuff for ERC, so they
19;; don't clutter up `init.el'.
20
21;;; Code:
22
23(defgroup acdw-erc nil
24 "Customizations for ERC."
25 :group 'erc)
26
27
28;;; Show a different header-line face when ERC is disconnected.
29;; https://www.emacswiki.org/emacs/ErcModeline#h5o-1
30
31(defface erc/header-line-disconnected
32 '((t (:foreground "black" :background "indianred")))
33 "Face to use when ERC has been disconnected.")
34
35(defun erc/update-header-line-show-disconnected ()
36 "Use a different face in the header-line when disconnected."
37 (erc-with-server-buffer
38 (cond ((erc-server-process-alive) 'erc-header-line)
39 (t 'erc/header-line-disconnected))))
40
41
42;;; Convenience functions
43;; from Prelude:
44;; https://github.com/bbatsov/prelude/blob/master/modules/prelude-erc.el#L114
45
46(defcustom erc/servers nil
47 "The list of IRC servers to connect to with `erc/connect'."
48 :type '(list string))
49
50(defcustom erc/bye-message "See You Space Cowpokes."
51 "Quit message sent when calling `erc/disconnect'."
52 :type 'string)
53
54(defun connect-to-erc (server &optional use-tls port nick)
55 "Connects to IRC SERVER at PORT with NICK.
56If USE-TLS is non-nil, use TLS."
57 (let* ((use-tls (or use-tls t))
58 (erc-fn (if use-tls #'erc-tls #'erc))
59 (port (or port (if use-tls 6697 6667)))
60 (nick (or nick erc-nick)))
61 (funcall erc-fn
62 :server server
63 :port port
64 :nick nick)))
65
66(defun erc/connect ()
67 "Connect to all the servers in `erc/servers'."
68 (interactive)
69 (require 'erc)
70 (mapcar #'connect-to-erc erc/servers))
71
72(defun filter-server-buffers ()
73 (delq nil (mapcar (lambda (x)
74 (and (erc-server-buffer-p x) x))
75 (buffer-list))))
76
77(defun erc/reconnect ()
78 "Reconnect to all IRC servers."
79 (interactive)
80 (dolist (buffer (filter-server-buffers))
81 (with-current-buffer buffer
82 (ignore-errors
83 (erc-cmd-RECONNECT)))))
84
85(defun erc/disconnect ()
86 "Disconnect from all IRC servers."
87 (interactive)
88 (dolist (buffer (filter-server-buffers))
89 (with-message (format "Killing server buffer: %s" (buffer-name buffer))
90 (with-current-buffer buffer
91 (erc-quit-server erc/bye-message))))
92 ;; TODO: kill all channel buffers
93 (force-mode-line-update))
94
95(defun acdw-erc/prompt ()
96 "The prompt to show for ERC."
97 ;; Rewrite s-truncate to avoid dependency.
98 (let ((name (buffer-name))
99 (ellipsis "~")
100 (len erc-fill-static-center))
101 (if (and len (> (length name) (- len 2)))
102 (format "%s%s>"
103 (substring name 0 (- len 2 (length ellipsis)))
104 ellipsis)
105 (propertize
106 (format "%s%s>"
107 name
108 (let ((ss) ; Rewrite s-repeat to avoid dependency.
109 (num (- len 2 (length name))))
110 (while (> num 0)
111 (setq ss (cons " " ss))
112 (setq num (1- num)))
113 (apply #'concat ss)))
114 'read-only t
115 'intangible t
116 'cursor-intangible t))))
117
118(defcustom erc-nick-truncate nil
119 "The width at which to truncate a nick with `erc-format-truncate-@nick'."
120 :group 'erc
121 :type 'integer)
122
123(defalias 'erc-propertize 'propertize) ; I guess...taken out in 28 ?
124
125(defun erc-format-truncate-@nick (&optional user channel-data)
126 "Format the nickname of USER as in `erc-format-@nick', with truncation.
127Truncation is customized using the `erc-nick-truncate' variable.
128See also `erc-format-nick-function'."
129 (when user
130 (let* ((nick (erc-server-user-nickname user))
131 (prefix (erc-get-user-mode-prefix nick))
132 (ellipsis "~")
133 (max-len (- erc-nick-truncate 2 ; one each for < and >
134 (length ellipsis)
135 (length prefix))))
136 (concat (erc-propertize
137 prefix
138 'font-lock-face 'erc-nick-prefix-face)
139 (if (and max-len (> (length nick) max-len))
140 (format "%s%s" (substring nick 0 max-len)
141 ellipsis)
142 nick)))))
143
144
145;;; Uh
146
147(defun acdw-erc/erc-switch-to-buffer (&optional arg)
148 "Prompt for ERC buffer to switch to.
149Reverse prefix argument from `erc-switch-to-buffer'."
150 (interactive "P")
151 (erc-switch-to-buffer (not arg)))
152
153
154;;; ERC-Bar
155;; NEEDS MUCH WORK
156
157(defun erc-bar-move-back (n)
158 "Moves back n message lines. Ignores wrapping, and server messages."
159 (interactive "nHow many lines ? ")
160 (re-search-backward "^.*<.*>" nil t n))
161
162(defun erc-bar-update-overlay ()
163 "Update the overlay for current buffer, based on the content of
164erc-modified-channels-alist. Should be executed on window change."
165 (interactive)
166 (let* ((info (assq (current-buffer) erc-modified-channels-alist))
167 (count (cadr info)))
168 (if (and info (> count erc-bar-threshold))
169 (save-excursion
170 (end-of-buffer)
171 (when (erc-bar-move-back count)
172 (let ((inhibit-field-text-motion t))
173 (move-overlay erc-bar-overlay
174 (line-beginning-position)
175 (line-end-position)
176 (current-buffer)))))
177 (delete-overlay erc-bar-overlay))))
178
179(defvar erc-bar-threshold 0
180 "Display bar when there are more than erc-bar-threshold unread messages.")
181
182(defvar erc-bar-overlay nil
183 "Overlay used to set bar")
184
185(setq erc-bar-overlay (make-overlay 0 0))
186(overlay-put erc-bar-overlay 'face '(:overline "gray"))
187
188(with-eval-after-load 'erc-track
189 ;;put the hook before erc-modified-channels-update
190 (defadvice erc-track-mode (after erc-bar-setup-hook
191 (&rest args) activate)
192 (add-hook 'window-configuration-change-hook 'erc-bar-update-overlay -90))
193
194 (add-hook 'erc-send-completed-hook (lambda (str)
195 (erc-bar-update-overlay))))
196
197
198;;; ZNC babeee
199;; needed variables are stored in private.el
200(defun znc/connect (znc-server znc-port znc-nick irc-servers)
201 (interactive (let ((zserv (or znc/server
202 (read-string "ZNC Server: ")))
203 (zport (or znc/port
204 (read-number "ZNC Port: ")))
205 (znick (or znc/nick
206 (read-string "ZNC Nick: ")))
207 (servers (or znc/irc-servers
208 (list
209 (cons
210 (read-string "IRC Server to connect to: ")
211 (read-passwd "Password: "))))))
212 (list zserv zport znick servers)))
213 (let ((si 0))
214 (dolist (server irc-servers)
215 (run-at-time si nil
216 (lambda ()
217 (erc-tls :server znc-server
218 :port znc-port
219 :nick znc-nick
220 :password (format "%s/%s:%s"
221 znc-nick
222 (car server)
223 (cdr server)))))
224 (setq si (1+ si)))))
225
226
227(provide 'acdw-erc)
228;;; acdw-erc.el ends here