Synch up with liece-2_0.
[elisp/liece.git] / lisp / liece-000.el
1 ;;; liece-000.el --- Handler routines for 000 numeric reply.
2 ;; Copyright (C) 1998-2000 Daiki Ueno
3
4 ;; Author: Daiki Ueno <ueno@unixuser.org>
5 ;; Created: 1998-09-28
6 ;; Revised: 1998-01-26
7 ;; Keywords: IRC, liece
8
9 ;; This file is part of Liece.
10
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)
14 ;; any later version.
15
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.
20
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.
25
26
27 ;;; Commentary:
28 ;; 
29
30 ;;; Code:
31
32 (eval-when-compile (require 'cl))
33
34 (eval-when-compile
35   (require 'liece-inlines)
36   (require 'liece-intl)
37   (require 'liece-misc))
38
39 (defvar liece-tmp-server-name)
40
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)))
47     (cond
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)))
54      (t
55       (liece-insert liece-000-buffer
56                      (format "%s%s %s (%s)\n"
57                              liece-info-prefix target1 msg target2))))))
58
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
65           liece-nickname nick
66           liece-real-nickname nick
67           liece-my-userhost nil)
68     (liece-send "USERHOST %s" liece-nickname)
69     (liece-insert-info
70      liece-000-buffer
71      (format
72       (_ "Welcome to the Internet Relay Chat world. Your nick is %s.\n")
73       nick))))
74
75 (defun liece-handle-002-message (prefix rest)
76   "RPL_YOURHOST \"Your host is <host>, running version <version>\"."
77   (cond
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))))
82    (t
83     (liece-insert-info liece-000-buffer
84                         (format (_ "Your client version is %s.\n")
85                                 (liece-version))))))
86
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)))))
93
94 (defmacro char-list-to-string-alist (clist)
95   `(mapcar
96     (lambda (ch) (list (char-to-string ch)))
97     ,clist))
98
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)))
104     (cond
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)))))
112      (t
113       (liece-insert-info liece-000-buffer (concat rest "\n"))))))
114
115 \f
116 ;; Undernet's MAP feature
117 (defvar liece-undernet-map nil)
118
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))
124
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))
132
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))
139
140 \f
141 ;;; @ register message handlers
142 ;;;
143
144 (eval-when-compile (require 'liece-handler))
145
146 (liece-handler-define-backend "000")
147
148 (defmacro liece-register-000-handler (num)
149   `(progn
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)))
155
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)
163
164 (provide 'liece-000)
165
166 ;;; liece-000.el ends here