Import Riece subtree
[packages] / xemacs-packages / riece / lisp / riece-irc.el
diff --git a/xemacs-packages/riece/lisp/riece-irc.el b/xemacs-packages/riece/lisp/riece-irc.el
new file mode 100644 (file)
index 0000000..5b56993
--- /dev/null
@@ -0,0 +1,126 @@
+;;; riece-irc.el --- IRC protocol -*- lexical-binding: t -*-
+;; Copyright (C) 1998-2004 Daiki Ueno
+
+;; Author: Daiki Ueno <ueno@unixuser.org>
+;; Created: 1998-09-28
+;; Keywords: IRC, riece
+
+;; This file is part of Riece.
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2, or (at your option)
+;; any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Code:
+
+(require 'riece-filter)
+(require 'riece-server)
+(require 'riece-mcat)
+
+(defun riece-irc-open-server (server server-name)
+  (riece-server-keyword-bind server
+    (let (selective-display
+         (coding-system-for-read 'binary)
+         (coding-system-for-write 'binary)
+         process)
+      (if (equal server-name "")
+         (message (riece-mcat "Connecting to IRC server..."))
+       (message (riece-mcat "Connecting to %s...") server-name))
+      (condition-case error
+         (setq process
+               (funcall function (riece-server-process-name server-name)
+                        (concat " *IRC*" server-name)
+                        host service))
+       (error
+        (if (equal server-name "")
+            (message (riece-mcat "Connecting to IRC server...failed: %S")
+                     error)
+          (message (riece-mcat "Connecting to %s...failed: %S") server-name
+                   error))
+        (signal (car error) (cdr error))))
+      (if (equal server-name "")
+         (message (riece-mcat "Connecting to IRC server...done"))
+       (message (riece-mcat "Connecting to %s...done") server-name))
+      (riece-reset-process-buffer process)
+      (with-current-buffer (process-buffer process)
+       (setq riece-server-name server-name))
+      (set-process-sentinel process 'riece-sentinel)
+      (set-process-filter process 'riece-filter)
+      (if (equal server-name "")
+         (message (riece-mcat "Logging in to IRC server..."))
+       (message (riece-mcat "Logging in to %s...") server-name))
+      (if riece-reconnect-with-password        ;password incorrect or not set.
+         (unwind-protect
+             (setq password
+                   (condition-case nil
+                       (let (inhibit-quit)
+                         (if (equal server-name "")
+                             (riece-read-passwd (riece-mcat "Password: "))
+                           (riece-read-passwd
+                            (format (riece-mcat "Password for %s: ")
+                                    server-name))))
+                     (quit
+                      (if (equal server-name "")
+                          (message (riece-mcat "Password: Quit"))
+                        (message (riece-mcat "Password for %s: Quit")
+                                 server-name))
+                      'quit)))
+           (setq riece-reconnect-with-password nil)))
+      (if (eq password 'quit)
+         (delete-process process)
+       (if password
+           (riece-process-send-string process
+                                      (format "PASS %s\r\n" password)))
+       (riece-process-send-string process (format "NICK %s\r\n" nickname))
+       (unless realname
+         (setq realname (riece-mcat "No information given")))
+       (if coding
+           (setq realname (encode-coding-string realname
+                                                (if (consp coding)
+                                                    (cdr coding)
+                                                  coding))))
+       (riece-process-send-string process
+                                  (format "USER %s * * :%s\r\n"
+                                          (or username
+                                              (user-real-login-name))
+                                          realname))
+       (with-current-buffer (process-buffer process)
+         (setq riece-last-nickname riece-real-nickname
+               riece-nick-accepted 'sent
+               riece-coding-system coding))
+       process))))
+
+(defun riece-irc-quit-server-process (process &optional message)
+  (if riece-quit-timeout
+      (riece-run-at-time riece-quit-timeout nil
+                        (lambda (process)
+                          (if (rassq process riece-server-process-alist)
+                              (delete-process process)))
+                        process))
+  (let ((server-name (with-current-buffer (process-buffer process)
+                      riece-server-name)))
+    (if (equal server-name "")
+       (message (riece-mcat "Sending QUIT..."))
+      (message (riece-mcat "Sending QUIT to \"%s\"...") server-name))
+    (riece-process-send-string process
+                              (if message
+                                  (format "QUIT :%s\r\n" message)
+                                "QUIT\r\n"))
+    (if (equal server-name "")
+       (message (riece-mcat "Sending QUIT...done"))
+      (message (riece-mcat "Sending QUIT to \"%s\"...done") server-name))))
+
+(provide 'riece-irc)
+
+;;; riece-irc.el ends here