1 ;;; liece-400.el --- Handler routines for 400 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)
35 (require 'liece-misc))
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
49 (liece-insert-error liece-400-buffer
50 (concat msg " (" target1 ")\n")))
52 (liece-insert-error liece-400-buffer
53 (format"%s %s (%s)\n" target1 msg target2))))))
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))))
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))))
69 (defun liece-handle-412-message (prefix rest)
70 "ERR_NOTEXTTOSEND \":No text to send\"."
71 (liece-message (_ "No text to send")))
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))
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))
90 (_ "Erroneous nickname %s. Choose a new one with %s.")
91 nick (substitute-command-keys "\\[liece-command-nickname]"))
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)))))
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))
106 (if (eq liece-nick-accepted 'ok)
107 (setq liece-real-nickname liece-nickname-last))
108 (with-current-buffer liece-command-buffer
110 (_ "Nickname %s already in use. Choose a new one with %s.")
111 nick (substitute-command-keys "\\[liece-command-nickname]"))
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)))))
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))))
134 (defun liece-handle-464-message (prefix rest)
135 "ERR_PASSWDMISMATCH \":Password incorrect\"."
137 (_ "Password incorrect from %s. Try again with password.") prefix)
138 (setq liece-reconnect-with-password t))
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")))
145 ;;; @ register message handlers
148 (eval-when-compile (require 'liece-handler))
150 (liece-handler-define-backend "400")
152 (defmacro liece-register-400-handler (num)
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)))
160 (liece-register-400-handler 401)
161 (liece-register-400-handler 406)
163 (liece-register-400-handler 412)
165 (liece-register-400-handler 432)
166 (liece-register-400-handler 433)
168 (liece-register-400-handler 442)
169 (liece-register-400-handler 443)
171 (liece-register-400-handler 464)
173 (liece-register-400-handler 482)
177 ;;; liece-400.el ends here