Remove Gnus, making way for new subtree Gnus pkg
[packages] / xemacs-packages / liece / lisp / liece-400.el
1 ;;; liece-400.el --- Handler routines for 400 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-11-25
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
33   (require 'liece-inlines)
34   (require 'liece-intl)
35   (require 'liece-misc))
36
37 (defun* liece-handle-400-messages (number prefix rest)
38   "400 replies -- ERRORS"
39   (or (string-match "[^ ]* \\([^ ]*\\) *\\([^ ]*\\) *:\\(.*\\)" rest)
40       (return-from liece-handle-400-messages))
41   (let ((target1 (match-string 1 rest)) (target2 (match-string 2 rest))
42         (msg (match-string 3 rest)))
43     (setq target1 (liece-channel-virtual target1)
44           target2 (liece-channel-virtual target2))
45     (cond ((string= target1 "")
46            (liece-insert-error liece-400-buffer
47                                 (concat msg "\n")))
48           ((string= target2 "")
49            (liece-insert-error liece-400-buffer
50                                 (concat msg " (" target1 ")\n")))
51           (t
52            (liece-insert-error liece-400-buffer
53                                 (format"%s %s (%s)\n" target1 msg target2))))))
54
55 (defun liece-handle-401-message (prefix rest)
56   "ERR_NOSUCHNICK \"<nickname> :No such nick/channel\"."
57   (if (string-match "[^ ]+ \\([^ ]+\\)" rest)
58       (let ((name (match-string 1 rest)))
59         (liece-nick-change name nil)
60         (liece-send "WHOWAS %s" name))))
61
62 (defun liece-handle-406-message (prefix rest)
63   "ERR_WASNOSUCHNICK \"<nickname> :There was no such nickname\"."
64   (if (string-match "[^ ]+ \\([^ ]+\\)" rest)
65       (let ((nick (match-string 1 rest)))
66         (liece-nick-change nick nil)
67         (liece-message (_ "No such user %s") nick))))
68
69 (defun liece-handle-412-message (prefix rest)
70   "ERR_NOTEXTTOSEND \":No text to send\"."
71   (liece-message (_ "No text to send")))
72
73 (defun liece-iterate-nick (nick)
74   (let* ((fmt (format "%s_" nick))
75          (new (substring fmt 0 (min 9 (length fmt)))))
76     (if (string= nick new)
77         (liece-iterate-nick (format "_%s" nick))
78       new)))
79
80 (defun liece-handle-432-message (prefix rest)
81   "ERR_ERRONEUSNICKNAME \"<nickname> :Erroneous nickname\"."
82   (let ((nick (cond ((string-match "^[^ ]+ +\\([^ ]+\\)" rest)
83                      (match-string 1 rest))
84                     ((string-match "^ *\\([^ ]+\\)" rest)
85                      (match-string 1 rest)))))
86     (with-current-buffer liece-command-buffer
87       (if (eq liece-nick-accepted 'ok)
88           (setq liece-real-nickname liece-nickname-last))
89       (liece-message
90        (_ "Erroneous nickname %s.  Choose a new one with %s.")
91        nick (substitute-command-keys "\\[liece-command-nickname]"))
92       (liece-beep))))
93
94 (defun liece-handle-433-message (prefix rest)
95   "ERR_NICKNAMEINUSE \"<nickname> :Nickname is already in use\"."
96   (let ((nick (cond ((string-match "^[^ ]+ +\\([^ ]+\\)" rest)
97                      (match-string 1 rest))
98                     ((string-match "^ *\\([^ ]+\\)" rest)
99                      (match-string 1 rest)))))
100     (cond
101      ((and (not (eq liece-nick-accepted 'ok))
102            liece-auto-iterate-nick)
103       (liece-send "NICK %s" (liece-iterate-nick nick))
104       (setq liece-nick-accepted 'sent))
105      (t
106       (if (eq liece-nick-accepted 'ok)
107           (setq liece-real-nickname liece-nickname-last))
108       (with-current-buffer liece-command-buffer
109         (liece-message
110          (_ "Nickname %s already in use.  Choose a new one with %s.")
111          nick (substitute-command-keys "\\[liece-command-nickname]"))
112         (liece-beep))))))
113
114 (defun liece-handle-442-message (prefix rest)
115   "ERR_NOTONCHANNEL \"<channel> :You're not on that channel\"."
116   (if (string-match "[^ ]+ \\([^ ]+\\) +:\\(.*\\)" rest)
117       (let* ((chnl (liece-channel-virtual (match-string 1 rest)))
118              (rest (match-string 2 rest)))
119         (if (liece-channel-member chnl liece-current-channels)
120             (liece-channel-part chnl)
121           (liece-message (_ "You're not on channel %s") chnl)))))
122
123 (defun liece-handle-443-message (prefix rest)
124   "ERR_USERONCHANNEL \"<channel> <nickname> :is already on channel\"."
125   (if (string-match "[^ ]+ \\([^ ]+\\) \\([^ ]+\\)" rest)
126       (let ((chnl (match-string 1 rest))
127             (rest (match-string 2 rest)))
128         (when (prog1 (liece-channel-p chnl)
129                 (setq chnl (liece-channel-virtual chnl)))
130           (or (liece-channel-member chnl liece-current-channels)
131               (liece-channel-join chnl)))
132         (liece-message (_ "You're already on channel %s") chnl))))
133
134 (defun liece-handle-464-message (prefix rest)
135   "ERR_PASSWDMISMATCH \":Password incorrect\"."
136   (liece-message
137    (_ "Password incorrect from %s. Try again with password.") prefix)
138   (setq liece-reconnect-with-password t))
139
140 (defun liece-handle-482-message (prefix rest)
141   "ERR_CHANOPRIVSNEEDED \"<channel> :You're not channel operator\"."
142   (liece-message (_ "You are not a channel operator")))
143
144 \f
145 ;;; @ register message handlers
146 ;;;
147
148 (eval-when-compile (require 'liece-handler))
149
150 (liece-handler-define-backend "400")
151
152 (defmacro liece-register-400-handler (num)
153   `(progn
154      (liece-handler-define-function
155       ,(number-to-string num) '(prefix require "400")
156       ',(intern (format "liece-handle-%03d-message" num)))
157      (defvar ,(intern (format "liece-%03d-hook" num)) nil)
158      (defvar ,(intern (format "liece-after-%03d-hook" num)) nil)))
159
160 (liece-register-400-handler 401)
161 (liece-register-400-handler 406)
162
163 (liece-register-400-handler 412)
164
165 (liece-register-400-handler 432)
166 (liece-register-400-handler 433)
167
168 (liece-register-400-handler 442)
169 (liece-register-400-handler 443)
170
171 (liece-register-400-handler 464)
172
173 (liece-register-400-handler 482)
174
175 (provide 'liece-400)
176
177 ;;; liece-400.el ends here