ae3c7bae6d216e83b24de3d5c98a0acaf945ca19
[riece] / lisp / riece-message.el
1 ;;; riece-message.el --- generate and display message line
2 ;; Copyright (C) 1999-2003 Daiki Ueno
3
4 ;; Author: Daiki Ueno <ueno@unixuser.org>
5 ;; Keywords: message
6
7 ;; This file is part of Riece.
8
9 ;; This program is free software; you can redistribute it and/or modify
10 ;; it under the terms of the GNU General Public License as published by
11 ;; the Free Software Foundation; either version 2, or (at your option)
12 ;; any later version.
13
14 ;; This program is distributed in the hope that it will be useful,
15 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
16 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 ;; GNU General Public License for more details.
18
19 ;; You should have received a copy of the GNU General Public License
20 ;; along with GNU Emacs; see the file COPYING.  If not, write to the
21 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
22 ;; Boston, MA 02111-1307, USA.
23
24 ;;; Code:
25
26 (eval-when-compile (require 'riece-inlines))
27
28 (require 'riece-identity)
29 (require 'riece-channel)
30 (require 'riece-user)
31 (require 'riece-display)
32 (require 'riece-misc)
33
34 (defgroup riece-message nil
35   "Messages"
36   :tag "Message"
37   :prefix "riece-"
38   :group 'riece)
39
40 (defcustom riece-message-make-open-bracket-function
41   #'riece-message-make-open-bracket
42   "Function which makes `open-bracket' string for each message."
43   :type 'function
44   :group 'riece-message)
45
46 (defcustom riece-message-make-close-bracket-function
47   #'riece-message-make-close-bracket
48   "Function which makes `close-bracket' string for each message."
49   :type 'function
50   :group 'riece-message)
51
52 (defcustom riece-message-make-name-function
53   #'riece-message-make-name
54   "Function which makes local identity for each message."
55   :type 'function
56   :group 'riece-message)
57
58 (defcustom riece-message-make-global-name-function
59   #'riece-message-make-global-name
60   "Function which makes global identity for each message."
61   :type 'function
62   :group 'riece-message)
63
64 (defun riece-message-make-open-bracket (message)
65   "Makes `open-bracket' string for MESSAGE."
66   (if (riece-message-own-p message)
67       ">"
68     (if (eq (riece-message-type message) 'notice)
69         "{"
70       (if (riece-message-private-p message)
71           "="
72         (if (riece-message-external-p message)
73             "("
74           "<")))))
75
76 (defun riece-message-make-close-bracket (message)
77   "Makes `close-bracket' string for MESSAGE."
78   (if (riece-message-own-p message)
79       "<"
80     (if (eq (riece-message-type message) 'notice)
81         "}"
82       (if (riece-message-private-p message)
83           "="
84         (if (riece-message-external-p message)
85             ")"
86           ">")))))
87
88 (defun riece-message-make-name (message)
89   "Makes local identity for MESSAGE."
90   (riece-identity-prefix
91    (if (and (riece-message-private-p message)
92             (riece-message-own-p message))
93        (riece-message-target message)
94      (riece-message-speaker message))))
95
96 (defun riece-message-make-global-name (message)
97   "Makes global identity for MESSAGE."
98   (if (riece-message-private-p message)
99       (if (riece-message-own-p message)
100           (riece-identity-prefix (riece-message-target message))
101         (riece-identity-prefix (riece-message-speaker message)))
102     (concat (riece-identity-prefix (riece-message-target message)) ":"
103             (riece-identity-prefix (riece-message-speaker message)))))
104
105 (defun riece-message-buffer (message)
106   "Return the buffer where MESSAGE should appear."
107   (let* ((target (if (riece-identity-equal-no-server
108                       (riece-message-target message)
109                       (riece-current-nickname))
110                      (riece-message-speaker message)
111                    (riece-message-target message)))
112          (entry (riece-identity-assoc-no-server
113                  target riece-channel-buffer-alist)))
114     (unless entry
115       (riece-join-channel target)
116       ;; If you are not joined any channel,
117       ;; switch to the target immediately.
118       (unless riece-current-channel
119         (riece-switch-to-channel target))
120       (riece-redisplay-buffers)
121       (setq entry (riece-identity-assoc-no-server
122                    target riece-channel-buffer-alist)))
123     (cdr entry)))
124
125 (defun riece-message-parent-buffers (message buffer)
126   "Return the parents of BUFFER where MESSAGE should appear.
127 Normally they are *Dialogue* and/or *Others*."
128   (if (or (and buffer (riece-frozen buffer))
129           (and riece-current-channel
130                (not (riece-identity-equal-no-server
131                      (riece-message-target message)
132                      riece-current-channel))))
133       (list riece-dialogue-buffer riece-others-buffer)
134     riece-dialogue-buffer))
135
136 (defun riece-display-message (message)
137   "Display MESSAGE object."
138   (let ((open-bracket
139          (funcall riece-message-make-open-bracket-function message))
140         (close-bracket
141          (funcall riece-message-make-close-bracket-function message))
142         (name
143          (funcall riece-message-make-name-function message))
144         (global-name
145          (funcall riece-message-make-global-name-function message))
146         (buffer (riece-message-buffer message))
147         parent-buffers)
148     (when (and buffer
149                (riece-message-own-p message)
150                (riece-own-frozen buffer))
151       (with-current-buffer buffer
152         (setq riece-freeze nil))
153       (riece-update-status-indicators))
154     (setq parent-buffers (riece-message-parent-buffers message buffer))
155     (riece-insert buffer
156                   (concat open-bracket name close-bracket
157                           " " (riece-message-text message) "\n"))
158     (riece-insert parent-buffers
159                   (concat
160                    (riece-concat-server-name
161                     (concat open-bracket global-name close-bracket
162                             " " (riece-message-text message)))
163                    "\n"))
164     (run-hook-with-args 'riece-after-display-message-functions message)))
165
166 (defun riece-make-message (speaker target text &optional type own-p)
167   "Make an instance of message object.
168 Arguments are appropriate to the sender, the receiver, and text
169 content, respectively.
170 Optional 4th argument TYPE specifies the type of the message.
171 Currently possible values are `action' and `notice'.
172 Optional 5th argument is the flag to indicate that this message is not
173 from the network."
174   (vector speaker target text type own-p))
175
176 (defun riece-message-speaker (message)
177   "Return the sender of MESSAGE."
178   (aref message 0))
179
180 (defun riece-message-target (message)
181   "Return the receiver of MESSAGE."
182   (aref message 1))
183
184 (defun riece-message-text (message)
185   "Return the text part of MESSAGE."
186   (aref message 2))
187
188 (defun riece-message-type (message)
189   "Return the type of MESSAGE.
190 Currently possible values are `action' and `notice'."
191   (aref message 3))
192
193 (defun riece-message-own-p (message)
194   "Return t if MESSAGE is not from the network."
195   (aref message 4))
196
197 (defun riece-message-private-p (message)
198   "Return t if MESSAGE is a private message."
199   (if (riece-message-own-p message)
200       (not (riece-channel-p (riece-message-target message)))
201     (riece-identity-equal-no-server
202      (riece-message-target message)
203      (riece-current-nickname))))
204
205 (defun riece-message-external-p (message)
206   "Return t if MESSAGE is from outside the channel."
207   (not (riece-identity-member-no-server
208         (riece-message-target message)
209         (mapcar #'riece-make-identity
210                 (riece-user-get-channels (riece-message-speaker message))))))
211
212 (defun riece-own-channel-message (message &optional channel type)
213   "Display MESSAGE as you sent to CHNL."
214   (riece-display-message
215    (riece-make-message (riece-current-nickname)
216                        (or channel riece-current-channel)
217                        message type t)))
218
219 (provide 'riece-message)
220
221 ;;; riece-message.el ends here