home *** CD-ROM | disk | FTP | other *** search
- ;; metaserver-mode.el --- major mode for watching netrek site info
- ;; Author: 1992 William M. Perry, Indiana University (wmperry@indiana.edu)
- ;; Maintainer: wmperry@indiana.edu
- ;; Created: 10/17/92
- ;; Version: 1.5b
- ;; Last Modified: Thu Nov 12 23:41:40 1992
- ;; Keywords: Netrek Metaserver
-
- ;; This file is not part of GNU Emacs.
-
- ;; This 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 software 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.
-
- ;; For a copy of the GNU General Public License write to
- ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
-
- (defvar metaserver-use-background nil
- "*Use the background.el package or not? Default is nil")
-
- (defvar metaserver-site "charon.amdahl.com"
- "*What machine is the metaserver on?")
-
- (defvar metaserver-port 3521 "*Which port to query on metaserver")
-
- (defvar metaserver-trailing-headers ".*That's.*"
- "String that comes at the end of the metaserver output")
-
- (defvar metaserver-netrek-binary "netrek_udp"
- "*Normal netrek client to run when in non-borg mode.")
-
- (defvar metaserver-use-borg nil "*Use borg or not?")
- (defvar metaserver-ping-program "/usr/etc/ping -s" "*Ping Program.")
- (defvar metaserver-ping-packets 10 "*# of pings to send to a server.")
- (defvar metaserver-ping-sizeof 65 "*Size of packets to send a server.")
- (defvar metaserver-list-all nil "*List every server, open or not.")
-
- (defvar metaserver-borg-binary "sunborg3"
- "*Borg netrek client to run when in borg mode.")
-
- (defvar metaserver-headers-kill-to "^-h *"
- "*Denotes last line of metaserver headers.")
-
- (defvar metaserver-empty-site-regexp "Not Responding\\|Nobody"
- "*Regular expression that matches empty sites.")
-
- (defvar metaserver-data-regexp "-h \\([^ ]*\\) *-p \\([^ ]*\\)\\(.*\\)"
- "*Parenthesized regular expression where the first parenthesized regexp
- matches the host, the second matches the port, and the third matches any
- data to be kept in the MetaServer buffer.")
-
- (defvar metaserver-site-order "descending"
- "*How to sort the open sites.... can be \"ascending\" or \"descending\".
- Ascending means put sites with wait queues at the bottom of the list.")
-
- (defvar metaserver-brief-description
- "- B Toggle Borg Status - L Toggle List All - R Refresh - RETURN Run Netrek"
- "One line description of key bindings, etc.")
-
- (defvar metaserver-mode-map () "mode map used in metaserver-mode")
-
- (if metaserver-use-background
- (load "background" nil t))
-
-
- (if metaserver-mode-map ()
- (setq metaserver-mode-map (make-sparse-keymap)))
-
- (define-key metaserver-mode-map "b" 'metaserver-toggle-borg)
- (define-key metaserver-mode-map "B" 'metaserver-toggle-borg)
- (define-key metaserver-mode-map "n" 'next-line)
- (define-key metaserver-mode-map "p" 'previous-line)
- (define-key metaserver-mode-map "P" 'metaserver-ping)
- (define-key metaserver-mode-map "q" 'metaserver-quit)
- (define-key metaserver-mode-map "Q" 'metaserver-quit)
- (define-key metaserver-mode-map "l" 'metaserver-toggle-list)
- (define-key metaserver-mode-map "L" 'metaserver-toggle-list)
- (define-key metaserver-mode-map "r" 'metaserver-refresh)
- (define-key metaserver-mode-map "R" 'metaserver-refresh)
- (define-key metaserver-mode-map " " 'scroll-up)
- (define-key metaserver-mode-map "\C-?" 'scroll-down)
- (define-key metaserver-mode-map "\C-m" 'metaserver-run-netrek)
- (define-key metaserver-mode-map "?" 'metaserver-describe-briefly)
- (define-key metaserver-mode-map "h" 'metaserver-describe-briefly)
-
- (defun flip-list (thelist)
- (interactive)
- (if (cdr thelist)
- (append (flip-list (cdr thelist)) (list (car thelist)))
- (list (car thelist))))
-
- (defun metaserver-toggle-list ()
- "Toggles whether to list all the servers and updates mode line accordingly."
- (interactive)
- (if buffer-read-only (toggle-read-only))
- (setq metaserver-list-all (not metaserver-list-all))
- (metaserver-update-mode-line)
- (if (not metaserver-list-all)
- (save-excursion
- (goto-char (point-min))
- (delete-matching-lines metaserver-empty-site-regexp))
- (save-excursion
- (goto-char (point-max))
- (if (equal metaserver-site-order "descending")
- (metaserver-insert-list (flip-list metaserver-empty-list))
- (metaserver-insert-list metaserver-empty-list))))
- (if (not buffer-read-only) (toggle-read-only)))
-
- (defun metaserver-describe-briefly ()
- "Describe briefly the keys used in metaserver-mode."
- (interactive)
- (message metaserver-brief-description))
-
- (defun metaserver-toggle-borg ()
- "Toggles whether to use the borg binary or the netrek binary. Updates the
- mode line accordingly."
- (interactive)
- (setq metaserver-use-borg (not metaserver-use-borg))
- (setq mode-line-process (if metaserver-use-borg "-Borg" ""))
- (metaserver-update-mode-line))
-
- ;;; Update the mode line to show flags of borg-use and list-all
- (defun metaserver-update-mode-line ()
- "Change mode-line to include -Borg and/or -All if appropriate, and force an
- update."
- (setq mode-line-process
- (concat (if metaserver-use-borg "-Borg" "")
- (if metaserver-list-all "-All" "")))
- (set-buffer-modified-p nil))
-
- (defun metaserver-mode ()
- " This is a major mode for viewing active netrek servers. A list of active
- servers is put in a buffer, displaying wait queue status, and time the server
- was last checked.
-
- User modifiable variables are:
- metaserver-netrek-binary: Normal netrek client binary
- metaserver-borg-binary: Borg netrek client binary
- metaserver-empty-site-regexp: Regular expression that matches empty sites
- metaserver-headers-kill-to: Regular expression that matches last line of
- the metaserver headers.
- metaserver-ping-program: Program to use to ping servers
- metaserver-ping-packets: # of packets to send to server when pinging
- metaserver-ping-sizeof: Size in bytes of packets sent during a ping
- metaserver-list-all: Show all servers or just open ones?
- metaserver-use-borg: Run normal client or borg client?
- metaserver-site-order: Ascending or descending order when
- printing sites?
- metaserver-site: Home of the metaserver
- metaserver-port: Port of the metaserver"
- (interactive)
- (kill-all-local-variables)
- (use-local-map metaserver-mode-map)
- (setq major-mode 'metaserver-mode)
- (setq mode-name "MetaServer")
- (metaserver-update-mode-line))
-
- ;;; Get the millisecond seek time to the server
- (defun metaserver-ping ()
- (interactive)
- (save-excursion
- (save-window-excursion
- (let* ((tmp (grab-current-line))
- (server (substring tmp 0 (string-match " " tmp))))
- (message "Pinging %s..." server)
- (shell-command (concat metaserver-ping-program " "
- server " "
- (int-to-string metaserver-ping-sizeof) " "
- (int-to-string metaserver-ping-packets)))
- (let ((ping-str (progn (set-buffer "*Shell Command Output*")
- (buffer-string)))
- (ping-regexp (concat ".*packets transmitted, "
- ".* packets received, \\(.*\\)\\\n"
- "round-trip (ms) \\(.*\\)")))
- (kill-buffer "*Shell Command Output*")
- (if (string-match ping-regexp ping-str)
- (message "%s:%s"
- (substring ping-str (match-beginning 1) (match-end 1))
- (substring ping-str (match-beginning 2) (match-end 2)))
- (message "%s is not responding..." server)))))))
-
- (defun metaserver-insert-headers ()
- "Insert headers in metaserver buffer.... makes it easier to read."
- (erase-buffer)
- (insert (format "%53s\n%-40s%35s\n" "Mins" "Site"
- "Ago Status Flags"))
- (while (< (current-column) 79) (insert "-"))
- (insert "\n"))
-
- (defun metaserver-insert-list (thelist)
- "Insert a list of (server . port . data) into the buffer"
- (let* ((tmp thelist))
- (while tmp
- (let* ((site (car (car tmp)))
- (data (car (cdr (cdr (car tmp))))))
- (insert (format "%-40s%39s\n" site data)))
- (setq tmp (cdr tmp)))))
-
- (defun metaserver-filter (proc string)
- "Filter for the stream to the metaserver. Calls parser when appropriate."
- (setq metaserver-server-output (concat metaserver-server-output string))
- (if (string-match metaserver-trailing-headers string) (metaserver-parser)))
-
- (defun metaserver-parser ()
- "Parses out the metaserver string into a list. Constructs buffer."
- (setq metaserver-server-output (substring
- metaserver-server-output
- (string-match metaserver-headers-kill-to
- metaserver-server-output)
- nil))
- (setq metaserver-server-output
- (substring metaserver-server-output
- 0 (1- (string-match metaserver-trailing-headers
- metaserver-server-output))))
- (while (not (equal "" metaserver-server-output))
- (let* ((tmp (substring metaserver-server-output
- 0 (string-match "$" metaserver-server-output))))
- (setq metaserver-server-output
- (substring metaserver-server-output
- (1+ (string-match "$" metaserver-server-output))
- nil))
- (string-match metaserver-data-regexp tmp)
- (let* ((site (substring tmp (match-beginning 1) (match-end 1)))
- (port (string-to-int
- (substring tmp (match-beginning 2) (match-end 2))))
- (data (substring tmp (match-beginning 3) (match-end 3))))
- (if (not (string-match metaserver-empty-site-regexp data))
- (setq metaserver-open-list
- (append (cons (cons site (cons port (cons data '()))) '())
- metaserver-open-list))
- (setq metaserver-empty-list
- (append (cons (cons site (cons port (cons data '()))) '())
- metaserver-empty-list))))))
- (save-excursion
- (switch-to-buffer "*MetaServer*")
- (goto-char (point-min))
- (metaserver-insert-headers)
- (if (equal "descending" metaserver-site-order)
- (metaserver-insert-list (flip-list metaserver-open-list))
- (metaserver-insert-list metaserver-open-list))
- (if metaserver-list-all
- (if (equal "descending" metaserver-site-order)
- (metaserver-insert-list (flip-list metaserver-empty-list))
- (metaserver-insert-list metaserver-empty-list)))
- (message "")
- (if (not buffer-read-only) (toggle-read-only))))
-
- (defun metaserver-refresh ()
- "Start the metaserver. Get site info, put in buffer, etc, etc."
- (interactive)
- (message "Calling metaserver at %s %d..." metaserver-site metaserver-port)
- (switch-to-buffer "*MetaServer*")
- (metaserver-mode)
- (if buffer-read-only (toggle-read-only))
- (erase-buffer)
- (setq metaserver-server-output nil
- metaserver-empty-list nil
- metaserver-open-list nil)
- (set-process-filter
- (open-network-stream "metaserver" nil metaserver-site metaserver-port)
- 'metaserver-filter))
-
- (defun metaserver-quit ()
- (interactive)
- (kill-buffer "*MetaServer*"))
-
- (defun metaserver-run-netrek ()
- "Run a netrek client in the background."
- (interactive)
- (if (and metaserver-use-background (not (boundp 'background)))
- (load "background" nil t))
- (if (not (getenv "DISPLAY"))
- (message "DISPLAY variable not set... must use Xwindows to play netrek!")
- (save-excursion
- (let* ((tmp (buffer-substring (progn (beginning-of-line) (point))
- (progn (end-of-line) (point))))
- (site (substring tmp 0 (string-match " " tmp)))
- (port 2592)
- (tmplist (if metaserver-list-all
- (append metaserver-open-list metaserver-empty-list)
- metaserver-open-list)))
- (while tmplist
- (let* ((current-site (car (car tmplist)))
- (current-port (car (cdr (car tmplist)))))
- (if (equal current-site site)
- (let* ((the-command (concat (if metaserver-use-borg
- metaserver-borg-binary
- metaserver-netrek-binary)
- " -h " site " -p "
- (int-to-string port))))
- (if metaserver-use-background
- (background the-command)
- (start-process "netrek" nil shell-file-name "-c"
- (message the-command)))
- (setq tmplist nil))
- (setq tmplist (cdr tmplist)))))))))
-
- (defun grab-current-line ()
- (buffer-substring (progn (beginning-of-line) (point))
- (progn (end-of-line) (point))))
-