1 ;;; liece-000.el --- Handler routines for 000 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.
32 (eval-when-compile (require 'cl))
35 (require 'liece-inlines)
37 (require 'liece-misc))
39 (defvar liece-tmp-server-name)
41 (defun* liece-handle-000-messages (number prefix rest)
42 (setq liece-nick-accepted 'ok)
43 (or (string-match "[^ ]* \\([^ :]*\\) *\\([^ :]*\\) *:\\(.*\\)" rest)
44 (return-from liece-handle-000-messages))
45 (let ((target1 (match-string 1 rest)) (target2 (match-string 2 rest))
46 (msg (match-string 3 rest)))
48 ((string-equal target1 "")
49 (liece-insert liece-000-buffer
50 (concat liece-info-prefix msg "\n")))
51 ((string-equal target2 "")
52 (liece-insert liece-000-buffer
53 (format "%s%s (%s)\n" liece-info-prefix msg target1)))
55 (liece-insert liece-000-buffer
56 (format "%s%s %s (%s)\n"
57 liece-info-prefix target1 msg target2))))))
59 (defun* liece-handle-001-message (prefix rest)
60 "RPL_WELCOME \"Welcome to the Internet Relay Network <nick>\""
61 (or (< 0 (length (setq rest (liece-split-line rest))))
62 (return-from liece-handle-001-message))
63 (let ((nick (car rest)))
64 (setq liece-tmp-server-name prefix
66 liece-real-nickname nick
67 liece-my-userhost nil)
68 (liece-send "USERHOST %s" liece-nickname)
72 (_ "Welcome to the Internet Relay Chat world. Your nick is %s.\n")
75 (defun liece-handle-002-message (prefix rest)
76 "RPL_YOURHOST \"Your host is <host>, running version <version>\"."
78 ((string-match "running version \\(.*\\)" rest)
79 (liece-insert-info liece-000-buffer
80 (format (_ "Your server is %s (version %s).\n")
81 liece-tmp-server-name (match-string 1 rest))))
83 (liece-insert-info liece-000-buffer
84 (format (_ "Your client version is %s.\n")
87 (defun liece-handle-003-message (prefix rest)
88 "RPL_CREATED \"This server was created <time>\"."
89 (if (string-match "was created \\(.*\\)" rest)
90 (liece-insert-info liece-000-buffer
91 (format (_ "Your server was created %s\n")
92 (match-string 1 rest)))))
94 (defmacro char-list-to-string-alist (clist)
96 (lambda (ch) (list (char-to-string ch)))
99 (defun* liece-handle-004-message (prefix rest)
100 "RPL_MYINFO \"<umodes> <chnlmodes>\""
101 (or (string-match "[^ ]* \\(.*\\)" rest)
102 (return-from liece-handle-004-message))
103 (let ((rest (match-string 1 rest)))
105 ((string-match "[^ ]* [^ ]* \\([^ ]+\\) \\(.*\\)" rest)
106 (setq liece-supported-user-mode-alist
107 (char-list-to-string-alist
108 (liece-string-to-list (match-string 1 rest)))
109 liece-supported-channel-mode-alist
110 (char-list-to-string-alist
111 (liece-string-to-list (match-string 2 rest)))))
113 (liece-insert-info liece-000-buffer (concat rest "\n"))))))
116 ;; Undernet's MAP feature
117 (defvar liece-undernet-map nil)
119 (defun liece-handle-005-message (prefix rest)
120 "RPL_MAP \"<server>\"."
121 (liece-increment-long-reply-count)
122 (liece-check-long-reply-count)
123 (push rest liece-undernet-map))
125 (defun liece-handle-006-message (prefix rest)
126 "RPL_MAPMORE \"<server> --> *more*\"."
127 (liece-increment-long-reply-count)
128 (liece-check-long-reply-count)
129 (if (string-match " --> \*more\*" rest)
130 (setq rest (concat "[" (substring rest 0 (match-beginning 0)))) "]*")
131 (push rest liece-undernet-map))
133 (defun liece-handle-007-message (prefix rest)
134 "RPL_MAPEND \"End of /MAP\"."
135 (liece-reset-long-reply-count)
136 (dolist (map liece-undernet-map)
137 (liece-insert-info liece-000-buffer (concat map "\n")))
138 (setq liece-undernet-map nil))
141 ;;; @ register message handlers
144 (eval-when-compile (require 'liece-handler))
146 (liece-handler-define-backend "000")
148 (defmacro liece-register-000-handler (num)
150 (liece-handler-define-function
151 ,(format "%03d" num) '(prefix require "000")
152 ',(intern (format "liece-handle-%03d-message" num)))
153 (defvar ,(intern (format "liece-%03d-hook" num)) nil)
154 (defvar ,(intern (format "liece-after-%03d-hook" num)) nil)))
156 (liece-register-000-handler 001)
157 (liece-register-000-handler 002)
158 (liece-register-000-handler 003)
159 (liece-register-000-handler 004)
160 (liece-register-000-handler 005)
161 (liece-register-000-handler 006)
162 (liece-register-000-handler 007)
166 ;;; liece-000.el ends here