startup.el 31.1 KB
Newer Older
Linus Tolke Y's avatar
Linus Tolke Y committed
1 2
;;;;;
;;;;; $Id$
3
;;;;; Copyright (C) 1991, 1996  Lysator Academic Computer Association.
Linus Tolke Y's avatar
Linus Tolke Y committed
4 5 6 7 8
;;;;;
;;;;; This file is part of the LysKOM server.
;;;;; 
;;;;; LysKOM is free software; you can redistribute it and/or modify it
;;;;; under the terms of the GNU General Public License as published by 
9
;;;;; the Free Software Foundation; either version 2, or (at your option) 
Linus Tolke Y's avatar
Linus Tolke Y committed
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
;;;;; any later version.
;;;;; 
;;;;; LysKOM 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 LysKOM; see the file COPYING.  If not, write to
;;;;; Lysator, c/o ISY, Linkoping University, S-581 83 Linkoping, SWEDEN,
;;;;; or the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, 
;;;;; MA 02139, USA.
;;;;;
;;;;; Please mail bug reports to bug-lyskom@lysator.liu.se. 
;;;;;
Per Cederqvist's avatar
.  
Per Cederqvist committed
25 26 27 28 29 30 31 32 33 34 35
;;;; ================================================================
;;;; ================================================================
;;;;
;;;; File: startup.el
;;;;
;;;; This file contains functions that are called only when lyskom
;;;; is loaded, started or when a new user is logged in during a 
;;;; session.
;;;;


36 37 38 39 40
(setq lyskom-clientversion-long 
      (concat lyskom-clientversion-long
	      "$Id$\n"))


Per Cederqvist's avatar
.  
Per Cederqvist committed
41 42 43 44
;;; ================================================================
;;;                         Start kom.


45
;;;###autoload
46
(defun lyskom (&optional host username password session-priority)
Per Cederqvist's avatar
.  
Per Cederqvist committed
47
  "Start a LysKOM session.
Linus Tolke Y's avatar
Linus Tolke Y committed
48 49 50
Optional arguments: HOST, USERNAME and PASSWORD.

See lyskom-mode for details."
David Kågedal's avatar
David Kågedal committed
51 52 53 54
  (interactive (list (lyskom-read-server-name
		      (lyskom-format 'server-q
				     (or (getenv "KOMSERVER")
					 lyskom-default-server)))
Per Cederqvist's avatar
.  
Per Cederqvist committed
55
		     nil
56 57 58 59
		     nil
		     (if current-prefix-arg
			 (prefix-numeric-value current-prefix-arg)
		       nil)))
Per Cederqvist's avatar
.  
Per Cederqvist committed
60

61
  (run-hooks 'lyskom-init-hook)
62
  (setq username
David Kågedal's avatar
David Kågedal committed
63
	(or username (getenv "KOMNAME")))
64
  (setq password
David Kågedal's avatar
David Kågedal committed
65
	(or password (getenv "KOMPASSWORD")))
Per Cederqvist's avatar
.  
Per Cederqvist committed
66
  (if (zerop (length host))
67 68 69 70 71
      (let* ((env-kom (getenv "KOMSERVER"))
	     (canon (rassoc env-kom kom-server-aliases)))
	(setq host (or (car canon)
		       env-kom
		       lyskom-default-server))))
72 73
  (let ((port 4894)
	(init-done nil))
Per Cederqvist's avatar
.  
Per Cederqvist committed
74 75 76 77 78 79 80 81 82
    (cond				;Allow "nanny:4892" to use port 4892.
     ((string-match ":" host)
      (setq port (string-to-int (substring host (match-end 0))))
      (cond
       ((zerop (match-beginning 0))
	(setq host lyskom-default-server))
       (t
	(setq host (substring host 0 (match-beginning 0)))))))

David Kågedal's avatar
David Kågedal committed
83 84
    (let* ((buffer (get-buffer host))
	   (name nil)
David Byers's avatar
David Byers committed
85 86
	   (proc nil)
           (reused-buffer nil))
David Kågedal's avatar
David Kågedal committed
87 88
      (if (and buffer
	       (lyskom-buffer-p buffer)
89 90 91 92
	       (not (prog1
			(j-or-n-p (lyskom-get-string
				   'start-new-session-same-server))
		      (message ""))))
David Byers's avatar
David Byers committed
93 94 95
	  (progn 
            (switch-to-buffer buffer)
            (setq reused-buffer t))
David Kågedal's avatar
David Kågedal committed
96 97
	(unwind-protect
	    (progn
98
	      (cond ((and buffer (not (lyskom-buffer-p buffer)))
David Kågedal's avatar
David Kågedal committed
99
		     (set-buffer buffer)
David Byers's avatar
David Byers committed
100
                     (setq reused-buffer t)
David Kågedal's avatar
David Kågedal committed
101 102 103 104 105 106 107
		     (goto-char (point-max))
		     (let ((time (decode-time (current-time))))
		       (setcar (cdr (cdr (cdr (cdr time))))
			       (1- (car (cdr (cdr (cdr (cdr time)))))))
		       (setcar (cdr (cdr (cdr (cdr (cdr time)))))
			       (- (car (cdr (cdr (cdr (cdr (cdr time))))))
				  1900))
108
		       (lyskom-insert
David Kågedal's avatar
David Kågedal committed
109 110 111 112 113 114 115
			(format (lyskom-get-string 'new-session-in-buffer)
				(lyskom-format-time
				 (apply 'lyskom-create-time time))))
		       (setq name (buffer-name buffer))))
		    (t
		     (setq buffer (generate-new-buffer host))
		     (setq name (buffer-name buffer))))
David Byers's avatar
David Byers committed
116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
              (let* ((proxy-host-string
                      (cond ((stringp kom-www-proxy) kom-www-proxy)
                            ((listp kom-www-proxy)
                             (or (cdr (lyskom-string-assoc host kom-www-proxy))
                                 (cdr (assq t kom-www-proxy))
                                 nil))
                            (t nil)))
                     (proxy-host nil)
                     (proxy-port nil)
                     (match (string-match "\\(.*\\):\\([0-9]+\\)"
                                          (or proxy-host-string ""))))
                (setq proxy-host (or (and match
                                          (match-string 1 proxy-host-string))
                                     proxy-host-string)
                      proxy-port (or (and match
                                          (string-to-int
                                           (match-string 2
                                                         proxy-host-string)))
                                     80))
                (cond (proxy-host
                       (setq proc (open-network-stream name buffer
                                                       proxy-host
                                                       proxy-port))
                       (lyskom-process-send-string 
                        proc
David Byers's avatar
David Byers committed
141 142 143
                        (format "\
connect %s:%d HTTP/1.0\r\n\
\r\n"
David Byers's avatar
David Byers committed
144 145 146
                                host port)))
                      (t (setq proc (open-network-stream name buffer
                                                         host port)))))
David Kågedal's avatar
David Kågedal committed
147 148
	      (switch-to-buffer buffer)
	      (lyskom-mode)		;Clearing lyskom-default...
149 150
	      (if session-priority
		  (setq lyskom-session-priority session-priority))
David Kågedal's avatar
David Kågedal committed
151 152 153 154 155 156 157 158 159
	      (setq lyskom-buffer buffer)
	      (setq lyskom-default-user-name username)
	      (setq lyskom-default-password password)
	      (setq lyskom-server-name host)
	      (setq lyskom-proc proc)
	      (lyskom-setup-faces)
	      (lyskom-insert
	       (lyskom-format 'try-connect lyskom-clientversion host))
	      (set-process-filter proc 'lyskom-connect-filter)
David Byers's avatar
David Byers committed
160
              (process-kill-without-query proc nil)
161 162 163 164 165
	      (lyskom-process-send-string
	       proc
	       (concat "A"
		       (lyskom-format-objects
			(concat (user-login-name)
David Byers's avatar
David Byers committed
166 167
				"%" (system-name)))
                       "\n"))
David Kågedal's avatar
David Kågedal committed
168 169 170 171 172 173 174 175
	      (while (eq 'lyskom-connect-filter (process-filter proc))
		(accept-process-output proc))
	      ;; Now we have got the correct response.
	      (set-process-sentinel proc 'lyskom-sentinel)

	      (save-excursion
		(lyskom-init-parse buffer))

176 177 178
	      ;; +++PREFETCH+++
	      (lyskom-setup-prefetch)

David Kågedal's avatar
David Kågedal committed
179 180 181 182 183
	      ;; Tell the server who we are
	      (initiate-set-client-version 'background nil
					   "lyskom.el" lyskom-clientversion)

	      (setq lyskom-server-info (blocking-do 'get-server-info))
184 185 186 187 188 189
	      (setq
	       lyskom-server-version
	       (list (/ (server-info->version lyskom-server-info) 10000)
		     (/ (% (server-info->version lyskom-server-info) 10000)
			100)
		     (% (server-info->version lyskom-server-info) 100)))
David Kågedal's avatar
David Kågedal committed
190 191 192 193 194 195 196 197
	      (lyskom-setup-client-for-server-version)
	      (lyskom-format-insert 
	       'connection-done
	       (if (zerop (elt lyskom-server-version 2))
		   (format "%d.%d"
			   (elt lyskom-server-version 0)
			   (elt lyskom-server-version 1))
		 (format "%d.%d.%d"
198 199 200
                         (elt lyskom-server-version 0)
                         (elt lyskom-server-version 1)
                         (elt lyskom-server-version 2))))
201 202
	      (if (not (zerop (server-info->motd-of-lyskom
			       lyskom-server-info)))
David Kågedal's avatar
David Kågedal committed
203 204 205 206 207 208 209 210 211 212 213 214
		  (let ((text (blocking-do 'get-text 
					   (server-info->motd-of-lyskom
					    lyskom-server-info))))
		    (lyskom-insert 
		     (if text
			 (text->text-mass text)
		       (lyskom-get-string 'lyskom-motd-was-garbed)))
		    (lyskom-insert "\n")))
	      ;; Can't use lyskom-end-of-command here.
	      (setq lyskom-executing-command nil) 
	      ;; Log in
	      (kom-start-anew t)
215 216 217 218 219 220 221
	      (if (memq lyskom-buffer lyskom-buffer-list)
		  (while (not (eq lyskom-buffer (car lyskom-buffer-list)))
		    (setq lyskom-buffer-list
			  (nconc (cdr lyskom-buffer-list)
				 (list (car lyskom-buffer-list)))))
		(setq lyskom-buffer-list
		      (cons lyskom-buffer lyskom-buffer-list)))
David Kågedal's avatar
David Kågedal committed
222 223 224 225 226
	      (setq init-done t))
	  ;; Something went wrong. Lets cleanup everything. :->
	  (if init-done
	      nil
	    (if proc (delete-process proc))
David Byers's avatar
David Byers committed
227
	    (unless reused-buffer (kill-buffer buffer))))))))
Per Cederqvist's avatar
.  
Per Cederqvist committed
228 229


230 231 232 233 234 235 236 237 238 239 240 241 242 243 244
(defun lyskom-setup-client-check-version (spec version)
  (let ((relation (elt spec 0))
        (major (elt spec 1))
        (minor (elt spec 2))
        (revision (elt spec 3)))
    (cond ((eq relation '=)
           (and (or (null major) (= major (elt version 0)))
                (or (null minor) (= minor (elt version 1)))
                (or (null revision) (= revision (elt version 2)))))
          ((eq relation '>=)
           (or (and (= (elt version 0) major)
                    (= (elt version 1) minor)
                    (>= (elt version 2) revision))
               (and (= (elt version 0) major)
                    (> (elt version 1) minor))
245 246 247 248 249 250 251 252
               (and (> (elt version 0) major))))
          ((eq relation '<)
           (or (and (= (elt version 0) major)
                    (= (elt version 1) minor)
                    (< (elt version 2) revision))
               (and (= (elt version 0) major)
                    (< (elt version 1) minor))
               (and (< (elt version 0) major)))))))
253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280


(defun lyskom-setup-client-for-server-version ()
 "Set up the supports list and flags for the current server. See
variable documentation for lyskom-server-feautres"
  (let ((result nil)
        (flags nil))
    (mapcar (function
             (lambda (spec)
               (let ((spec-version (elt spec 0))
                     (plist (elt spec 1)))
                 (if (and (lyskom-setup-client-check-version 
                           spec-version
                           lyskom-server-version))
                     (mapcar
                      (function
                       (lambda (x)
                         (cond ((consp x) (setq result (cons x result)))
                               ((symbolp x) (setq flags (cons x flags)))
                               (t (setq result (cons (cons x t) 
                                                     result))))))
                      plist)))))
            lyskom-server-features)
    (mapcar (function (lambda (x) (set x t))) flags)
    (setq lyskom-server-supports result)))
                                             
                                                                 

Per Cederqvist's avatar
.  
Per Cederqvist committed
281 282
(defun lyskom-connect-filter (proc output)
  "Receive connection acknowledgement from server."
283
  (if lyskom-debug-communications-to-buffer
David Kågedal's avatar
David Kågedal committed
284
      (lyskom-debug-insert proc "-----> " output))
285 286 287 288 289 290
  (cond
   ((string-match "^LysKOM\n" output)
    (set-process-filter proc 'lyskom-filter))))



Per Cederqvist's avatar
.  
Per Cederqvist committed
291 292 293 294 295 296


;;; ================================================================
;;;                        Start anew


297
(defun kom-start-anew (&optional lyskom-first-time-around)
298
  "Start as a new person."
Per Cederqvist's avatar
.  
Per Cederqvist committed
299 300
  (interactive)
  (lyskom-start-of-command 'kom-start-anew)
301
  (lyskom-completing-clear-cache)
302 303
  (let ((old-me lyskom-pers-no)
	(login-successful nil))
David Kågedal's avatar
David Kågedal committed
304
    (unwind-protect
305 306 307 308 309 310
        (progn
          (if lyskom-first-time-around
              nil
            (lyskom-tell-internat 'kom-tell-login))
          (setq lyskom-pers-no nil)
          (while (not lyskom-pers-no)
311

312 313 314 315
            (if (and lyskom-first-time-around
                     lyskom-default-user-name)
                ;; This is nil if we can't find a unique match.
                (setq lyskom-pers-no
316
                      (conf-z-info->conf-no
317 318
                       (lyskom-lookup-conf-by-name lyskom-default-user-name
                                                   '(pers)))))
319
            (if lyskom-pers-no
320 321 322
                nil
              (let ((name (lyskom-read-conf-name
                           (lyskom-get-string 'what-is-your-name)
323
                           '(pers none) t "" t)))
324
                (setq lyskom-pers-no
325
                      (or (conf-z-info->conf-no 
326
                           (lyskom-lookup-conf-by-name name '(pers)))
327 328 329 330 331 332
                          (lyskom-create-new-person name)))))
            ;; Now lyskom-pers-no contains a number of a person.
            ;; Lets log him in.
            (if lyskom-pers-no
                (let ((conf-stat (blocking-do 'get-conf-stat lyskom-pers-no))
                      (lyskom-inhibit-minibuffer-messages t))
333 334 335

		  ;; DEBUG
		  (if (null conf-stat)
336
		      (lyskom-insert "You don't exist. Go away.\n"))
337

338 339 340 341 342 343 344 345 346 347 348 349 350
                  (lyskom-insert (concat (conf-stat->name conf-stat) "\n"))
                  (setq lyskom-first-time-around nil)
                  (if (blocking-do 'login lyskom-pers-no
                                   (if lyskom-default-password
                                       (prog1
                                           lyskom-default-password
                                         (setq lyskom-default-password nil)
                                         (set-default 'lyskom-default-password
                                                      nil))
                                     ;; Use password read when creating
                                     ;; the person when loggin in new
                                     ;; users
                                     (or lyskom-is-new-user
351 352
                                         (silent-read
					  (lyskom-get-string 'password)))))
353 354 355 356 357 358
		      (progn
			(if lyskom-is-new-user
			    (blocking-do 'add-member
					 (server-info->conf-pres-conf lyskom-server-info)
					 lyskom-pers-no 100 1))
			(setq login-successful t))
359 360 361
                    (lyskom-insert-string 'wrong-password)
                    (setq lyskom-pers-no nil))
                  (setq lyskom-is-new-user nil))))
David Kågedal's avatar
David Kågedal committed
362
	  
363 364 365 366 367 368 369
          ;; Now we are logged in.
          (lyskom-insert-string 'are-logged-in)
          (let ((conf-stat (blocking-do 'get-conf-stat lyskom-pers-no)))
            (if (and conf-stat
                     (/= (conf-stat->msg-of-day conf-stat) 0))
                (progn
                  (lyskom-insert-string 'you-have-motd)
370 371 372
                  (let ((lyskom-show-comments ; +++SOJGE
                         (not kom-no-comments-to-motd)))
                    (lyskom-view-text (conf-stat->msg-of-day conf-stat)))))
373 374 375 376 377 378
            (if (and conf-stat
                     (zerop (conf-stat->presentation conf-stat))
                     (not (zerop (conf-stat->no-of-texts conf-stat))))
                (lyskom-insert-string 'presentation-encouragement)))
          (if (not lyskom-dont-read-user-area)
              (lyskom-read-options))
David Byers's avatar
David Byers committed
379 380 381
          (lyskom-run-hook-with-args 'lyskom-change-conf-hook
                                     lyskom-current-conf
                                     0)
382
          (setq lyskom-current-conf 0)
383 384 385 386 387 388 389
          (lyskom-refetch)
          ;; (cache-initiate-who-info-buffer (blocking-do 'who-is-on))
          (cache-set-marked-texts (blocking-do 'get-marks))
          ;; What is this variable? It is never used. It is ust to
          ;; fill the cache?
          (let ((lyskom-who-am-i (blocking-do 'who-am-i)))
            (if lyskom-who-am-i (setq lyskom-session-no lyskom-who-am-i))))
David Kågedal's avatar
David Kågedal committed
390
	  
David Kågedal's avatar
David Kågedal committed
391
      ;; If something failed, make sure we are someone
392 393 394
      (if login-successful
	  (clear-all-caches)
	(setq lyskom-pers-no old-me))
David Kågedal's avatar
David Kågedal committed
395
      (setq lyskom-is-new-user nil)
David Kågedal's avatar
David Kågedal committed
396 397 398 399
      (lyskom-end-of-command)))
  ;; Run the hook kom-login-hook. We don't want to hang the
  ;; login, just because something crashed here.
  (condition-case err
400
      (progn
401 402
        (run-hooks 'lyskom-login-hook)
        (run-hooks 'kom-login-hook))
David Kågedal's avatar
David Kågedal committed
403
    (error (lyskom-format-insert-before-prompt
David Byers's avatar
David Byers committed
404
            'error-in-login-hook (format "%s" err))))
David Byers's avatar
David Byers committed
405 406 407 408 409
  (unless (eq lyskom-language kom-default-language)   
    (when (lyskom-set-language kom-default-language)
      (lyskom-format-insert-before-prompt 
       'changing-language-to
       (lyskom-language-name kom-default-language)))))
Linus Tolke Y's avatar
Linus Tolke Y committed
410 411 412


(defun lyskom-refetch ()
413 414
  "Resets and fetches all reading info.
This is called at login and after prioritize and set-unread."
415 416
  ;; +++PREFETCH+++

417
  ;; The whole membership!
418 419 420 421
  ;; (lyskom-set-membership (blocking-do 'get-membership lyskom-pers-no))
  ;; (setq lyskom-membership-is-read t)
  ;; (setq lyskom-unread-confs (blocking-do 'get-unread-confs lyskom-pers-no))

422 423
  (setq lyskom-membership nil)

424 425 426 427
  (lyskom-reset-prefetch)
  (lyskom-start-prefetch)
  (lyskom-prefetch-membership lyskom-pers-no)

Linus Tolke Y's avatar
Linus Tolke Y committed
428
  (setq lyskom-to-do-list (lyskom-create-read-list))
429
  (setq lyskom-reading-list (lyskom-create-read-list)))
430 431


Linus Tolke Y's avatar
Linus Tolke Y committed
432 433 434
(defun lyskom-set-membership (membership)
  "Sets lyskom-membership to a new value.
Args: MEMBERSHIP."
David Kågedal's avatar
David Kågedal committed
435
  (setq lyskom-membership (sort (listify-vector membership)
Linus Tolke Y's avatar
Linus Tolke Y committed
436 437
				'lyskom-membership-<))
  (setq lyskom-membership-is-read t))
Per Cederqvist's avatar
.  
Per Cederqvist committed
438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476


(defun lyskom-print-name (conf-stat)
  "Print the name of the CONF-STAT, with a trailing \n."
  (lyskom-insert (concat (conf-stat->name conf-stat) "\n")))


(defun lyskom-extract-persons (conf-list)
  "Extract persons from a conf-list.
Return a list of pers-nos of all conferences that are persons.
Args: CONF-LIST."
  (lyskom-do-extract-persons-or-confs conf-list t))


(defun lyskom-extract-confs (conf-list)
  "Extract conferences from a conf-list.
Return a list of conf-nos of all conferences that are persons.
Args: CONF-LIST."
  (lyskom-do-extract-persons-or-confs conf-list nil))


(defun lyskom-do-extract-persons-or-confs (conf-list want-persons)
  "Extract persons or conferences from CONF-LIST.
WANT-PERSONS is t for persons, nil for confs."
  (let* ((result nil)
	 (i 0)
	 (nos (conf-list->conf-nos conf-list))
	 (types (conf-list->conf-types conf-list))
	 (len (length nos)))
    (while (< i len)
      (cond
       ((eq (conf-type->letterbox (elt types i))
	    want-persons)
	(setq result (cons (elt nos i)
			   result))))
      (++ i))
    (nreverse result)))


David Kågedal's avatar
David Kågedal committed
477
(defun lyskom-create-new-person (name)
Per Cederqvist's avatar
.  
Per Cederqvist committed
478 479 480 481 482 483 484 485 486 487
  "A new user named NAME (or an old that mis-spelled his name)."
  (lyskom-insert
   (lyskom-format 'first-greeting name))
  (lyskom-scroll)
  (cond
   ((ja-or-nej-p (lyskom-format 'is-name-correct name))
    (let ((password (silent-read (lyskom-get-string 'personal-password))))
      (cond
       ((not (equal password 
		    (silent-read (lyskom-get-string 'repeat-password))))
David Kågedal's avatar
David Kågedal committed
488
	;; Failed to enter the same password twice
Per Cederqvist's avatar
.  
Per Cederqvist committed
489
	(lyskom-insert-string 'repeat-failure)
David Kågedal's avatar
David Kågedal committed
490
	nil)
Per Cederqvist's avatar
.  
Per Cederqvist committed
491
       (t
David Kågedal's avatar
David Kågedal committed
492 493 494 495 496 497 498 499
	;; Entered the same password twice
	(let ((new-person (blocking-do 'create-person name password)))
	  (if (null new-person)
	      (lyskom-insert-string 'could-not-create-you)
	    ;; Raise a flag so the user will be added to the
	    ;; presentation conference after login
	    (setq lyskom-is-new-user password))
	  new-person)))))
Per Cederqvist's avatar
.  
Per Cederqvist committed
500
   (t
David Kågedal's avatar
David Kågedal committed
501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522
    ;; Do not create a new person
    nil)))


;;(defun lyskom-start-anew-create-handler (pers-no name password)
;;  "A new person has been created. Log in as him."
;;  (cond
;;   ((null pers-no)
;;    (lyskom-insert-string 'could-not-create-you)
;;    (setq lyskom-executing-command nil)
;;    (kom-start-anew))
;;   (t
;;    (initiate-login 'main 'lyskom-add-for-new-person
;;		    pers-no password pers-no lyskom-pers-no)
;;    )))

;;(defun lyskom-add-for-new-person (reply pers-no lyskom-pers-no)
;;  "Add a news person as member in the default presentation conference."
;;  (initiate-add-member 'main 'lyskom-start-anew-login-2
;;		       (server-info->conf-pres-conf lyskom-server-info)
;;		       pers-no 100 1
;;		       pers-no lyskom-pers-no))
Linus Tolke Y's avatar
Linus Tolke Y committed
523

Per Cederqvist's avatar
.  
Per Cederqvist committed
524

David Kågedal's avatar
David Kågedal committed
525 526
(defun lyskom-read-server-name (prompt)
  "Read the name of a LysKOM server.
David Kågedal's avatar
David Kågedal committed
527
Copmpletion is done on the servers i kom-server-aliases. If an
David Kågedal's avatar
David Kågedal committed
528 529 530 531 532 533 534
alias name is entered, the corresponding address is returned."
  ;; Create a completion table like
  ;; (("kom.lysator.liu.se" . "kom.lysator.liu.se")
  ;;  ("LysKOM" . "kom.lysator.liu.se"))
  (let ((known-servers
	 (append (mapcar (function (lambda (pair)
				     (cons (car pair) (car pair))))
David Kågedal's avatar
David Kågedal committed
535
			 kom-server-aliases)
David Kågedal's avatar
David Kågedal committed
536 537
		 (mapcar (function (lambda (pair)
				     (cons (cdr pair) (car pair))))
David Kågedal's avatar
David Kågedal committed
538
			 kom-server-aliases)))
David Kågedal's avatar
David Kågedal committed
539 540 541 542 543 544 545
	(completion-ignore-case t)
	server)
    (setq server (completing-read prompt known-servers nil nil))
    (or (cdr (assoc server known-servers))
	server)))
      

Per Cederqvist's avatar
.  
Per Cederqvist committed
546 547 548
;;; ================================================================
;;;                        The LysKOM mode.

549 550 551
;; The LysKOM mode should not be inherited if we create a new buffer
;; and default-major-mode is nil.
(put 'lyskom-mode 'mode-class 'special)
Per Cederqvist's avatar
.  
Per Cederqvist committed
552 553 554 555

(defun lyskom-mode ()
  "\\<lyskom-mode-map>Mode for LysKOM client.
Commands:
David Kågedal's avatar
David Kågedal committed
556 557 558 559 560 561
\\[kom-next-command]	Do the default action. This can be to read the next text,select
n	ext conference with unread texts or whatever the prompt says.
\\[kom-go-to-conf]	Go to a conference. LysKOM will ask you for a conference
	and make you a member of it if you are not already.
\\[kom-list-conferences]	List conferences matching a given string.
\\[kom-list-persons]	List persons matching a given string.
Per Cederqvist's avatar
.  
Per Cederqvist committed
562

David Kågedal's avatar
David Kågedal committed
563 564
\\[kom-list-news]	List the conferences you have unread texts in.
\\[kom-go-to-next-conf]	Go to the next conference with unread texts.
Per Cederqvist's avatar
.  
Per Cederqvist committed
565

David Kågedal's avatar
David Kågedal committed
566
\\[kom-membership]	Display a buffer with the list of conferences you are member in.
Per Cederqvist's avatar
.  
Per Cederqvist committed
567

David Kågedal's avatar
David Kågedal committed
568 569
\\[kom-quit]	Leave this LysKOM session.
\\[kom-who-is-on]	Show a list of all the users of lyskom right now.
Per Cederqvist's avatar
.  
Per Cederqvist committed
570

David Kågedal's avatar
David Kågedal committed
571
\\[kom-extended-command]	Read a command using the minibuffer and execute it.
572
	This is another way to give commands.
Per Cederqvist's avatar
.  
Per Cederqvist committed
573

David Kågedal's avatar
David Kågedal committed
574 575 576
\\[kom-write-text]	Start writing a new text.
\\[kom-write-comment]	Start writing a comment to the last read article.
\\[kom-private-answer]	Start writing a personal answer to the author of the last
Per Cederqvist's avatar
.  
Per Cederqvist committed
577
	read article.
David Kågedal's avatar
David Kågedal committed
578
\\[kom-send-letter]	Start writing a letter to a person or conference.
Per Cederqvist's avatar
.  
Per Cederqvist committed
579

David Kågedal's avatar
David Kågedal committed
580 581
\\[kom-page-next-command]	Clear the page and do what \\[kom-next-command] does.
\\[kom-line-next-command]	Do what \\[kom-next-command] does, but scroll at most 1 line.
Per Cederqvist's avatar
.  
Per Cederqvist committed
582

David Kågedal's avatar
David Kågedal committed
583 584
0 .. 9	Give a numeric argument to the next command.
\\[describe-mode]	Display this help text.
Per Cederqvist's avatar
.  
Per Cederqvist committed
585

David Kågedal's avatar
David Kågedal committed
586
\\[kom-busy-wait]	Put the lyskom-session in wait mode. The next created text with 
Per Cederqvist's avatar
.  
Per Cederqvist committed
587 588
	a priotity higher that that of the next conference you are going
	to will be read directly when it is created.
David Kågedal's avatar
David Kågedal committed
589 590 591
\\[kom-set-unread]	Mark a number of texts as unread.
\\[kom-jump]	Skip (mark as read) all the comments to this article recursively.
\\[kom-display-time]	Show the current date and time.
Per Cederqvist's avatar
.  
Per Cederqvist committed
592

David Kågedal's avatar
David Kågedal committed
593 594 595 596
\\[kom-change-presentation]	Change your presentation.
\\[kom-view]	View the specified text.
\\[kom-view-commented-text]	View the text that the current text comments or is a footnote to.
\\[kom-review-presentation]	Show the presentation for a person or a conferencce.
Per Cederqvist's avatar
.  
Per Cederqvist committed
597

David Kågedal's avatar
David Kågedal committed
598 599
\\[kom-review-comments]	View all comments to the current text.
\\[kom-review-tree]	View all comments to the current text and step through the tree
Per Cederqvist's avatar
.  
Per Cederqvist committed
600 601
	in depth-first order.

David Kågedal's avatar
David Kågedal committed
602 603 604
\\[kom-find-root-review]	View the complete comment tree.
\\[kom-find-root]	Show the root text of this comment tree.
\\[kom-review-by-to]	View the last (first or all) article written by named author
Per Cederqvist's avatar
.  
Per Cederqvist committed
605 606
	in a named conference.

David Kågedal's avatar
David Kågedal committed
607 608 609 610
\\[kom-mark-text]	Create a mark on a text.
\\[kom-unmark-text]	Remove the mark on a text.
\\[kom-review-marked-texts]	View all text marked with a certain mark.
\\[kom-review-all-marked-texts]	View all marked text.
Per Cederqvist's avatar
.  
Per Cederqvist committed
611

David Kågedal's avatar
David Kågedal committed
612 613 614 615 616 617
\\[kom-view-next-new-text]	Read the next text from the list of unread.
\\[kom-review-next]	Continue the viewing.
\\[kom-review-stack]	Show the stack of things we are viewing.
\\[kom-review-clear]	Clear the stack of things we are viewing.
\\[kom-review-backward]	Toggles the read order of reviewed texts. This can only be done
	when viewing texts with \\[kom-review-by-to], \\[kom-review-marked-texts] and \\[kom-review-all-marked-texts].
Per Cederqvist's avatar
.  
Per Cederqvist committed
618

David Kågedal's avatar
David Kågedal committed
619 620 621
\\[kom-status-conf]	Show the status of a conference.
\\[kom-status-person]	Show the status of a person
\\[kom-save-text]	Save the text you are looking at to a file.
Per Cederqvist's avatar
.  
Per Cederqvist committed
622

David Kågedal's avatar
David Kågedal committed
623 624
\\[kom-get-abuse]	Get an insulting text.
\\[kom-get-appreciation]	Get an encouraging text.
Per Cederqvist's avatar
.  
Per Cederqvist committed
625

David Kågedal's avatar
David Kågedal committed
626 627
\\[kom-add-self]	Become a member of a conference.
\\[kom-sub-self]	Removes you as a member of a conference.
Per Cederqvist's avatar
.  
Per Cederqvist committed
628 629 630 631

All bindings (this is here due to the fact that inconsistensies while 
developping this package are frequent):
\\{lyskom-mode-map}
Linus Tolke Y's avatar
Linus Tolke Y committed
632 633 634 635 636 637
Entry to this mode runs lyskom-mode-hook.

Functions and variables beginning with kom- are intended for the user to see,
set or call.
Functions and variables beginning with lyskom- are not intended for the user
to see, set of call."
Per Cederqvist's avatar
.  
Per Cederqvist committed
638 639 640
  (interactive)
  (lyskom-clear-vars)
  (setq mode-line-buffer-identification
641
	(list (concat (lyskom-mode-name-from-host) ": ") 'mode-line-conf-name))
Per Cederqvist's avatar
.  
Per Cederqvist committed
642 643 644

  (setq major-mode 'lyskom-mode)
  (setq mode-name "LysKOM")
645
  (setq mode-line-process (lyskom-get-string 'mode-line-working))
Per Cederqvist's avatar
.  
Per Cederqvist committed
646
  (use-local-map lyskom-mode-map)
David Byers's avatar
X  
David Byers committed
647
  (lyskom-set-menus 'lyskom-mode lyskom-mode-map)
648
  (run-hooks 'lyskom-mode-hook)
649
  (buffer-disable-undo (current-buffer))
David Kågedal's avatar
David Kågedal committed
650
  (setq buffer-read-only t))
Per Cederqvist's avatar
.  
Per Cederqvist committed
651 652 653

(defun lyskom-clear-vars ()
  "Set up buffer-local vars."
David Byers's avatar
X  
David Byers committed
654 655 656 657 658 659 660 661 662
  (lyskom-save-variables (lyskom-proc
                          lyskom-pers-no
                          lyskom-membership
                          lyskom-membership-is-read
                          lyskom-last-viewed
                          lyskom-unparsed-buffer
                          lyskom-unparsed-marker
                          lyskom-server-info
                          lyskom-server-name)
David Byers's avatar
David Byers committed
663
      (kill-all-local-variables))
David Byers's avatar
X  
David Byers committed
664
    (lyskom-setup-local-variables)
Per Cederqvist's avatar
.  
Per Cederqvist committed
665
    (setq lyskom-do-when-done (cons kom-do-when-done kom-do-when-done))
David Kågedal's avatar
David Kågedal committed
666
    (setq lyskom-output-queues (make-vector 10 nil))
David Byers's avatar
X  
David Byers committed
667
    (setq lyskom-collate-table lyskom-default-collate-table)    (let ((i 0))
David Kågedal's avatar
David Kågedal committed
668
      (while (< i 10)
David Byers's avatar
X  
David Byers committed
669 670
        (aset lyskom-output-queues i (lyskom-queue-create))
        (setq i (1+ i))))
David Kågedal's avatar
David Kågedal committed
671
    (setq lyskom-pending-calls nil)
David Byers's avatar
X  
David Byers committed
672
    (lyskom-set-mode-line
David Byers's avatar
David Byers committed
673
     (lyskom-get-string 'not-present-anywhere)))
David Byers's avatar
X  
David Byers committed
674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801



  
;  (let ((proc lyskom-proc)
;	(pers-no lyskom-pers-no)
;	(membership lyskom-membership)
;	(membership-is-read lyskom-membership-is-read)
;	(last-viewed lyskom-last-viewed)
;	(replies-buffer lyskom-unparsed-buffer)
;	(replies-marker lyskom-unparsed-marker)
;	(server-info lyskom-server-info)
;	(server-name lyskom-server-name)
;	)
;    (kill-all-local-variables)
;    (make-local-variable 'kom-ansaphone-show-messages)
;    (make-local-variable 'kom-ansaphone-record-messages)
;    (make-local-variable 'kom-ansaphone-on)
;    (make-local-variable 'kom-ansaphone-default-reply)
;    (make-local-variable 'kom-friends)
;    (make-local-variable 'kom-login-hook)
;    (make-local-variable 'kom-membership-default-priority)
;    (make-local-variable 'kom-permanent-filter-list)
;    (make-local-variable 'kom-user-prompt-format)
;    (make-local-variable 'kom-user-prompt-format-executing)
;    (make-local-variable 'kom-enabled-prompt-format)
;    (make-local-variable 'kom-enabled-prompt-format-executing)
;    (make-local-variable 'kom-remote-control)
;    (make-local-variable 'kom-remote-controllers)
;    (make-local-variable 'kom-session-filter-list)
;    (make-local-variable 'lyskom-accept-async-flag)
;    (make-local-variable 'lyskom-blocking-return)
;    (make-local-variable 'lyskom-buffer)
;    (make-local-variable 'lyskom-command-to-do)
;    (make-local-variable 'lyskom-conf-cache)
;    (make-local-variable 'lyskom-count-var)
;    (make-local-variable 'lyskom-current-conf)
;    (make-local-variable 'lyskom-current-subject)
;    (make-local-variable 'lyskom-current-text)
;    (make-local-variable 'lyskom-default-password)
;    (make-local-variable 'lyskom-default-user-name)
;    (make-local-variable 'lyskom-do-when-done)
;    (make-local-variable 'lyskom-dynamic-session-info-flag)
;    (make-local-variable 'lyskom-dont-change-prompt)
;    (make-local-variable 'lyskom-errno)
;    (make-local-variable 'lyskom-executing-command)
;    (make-local-variable 'lyskom-filter-list)
;    (make-local-variable 'lyskom-idle-time-flag)
;    (make-local-variable 'lyskom-is-administrator)
;    (make-local-variable 'lyskom-is-parsing)
;    (make-local-variable 'lyskom-is-waiting)
;    (make-local-variable 'lyskom-is-writing)
;    (make-local-variable 'lyskom-language)
;    (make-local-variable 'lyskom-last-group-message-recipient)
;    (make-local-variable 'lyskom-last-personal-message-sender)
;    (make-local-variable 'lyskom-last-viewed)
;    (make-local-variable 'lyskom-list-of-edit-buffers)
;    (make-local-variable 'lyskom-long-conf-types-flag)
;    (make-local-variable 'lyskom-marked-text-cache)
;    (make-local-variable 'lyskom-membership)
;    (make-local-variable 'lyskom-membership-is-read)
;    (make-local-variable 'lyskom-current-prompt)
;    (make-local-variable 'lyskom-normally-read-texts)
;    (make-local-variable 'lyskom-number-of-pending-calls)
;    (make-local-variable 'lyskom-options-done)
;    (make-local-variable 'lyskom-other-clients-user-areas)
;    (make-local-variable 'lyskom-output-queues)
;    (make-local-variable 'lyskom-pending-calls)
;    (make-local-variable 'lyskom-pending-prefetch)
;    (make-local-variable 'lyskom-pers-cache)
;    (make-local-variable 'lyskom-pers-no)
;    (make-local-variable 'lyskom-prefetch-conf-tresh)
;    (make-local-variable 'lyskom-prefetch-confs)
;    (make-local-variable 'lyskom-prefetch-in-action)
;    (make-local-variable 'lyskom-prefetch-pending-prefetch)
;    (make-local-variable 'lyskom-prefetch-stack)
;    (make-local-variable 'lyskom-prefetch-texts)
;    (make-local-variable 'lyskom-previous-text)
;    (make-local-variable 'lyskom-prioritize-buffer)
;    (make-local-variable 'lyskom-proc)
;    (make-local-variable 'lyskom-reading-list)
;    (make-local-variable 'lyskom-server-info)
;    (make-local-variable 'lyskom-server-name)
;    (make-local-variable 'lyskom-server-version)
;    (make-local-variable 'lyskom-server-supports)
;    (make-local-variable 'lyskom-long-conf-types-flag)
;    (make-local-variable 'lyskom-set-last-read-flag)
;    (make-local-variable 'lyskom-uconf-stats-flag)
;    (make-local-variable 'lyskom-z-lookup-flag)
;    (make-local-variable 'lyskom-session-no)
;    (make-local-variable 'lyskom-session-priority)
;    (make-local-variable 'lyskom-text-cache)
;    (make-local-variable 'lyskom-text-mass-cache)
;    (make-local-variable 'lyskom-to-be-printed-before-prompt)
;    (make-local-variable 'lyskom-to-do-list)
;    (make-local-variable 'lyskom-unparsed-buffer)
;    (make-local-variable 'lyskom-unparsed-marker)
;    (make-local-variable 'lyskom-unread-confs)
;    (make-local-variable 'lyskom-what-i-am-doing)
;    (make-local-variable 'lyskom-who-info-buffer)
;    (make-local-variable 'lyskom-who-info-buffer-is-on)
;    (make-local-variable 'lyskom-who-info-cache)
;    (make-local-variable 'lyskom-collate-table)
;    (make-local-variable 'mode-line-conf-name)
;    (make-local-variable 'lyskom-mode-map)
;    (make-local-variable 'lyskom-edit-mode-map)
;    (make-local-variable 'lyskom-filter-edit-map)
;    (make-local-variable 'lyskom-prioritize-mode-map)
;    (make-local-variable 'lyskom-customize-map)
;    (setq lyskom-proc proc)
;    (setq lyskom-pers-no pers-no)
;    (setq lyskom-membership membership)
;    (setq lyskom-last-viewed last-viewed)
;    (setq lyskom-membership-is-read membership-is-read)
;    (setq lyskom-unparsed-buffer replies-buffer)
;    (setq lyskom-unparsed-marker replies-marker)
;    (setq lyskom-server-info server-info)
;    (setq lyskom-server-name server-name)
;    (setq lyskom-do-when-done (cons kom-do-when-done kom-do-when-done))
;    (setq lyskom-output-queues (make-vector 10 nil))
;    (setq lyskom-collate-table lyskom-default-collate-table)
;    (let ((i 0))
;      (while (< i 10)
;	(aset lyskom-output-queues i (lyskom-queue-create))
;	(++ i)))
;    (setq lyskom-list-of-edit-buffers nil)
;    (setq lyskom-pending-calls nil)
;    (lyskom-set-mode-line (lyskom-get-string 'not-present-anywhere))))