Import Riece subtree
[packages] / xemacs-packages / riece / lisp / riece-async.el
diff --git a/xemacs-packages/riece/lisp/riece-async.el b/xemacs-packages/riece/lisp/riece-async.el
new file mode 100644 (file)
index 0000000..8b84a74
--- /dev/null
@@ -0,0 +1,95 @@
+;;; riece-async.el --- connect to IRC server via async proxy -*- lexical-binding: t -*-
+;; Copyright (C) 1998-2003 Daiki Ueno
+
+;; Author: Daiki Ueno <ueno@unixuser.org>
+;; 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.
+
+;;; Commentary:
+
+;; NOTE: This is an add-on module for Riece.
+
+;; This program allows to connect to an IRC server via local proxy
+;; which responds to PING requests from server.
+
+;; If you want to enable this feature per server, write the server
+;; spec like this:
+;; (add-to-list 'riece-server-alist
+;;              '("async" :host "irc.tokyo.wide.ad.jp"
+;;                :function riece-async-open-network-stream))
+
+;;; Code:
+
+(require 'riece-options)
+(require 'riece-ruby)                  ;riece-ruby-command
+
+(defgroup riece-async nil
+  "Connect to IRC server via async proxy."
+  :prefix "riece-"
+  :group 'riece)
+
+(defcustom riece-async-buffer-size 65535
+  "Maximum size of the write buffer."
+  :type 'integer
+  :group 'riece-async)
+
+(defcustom riece-async-backup-file (expand-file-name "riece-async.bak"
+                                                    riece-directory)
+  "A file which contains outdated messages."
+  :type 'string
+  :group 'riece-async)
+
+(defvar riece-async-server-program "aproxy.rb"
+  "The server program file.  If the filename is not absolute, it is
+assumed that the file is in the same directory of this file.")
+
+(defvar riece-async-server-program-arguments
+  (list "-s" (number-to-string riece-async-buffer-size)
+       "-b" riece-async-backup-file)
+  "Command line arguments passed to `riece-async-server-program'.")
+
+(defconst riece-async-description
+  "Connect to IRC server via async proxy.")
+
+;;;###autoload
+(defun riece-async-open-network-stream (name buffer _host _service)
+  (let* (process-connection-type
+        (process
+         (apply #'start-process name buffer riece-ruby-command
+                (expand-file-name riece-async-server-program
+                                  riece-data-directory)
+                riece-async-server-program-arguments)))
+    (if buffer
+       (with-current-buffer (process-buffer process)
+         (while (and (eq (process-status process) 'run)
+                     (progn
+                       (goto-char (point-min))
+                       (not (looking-at (format "NOTICE CONNECTED %d"
+                                                (process-id process))))))
+           (accept-process-output process))))
+    (riece-set-process-query-on-exit-flag process nil)
+    process))
+
+(defun riece-async-insinuate ()
+  (setq riece-default-open-connection-function
+       #'riece-async-open-network-stream))
+
+(provide 'riece-async)
+
+;;; riece-async.el ends here