commands1.el 75.5 KB
Newer Older
Linus Tolke's avatar
Linus Tolke committed
1
2
;;;;;
;;;;; $Id$
3
;;;;; Copyright (C) 1991, 1996  Lysator Academic Computer Association.
Linus Tolke's avatar
Linus Tolke 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's avatar
Linus Tolke 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
;;;; ================================================================
;;;; ================================================================
;;;;
;;;; File: commands1.el
;;;;
;;;; This file contains the code for some of the high level commands.
;;;;

33
34
35
36
37
(setq lyskom-clientversion-long 
      (concat lyskom-clientversion-long
	      "$Id$\n"))


Per Cederqvist's avatar
.    
Per Cederqvist committed
38
39
40
41
42
43
;;; ================================================================
;;;                  F} uppmuntran - Get appreciation 

;;; Author: Inge Wallin


David Kågedal's avatar
David Kågedal committed
44
(def-kom-command kom-get-appreciation ()
Per Cederqvist's avatar
.    
Per Cederqvist committed
45
46
  "Give the user a little light in the dark"
  (interactive)
David Kågedal's avatar
David Kågedal committed
47
48
  (lyskom-insert-string 'appreciation))
  
Per Cederqvist's avatar
.    
Per Cederqvist committed
49
50
51
52
53
54
55

;;; ================================================================
;;;                      F} Sk{ll - Get abuse

;;; Author: Inge Wallin


David Kågedal's avatar
David Kågedal committed
56
(def-kom-command kom-get-abuse ()
Per Cederqvist's avatar
.    
Per Cederqvist committed
57
58
  "Give the user a little verbal abuse."
  (interactive)
David Kågedal's avatar
David Kågedal committed
59
  (lyskom-insert-string 'abuse))
Per Cederqvist's avatar
.    
Per Cederqvist committed
60
61
62
63
64
65
66
67


;;; ================================================================
;;;            Utpl}na - Delete a person or a conference

;;; Author: Inge Wallin


David Kågedal's avatar
David Kågedal committed
68
(def-kom-command kom-delete-conf ()
Per Cederqvist's avatar
.    
Per Cederqvist committed
69
70
  "Delete a person or a conference."
  (interactive)
David Kågedal's avatar
David Kågedal committed
71
72
  (let ((conf-stat 
	 (lyskom-read-conf-stat (lyskom-get-string 'what-conf-to-delete)
73
				'(all) nil nil t)))
David Kågedal's avatar
David Kågedal committed
74
75
76
77
78
79
80
81
82
83
    (if conf-stat
	(if (lyskom-ja-or-nej-p
	     (lyskom-format 'confirm-delete-pers-or-conf
			    (if (conf-type->letterbox (conf-stat->conf-type 
						       conf-stat))
				(lyskom-get-string 'the-pers)
			      (lyskom-get-string 'the-conf))
			    (conf-stat->name conf-stat)))
	    (if (blocking-do 'delete-conf
			     (conf-stat->conf-no conf-stat))
84
85
86
87
88
89
90
91
92
93
94
95
96
97
		(progn
		  (lyskom-format-insert 'conf-is-deleted
					(conf-stat->name conf-stat))
		  (when (= (conf-stat->conf-no conf-stat)
			   lyskom-pers-no)
		    (lyskom-insert (lyskom-get-string
				    'you-have-deleted-yourself))
		    (setq lyskom-pers-no nil
			  lyskom-membership nil
			  lyskom-to-do-list (lyskom-create-read-list)
			  lyskom-reading-list (lyskom-create-read-list)
			  lyskom-pending-commands (cons
						   'kom-start-anew
						   lyskom-pending-commands))))
David Kågedal's avatar
David Kågedal committed
98
99
100
101
	      (lyskom-format-insert 'you-could-not-delete
				    conf-stat))
	  (lyskom-insert-string 'deletion-not-confirmed))
      (lyskom-insert-string 'somebody-else-deleted-that-conf))))
Per Cederqvist's avatar
.    
Per Cederqvist committed
102
103
104
105
106
107
108
109


;;; ================================================================
;;;                Radera (text) - Delete a text

;;; Author: Inge Wallin


110
(def-kom-command kom-delete-text (text-no-arg)
Per Cederqvist's avatar
.    
Per Cederqvist committed
111
112
113
114
115
116
  "Delete a text. Argument: TEXT-NO"
  (interactive "P")
  (let ((text-no (cond ((null text-no-arg) 0)
		       ((integerp text-no-arg) text-no-arg)
		       ((listp text-no-arg) (car text-no-arg))
		       (t 0))))
117
    (if (zerop text-no)
Per Cederqvist's avatar
.    
Per Cederqvist committed
118
119
120
121
	(setq text-no 
	      (lyskom-read-number (lyskom-get-string 'what-text-to-delete)
				  lyskom-current-text)))
    (lyskom-format-insert 'deleting-text text-no)
122
    (lyskom-report-command-answer (blocking-do 'delete-text text-no))))
Per Cederqvist's avatar
.    
Per Cederqvist committed
123
124
125
126
127
128
129
130
131


;;; ================================================================
;;;        ]terse presentation - Review the presentation
;;;               for a person or a conference

;;; Author: Inge Wallin


132
(defun kom-review-presentation (&optional who)
Per Cederqvist's avatar
.    
Per Cederqvist committed
133
134
135
  "Review the presentation for a person or a conference."
  (interactive)
  (lyskom-start-of-command 'kom-review-presentation)
136
137
  (let ((end-of-command-taken-care-of))
    (unwind-protect
138
139
140
141
142
        (let ((conf-stat 
               (if who
                   (blocking-do 'get-conf-stat who)
                 (lyskom-read-conf-stat 
                          (lyskom-get-string 'presentation-for-whom)
143
144
                          '(all)
                          nil "" t))))
145
146
147
148
149
150
151
152
          (if (null conf-stat)
              (lyskom-insert-string 'somebody-deleted-that-conf)
            (lyskom-format-insert 'review-presentation-of
                                  conf-stat)
            (if (/= (conf-stat->presentation conf-stat) 0)
                (lyskom-view-text (conf-stat->presentation conf-stat))
              (lyskom-format-insert 'has-no-presentation
                                    conf-stat))))
153
      (if end-of-command-taken-care-of
154
155
          nil
        (lyskom-end-of-command)))))
156

Per Cederqvist's avatar
.    
Per Cederqvist committed
157
158
159
160
161
162


;;; ================================================================
;;;          ]terse det kommenterade - View commented text

;;; Author: Inge Wallin
163
;;; Modified by: David K}gedal
Per Cederqvist's avatar
.    
Per Cederqvist committed
164

David Kågedal's avatar
David Kågedal committed
165
(def-kom-command kom-view-commented-text ()
Per Cederqvist's avatar
.    
Per Cederqvist committed
166
167
168
169
  "View the commented text.
If the current text is comment to (footnote to) several text then the first
text is shown and a REVIEW list is built to shown the other ones."
  (interactive)
David Kågedal's avatar
David Kågedal committed
170
171
172
173
174
175
  (if lyskom-current-text
      (progn
	(lyskom-tell-internat 'kom-tell-read)
	(lyskom-view-commented-text
	 (blocking-do 'get-text-stat lyskom-current-text)))
    (lyskom-insert-string 'have-to-read)))
Per Cederqvist's avatar
.    
Per Cederqvist committed
176
177


178
179
180
181
182
183
184
185
186
187
188
189
190
(def-kom-command kom-view-previous-commented-text ()
 "View the text the previous text commented.
If the previously viewed text is a comment to (footnote to) several
texts then the first text is shown and a REVIEW list is built to show
the other ones."
	      (interactive)
	      (if lyskom-previous-text
		  (progn
		    (lyskom-tell-internat 'kom-tell-read)
		    (lyskom-view-commented-text
		     (blocking-do 'get-text-stat lyskom-previous-text)))
		(lyskom-insert-string 'confusion-what-to-view)))

Per Cederqvist's avatar
.    
Per Cederqvist committed
191
192
(defun lyskom-view-commented-text (text-stat)
  "Handles the return from the initiate-get-text-stat, displays and builds list."
193
  (let* ((misc-info-list (and text-stat
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
                              (text-stat->misc-info-list text-stat)))
         (misc-infos (and misc-info-list
                          (append (lyskom-misc-infos-from-list
                                   'COMM-TO misc-info-list)
                                  (lyskom-misc-infos-from-list
                                   'FOOTN-TO misc-info-list))))
         (text-nos (and misc-infos
                        (mapcar
                         (function
                          (lambda (misc-info)
                            (if (equal (misc-info->type misc-info)
                                       'COMM-TO)
                                (misc-info->comm-to misc-info)
                              (misc-info->footn-to misc-info))))
                         misc-infos))))
209
    (if text-nos
210
211
212
213
214
215
216
217
218
219
220
        (progn
          (lyskom-format-insert 'review-text-no 
                                (car text-nos))
          (if (cdr text-nos)
              (read-list-enter-read-info
               (lyskom-create-read-info
                'REVIEW nil (lyskom-get-current-priority)
                (lyskom-create-text-list (cdr text-nos))
                lyskom-current-text)
               lyskom-reading-list t))
          (lyskom-view-text (car text-nos)))
221
      (lyskom-insert-string 'no-comment-to))))
Per Cederqvist's avatar
.    
Per Cederqvist committed
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237


(defun lyskom-misc-infos-from-list (type list)
  "Get all the misc-infos from the misc-info-list LIST with the same type
as TYPE. If no such misc-info, return NIL"
  (cond ((null list) nil)
	((equal type (misc-info->type (car list))) 
	 (cons (car list)
	       (lyskom-misc-infos-from-list type (cdr list))))
	(t (lyskom-misc-infos-from-list type (cdr list)))))


;;; ================================================================
;;;                         Brev - Send letter

;;; Author: Inge Wallin
238
;;; Rewritten using read-conf-no by Linus Tolke (4=>1)
Per Cederqvist's avatar
.    
Per Cederqvist committed
239

240
(def-kom-command kom-send-letter (&optional pers-no)
241
  "Send a personal letter to a person or a conference."
Per Cederqvist's avatar
.    
Per Cederqvist committed
242
  (interactive)
243
  (condition-case nil
Linus Tolke's avatar
Linus Tolke committed
244
      (progn
245
        (lyskom-tell-internat 'kom-tell-write-letter)
246
247
	;; If there was a motd, which is now removed we have to
	;; refetch the conf-stat to know that.
248
249
250
        (let* ((tono (or pers-no
                         (lyskom-read-conf-no
                          (lyskom-get-string 'who-letter-to)
251
                          '(all) nil nil t)))
252
               (conf-stat (blocking-do 'get-conf-stat tono)))
David Kågedal's avatar
David Kågedal committed
253
	  (cache-del-conf-stat tono)
254
255
256
          (if (if (zerop (conf-stat->msg-of-day conf-stat))
                  t
                (progn
David Kågedal's avatar
David Kågedal committed
257
                  (recenter 1)
258
259
260
261
262
263
264
265
266
267
268
269
270
271
                  (lyskom-format-insert 'has-motd 
                                        conf-stat)
                  (lyskom-view-text (conf-stat->msg-of-day conf-stat))
                  (if (lyskom-j-or-n-p (lyskom-get-string 'motd-persist-q))
                      t
                    nil)))
              (if (= tono lyskom-pers-no)
                  (lyskom-edit-text lyskom-proc
                                    (lyskom-create-misc-list 'recpt tono)
                                    "" "")
                (lyskom-edit-text lyskom-proc
                                  (lyskom-create-misc-list 'recpt tono
                                                           'recpt lyskom-pers-no)
                                  "" "")))))
272
    (quit (signal 'quit "Quitting in letter"))))
Per Cederqvist's avatar
.    
Per Cederqvist committed
273
274
275
276
277
278
279


;;; ================================================================
;;;           Bli medlem i m|te - Become a member of a conference
;;;             Addera medlem - Add somebody else as a member

;;; Author: ???
280
;;; Rewritten by: David K}gedal
Per Cederqvist's avatar
.    
Per Cederqvist committed
281
282
283
284


;; Add another person

David Kågedal's avatar
David Kågedal committed
285
(def-kom-command kom-add-member ()
286
287
  "Add a person as a member of a conference.
Ask for the name of the person, the conference to add him/her to."
Per Cederqvist's avatar
.    
Per Cederqvist committed
288
  (interactive)
David Kågedal's avatar
David Kågedal committed
289
  (let* ((who (lyskom-read-conf-stat (lyskom-get-string 'who-to-add)
290
				     '(pers) nil nil t))
David Kågedal's avatar
David Kågedal committed
291
	 (whereto (lyskom-read-conf-stat (lyskom-get-string 'where-to-add)
292
					 '(all) nil nil t))
David Kågedal's avatar
David Kågedal committed
293
294
295
	 (pers-stat (blocking-do 'get-pers-stat (conf-stat->conf-no who))))
    (lyskom-add-member-answer (lyskom-try-add-member whereto who pers-stat)
			      whereto who)))
Per Cederqvist's avatar
.    
Per Cederqvist committed
296
297
298
299
300



;; Add self

301
(def-kom-command kom-add-self (&optional conf)
Per Cederqvist's avatar
.    
Per Cederqvist committed
302
303
  "Add this person as a member of a conference."
  (interactive)
304
305
306
  (let ((whereto (if conf (blocking-do 'get-conf-stat conf)
                   (lyskom-read-conf-stat 
                    (lyskom-get-string 'where-to-add-self)
307
                    '(all) nil "" t)))
308
309
        (who (blocking-do 'get-conf-stat lyskom-pers-no))
        (pers-stat (blocking-do 'get-pers-stat lyskom-pers-no)))
David Kågedal's avatar
David Kågedal committed
310
    (lyskom-add-member-answer (lyskom-try-add-member whereto who pers-stat)
311
                              whereto who)))
312

Per Cederqvist's avatar
.    
Per Cederqvist committed
313
314
315
316
317


;;; NOTE: This function is also called from lyskom-go-to-conf-handler
;;;       and from lyskom-create-conf-handler.

318
(defun lyskom-add-member-by-no (conf-no pers-no &optional thendo &rest data)
Per Cederqvist's avatar
.    
Per Cederqvist committed
319
320
  "Fetch info to be able to add a person to a conf.
Get the conf-stat CONF-NO for the conference and the conf-stat and pers-stat 
321
for person PERS-NO and send them into lyskom-try-add-member."
David Byers's avatar
David Byers committed
322
323
324
325
326
327
328
329
  (blocking-do-multiple ((whereto (get-conf-stat conf-no))
                         (who (get-conf-stat pers-no))
                         (pers-stat (get-pers-stat pers-no)))
    (let ((result (lyskom-try-add-member whereto who pers-stat)))
      (lyskom-add-member-answer result whereto who)
      (if thendo
          (apply thendo data))
      result)))
Per Cederqvist's avatar
.    
Per Cederqvist committed
330
331


332
(defun lyskom-try-add-member (conf-conf-stat pers-conf-stat pers-stat)
Per Cederqvist's avatar
.    
Per Cederqvist committed
333
  "Add a member to a conference.
334
Args: CONF-CONF-STAT PERS-CONF-STAT PERS-STAT
Per Cederqvist's avatar
.    
Per Cederqvist committed
335
336
337
CONF-CONF-STAT: the conf-stat of the conference the person is being added to
PERS-CONF-STAT: the conf-stat of the person being added.
PERS-STAT: the pers-stat of the person being added.
338
339

Returns t if it was possible, otherwise nil."
Per Cederqvist's avatar
.    
Per Cederqvist committed
340
341
  (if (or (null conf-conf-stat)
	  (null pers-conf-stat))
342
      nil				; We have some problem here.
Per Cederqvist's avatar
.    
Per Cederqvist committed
343
344
345
346
347
    (let ((priority
	   (if (/= lyskom-pers-no (conf-stat->conf-no pers-conf-stat))
	       100			; When adding someone else
	     (if (and (numberp kom-membership-default-priority)
		      (< kom-membership-default-priority 256)
348
		      (> kom-membership-default-priority 0))
Per Cederqvist's avatar
.    
Per Cederqvist committed
349
350
		 kom-membership-default-priority
	       (lyskom-read-num-range
David Byers's avatar
David Byers committed
351
		1 255 (lyskom-get-string 'priority-q)))))
Per Cederqvist's avatar
.    
Per Cederqvist committed
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
	  (where
	   (if (/= lyskom-pers-no (conf-stat->conf-no pers-conf-stat))
	       1			; When adding someone else
	     (cond
	      ((and (numberp kom-membership-default-placement)
		    (>= kom-membership-default-placement 0))
	       kom-membership-default-placement)
	      ((eq kom-membership-default-placement 'first)
	       0)
	      ((eq kom-membership-default-placement 'last)
	       (length lyskom-membership))
	      (t
	       (lyskom-read-num-range
		0 (pers-stat->no-of-confs pers-stat)
		(lyskom-format 'where-on-list-q
			       (length lyskom-membership))))))))

369
370
371
      (if (= (conf-stat->conf-no pers-conf-stat)
	     lyskom-pers-no)
	  (lyskom-format-insert 'member-in-conf
372
				conf-conf-stat)
373
	(lyskom-format-insert 'add-member-in
374
375
			      pers-conf-stat
			      conf-conf-stat))
376
377
378
379
      (blocking-do 'add-member 
		   (conf-stat->conf-no conf-conf-stat)
		   (conf-stat->conf-no pers-conf-stat)
		   priority where))))
Per Cederqvist's avatar
.    
Per Cederqvist committed
380
381


382
(defun lyskom-add-member-answer (answer conf-conf-stat pers-conf-stat)
Per Cederqvist's avatar
.    
Per Cederqvist committed
383
384
  "Handle the result from an attempt to add a member to a conference."
  (if (null answer)
Linus Tolke's avatar
Linus Tolke committed
385
386
      (progn
	(lyskom-insert-string 'nope)
387
	(if (conf-type->rd_prot (conf-stat->conf-type conf-conf-stat))
388
389
390
	    ;; The conference is protected. Tell the user to contact
	    (let ((supervisorconf (blocking-do
				   'get-conf-stat
David Kågedal's avatar
David Kågedal committed
391
				   (conf-stat->supervisor conf-conf-stat))))
392
393
394
395
396
397
	      (if supervisorconf
		  (lyskom-format-insert 'is-read-protected-contact-supervisor
					conf-conf-stat
					supervisorconf)
		(lyskom-format-insert 'cant-find-supervisor
				      conf-conf-stat)))
Linus Tolke's avatar
Linus Tolke committed
398
399
	  (lyskom-format-insert 'error-code
				(lyskom-get-error-text lyskom-errno)
400
				lyskom-errno)))
Linus Tolke's avatar
Linus Tolke committed
401

Per Cederqvist's avatar
.    
Per Cederqvist committed
402
    (lyskom-insert-string 'done)
403
404
405
406
    ;;+++Borde {ndra i cachen i st{llet.
    (cache-del-pers-stat (conf-stat->conf-no pers-conf-stat))
    ;;+++Borde {ndra i cachen i st{llet.
    (cache-del-conf-stat (conf-stat->conf-no conf-conf-stat))
Per Cederqvist's avatar
.    
Per Cederqvist committed
407
408
    (if (= (conf-stat->conf-no pers-conf-stat)
	   lyskom-pers-no)
409
410
411
412
413
	(progn				; Adding myself
	  (lyskom-add-membership
	   (blocking-do 'query-read-texts
			lyskom-pers-no 
			(conf-stat->conf-no conf-conf-stat))
414
	   (conf-stat->conf-no conf-conf-stat))))))
Per Cederqvist's avatar
.    
Per Cederqvist committed
415
416


Linus Tolke's avatar
Linus Tolke committed
417

418
(defun lyskom-add-membership (membership conf-no)
Per Cederqvist's avatar
.    
Per Cederqvist committed
419
420
421
422
423
  "Adds MEMBERSHIP to the sorted list of memberships.
Args: MEMBERSHIP CONF-STAT THENDO DATA
Also adds to lyskom-to-do-list."
  (if membership
      (progn
424
425
426
427
	(lyskom-insert-membership membership lyskom-membership)
	(lyskom-prefetch-map conf-no
			     membership))
    (lyskom-insert-string 'conf-does-not-exist)))
Per Cederqvist's avatar
.    
Per Cederqvist committed
428
429
430
431
432
433
434



;;; ================================================================
;;;     Uttr{d - Subtract yourself as a member from a conference
;;;     Uteslut medlem - Subtract somebody else as a member

435
436
;;; Author: David Byers
;;; Based on code by Inge Wallin
Per Cederqvist's avatar
.    
Per Cederqvist committed
437
438
439
440


;; Subtract another person

David Kågedal's avatar
David Kågedal committed
441
(def-kom-command kom-sub-member ()
442
443
  "Subtract a person as a member from a conference. Ask for the name
of the person."
Per Cederqvist's avatar
.    
Per Cederqvist committed
444
  (interactive)
David Kågedal's avatar
David Kågedal committed
445
  (lyskom-sub-member
446
   (lyskom-read-conf-stat (lyskom-get-string 'who-to-exclude)
447
                          '(pers) nil "" t)
David Kågedal's avatar
David Kågedal committed
448
   (lyskom-read-conf-stat (lyskom-get-string 'where-from-exclude) 
449
			  '(all) nil "" t)))
Per Cederqvist's avatar
.    
Per Cederqvist committed
450
451


452
(def-kom-command kom-sub-self (&optional conf)
Per Cederqvist's avatar
.    
Per Cederqvist committed
453
454
  "Subtract this person as a member from a conference."
  (interactive)
David Kågedal's avatar
David Kågedal committed
455
456
  (lyskom-sub-member 
   (blocking-do 'get-conf-stat lyskom-pers-no)
457
458
   (if conf (blocking-do 'get-conf-stat conf)
     (lyskom-read-conf-stat (lyskom-get-string 'leave-what-conf)
459
                            '(all) nil 
460
461
462
463
464
465
466
467
                            (let ((ccn 
                                   (if (or (zerop lyskom-current-conf))
                                       ""
                                     (conf-stat->name
                                      (blocking-do 'get-conf-stat
                                                   lyskom-current-conf)))))
                              (if ccn
                                  (cons ccn 0)
468
                                "")) t))))
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484

(defun lyskom-sub-member (pers conf)
  "Remove the person indicated by PERS as a member of CONF."
  (let ((reply nil)
	(self (= (conf-stat->conf-no pers) lyskom-pers-no)))
    (cond ((null pers) (lyskom-insert-string 'error-fetching-person))
	  ((null conf) (lyskom-insert-string 'error-fetching-conf))
	  (t
	   (if self
	       (lyskom-format-insert 'unsubscribe-to conf)
	     (lyskom-format-insert 'exclude-from pers conf))

	   (setq reply (blocking-do 'sub-member
				    (conf-stat->conf-no conf)
				    (conf-stat->conf-no pers)))
	   (if self
485
486
	       (lyskom-remove-membership (conf-stat->conf-no conf)
					 lyskom-membership))
487
488
489
490
	   (if (not reply)
	       (lyskom-format-insert 'unsubscribe-failed
				     (if self
					 (lyskom-get-string 'You)
491
492
				       (conf-stat->name pers))
				     (conf-stat->name conf))
493
494
495
496
497
498
499
500
	     (lyskom-insert-string 'done)
	     (if (and self
		      (= (conf-stat->conf-no conf)
			 lyskom-current-conf))
		 (progn 
		   (set-read-list-empty lyskom-reading-list)
		   (setq lyskom-current-conf 0)))
	     (read-list-delete-read-info (conf-stat->conf-no conf)
501
					 lyskom-to-do-list))))))
502
	   
Per Cederqvist's avatar
.    
Per Cederqvist committed
503

504
	 
505

Per Cederqvist's avatar
.    
Per Cederqvist committed
506
507
508
509
510
511
;;; ================================================================
;;;                 Skapa m|te - Create a conference

;;; Author: ???


David Kågedal's avatar
David Kågedal committed
512
(def-kom-command kom-create-conf (&optional name)
Per Cederqvist's avatar
.    
Per Cederqvist committed
513
  "Create a conference."
David Kågedal's avatar
David Kågedal committed
514
  (interactive)
David Kågedal's avatar
David Kågedal committed
515
516
517
  (let* ((conf-name (or name
			(lyskom-read-string
			 (lyskom-get-string 'name-of-conf))))
David Kågedal's avatar
David Kågedal committed
518
	 (open (j-or-n-p (lyskom-get-string 'anyone-member)))
Per Cederqvist's avatar
.    
Per Cederqvist committed
519
520
	 (secret (if (not open)
		     (j-or-n-p (lyskom-get-string 'secret-conf))))
David Kågedal's avatar
David Kågedal committed
521
	 (orig (j-or-n-p (lyskom-get-string 'comments-allowed)))
522
         (anarchy (j-or-n-p (lyskom-get-string 'anonymous-allowed)))
David Kågedal's avatar
David Kågedal committed
523
524
525
526
527
	 (conf-no (blocking-do 'create-conf 
			       conf-name
			       (lyskom-create-conf-type (not open) 
							(not orig)
							secret
528
529
530
531
532
							nil
                                                        anarchy
                                                        nil
                                                        nil
                                                        nil))))
David Kågedal's avatar
David Kågedal committed
533
    (if (null conf-no)
David Kågedal's avatar
David Kågedal committed
534
535
536
537
538
539
	(progn
	  (lyskom-format-insert 'could-not-create-conf
				conf-name)
	  (lyskom-format-insert 'error-code
				(lyskom-get-error-text lyskom-errno)
				lyskom-errno))
David Kågedal's avatar
David Kågedal committed
540
541
542
543
544
545
546
547
548
549
550
551
552
553
      (progn
	(let ((conf-stat (blocking-do 'get-conf-stat conf-no)))
	  (lyskom-format-insert 'created-conf-no-name 
				(or conf-stat conf-no)
				(or conf-stat conf-name)
				(if conf-stat
				    (lyskom-default-button 'conf conf-stat)
				  nil)))
	(lyskom-scroll)
	(lyskom-add-member-by-no conf-no lyskom-pers-no
				 (if secret
				     nil ; Don't write a presentation
				   'lyskom-create-conf-handler-2)
				 conf-no conf-name)))))
Per Cederqvist's avatar
.    
Per Cederqvist committed
554
555
556
557
558
559


(defun lyskom-create-conf-handler-2 (conf-no conf-name)
  "Starts editing a presentation for the newly created conference.
This does lyskom-end-of-command"
  (lyskom-tell-internat 'kom-tell-conf-pres)
560
  (let ((conf (blocking-do 'get-conf-stat conf-no)))
David Kågedal's avatar
David Kågedal committed
561
    (if conf
562
563
564
565
566
567
568
        (lyskom-dispatch-edit-text lyskom-proc
                                   (lyskom-create-misc-list
                                    'recpt
                                    (server-info->conf-pres-conf 
                                     lyskom-server-info))
                                   conf-name ""
                                   'lyskom-set-presentation conf-no))))
Per Cederqvist's avatar
.    
Per Cederqvist committed
569
570
571
572
573


(defun lyskom-set-presentation (text-no conf-no)
  "Set presentation of a conference. Args: text-no conf-no."
  (initiate-set-presentation 'background nil conf-no text-no)
574
  (cache-del-conf-stat conf-no))	;+++Borde {ndra i cachen i st{llet.
Per Cederqvist's avatar
.    
Per Cederqvist committed
575
576
577
578
579
580
581
582
					;+++ Kan tas bort n{r det existerar 
					;asynkrona meddelanden som talar om att
					;n}got {r {ndrat.
    

(defun lyskom-set-conf-motd (text-no conf-no)
  "Set motd of a conference. Args: text-no conf-no."
  (initiate-set-conf-motd 'background nil conf-no text-no)
583
  (cache-del-conf-stat conf-no))	;+++Borde {ndra i cachen i st{llet.
Per Cederqvist's avatar
.    
Per Cederqvist committed
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
					;+++ Kan tas bort n{r det existerar 
					;asynkrona meddelanden som talar om att
					;n}got {r {ndrat.
    

;;; ================================================================
;;;                  Kommentera - write comment

;;; Author: ???


(defun kom-write-comment (&optional text-no)
  "Write a comment to a text.
If optional arg TEXT-NO is present write a comment to that text instead."
  (interactive (list 
		(cond
		 ((null current-prefix-arg)
		  lyskom-current-text)
		 ((integerp current-prefix-arg)
		  current-prefix-arg)
604
605
		 ((listp current-prefix-arg) 
		  (lyskom-read-number (lyskom-get-string 'what-comment-no)))
Per Cederqvist's avatar
.    
Per Cederqvist committed
606
607
		 (t
		  (signal 'lyskom-internal-error '(kom-write-comment))))))
608
  (lyskom-start-of-command (concat 
David Kågedal's avatar
David Kågedal committed
609
			    (lyskom-command-name 'kom-write-comment)
610
			    (if text-no 
611
				(lyskom-format " (%#1n)" text-no)
612
			      "")))
613
614
615
616
617
618
619
620
  (unwind-protect
      (if text-no
          (lyskom-write-comment-soon
           (blocking-do 'get-text-stat text-no)
           (blocking-do 'get-text text-no)
           text-no
           'comment)
        (lyskom-insert-string 'confusion-what-to-comment))
Per Cederqvist's avatar
.    
Per Cederqvist committed
621
622
623
    (lyskom-end-of-command)))


624
(def-kom-command kom-write-footnote (&optional text-no)
Per Cederqvist's avatar
.    
Per Cederqvist committed
625
626
627
628
629
630
631
632
  "Write a footnote to a text.
If optional arg TEXT-NO is present write a footnote to that text instead."
  (interactive (list 
		(cond
		 ((null current-prefix-arg)
		  lyskom-current-text)
		 ((integerp current-prefix-arg)
		  current-prefix-arg)
633
634
		 ((listp current-prefix-arg) 
		  (lyskom-read-number (lyskom-get-string 'what-comment-no)))
Per Cederqvist's avatar
.    
Per Cederqvist committed
635
636
637
		 (t
		  (signal 'lyskom-internal-error '(kom-write-comment))))))
  (if text-no
638
639
640
641
      (lyskom-write-comment-soon
       (blocking-do 'get-text-stat text-no)
       (blocking-do 'get-text text-no)
       text-no 'footnote)
642
    (lyskom-insert-string 'confusion-what-to-footnote)))
Per Cederqvist's avatar
.    
Per Cederqvist committed
643
644


645
(def-kom-command kom-comment-previous ()
Per Cederqvist's avatar
.    
Per Cederqvist committed
646
647
648
  "Write a comment to previously viewed text."
  (interactive)
  (if lyskom-previous-text
649
650
651
652
      (lyskom-write-comment-soon 
       (blocking-do 'get-text-stat lyskom-previous-text)
       (blocking-do 'get-text lyskom-previous-text)
       lyskom-previous-text 'comment)
653
    (lyskom-insert-string 'confusion-what-to-comment)))
Per Cederqvist's avatar
.    
Per Cederqvist committed
654
655
656
657
658


(defun lyskom-write-comment-soon (text-stat text text-no type)
  "Write a comment to the text with TEXT-STAT, TEXT and, TEXT-NO.
TYPE is either 'comment or 'footnote."
659
660
661
662
  (cond
   ;; Text not found?
   ((or (null text-stat)
	(null text))
663
    (lyskom-format-insert 'cant-read-textno text-no))
664
665
666
667
668
669
670
671
   ;; Give header.
   ((string-match "\n" (text->text-mass text))
    (lyskom-write-comment text-stat
			  (substring (text->text-mass text)
				     0 (match-beginning 0))
			  type))
   ;; The commented text had no header.
   (t (lyskom-write-comment text-stat "" type))))
Per Cederqvist's avatar
.    
Per Cederqvist committed
672
673
674
675
676
677
678


(defun lyskom-write-comment (text-stat subject type)
  "Write a comment to the text associated with TEXT-STAT.
The default subject is SUBJECT. TYPE is either 'comment or 'footnote."
  (if (null text-stat)
      (progn
679
        (lyskom-insert-string 'confusion-what-to-comment))
680
    (let ((ccrep))
Per Cederqvist's avatar
.    
Per Cederqvist committed
681
      (lyskom-tell-internat (if (eq type 'comment)
682
683
                                'kom-tell-write-comment
                              'kom-tell-write-footnote))
684
      (let (data)
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
        (mapcar 
         (function
          (lambda (misc-info)
            (cond
             ((eq 'RECPT (misc-info->type misc-info))
              (setq data 
                    (cons (blocking-do 'get-conf-stat 
                                       (misc-info->recipient-no misc-info))
                          data)))
             ((and (eq type 'footnote)
                   (eq 'CC-RECPT (misc-info->type misc-info)))
              (setq ccrep (cons (misc-info->recipient-no misc-info) 
                                ccrep))
              (setq data (cons (blocking-do 'get-conf-stat
                                            (misc-info->recipient-no misc-info))
                               data))))))
         (text-stat->misc-info-list text-stat))
        (lyskom-comment-recipients data lyskom-proc text-stat
                                   subject type ccrep)))))
Per Cederqvist's avatar
.    
Per Cederqvist committed
704
705


706
707
(defun lyskom-comment-recipients (data lyskom-proc text-stat
				       subject type ccrep)
Per Cederqvist's avatar
.    
Per Cederqvist committed
708
  "Compute recipients to a comment to a text.
709
Args: DATA, LYSKOM-PROC TEXT-STAT SUBJECT TYPE CCREP.
710
711
712
DATA is a list of all the recipients that should receive this text.
If DATA contains more than one conference the user is asked (using y-or-n-p)
if all conferences really should receive the text.
713
714
715
The call is continued to the lyskom-edit-text.
TYPE is info whether this is going to be a comment of footnote.
CCREP is a list of all recipients that are going to be cc-recipients."
716

717
  (condition-case nil
718
      ;; Catch any quits
719
720
      (progn
	;; Filter multiple recipients through y-or-n-p.
721
722
	(if (and (eq kom-confirm-multiple-recipients 'before)
                 (> (length data) 1)
723
724
725
726
727
728
729
		 (not (and (= (length data) 2)
			   (or (= lyskom-pers-no (conf-stat->conf-no
						  (car data)))
			       (= lyskom-pers-no (conf-stat->conf-no
						  (car (cdr data))))))))
	    (let ((new-data nil))
	      (while data
Linus Tolke's avatar
Linus Tolke committed
730
		(if (lyskom-j-or-n-p (lyskom-format 'comment-keep-recpt-p
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
					     (conf-stat->name (car data))))
		    (setq new-data (cons (car data) new-data)))
		(setq data (cdr data)))
	      (setq data (nreverse new-data))))	    

	(let* ((member nil)
	       (recver (lyskom-create-misc-list
			(cond 
			 ((eq type 'comment) 'comm-to)
			 ((eq type 'footnote) 'footn-to)
			 (t (signal 'lyskom-internal-error
				    (list "Unknown comment type" type))))
			(text-stat->text-no text-stat)))
	       (recpts nil))
	  (while data
	    (let ((conf-stat (car data)))
	      (if (memq (conf-stat->comm-conf conf-stat) recpts)
		  nil
		(setq recver
		      (append recver
			      (list
752
753
754
755
			       (cons (if (memq (conf-stat->conf-no conf-stat)
					       ccrep)
					 'cc-recpt
				       'recpt)
756
				     (conf-stat->comm-conf conf-stat)))))
757
		(if (lyskom-get-membership (conf-stat->conf-no conf-stat))
758
759
760
761
762
763
764
765
766
767
768
769
		    (setq member t))
		(setq recpts (cons (conf-stat->comm-conf conf-stat) recpts))))
	    (setq data (cdr data)))
	  ;; Add the user to the list of recipients if he isn't a member in
	  ;; any of the recipients.
	  (if (not member)
	      (setq recver (append recver
				   (list (cons 'recpt lyskom-pers-no)))))
	  (lyskom-edit-text lyskom-proc 
			    recver
			    subject "")))

770
    (quit (signal 'quit "quit in lyskom-comment-recipients"))))
Per Cederqvist's avatar
.    
Per Cederqvist committed
771
772
773
774
775
776


;;; ================================================================
;;;                Personligt svar - personal answer

;;; Author: ???
777
;;; Rewritten using blocking-do by: Linus Tolke
Per Cederqvist's avatar
.    
Per Cederqvist committed
778
779


780
(def-kom-command kom-private-answer (&optional text-no)
Per Cederqvist's avatar
.    
Per Cederqvist committed
781
782
783
784
785
786
787
788
789
  "Write a private answer to the current text.
If optional arg TEXT-NO is present write a private answer to
that text instead."
  (interactive (list
		(cond
		 ((null current-prefix-arg)
		  lyskom-current-text)
		 ((integerp current-prefix-arg)
		  current-prefix-arg)
790
791
		 ((listp current-prefix-arg) 
		  (lyskom-read-number (lyskom-get-string 'what-private-no)))
Per Cederqvist's avatar
.    
Per Cederqvist committed
792
793
794
		 (t
		  (signal 'lyskom-internal-error '(kom-private-answer))))))
  (if text-no
795
796
797
798
      (lyskom-private-answer-soon
       (blocking-do 'get-text-stat text-no)
       (blocking-do 'get-text text-no)
       text-no)
799
    (lyskom-insert-string 'confusion-who-to-reply-to)))
Per Cederqvist's avatar
.    
Per Cederqvist committed
800
801


802
(defun lyskom-private-answer-soon (text-stat text text-no)
Per Cederqvist's avatar
.    
Per Cederqvist committed
803
  "Write a private answer to TEXT-STAT, TEXT."
804
805
806
807
808
809
  (if (and text-stat text)
      (if (string-match "\n" (text->text-mass text))
	  (lyskom-private-answer text-stat
				 (substring (text->text-mass text)
					    0 (match-beginning 0)))
	(lyskom-private-answer text-stat ""))
810
    (lyskom-format-insert 'no-such-text-no text-no)))
Per Cederqvist's avatar
.    
Per Cederqvist committed
811
812
813
814
815
816


(defun lyskom-private-answer (text-stat subject)
  "Write a private answer. Args: TEXT-STAT SUBJECT."
  (if (null text-stat)
      (progn
817
	(lyskom-insert-string 'confusion-what-to-answer-to))
Per Cederqvist's avatar
.    
Per Cederqvist committed
818
819
820
821
822
823
824
825
826
827
    (progn
      (lyskom-tell-internat 'kom-tell-write-reply)
      (lyskom-edit-text lyskom-proc
			(lyskom-create-misc-list
			 'comm-to (text-stat->text-no text-stat)
			 'recpt (text-stat->author text-stat)
			 'recpt lyskom-pers-no)
			subject ""))))


828
829
830
831
;;; ================================================================
;;;    Personligt svar p} f|reg}ende - kom-private-answer-previous

;;; Author: ceder
832
;;; Rewritten using blocking-do by: Linus Tolke
833

834
(def-kom-command kom-private-answer-previous ()
835
836
837
  "Write a private answer to previously viewed text."
  (interactive)
  (if lyskom-previous-text
838
839
840
      (lyskom-private-answer-soon-prev
       (blocking-do 'get-text-stat lyskom-previous-text)
       (blocking-do 'get-text lyskom-previous-text))
841
    (lyskom-insert-string 'confusion-who-to-reply-to)))
842
843
844
845
846
847
848
849
850
851

(defun lyskom-private-answer-soon-prev (text-stat text)
  "Write a private answer to TEXT-STAT, TEXT."
  (if (string-match "\n" (text->text-mass text))
      (lyskom-private-answer text-stat
			     (substring (text->text-mass text)
					0 (match-beginning 0)))
    (lyskom-private-answer text-stat "")))


Per Cederqvist's avatar
.    
Per Cederqvist committed
852
853
854
855
856
857
858
859
860
861
862
;;; ================================================================
;;;                         Sluta - quit

;;; Author: ???


(defun kom-quit (&optional arg)
  "Quit session. Kill process and buffer-local variables.
If optional argument is non-nil then dont ask for confirmation."
  (interactive "P")
  (lyskom-start-of-command 'kom-quit t)
863
864
865
866
867
868
869
870
871
872
873
874
875
  (let ((do-end-of-command t))
    (unwind-protect
        (setq do-end-of-command
              (cond
               ((and (lyskom-count-down-edits)
                     (display-buffer (car lyskom-list-of-edit-buffers))
                     (not (lyskom-ja-or-nej-p
                           (lyskom-get-string 'quit-in-spite-of-unsent))))
                t)
               ((or arg (lyskom-ja-or-nej-p (lyskom-get-string 'really-quit)))
                (lyskom-quit) nil)
               (t t)))
      (if do-end-of-command (lyskom-end-of-command)))))
876
877
878
879
880


(defun lyskom-quit ()
  "Quit a session. Kill process and buffer-local variables.
Don't ask for confirmation."
Per Cederqvist's avatar
.    
Per Cederqvist committed
881
    (initiate-logout 'main nil)
882
    (setq lyskom-sessions-with-unread
David Kågedal's avatar
David Kågedal committed
883
	  (delq lyskom-buffer lyskom-sessions-with-unread))
David Kågedal's avatar
David Kågedal committed
884
    (setq lyskom-sessions-with-unread-letters
David Kågedal's avatar
David Kågedal committed
885
	  (delq lyskom-buffer lyskom-sessions-with-unread-letters))
Per Cederqvist's avatar
.    
Per Cederqvist committed
886
887
888
889
    (set-process-sentinel lyskom-proc nil)
    (delete-process lyskom-proc)
    (setq lyskom-proc)
    (lyskom-insert-string 'session-ended)
Linus Tolke's avatar
Linus Tolke committed
890
    (lyskom-scroll)
891
    (setq mode-line-process (lyskom-get-string 'mode-line-down))
Linus Tolke's avatar
Linus Tolke committed
892
    (run-hooks 'kom-quit-hook))
Per Cederqvist's avatar
.    
Per Cederqvist committed
893
894
895
896
897
898
899
900
901
902
  

;;; ================================================================
;;;     	[ndra presentation - Change presentation 
;;;	         S{tta lapp p} d|rren - Change conf-motd

;;; Author: Inge Wallin
;;; Changed by Linus Tolke


David Kågedal's avatar
David Kågedal committed
903
(def-kom-command kom-change-presentation ()
Per Cederqvist's avatar
.    
Per Cederqvist committed
904
905
  "Change presentation for a person or a conference."
  (interactive)
David Kågedal's avatar
David Kågedal committed
906
907
908
  (lyskom-change-pres-or-motd-2
   (let ((no (lyskom-read-conf-no 
	      (lyskom-get-string 'what-to-change-pres-you)
909
	      '(all) t nil t)))
David Kågedal's avatar
David Kågedal committed
910
911
912
913
     (if (zerop no)
	 (setq no lyskom-pers-no))
     (blocking-do 'get-conf-stat no))
   'pres))
Per Cederqvist's avatar
.    
Per Cederqvist committed
914
915


David Kågedal's avatar
David Kågedal committed
916
(def-kom-command kom-change-conf-motd ()
Per Cederqvist's avatar
.    
Per Cederqvist committed
917
918
  "Change motd for a person or a conference."
  (interactive)
David Kågedal's avatar
David Kågedal committed
919
920
  (lyskom-change-pres-or-motd-2
   (let ((no (lyskom-read-conf-no (lyskom-get-string 'who-to-put-motd-for)
921
				  '(all) t nil t)))
David Kågedal's avatar
David Kågedal committed
922
923
924
925
     (if (zerop no)
	 (setq no lyskom-pers-no))
     (blocking-do 'get-conf-stat no))
   'motd))
Per Cederqvist's avatar
.    
Per Cederqvist committed
926
927
928
929
930
931
932


(defun lyskom-change-pres-or-motd-2 (conf-stat type)
  "Change the presentation or motd of CONF-STAT.
TYPE is either 'pres or 'motd, depending on what should be changed."
  (cond
   ((null conf-stat)			;+++ annan felhantering
933
    (lyskom-insert-string 'cant-get-conf-stat))
934
   ((or lyskom-is-administrator
935
	(lyskom-get-membership (conf-stat->supervisor conf-stat))
936
	(= lyskom-pers-no (conf-stat->conf-no conf-stat)))
937
938
    (lyskom-dispatch-edit-text
     lyskom-proc
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
     (apply 'lyskom-create-misc-list
	    (append (list 'recpt
			  (cond
			   ((eq type 'motd)
			    (server-info->motd-conf lyskom-server-info))
			   ((eq type 'pres)
			    (if (conf-type->letterbox
				 (conf-stat->conf-type conf-stat))
				(server-info->pers-pres-conf 
				 lyskom-server-info)
			      (server-info->conf-pres-conf
			       lyskom-server-info)))))
		    (if (and (eq type 'pres)
			     (not (zerop (conf-stat->presentation conf-stat))))
			(list 'comm-to
			      (conf-stat->presentation conf-stat)))))
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
     (conf-stat->name conf-stat)
     (let ((text-mass (blocking-do 'get-text 
				   (cond
				    ((eq type 'pres)
				     (conf-stat->presentation conf-stat))
				    ((eq type 'motd)
				     (conf-stat->msg-of-day conf-stat))))))
       (if (and text-mass
		(string-match "\n" (text->text-mass text-mass)))
	   (substring (text->text-mass text-mass) (match-end 0))
	 (if (and (eq type 'pres)
		  (conf-type->letterbox (conf-stat->conf-type conf-stat)))
	     (lyskom-get-string 'presentation-form)
	   "")))
     (cond
      ((eq type 'pres) 'lyskom-set-presentation)
      ((eq type 'motd) 'lyskom-set-conf-motd))
     (conf-stat->conf-no conf-stat)))
Per Cederqvist's avatar
.    
Per Cederqvist committed
973
   (t
974
    (lyskom-format-insert 'not-supervisor-for
975
			  conf-stat))))
Per Cederqvist's avatar
.    
Per Cederqvist committed
976
977
978
979
980
981
982
983
984
985


   

;;; ================================================================
;;;           Ta bort lapp p} d|rren - delete conf-motd

;;; Author: Linus Tolke (& Inge Wallin)


David Kågedal's avatar
David Kågedal committed
986
(def-kom-command kom-unset-conf-motd ()
Per Cederqvist's avatar
.    
Per Cederqvist committed
987
988
  "Removes motd for a person or a conference."
  (interactive)
David Kågedal's avatar
David Kågedal committed
989
990
  (let ((conf-stat (or (lyskom-read-conf-stat
			(lyskom-get-string 'who-to-remove-motd-for)
991
			'(all) t nil t)
David Kågedal's avatar
David Kågedal committed
992
993
994
995
996
		       (blocking-do 'get-conf-stat lyskom-pers-no))))
    (cond
     ((null conf-stat)
      (lyskom-insert-string 'cant-get-conf-stat))
     ((or lyskom-is-administrator
997
	  (lyskom-get-membership (conf-stat->supervisor conf-stat)))
David Kågedal's avatar
David Kågedal committed
998
999
1000
1001
1002
      ;; This works like a dispatch. No error handling.
      (lyskom-set-conf-motd 0 (conf-stat->conf-no conf-stat)))
     (t
      (lyskom-format-insert 'not-supervisor-for
			    conf-stat)))))
Per Cederqvist's avatar
.    
Per Cederqvist committed
1003
1004
1005
1006
1007
1008
1009
  

;;; ================================================================
;;;               G} till M|te - Go to a conference.

;;; Author: ???

1010
(def-kom-command kom-go-to-conf (&optional conf-no)
Per Cederqvist's avatar
.    
Per Cederqvist committed
1011
1012
1013
1014
1015
  "Select a certain conference.
The user is prompted for the name of the conference.
If s/he was already reading a conference that conference will be put
back on lyskom-to-do-list."
  (interactive)
1016
1017
1018
1019
  (let ((conf (if conf-no
                  (blocking-do 'get-conf-stat conf-no)
                (lyskom-read-conf-stat
                 (lyskom-get-string 'go-to-conf-p)
1020
                 '(all) nil "" t))))
1021
1022
1023
1024
1025
1026
1027
1028
    (lyskom-go-to-conf conf)))


(defun lyskom-go-to-conf (conf)
  "Go to the conference in CONF. CONF can be conf-no of conf-stat.
Allowed conferences are conferences and the mailboxes you are 
member of."
  (if (numberp conf) (setq conf (blocking-do 'get-conf-stat conf)))
1029
  (let ((membership (lyskom-get-membership (conf-stat->conf-no conf))))
1030
1031
    (lyskom-format-insert 'go-to-conf
			  conf)
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058

    ;; DEBUG+++
    (let ((lyskom-inhibit-prefetch t))

      (cond
       (membership
	(lyskom-do-go-to-conf conf membership))
       ((conf-type->letterbox (conf-stat->conf-type conf))
	(lyskom-format-insert 'cant-go-to-his-mailbox
			      conf))
       (t
	(progn
	  (lyskom-format-insert 'not-member-of-conf
				conf)
	  (lyskom-scroll)
	  (if (lyskom-j-or-n-p (lyskom-get-string 'want-become-member))
	      (if (lyskom-add-member-by-no (conf-stat->conf-no conf)
					   lyskom-pers-no)
		  (lyskom-do-go-to-conf conf
					(lyskom-get-membership
					 (conf-stat->conf-no conf)))
		(lyskom-insert-string 'nope))
	    (lyskom-insert-string 'no-ok))))))

    ;; DEBUG+++
    (lyskom-continue-prefetch)
    ))
1059
  
Per Cederqvist's avatar
.    
Per Cederqvist committed
1060

David Kågedal's avatar
David Kågedal committed
1061
1062
1063
1064
1065
;; Dead function /davidk 960217
;;(defun lyskom-fixup-and-go-to-conf (conf-no)
;;  "Prefetches and after lyskom-member-in-conf and then goes to CONF-NO."
;;  (lyskom-do-go-to-conf (blocking-do 'get-conf-stat conf-no)
;;			(lyskom-member-p conf-no)))
Per Cederqvist's avatar
.    
Per Cederqvist committed
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075

 
(defun lyskom-do-go-to-conf (conf-stat membership)
  "Go to a conference. Args: CONF-STAT MEMBERSHIP.
 Put a read-info of type CONF first on lyskom-reading-list.
Args: CONF-STAT MEMBERSHIP"
  (let ((priority (lyskom-get-current-priority)))
    (lyskom-maybe-move-unread nil)
    (if conf-stat
	(lyskom-set-mode-line conf-stat))
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
    (let ((r 0)
	  (len (read-list-length lyskom-to-do-list)) 
	  (found nil))
      (while (and (not found)
		  (< r len))
	(if (and (read-info->conf-stat (read-list->nth lyskom-to-do-list r))
		 (= (conf-stat->conf-no conf-stat)
		    (conf-stat->conf-no 
		     (read-info->conf-stat 
		      (read-list->nth lyskom-to-do-list r)))))
	    (setq found t)
	  (++ r)))

      (cond (found
	     (let ((read-info (read-list->nth lyskom-to-do-list r)))
	       (read-list-enter-first read-info lyskom-reading-list)
	       (read-list-delete-read-info (conf-stat->conf-no conf-stat)
					   lyskom-to-do-list)
	       (read-list-enter-first read-info lyskom-to-do-list)
	       (set-read-info->priority read-info priority)
	       (lyskom-enter-conf conf-stat read-info)))
	    (t
	     (lyskom-go-to-empty-conf conf-stat))))))
Per Cederqvist's avatar
.    
Per Cederqvist committed
1099
1100
1101
1102
1103



(defun lyskom-go-to-empty-conf (conf-stat)
  "Go to a conference with no unseen messages. Args: CONF-STAT."
1104
  (blocking-do 'pepsi (conf-stat->conf-no conf-stat))
Per Cederqvist's avatar
.    
Per Cederqvist committed
1105
  (setq lyskom-current-conf (conf-stat->conf-no conf-stat))
1106
1107
  (lyskom-format-insert 'conf-all-read 
			conf-stat))
1108

Per Cederqvist's avatar
.    
Per Cederqvist committed
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125


(defun lyskom-get-current-priority ()
  "Return the current priority level."
  (or (read-info->priority (read-list->first 
			    lyskom-reading-list))
      (read-info->priority (read-list->first
			    lyskom-to-do-list))
      -1))


;;; ================================================================
;;;                 Skriva inl{gg - write text

;;; Author: ???


1126
(def-kom-command kom-write-text ()
Per Cederqvist's avatar
.    
Per Cederqvist committed
1127
1128
  "write a text."
  (interactive)
1129
;  (lyskom-start-of-command 'kom-write-text)
Per Cederqvist's avatar
.    
Per Cederqvist committed
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
  (if (zerop lyskom-current-conf)
      (progn
	(lyskom-insert-string 'no-in-conf)
	(lyskom-end-of-command))
    (lyskom-tell-internat 'kom-tell-write-text)
    (lyskom-edit-text lyskom-proc
		      (lyskom-create-misc-list 'recpt
					       lyskom-current-conf)
		      "" "")))


;;; ================================================================
;;;                 Lista Personer - List persons

;;; Author: ceder
1145
;;; Rewritten: linus
Per Cederqvist's avatar
.    
Per Cederqvist committed
1146

David Kågedal's avatar
David Kågedal committed
1147
(def-kom-command kom-list-persons (match)
Per Cederqvist's avatar
.    
Per Cederqvist committed
1148
  "List all persons whose name matches MATCH (a string)."
1149
1150
  (interactive (list (lyskom-read-string 
		      (lyskom-get-string 'search-for-pers))))
David Kågedal's avatar
David Kågedal committed
1151
1152
  (mapcar
   (function (lambda (no)
1153
	       (lyskom-list-pers-print no)))
David Kågedal's avatar
David Kågedal committed
1154
   (lyskom-extract-persons (blocking-do 'lookup-name match))))
Per Cederqvist's avatar
.    
Per Cederqvist committed
1155
1156


1157
1158
1159
1160
1161
1162
(defun lyskom-list-pers-print (conf-no)
  "Print name of the person CONF-NO for kom-list-persons."
  (lyskom-format-insert "%[%#1@%4#2:p %#3P%]\n"
			(lyskom-default-button 'pers conf-no)
			conf-no
			conf-no))
1163

Per Cederqvist's avatar
.    
Per Cederqvist committed
1164
1165
1166
1167
1168
1169


;;; ================================================================
;;;              Lista M|ten - List conferences

;;; Author: ceder
1170
;;; Rewritten: linus
Per Cederqvist's avatar
.    
Per Cederqvist committed
1171

David Kågedal's avatar
David Kågedal committed
1172
(def-kom-command kom-list-conferences (match)
Per Cederqvist's avatar
.    
Per Cederqvist committed
1173
1174
  "List all conferences whose name matches MATCH (a string).
Those that you are not a member in will be marked with an asterisk."
1175
1176
  (interactive (list (lyskom-read-string
		      (lyskom-get-string 'search-for-conf))))
David Kågedal's avatar
David Kågedal committed
1177
1178
  (mapcar
   (function (lambda (no)
1179
	       (lyskom-list-conf-print no)))
David Kågedal's avatar
David Kågedal committed
1180
   (lyskom-extract-confs (blocking-do 'lookup-name match))))
Per Cederqvist's avatar
.    
Per Cederqvist committed
1181
1182


1183
1184
(defun lyskom-list-conf-print (conf-no)
  "Print a line of info about CONF-NO.
Per Cederqvist's avatar
.    
Per Cederqvist committed
1185
If you are not member in the conference it will be flagged with an asterisk."
1186
1187
1188
  (lyskom-format-insert "%[%#1@%4#2:m %#3c %#4M%]\n"
			(lyskom-default-button 'conf conf-no)
			conf-no
1189
			(if (lyskom-get-membership conf-no)
1190
1191
			    32 ?*)
			conf-no))
1192

1193
1194
1195
1196
1197
;;; ================================================================
;;;                Lista med regexpar - List regexp

(def-kom-command kom-list-re (regexp)
  "List all persons and conferences whose name matches REGEXP."
David Kågedal's avatar
David Kågedal committed
1198
1199
  (interactive (list (lyskom-read-string
		      (lyskom-get-string 'search-re))))
1200
1201
1202
1203
  (lyskom-format-insert 'matching-regexp regexp)
  (let ((conf-list (blocking-do 're-z-lookup regexp 1 1)))
    (mapcar
     (function (lambda (czi)
David Kågedal's avatar
David Kågedal committed
1204
1205
1206
1207
1208
1209
1210
1211
1212
		 (lyskom-format-insert
		  "%[%#1@%4#2:m %#3c %#4:M%]\n"
		  (lyskom-default-button
		   'conf (conf-z-info->conf-no czi))
		  (conf-z-info->conf-no czi)
		  (if (conf-type->letterbox 
		       (conf-z-info->conf-type czi))
		      ?P ?M)
		  (conf-z-info->name czi))))
1213
1214
     (conf-z-info-list->conf-z-infos conf-list))))

Per Cederqvist's avatar
.    
Per Cederqvist committed
1215
1216
1217
1218
1219
1220
1221

;;; ================================================================
;;;                 [ndra namn - Change name

;;; Author: Inge Wallin
;;; Changed by: Peter Eriksson(?)
;;; Changed again: Inge Wallin
1222
;;; Rewritten: linus
Per Cederqvist's avatar
.    
Per Cederqvist committed
1223

Linus Tolke's avatar
Linus Tolke committed
1224

David Kågedal's avatar
David Kågedal committed
1225
(def-kom-command kom-change-name ()
Per Cederqvist's avatar
.    
Per Cederqvist committed
1226
1227
  "Change the name of a person or conference."
  (interactive)
David Kågedal's avatar
David Kågedal committed
1228
1229
  (let ((conf-stat (lyskom-read-conf-stat 
		    (lyskom-get-string 'name-to-be-changed)
1230
		    '(all) nil nil t)))
David Kågedal's avatar
David Kågedal committed
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
    (if (null conf-stat)
	(lyskom-insert-string 'no-such-conf-or-pers)
      (let (name)
	(lyskom-format-insert 'about-to-change-name-from
			      conf-stat)
	(lyskom-scroll)
	(lyskom-tell-internat 'kom-tell-change-name)
	(setq name (lyskom-read-string (lyskom-get-string 'new-name)
				       (conf-stat->name conf-stat)))
	(if (blocking-do 'change-name (conf-stat->conf-no conf-stat) name)
	    (lyskom-format-insert 'change-name-done name
				  (lyskom-default-button 'conf conf-stat))
	  (lyskom-format-insert 'change-name-nope name 
				(lyskom-get-error-text lyskom-errno)
				lyskom-errno))))))
1246
	    
Per Cederqvist's avatar
.    
Per Cederqvist committed
1247
1248
1249
1250
1251
1252


;;; ================================================================
;;;                [ndra organisat|r - Change supervisor

;;; Author: Inge Wallin
1253
;;; Rewritten: linus
Per Cederqvist's avatar
.    
Per Cederqvist committed
1254

David Kågedal's avatar
David Kågedal committed
1255
(def-kom-command kom-change-supervisor ()
Per Cederqvist's avatar
.    
Per Cederqvist committed
1256
1257
  "Change the supervisor of a person or conference."
  (interactive)
David Kågedal's avatar
David Kågedal committed
1258
1259
  (let ((supervisee (lyskom-read-conf-stat
		     (lyskom-get-string 'who-to-change-supervisor-for)
1260
		     '(all) nil nil t)))
David Kågedal's avatar
David Kågedal committed
1261
1262
1263
1264
1265
    (if (null supervisee)
	(lyskom-insert-string 'no-such-conf-or-pers)
      (lyskom-tell-internat 'kom-tell-change-supervisor)
      (let ((supervisor (lyskom-read-conf-stat
			 (lyskom-get-string 'new-supervisor)
1266