From: ueno Date: Sat, 13 Dec 2003 11:13:11 +0000 (+0000) Subject: * riece-options.el (riece-default-open-connection-function): New X-Git-Tag: riece-0_1_7~19 X-Git-Url: http://git.chise.org/gitweb/?a=commitdiff_plain;h=d2ce0f1dc56d41eb9d9abc644103e64d8abc9de9;p=elisp%2Friece.git * riece-options.el (riece-default-open-connection-function): New user option. * riece-server.el (riece-server-keyword-map): Use riece-default-open-connection-function. * riece-async.el: New add-on. * COMPILE (riece-modules): Add riece-async. * Makefile.am (EXTRA_DIST): Add riece-async.el --- diff --git a/lisp/COMPILE b/lisp/COMPILE index f485bd9..fa6d087 100644 --- a/lisp/COMPILE +++ b/lisp/COMPILE @@ -56,7 +56,8 @@ riece-button riece-keyword riece-menu - riece-icon)))) + riece-icon + riece-async)))) (defun riece-compile-modules (modules) (let ((load-path (cons nil load-path))) diff --git a/lisp/Makefile.am b/lisp/Makefile.am index e507f5f..e3e46cd 100644 --- a/lisp/Makefile.am +++ b/lisp/Makefile.am @@ -10,7 +10,7 @@ EXTRA_DIST = COMPILE ChangeLog ChangeLog.Liece \ riece-ndcc.el riece-rdcc.el riece-log.el riece-mini.el \ riece-doctor.el riece-alias.el riece-layout.el riece-skk-kakutei.el \ riece-guess.el riece-history.el riece-button.el riece-keyword.el \ - riece-menu.el riece-icon.el + riece-menu.el riece-icon.el riece-async CLEANFILES = auto-autoloads.el custom-load.el *.elc FLAGS ?= -batch -q -no-site-file diff --git a/lisp/riece-async.el b/lisp/riece-async.el new file mode 100644 index 0000000..a21f5c0 --- /dev/null +++ b/lisp/riece-async.el @@ -0,0 +1,124 @@ +;;; riece-async.el --- connect to IRC server via asynchronous proxy +;; Copyright (C) 1998-2003 Daiki Ueno + +;; Author: Daiki Ueno +;; 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., 59 Temple Place - Suite 330, +;; Boston, MA 02111-1307, USA. + +;;; Commentary: + +;; This program allows to connect IRC server via asynchronous proxy +;; which responds to PING request from server in background. + +;; To use, add the following line to your ~/.riece/init.el: +;; (add-to-list 'riece-addons 'riece-async) + +;; If you want to enable this feature to 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: + +(defgroup riece-async nil + "Connect to IRC server via asynchronous proxy" + :prefix "riece-" + :group 'riece) + +(defcustom riece-async-ruby-command "ruby" + "Command name for Ruby interpreter." + :type 'string + :group 'riece-async) + +(defcustom riece-async-server-program + '("\ +socket = TCPSocket.new(" host ", " service ") +$stdout.write(\"NOTICE CONNECTED\r\n\") +$stdout.flush +loop do + rfds, = select([socket, $stdin]) + if rfds.delete(socket) + line = socket.gets(\"\r\n\") + break unless line + if line =~ /^(?::[^ ]+ +)?PING +(.+)\r\n/i + socket.write(\"PONG #{$1}\r\n\") + socket.flush + else + $stdout.write(line) + $stdout.flush + end + end + if rfds.delete($stdin) + line = $stdin.gets(\"\r\n\") + break unless line + socket.write(line) + socket.flush + end +end +socket.close +exit +") + "Ruby program of asynchronous proxy" + :type 'list + :group 'riece-async) + +(defun riece-async-substitute-variables (program variable value) + (setq program (copy-sequence program)) + (let ((pointer program)) + (while pointer + (setq pointer (memq variable program)) + (if pointer + (setcar pointer value))) + program)) + +;;;###autoload +(defun riece-async-open-network-stream (name buffer host service) + (let* ((process-connection-type nil) + (process (start-process name buffer "ruby" "-rsocket"))) + (process-kill-without-query process) + (process-send-string process + (apply #'concat + (riece-async-substitute-variables + (riece-async-substitute-variables + riece-async-server-program + 'host + (concat "'" host "'")) + 'service + (if (numberp service) + (number-to-string service) + (concat "'" service "'"))))) + (process-send-string process "\0\n") ;input to process is needed + (if buffer + (save-excursion + (set-buffer (process-buffer process)) + (while (and (eq (process-status process) 'run) + (progn + (goto-char (point-min)) + (not (looking-at "NOTICE CONNECTED\r\n")))) + (accept-process-output process)))) + process)) + +(defun riece-async-insinuate () + (setq riece-default-open-connection-function + #'riece-async-open-network-stream)) + +(provide 'riece-async) + +;;; riece-rdcc.el ends here diff --git a/lisp/riece-options.el b/lisp/riece-options.el index 945c699..06c9d84 100644 --- a/lisp/riece-options.el +++ b/lisp/riece-options.el @@ -203,6 +203,11 @@ way is to put Riece variables on .emacs or file loaded from there." (const nil)) :group 'riece-server) +(defcustom riece-default-open-connection-function #'open-network-stream + "Default function used for connecting to an IRC server." + :type 'function + :group 'riece-server) + (defcustom riece-channel-buffer-mode t "When non-nil, Riece will display a channel buffer." :type 'boolean diff --git a/lisp/riece-server.el b/lisp/riece-server.el index c3ab69e..5c6b420 100644 --- a/lisp/riece-server.el +++ b/lisp/riece-server.el @@ -37,7 +37,7 @@ (:nickname riece-nickname) (:username riece-username) (:password) - (:function #'open-network-stream) + (:function riece-default-open-connection-function) (:coding riece-default-coding-system)) "Mapping from keywords to default values. All keywords that can be used must be listed here."))