diff options
Diffstat (limited to 'lisp/acdw-erc.el')
-rw-r--r-- | lisp/acdw-erc.el | 228 |
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. | ||
56 | If 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. | ||
127 | Truncation is customized using the `erc-nick-truncate' variable. | ||
128 | See 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. | ||
149 | Reverse 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 | ||
164 | erc-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 | ||