1 ;;; liece-200.el --- Handler routines for 200 numeric reply.
2 ;; Copyright (C) 1998-2000 Daiki Ueno
4 ;; Author: Daiki Ueno <ueno@unixuser.org>
7 ;; Keywords: IRC, liece
9 ;; This file is part of Liece.
11 ;; This program is free software; you can redistribute it and/or modify
12 ;; it under the terms of the GNU General Public License as published by
13 ;; the Free Software Foundation; either version 2, or (at your option)
16 ;; This program is distributed in the hope that it will be useful,
17 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
18 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 ;; GNU General Public License for more details.
21 ;; You should have received a copy of the GNU General Public License
22 ;; along with GNU Emacs; see the file COPYING. If not, write to the
23 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
24 ;; Boston, MA 02111-1307, USA.
33 (require 'liece-inlines)
36 (require 'liece-commands))
38 (defun* liece-handle-200-messages (number prefix rest)
40 (or (string-match "[^ ]* \\([^ ]*\\) *\\([^ ]*\\) *:\\(.*\\)" rest)
41 (return-from liece-handle-200-messages))
42 (let ((target1 (match-string 1 rest)) (target2 (match-string 2 rest))
43 (msg (match-string 3 rest)))
44 (setq target1 (liece-channel-virtual target1)
45 target2 (liece-channel-virtual target2))
46 (cond ((string-equal target1 "")
47 (liece-insert-info liece-200-buffer (concat msg "\n")))
48 ((string-equal target2 "")
50 liece-200-buffer (concat target1 " " msg "\n")))
53 liece-200-buffer (concat target1 " " msg " (" target2 ")\n"))))))
55 (defun* liece-handle-200-message (prefix rest)
56 "RPL_TRACELINK \"Link <version & debug level> <destination> <next server>\""
57 (or (string-match "Link \\([^ ]*\\)[ :]*\\([^ ]*\\)[ :]*\\([^ ]*\\)[ :]*\\([^ ]*\\)[ :]*\\([^ ]*\\)[ :]*\\([^ ]*\\)[ :]*\\(.*\\)" rest)
58 (return-from liece-handle-200-message))
59 (let ((version (match-string 1 rest)) (dest (match-string 2 rest))
60 (next (match-string 3 rest)) (ver (match-string 4 rest))
61 (sec (match-string 5 rest))
62 (q1 (match-string 6 rest)) (q2 (match-string 7 rest)))
63 (liece-insert-info liece-200-buffer
66 version (if ver (concat " " ver) "")
68 (liece-insert-info liece-200-buffer
69 (concat "\t[" (liece-convert-seconds sec) "]"
70 (if (not (string= q1 "")) (concat " " q1) "")
71 (if (not (string= q2 "")) (concat "/" q2) "")
72 " (next " next ")\n"))))
74 (defun* liece-handle-201-message (prefix rest)
75 "RPL_TRACECONNECTING \"Try. <class> <server>\""
76 (or (string-match "[^ ]* [^ ]* \\([0-9]*\\)[ :]*\\(.*\\)" rest)
77 (return-from liece-handle-201-message))
78 (let ((class (match-string 1 rest))
79 (server (match-string 2 rest)))
80 (liece-insert-info liece-200-buffer
81 (format (_ "%s Trying to connect to %s (class %s)\n")
82 prefix server class))))
84 (defun* liece-handle-202-message (prefix rest)
85 "RPL_TRACEHANDSHAKE \"H.S. <class> <server>\""
86 (or (string-match "[^ ]* [^ ]* \\([0-9]*\\)[ :]*\\(.*\\)" rest)
87 (return-from liece-handle-202-message))
88 (let ((class (match-string 1 rest)) (server (match-string 2 rest)))
89 (liece-insert-info liece-200-buffer
90 (format (_ "%s Handshaking with %s (class: %s)\n")
91 prefix server class))))
93 (defun* liece-handle-203-message (prefix rest)
94 "RPL_TRACEUNKNOWN \"???? <class> [<client IP address in dot form>]\""
95 (or (string-match "[^ ]* [^ ]* \\([^ ]*\\)[ :]+\\(.*\\)" rest)
96 (return-from liece-handle-203-message))
97 (let ((class (match-string 1 rest)) (who (match-string 2 rest)))
98 (liece-insert-info liece-200-buffer
99 (concat "Class " class ": unknown " who "\n"))))
101 (defun* liece-handle-204-message (prefix rest)
102 "RPL_TRACEOPERATOR \"Oper <class> <nick>\""
103 (or (string-match "[^ ]* [^ ]* \\([^ ]*\\)[ :]+\\(.*\\)" rest)
104 (return-from liece-handle-204-message))
105 (let ((class (match-string 1 rest)) (who (match-string 2 rest)))
106 (liece-insert-info liece-200-buffer
107 (concat "Class " class ": operator " who "\n"))))
109 (defun* liece-handle-205-message (prefix rest)
110 "RPL_TRACEUSER \"User <class> <nick>\""
111 (or (string-match "[^ ]* [^ ]* \\([0-9]*\\)[ :]*\\(.*\\)" rest)
112 (return-from liece-handle-205-message))
113 (let ((hops (match-string 1 rest)) (where (match-string 2 rest)))
114 (liece-insert-info liece-200-buffer
115 (concat "Class " hops ": user " where "\n"))))
117 (defun* liece-handle-206-message (prefix rest)
118 "RPL_TRACESERVER \"Serv <class> <int>S <int>C <server> <nick!user|*!*>@<host|server>\""
119 (or (string-match "Serv \\([^ ]*\\) \\(.*\\)" rest)
120 (return-from liece-handle-206-message))
121 (let ((class (match-string 1 rest)) (pars (match-string 2 rest)))
123 ((string-match "\\([0-9]*\\)S *\\([0-9]*\\)C *\\([^ ]*\\) *\\([^ ]*\\)[ :]*\\(.*\\)" pars)
124 (let ((servers (match-string 1 pars)) (clients (match-string 2 pars))
125 (next (match-string 3 pars)) (by (match-string 4 pars))
126 (type (match-string 5 pars)))
128 ;; This is automatic connection line
129 (setq by (if (string-match "^AutoConn\\.!" by)
133 (liece-insert-info liece-200-buffer
134 (concat prefix " --- " next "\n"))
135 (liece-insert-info liece-200-buffer
136 (concat "\t[" clients " clients, "
138 " Class " class ", Type " type " " by
141 (liece-insert-info liece-200-buffer
142 (format "Class %s: server %s --- %s\n"
143 class prefix pars))))))
145 (defun* liece-handle-207-message (prefix rest)
146 "RPL_TRACESERVICE \"Service <class> <name> <type> <wants>\""
147 (or (string-match "[^ ]* Service \\([0-9]*\\) \\(.*\\)" rest)
148 (return-from liece-handle-207-message))
149 (let ((class (match-string 1 rest)) (service (match-string 2 rest)))
150 (liece-insert-info liece-200-buffer
151 (concat "Class " class ": service " service "\n"))))
153 (defun liece-handle-208-message (prefix rest)
154 "RPL_TRACENEWTYPE \"<newtype> 0 <client name>\"."
155 (liece-insert-info liece-200-buffer
156 (format "%s: RPL_TRACENEWTYPE: Why this?\n" prefix)))
158 (defun* liece-handle-209-message (prefix rest)
159 "RPL_TRACECLASS \"Class <class> <links>\""
160 (or (string-match "[^ ]* Class \\([0-9]*\\) \\([0-9]*\\)" rest)
161 (return-from liece-handle-209-message))
162 (let ((class (match-string 1 rest)) (entries (match-string 2 rest)))
163 (liece-insert-info liece-200-buffer
164 (concat "Class " class ": " entries
165 "entries linked\n"))))
167 (defun* liece-handle-211-message (prefix rest)
168 "RPL_STATSLINKINF \"<linkname> <sendq> <sent messages> <sent bytes> <received messages> <received bytes> <time open>\""
169 (or (string-match "\\([^ ]*\\) \\([^ ]*\\) \\([^ ]*\\) \\([^ ]*\\) \\([^ ]*\\) \\([^ ]*\\) \\([^ ]*\\)[ :]+\\(.*\\)" rest)
170 (return-from liece-handle-211-message))
171 (let ((link (match-string 2 rest)) (sendq (match-string 3 rest))
172 (sendm (match-string 4 rest)) (sendb (match-string 5 rest))
173 (rcvem (match-string 6 rest)) (rcveb (match-string 7 rest))
174 (open (match-string 8 rest)))
175 (liece-insert-info liece-200-buffer
176 (format "%-35s %s: %5s%7s%10s%7s%10s %s\n"
177 link prefix sendq sendm sendb
180 (defun* liece-handle-212-message (prefix rest)
181 "RPL_STATSCOMMANDS \"<command> <count>\""
182 (or (string-match "[^ ]* \\([^ ]*\\) \\([0-9]*\\)" rest)
183 (return-from liece-handle-212-message))
184 (let ((cmd (match-string 1 rest)) (times (match-string 2 rest)))
185 (liece-insert-info liece-200-buffer
186 (format "%s has been used %s times after startup\n"
189 (defun* liece-handle-213-message (prefix rest)
190 "RPL_STATSCLINE \"C <host> * <name> <port> <class>\""
191 (or (string-match "[^ ]* C \\([^ ]*\\) \\* \\([^ ]*\\) \\([0-9]*\\) \\([0-9]*\\)" rest)
192 (return-from liece-handle-213-message))
193 (let ((canon (match-string 1 rest)) (name (match-string 2 rest))
194 (port (match-string 3 rest)) (class (match-string 4 rest)))
195 (liece-insert-info liece-200-buffer
196 (concat "Connect to " canon ":" port
197 (if (not (string= class ""))
198 " (Class " class ")" "")
200 (liece-insert-info liece-200-buffer
201 (concat "\t[" name "]\n"))))
203 (defun* liece-handle-214-message (prefix rest)
204 "RPL_STATSNLINE \"N <host> * <name> <port> <class>\""
205 (or (string-match "[^ ]* N \\([^ ]*\\) \\* \\([^ ]*\\) \\([0-9]*\\) \\([0-9]*\\)" rest)
206 (return-from liece-handle-214-message))
207 (let ((canon (match-string 1 rest)) (name (match-string 2 rest))
208 (port (match-string 3 rest)) (class (match-string 4 rest)))
209 (liece-insert-info liece-200-buffer
210 (concat "Accept " canon ":" port
211 (if (not (string= class ""))
212 " (Class " class ")" "")
214 (liece-insert-info liece-200-buffer
215 (concat "\t[" name "]\n"))))
217 (defun* liece-handle-215-message (prefix rest)
218 "RPL_STATSILINE \"I <host> * <host> <port> <class>\""
219 (or (string-match "[^ ]* I \\([^ ]*\\) \\(.*\\) \\([^ ]*\\)" rest)
220 (return-from liece-handle-215-message))
221 (let ((domain (match-string 1 rest)) (passwd (match-string 2 rest))
222 (redomain (match-string 3 rest)))
223 (liece-insert-info liece-200-buffer
224 (format "I:%s:%s:%s\n" domain passwd redomain))))
226 (defun* liece-handle-216-message (prefix rest)
227 "RPL_STATSKLINE \"K <host> * <username> <port> <class>\""
228 (or (or (string-match
229 "[^ ]* K \\([^ ]*\\) \\(.\\) \\([^ ]*\\) 0 -1" rest)
231 "[^ ]* K \\([^ ]*\\) \\([^ ]*\\) \\([^ ]*\\) 0 [:]*-1" rest))
232 (return-from liece-handle-216-message))
233 (let ((host (match-string 1 rest)) (pass (match-string 2 rest))
234 (user (match-string 3 rest)))
235 (liece-insert-info liece-200-buffer
236 (format "K:%s:%s:%s\n" host pass user))))
238 (defun* liece-handle-217-message (prefix rest)
239 "RPL_STATSQLINE \"Q %s %s %s %d %d\""
241 "[^ ]* Q \\([^ ]*\\) \\(.\\) \\([^ ]*\\) \\(.*\\)" rest)
242 (return-from liece-handle-217-message))
243 (let ((reason (match-string 1 rest)) (star (match-string 2 rest))
244 (host (match-string 3 rest)) (stuff (match-string 4 rest)))
245 (liece-insert-info liece-200-buffer
246 (format "Q:%s:%s:%s:%s\n" reason star host stuff))))
248 (defun* liece-handle-218-message (prefix rest)
249 "RPL_STATSYLINE \"Y <class> <ping frequency> <connect frequency> <max sendq>\""
250 (or (string-match "[^ ]* Y " rest)
251 (return-from liece-handle-218-message))
252 (let* ((args (split-string (substring rest (match-end 0))))
253 (class (pop args)) (pingfreq (pop args)) (confreq (pop args))
254 (maxlinks (pop args)) (qlen (pop args)))
255 (liece-insert-info liece-200-buffer
256 (concat "Class " class ": \n"))
257 (liece-insert-info liece-200-buffer
258 (concat "\tPing frequency " pingfreq " (sec)\n"))
259 (liece-insert-info liece-200-buffer
260 (concat "\tConnection frequency " confreq " (sec)\n"))
261 (liece-insert-info liece-200-buffer
262 (concat "\tMaximum links " maxlinks "\n"))
264 (liece-insert-info liece-200-buffer
265 (concat "\tMaximum amount of send buffer "
266 qlen " (bytes)\n")))))
268 (defun liece-handle-219-message (prefix rest)
269 "RPL_ENDOFSTATS \"<stats letter> :End of /STATS report\"."
272 (defun liece-handle-221-message (prefix rest)
273 "RPL_UMODEIS \"<user mode string>\"."
274 (if (string-match "[^ ]* \\(.*\\)" rest)
275 (liece-insert-info liece-200-buffer
276 (format (_ "Mode for you is %s\n")
277 (match-string 1 rest)))))
280 ;;; 230 series not implemented as 7/94
282 (defun liece-handle-231-message (prefix rest)
285 (defun liece-handle-232-message (prefix rest)
288 (defun liece-handle-233-message (prefix rest)
291 (defun liece-handle-234-message (prefix rest)
294 (defun liece-handle-235-message (prefix rest)
297 (defun liece-handle-241-message (prefix rest)
298 "RPL_STATSLLINE \"L <hostmask> * <servername> <maxdepth>\"."
299 (if (string-match "[^ ]* \\(.*\\)" rest)
300 (liece-insert-info liece-200-buffer
301 (concat (match-string 1 rest) "\n"))))
303 (defun liece-handle-242-message (prefix rest)
304 "RPL_STATSUPTIME \":Server Up %d days %d:%02d:%02d\"."
305 (if (string-match "[^ ]* :\\(.*\\)" rest)
306 (liece-insert-info liece-200-buffer
307 (concat (match-string 1 rest) "\n"))))
309 (defun liece-handle-243-message (prefix rest)
310 "RPL_STATSOLINE \"O <hostmask> * <name>\"."
311 (if (string-match "[^ ]* \\(.*\\)" rest)
312 (liece-insert-info liece-200-buffer
313 (concat (match-string 1 rest) "\n"))))
315 (defun liece-handle-244-message (prefix rest)
316 "RPL_STATSHLINE \"H <hostmask> * <servername>\"."
317 (if (string-match "[^ ]* \\(.*\\)" rest)
318 (liece-insert-info liece-200-buffer
319 (concat (match-string 1 rest) "\n"))))
321 (defun liece-handle-245-message (prefix rest)
322 "RPL_STATSSLINE \"S <hostmask> * <servicename> <servicetype> <class>\"."
323 (if (string-match "[^ ]* \\(.*\\)" rest)
324 (liece-insert-info liece-200-buffer
325 (concat (match-string 1 rest) "\n"))))
327 (defun liece-handle-262-message (prefix rest)
328 "RPL_ENDOFTRACE \"<nickname> <target> <version> :End of TRACE\"."
332 ;;; @ register message handlers
335 (eval-when-compile (require 'liece-handler))
337 (liece-handler-define-backend "200")
339 (defmacro liece-register-200-handler (num)
341 (liece-handler-define-function
342 ,(number-to-string num) '(prefix rest "200")
343 ',(intern (format "liece-handle-%03d-message" num)))
344 (defvar ,(intern (format "liece-%03d-hook" num)) nil)
345 (defvar ,(intern (format "liece-after-%03d-hook" num)) nil)))
347 (liece-register-200-handler 200)
348 (liece-register-200-handler 201)
349 (liece-register-200-handler 202)
350 (liece-register-200-handler 203)
351 (liece-register-200-handler 204)
352 (liece-register-200-handler 205)
353 (liece-register-200-handler 206)
354 (liece-register-200-handler 207)
355 (liece-register-200-handler 208)
356 (liece-register-200-handler 209)
358 (liece-register-200-handler 211)
359 (liece-register-200-handler 212)
360 (liece-register-200-handler 213)
361 (liece-register-200-handler 214)
362 (liece-register-200-handler 215)
363 (liece-register-200-handler 216)
364 (liece-register-200-handler 217)
365 (liece-register-200-handler 218)
366 (liece-register-200-handler 219)
368 (liece-register-200-handler 221)
370 (liece-register-200-handler 231)
371 (liece-register-200-handler 232)
372 (liece-register-200-handler 233)
373 (liece-register-200-handler 234)
374 (liece-register-200-handler 235)
376 (liece-register-200-handler 241)
377 (liece-register-200-handler 242)
378 (liece-register-200-handler 243)
379 (liece-register-200-handler 244)
380 (liece-register-200-handler 245)
381 (liece-register-200-handler 262)
385 ;;; liece-200.el ends here