annotate mcabber/src/hooks.c @ 830:80434fde7cfa

Display presence notification timestamps when they exist These timestamps were used in the roster, but not in the buffer window message nor in the history logfile. Reported by "ze".
author Mikael Berthe <mikael@lilotux.net>
date Wed, 03 May 2006 11:28:41 +0200
parents 4a6ce276ffca
children 722f186f51c3
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
113
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
1 /*
699
ee03b56b93ee Update Copyright (2006)
Mikael Berthe <mikael@lilotux.net>
parents: 675
diff changeset
2 * hooks.c -- Hooks layer
393
f8f3c7493457 Whitespace cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 391
diff changeset
3 *
699
ee03b56b93ee Update Copyright (2006)
Mikael Berthe <mikael@lilotux.net>
parents: 675
diff changeset
4 * Copyright (C) 2005, 2006 Mikael Berthe <bmikael@lists.lilotux.net>
113
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
5 *
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
6 * This program is free software; you can redistribute it and/or modify
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
7 * it under the terms of the GNU General Public License as published by
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
8 * the Free Software Foundation; either version 2 of the License, or (at
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
9 * your option) any later version.
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
10 *
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
11 * This program is distributed in the hope that it will be useful, but
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
14 * General Public License for more details.
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
15 *
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
16 * You should have received a copy of the GNU General Public License
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
17 * along with this program; if not, write to the Free Software
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
19 * USA
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
20 */
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
21
160
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
22 #include <sys/types.h>
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
23 #include <unistd.h>
524
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 516
diff changeset
24 #include <stdlib.h>
113
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
25
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
26 #include "hooks.h"
378
2e6c7b1440d1 Improve debugging/logging
Mikael Berthe <mikael@lilotux.net>
parents: 374
diff changeset
27 #include "screen.h"
113
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
28 #include "roster.h"
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
29 #include "histolog.h"
325
ff6fb51bfd78 Handle "error" message type
Mikael Berthe <mikael@lilotux.net>
parents: 318
diff changeset
30 #include "hbuf.h"
477
d11e5ce2582c Improve hk_message_in()
Mikael Berthe <mikael@lilotux.net>
parents: 468
diff changeset
31 #include "settings.h"
524
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 516
diff changeset
32 #include "utils.h"
113
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
33
355
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
34 static char *extcmd;
113
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
35
447
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
36 inline void hk_message_in(const char *jid, const char *resname,
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
37 time_t timestamp, const char *msg, const char *type)
113
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
38 {
141
6533a231a65e [/trunk] Changeset 153 by mikael
mikael
parents: 120
diff changeset
39 int new_guy = FALSE;
477
d11e5ce2582c Improve hk_message_in()
Mikael Berthe <mikael@lilotux.net>
parents: 468
diff changeset
40 int is_groupchat = FALSE; // groupchat message
d11e5ce2582c Improve hk_message_in()
Mikael Berthe <mikael@lilotux.net>
parents: 468
diff changeset
41 int is_room = FALSE; // window is a room window
d11e5ce2582c Improve hk_message_in()
Mikael Berthe <mikael@lilotux.net>
parents: 468
diff changeset
42 int log_muc_conf = FALSE;
447
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
43 int message_flags = 0;
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
44 guint rtype = ROSTER_TYPE_USER;
567
6f490c725999 Handle "/me " in messages
Mikael Berthe <mikael@lilotux.net>
parents: 541
diff changeset
45 char *wmsg = NULL, *bmsg = NULL, *mmsg = NULL;
447
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
46 GSList *roster_usr;
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
47
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
48 if (type && !strcmp(type, "groupchat")) {
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
49 rtype = ROSTER_TYPE_ROOM;
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
50 is_groupchat = TRUE;
477
d11e5ce2582c Improve hk_message_in()
Mikael Berthe <mikael@lilotux.net>
parents: 468
diff changeset
51 log_muc_conf = settings_opt_get_int("log_muc_conf");
447
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
52 if (!resname) {
648
16cd6c858a5d MUC: No new_message flag for server messages
Mikael Berthe <mikael@lilotux.net>
parents: 646
diff changeset
53 message_flags = HBB_PREFIX_INFO | HBB_PREFIX_NOFLAG;
447
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
54 resname = "";
646
a8cb28ca5ff4 MUC: Server messages are prefixed with "~ " instead of "<> "
Mikael Berthe <mikael@lilotux.net>
parents: 625
diff changeset
55 bmsg = g_strdup_printf("~ %s", msg);
a8cb28ca5ff4 MUC: Server messages are prefixed with "~ " instead of "<> "
Mikael Berthe <mikael@lilotux.net>
parents: 625
diff changeset
56 } else {
a8cb28ca5ff4 MUC: Server messages are prefixed with "~ " instead of "<> "
Mikael Berthe <mikael@lilotux.net>
parents: 625
diff changeset
57 bmsg = g_strdup_printf("<%s> %s", resname, msg);
447
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
58 }
646
a8cb28ca5ff4 MUC: Server messages are prefixed with "~ " instead of "<> "
Mikael Berthe <mikael@lilotux.net>
parents: 625
diff changeset
59 wmsg = bmsg;
567
6f490c725999 Handle "/me " in messages
Mikael Berthe <mikael@lilotux.net>
parents: 541
diff changeset
60 if (!strncmp(msg, "/me ", 4))
6f490c725999 Handle "/me " in messages
Mikael Berthe <mikael@lilotux.net>
parents: 541
diff changeset
61 wmsg = mmsg = g_strdup_printf("*%s %s", resname, msg+4);
447
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
62 } else {
567
6f490c725999 Handle "/me " in messages
Mikael Berthe <mikael@lilotux.net>
parents: 541
diff changeset
63 if (!strncmp(msg, "/me ", 4))
6f490c725999 Handle "/me " in messages
Mikael Berthe <mikael@lilotux.net>
parents: 541
diff changeset
64 wmsg = mmsg = g_strdup_printf("*%s %s", jid, msg+4);
6f490c725999 Handle "/me " in messages
Mikael Berthe <mikael@lilotux.net>
parents: 541
diff changeset
65 else
6f490c725999 Handle "/me " in messages
Mikael Berthe <mikael@lilotux.net>
parents: 541
diff changeset
66 wmsg = (char*) msg;
447
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
67 }
141
6533a231a65e [/trunk] Changeset 153 by mikael
mikael
parents: 120
diff changeset
68
6533a231a65e [/trunk] Changeset 153 by mikael
mikael
parents: 120
diff changeset
69 // If this user isn't in the roster, we add it
483
4a10c04ac2fb Fix a bug in roster_find()
Mikael Berthe <mikael@lilotux.net>
parents: 479
diff changeset
70 roster_usr = roster_find(jid, jidsearch, 0);
447
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
71 if (!roster_usr) {
141
6533a231a65e [/trunk] Changeset 153 by mikael
mikael
parents: 120
diff changeset
72 new_guy = TRUE;
603
9516db839e08 Store subscription data
Mikael Berthe <mikael@lilotux.net>
parents: 591
diff changeset
73 roster_usr = roster_add_user(jid, NULL, NULL, rtype, sub_none);
477
d11e5ce2582c Improve hk_message_in()
Mikael Berthe <mikael@lilotux.net>
parents: 468
diff changeset
74 if (!roster_usr) { // Shouldn't happen...
d11e5ce2582c Improve hk_message_in()
Mikael Berthe <mikael@lilotux.net>
parents: 468
diff changeset
75 scr_LogPrint(LPRINT_LOGNORM, "ERROR: unable to add buddy!");
774
46304b773a44 Remove useless checks before g_free() calls
Mikael Berthe <mikael@lilotux.net>
parents: 772
diff changeset
76 g_free(bmsg);
46304b773a44 Remove useless checks before g_free() calls
Mikael Berthe <mikael@lilotux.net>
parents: 772
diff changeset
77 g_free(mmsg);
477
d11e5ce2582c Improve hk_message_in()
Mikael Berthe <mikael@lilotux.net>
parents: 468
diff changeset
78 return;
d11e5ce2582c Improve hk_message_in()
Mikael Berthe <mikael@lilotux.net>
parents: 468
diff changeset
79 }
489
21ab22a60bcb Auto-convert a roster item to "room" type when receiving a groupchat message
Mikael Berthe <mikael@lilotux.net>
parents: 485
diff changeset
80 } else if (is_groupchat) {
21ab22a60bcb Auto-convert a roster item to "room" type when receiving a groupchat message
Mikael Berthe <mikael@lilotux.net>
parents: 485
diff changeset
81 // Make sure the type is ROOM
21ab22a60bcb Auto-convert a roster item to "room" type when receiving a groupchat message
Mikael Berthe <mikael@lilotux.net>
parents: 485
diff changeset
82 buddy_settype(roster_usr->data, ROSTER_TYPE_ROOM);
477
d11e5ce2582c Improve hk_message_in()
Mikael Berthe <mikael@lilotux.net>
parents: 468
diff changeset
83 }
d11e5ce2582c Improve hk_message_in()
Mikael Berthe <mikael@lilotux.net>
parents: 468
diff changeset
84
d11e5ce2582c Improve hk_message_in()
Mikael Berthe <mikael@lilotux.net>
parents: 468
diff changeset
85 is_room = !!(buddy_gettype(roster_usr->data) & ROSTER_TYPE_ROOM);
d11e5ce2582c Improve hk_message_in()
Mikael Berthe <mikael@lilotux.net>
parents: 468
diff changeset
86
728
421b337dc6d2 Chat window: Highlight the flag in our messages
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
87 if (is_room) {
421b337dc6d2 Chat window: Highlight the flag in our messages
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
88 if (!is_groupchat) {
421b337dc6d2 Chat window: Highlight the flag in our messages
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
89 // This is a private message from a room participant
734
1d9f0efcfcee MUC: Do not mark error messages as private
Mikael Berthe <mikael@lilotux.net>
parents: 729
diff changeset
90 if (!resname) {
728
421b337dc6d2 Chat window: Highlight the flag in our messages
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
91 resname = "";
734
1d9f0efcfcee MUC: Do not mark error messages as private
Mikael Berthe <mikael@lilotux.net>
parents: 729
diff changeset
92 wmsg = bmsg = g_strdup(msg);
1d9f0efcfcee MUC: Do not mark error messages as private
Mikael Berthe <mikael@lilotux.net>
parents: 729
diff changeset
93 } else {
1d9f0efcfcee MUC: Do not mark error messages as private
Mikael Berthe <mikael@lilotux.net>
parents: 729
diff changeset
94 wmsg = bmsg = g_strdup_printf("PRIV#<%s> %s", resname, msg);
1d9f0efcfcee MUC: Do not mark error messages as private
Mikael Berthe <mikael@lilotux.net>
parents: 729
diff changeset
95 if (!strncmp(msg, "/me ", 4))
1d9f0efcfcee MUC: Do not mark error messages as private
Mikael Berthe <mikael@lilotux.net>
parents: 729
diff changeset
96 wmsg = mmsg = g_strdup_printf("PRIV#*%s %s", resname, msg+4);
1d9f0efcfcee MUC: Do not mark error messages as private
Mikael Berthe <mikael@lilotux.net>
parents: 729
diff changeset
97 }
728
421b337dc6d2 Chat window: Highlight the flag in our messages
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
98 } else {
421b337dc6d2 Chat window: Highlight the flag in our messages
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
99 // This is a regular chatroom message.
421b337dc6d2 Chat window: Highlight the flag in our messages
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
100 // Let's see if we are the message sender, in which case we'll
421b337dc6d2 Chat window: Highlight the flag in our messages
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
101 // highlight it.
421b337dc6d2 Chat window: Highlight the flag in our messages
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
102 const char *nick = buddy_getnickname(roster_usr->data);
421b337dc6d2 Chat window: Highlight the flag in our messages
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
103 if (resname && nick && !strcmp(resname, nick))
421b337dc6d2 Chat window: Highlight the flag in our messages
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
104 message_flags |= HBB_PREFIX_HLIGHT;
421b337dc6d2 Chat window: Highlight the flag in our messages
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
105 }
141
6533a231a65e [/trunk] Changeset 153 by mikael
mikael
parents: 120
diff changeset
106 }
6533a231a65e [/trunk] Changeset 153 by mikael
mikael
parents: 120
diff changeset
107
325
ff6fb51bfd78 Handle "error" message type
Mikael Berthe <mikael@lilotux.net>
parents: 318
diff changeset
108 if (type && !strcmp(type, "error")) {
ff6fb51bfd78 Handle "error" message type
Mikael Berthe <mikael@lilotux.net>
parents: 318
diff changeset
109 message_flags = HBB_PREFIX_ERR | HBB_PREFIX_IN;
374
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 364
diff changeset
110 scr_LogPrint(LPRINT_LOGNORM, "Error message received from <%s>", jid);
447
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
111 }
325
ff6fb51bfd78 Handle "error" message type
Mikael Berthe <mikael@lilotux.net>
parents: 318
diff changeset
112
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 160
diff changeset
113 // Note: the hlog_write should not be called first, because in some
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 160
diff changeset
114 // cases scr_WriteIncomingMessage() will load the history and we'd
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 160
diff changeset
115 // have the message twice...
447
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
116 scr_WriteIncomingMessage(jid, wmsg, timestamp, message_flags);
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
117
567
6f490c725999 Handle "/me " in messages
Mikael Berthe <mikael@lilotux.net>
parents: 541
diff changeset
118 // We don't log the modified message, but the original one
6f490c725999 Handle "/me " in messages
Mikael Berthe <mikael@lilotux.net>
parents: 541
diff changeset
119 if (wmsg == mmsg)
6f490c725999 Handle "/me " in messages
Mikael Berthe <mikael@lilotux.net>
parents: 541
diff changeset
120 wmsg = bmsg;
6f490c725999 Handle "/me " in messages
Mikael Berthe <mikael@lilotux.net>
parents: 541
diff changeset
121
477
d11e5ce2582c Improve hk_message_in()
Mikael Berthe <mikael@lilotux.net>
parents: 468
diff changeset
122 // - We don't log the message if it is an error message
d11e5ce2582c Improve hk_message_in()
Mikael Berthe <mikael@lilotux.net>
parents: 468
diff changeset
123 // - We don't log the message if it is a private conf. message
d11e5ce2582c Improve hk_message_in()
Mikael Berthe <mikael@lilotux.net>
parents: 468
diff changeset
124 // - We don't log the message if it is groupchat message and the log_muc_conf
d11e5ce2582c Improve hk_message_in()
Mikael Berthe <mikael@lilotux.net>
parents: 468
diff changeset
125 // option is off (and it is not a history line)
d11e5ce2582c Improve hk_message_in()
Mikael Berthe <mikael@lilotux.net>
parents: 468
diff changeset
126 if (!(message_flags & HBB_PREFIX_ERR) &&
d11e5ce2582c Improve hk_message_in()
Mikael Berthe <mikael@lilotux.net>
parents: 468
diff changeset
127 (!is_room || (is_groupchat && log_muc_conf && !timestamp)))
447
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
128 hlog_write_message(jid, timestamp, FALSE, wmsg);
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
129
355
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
130 // External command
477
d11e5ce2582c Improve hk_message_in()
Mikael Berthe <mikael@lilotux.net>
parents: 468
diff changeset
131 // - We do not call hk_ext_cmd() for history lines in MUC
d11e5ce2582c Improve hk_message_in()
Mikael Berthe <mikael@lilotux.net>
parents: 468
diff changeset
132 // - We do call hk_ext_cmd() for private messages in a room
d11e5ce2582c Improve hk_message_in()
Mikael Berthe <mikael@lilotux.net>
parents: 468
diff changeset
133 if ((is_groupchat && !timestamp) || !is_groupchat)
524
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 516
diff changeset
134 hk_ext_cmd(jid, (is_groupchat ? 'G' : 'M'), 'R', wmsg);
447
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
135
808
4a6ce276ffca New option "log_display_sender"
Mikael Berthe <mikael@lilotux.net>
parents: 774
diff changeset
136 // Display the sender in the log window
4a6ce276ffca New option "log_display_sender"
Mikael Berthe <mikael@lilotux.net>
parents: 774
diff changeset
137 if ((!is_groupchat) && !(message_flags & HBB_PREFIX_ERR) &&
4a6ce276ffca New option "log_display_sender"
Mikael Berthe <mikael@lilotux.net>
parents: 774
diff changeset
138 settings_opt_get_int("log_display_sender")) {
4a6ce276ffca New option "log_display_sender"
Mikael Berthe <mikael@lilotux.net>
parents: 774
diff changeset
139 const char *name = roster_getname(jid);
4a6ce276ffca New option "log_display_sender"
Mikael Berthe <mikael@lilotux.net>
parents: 774
diff changeset
140 if (!name) name = "";
4a6ce276ffca New option "log_display_sender"
Mikael Berthe <mikael@lilotux.net>
parents: 774
diff changeset
141 scr_LogPrint(LPRINT_NORMAL, "Message received from %s <%s/%s>",
4a6ce276ffca New option "log_display_sender"
Mikael Berthe <mikael@lilotux.net>
parents: 774
diff changeset
142 name, jid, resname);
4a6ce276ffca New option "log_display_sender"
Mikael Berthe <mikael@lilotux.net>
parents: 774
diff changeset
143 }
4a6ce276ffca New option "log_display_sender"
Mikael Berthe <mikael@lilotux.net>
parents: 774
diff changeset
144
675
ae7016aae014 New "beep_on_message" option
Mikael Berthe <mikael@lilotux.net>
parents: 656
diff changeset
145 // Beep, if enabled
ae7016aae014 New "beep_on_message" option
Mikael Berthe <mikael@lilotux.net>
parents: 656
diff changeset
146 if (settings_opt_get_int("beep_on_message"))
ae7016aae014 New "beep_on_message" option
Mikael Berthe <mikael@lilotux.net>
parents: 656
diff changeset
147 scr_Beep();
ae7016aae014 New "beep_on_message" option
Mikael Berthe <mikael@lilotux.net>
parents: 656
diff changeset
148
146
50f23c38743a [/trunk] Changeset 158 by mikael
mikael
parents: 141
diff changeset
149 // We need to rebuild the list if the sender is unknown or
50f23c38743a [/trunk] Changeset 158 by mikael
mikael
parents: 141
diff changeset
150 // if the sender is offline/invisible and hide_offline_buddies is set
50f23c38743a [/trunk] Changeset 158 by mikael
mikael
parents: 141
diff changeset
151 if (new_guy ||
477
d11e5ce2582c Improve hk_message_in()
Mikael Berthe <mikael@lilotux.net>
parents: 468
diff changeset
152 (buddy_getstatus(roster_usr->data, NULL) == offline &&
438
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
153 buddylist_get_hide_offline_buddies()))
146
50f23c38743a [/trunk] Changeset 158 by mikael
mikael
parents: 141
diff changeset
154 {
141
6533a231a65e [/trunk] Changeset 153 by mikael
mikael
parents: 120
diff changeset
155 buddylist_build();
6533a231a65e [/trunk] Changeset 153 by mikael
mikael
parents: 120
diff changeset
156 update_roster = TRUE;
6533a231a65e [/trunk] Changeset 153 by mikael
mikael
parents: 120
diff changeset
157 }
447
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
158
774
46304b773a44 Remove useless checks before g_free() calls
Mikael Berthe <mikael@lilotux.net>
parents: 772
diff changeset
159 g_free(bmsg);
46304b773a44 Remove useless checks before g_free() calls
Mikael Berthe <mikael@lilotux.net>
parents: 772
diff changeset
160 g_free(mmsg);
113
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
161 }
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
162
484
00e2d3821a5b Display PRIV for private messages in a room when using /say_to
Mikael Berthe <mikael@lilotux.net>
parents: 483
diff changeset
163 // hk_message_out()
00e2d3821a5b Display PRIV for private messages in a room when using /say_to
Mikael Berthe <mikael@lilotux.net>
parents: 483
diff changeset
164 // nick should be set for private messages in a chat room, and null for
00e2d3821a5b Display PRIV for private messages in a room when using /say_to
Mikael Berthe <mikael@lilotux.net>
parents: 483
diff changeset
165 // normal messages.
00e2d3821a5b Display PRIV for private messages in a room when using /say_to
Mikael Berthe <mikael@lilotux.net>
parents: 483
diff changeset
166 inline void hk_message_out(const char *jid, const char *nick,
00e2d3821a5b Display PRIV for private messages in a room when using /say_to
Mikael Berthe <mikael@lilotux.net>
parents: 483
diff changeset
167 time_t timestamp, const char *msg)
113
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
168 {
772
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 735
diff changeset
169 char *wmsg = NULL, *bmsg = NULL, *mmsg = NULL;
484
00e2d3821a5b Display PRIV for private messages in a room when using /say_to
Mikael Berthe <mikael@lilotux.net>
parents: 483
diff changeset
170
567
6f490c725999 Handle "/me " in messages
Mikael Berthe <mikael@lilotux.net>
parents: 541
diff changeset
171 if (nick) {
6f490c725999 Handle "/me " in messages
Mikael Berthe <mikael@lilotux.net>
parents: 541
diff changeset
172 wmsg = bmsg = g_strdup_printf("PRIV#<%s> %s", nick, msg);
6f490c725999 Handle "/me " in messages
Mikael Berthe <mikael@lilotux.net>
parents: 541
diff changeset
173 } else {
6f490c725999 Handle "/me " in messages
Mikael Berthe <mikael@lilotux.net>
parents: 541
diff changeset
174 wmsg = (char*)msg;
6f490c725999 Handle "/me " in messages
Mikael Berthe <mikael@lilotux.net>
parents: 541
diff changeset
175 if (!strncmp(msg, "/me ", 4)) {
6f490c725999 Handle "/me " in messages
Mikael Berthe <mikael@lilotux.net>
parents: 541
diff changeset
176 const char *myid = settings_opt_get("username");
6f490c725999 Handle "/me " in messages
Mikael Berthe <mikael@lilotux.net>
parents: 541
diff changeset
177 if (myid)
6f490c725999 Handle "/me " in messages
Mikael Berthe <mikael@lilotux.net>
parents: 541
diff changeset
178 wmsg = mmsg = g_strdup_printf("*%s %s", settings_opt_get("username"),
6f490c725999 Handle "/me " in messages
Mikael Berthe <mikael@lilotux.net>
parents: 541
diff changeset
179 msg+4);
6f490c725999 Handle "/me " in messages
Mikael Berthe <mikael@lilotux.net>
parents: 541
diff changeset
180 }
6f490c725999 Handle "/me " in messages
Mikael Berthe <mikael@lilotux.net>
parents: 541
diff changeset
181 }
484
00e2d3821a5b Display PRIV for private messages in a room when using /say_to
Mikael Berthe <mikael@lilotux.net>
parents: 483
diff changeset
182
485
55aa45eb7ece Fix a small display bug
Mikael Berthe <mikael@lilotux.net>
parents: 484
diff changeset
183 // Note: the hlog_write should not be called first, because in some
55aa45eb7ece Fix a small display bug
Mikael Berthe <mikael@lilotux.net>
parents: 484
diff changeset
184 // cases scr_WriteOutgoingMessage() will load the history and we'd
55aa45eb7ece Fix a small display bug
Mikael Berthe <mikael@lilotux.net>
parents: 484
diff changeset
185 // have the message twice...
484
00e2d3821a5b Display PRIV for private messages in a room when using /say_to
Mikael Berthe <mikael@lilotux.net>
parents: 483
diff changeset
186 scr_WriteOutgoingMessage(jid, wmsg);
485
55aa45eb7ece Fix a small display bug
Mikael Berthe <mikael@lilotux.net>
parents: 484
diff changeset
187
55aa45eb7ece Fix a small display bug
Mikael Berthe <mikael@lilotux.net>
parents: 484
diff changeset
188 // We don't log private messages
55aa45eb7ece Fix a small display bug
Mikael Berthe <mikael@lilotux.net>
parents: 484
diff changeset
189 if (!nick) hlog_write_message(jid, timestamp, TRUE, msg);
55aa45eb7ece Fix a small display bug
Mikael Berthe <mikael@lilotux.net>
parents: 484
diff changeset
190
355
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
191 // External command
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
192 hk_ext_cmd(jid, 'M', 'S', NULL);
484
00e2d3821a5b Display PRIV for private messages in a room when using /say_to
Mikael Berthe <mikael@lilotux.net>
parents: 483
diff changeset
193
774
46304b773a44 Remove useless checks before g_free() calls
Mikael Berthe <mikael@lilotux.net>
parents: 772
diff changeset
194 g_free(bmsg);
46304b773a44 Remove useless checks before g_free() calls
Mikael Berthe <mikael@lilotux.net>
parents: 772
diff changeset
195 g_free(mmsg);
113
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
196 }
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
197
438
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
198 inline void hk_statuschange(const char *jid, const char *resname, gchar prio,
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
199 time_t timestamp, enum imstatus status,
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
200 const char *status_msg)
113
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
201 {
510
6c3cd3aa4a91 New 'buddy_format' option
Mikael Berthe <mikael@lilotux.net>
parents: 489
diff changeset
202 int buddy_format;
516
e5008032edb8 Add option 'show_status_in_buffer'
Mikael Berthe <mikael@lilotux.net>
parents: 514
diff changeset
203 int st_in_buf;
e5008032edb8 Add option 'show_status_in_buffer'
Mikael Berthe <mikael@lilotux.net>
parents: 514
diff changeset
204 enum imstatus oldstat;
510
6c3cd3aa4a91 New 'buddy_format' option
Mikael Berthe <mikael@lilotux.net>
parents: 489
diff changeset
205 char *bn = NULL;
655
de6837908702 Use "(...)" when cutting a multi-line status message in the log window
Mikael Berthe <mikael@lilotux.net>
parents: 648
diff changeset
206 char *logsmsg;
614
d3020b2c4da2 Show empty resources
Mikael Berthe <mikael@lilotux.net>
parents: 603
diff changeset
207 const char *rn = (resname ? resname : "");
510
6c3cd3aa4a91 New 'buddy_format' option
Mikael Berthe <mikael@lilotux.net>
parents: 489
diff changeset
208
516
e5008032edb8 Add option 'show_status_in_buffer'
Mikael Berthe <mikael@lilotux.net>
parents: 514
diff changeset
209 st_in_buf = settings_opt_get_int("show_status_in_buffer");
510
6c3cd3aa4a91 New 'buddy_format' option
Mikael Berthe <mikael@lilotux.net>
parents: 489
diff changeset
210 buddy_format = settings_opt_get_int("buddy_format");
6c3cd3aa4a91 New 'buddy_format' option
Mikael Berthe <mikael@lilotux.net>
parents: 489
diff changeset
211 if (buddy_format) {
6c3cd3aa4a91 New 'buddy_format' option
Mikael Berthe <mikael@lilotux.net>
parents: 489
diff changeset
212 const char *name = roster_getname(jid);
6c3cd3aa4a91 New 'buddy_format' option
Mikael Berthe <mikael@lilotux.net>
parents: 489
diff changeset
213 if (name && strcmp(name, jid)) {
6c3cd3aa4a91 New 'buddy_format' option
Mikael Berthe <mikael@lilotux.net>
parents: 489
diff changeset
214 if (buddy_format == 1)
6c3cd3aa4a91 New 'buddy_format' option
Mikael Berthe <mikael@lilotux.net>
parents: 489
diff changeset
215 bn = g_strdup_printf("%s <%s/%s>", name, jid, rn);
6c3cd3aa4a91 New 'buddy_format' option
Mikael Berthe <mikael@lilotux.net>
parents: 489
diff changeset
216 else if (buddy_format == 2)
6c3cd3aa4a91 New 'buddy_format' option
Mikael Berthe <mikael@lilotux.net>
parents: 489
diff changeset
217 bn = g_strdup_printf("%s/%s", name, rn);
6c3cd3aa4a91 New 'buddy_format' option
Mikael Berthe <mikael@lilotux.net>
parents: 489
diff changeset
218 else if (buddy_format == 3)
6c3cd3aa4a91 New 'buddy_format' option
Mikael Berthe <mikael@lilotux.net>
parents: 489
diff changeset
219 bn = g_strdup_printf("%s", name);
6c3cd3aa4a91 New 'buddy_format' option
Mikael Berthe <mikael@lilotux.net>
parents: 489
diff changeset
220 }
6c3cd3aa4a91 New 'buddy_format' option
Mikael Berthe <mikael@lilotux.net>
parents: 489
diff changeset
221 }
6c3cd3aa4a91 New 'buddy_format' option
Mikael Berthe <mikael@lilotux.net>
parents: 489
diff changeset
222
6c3cd3aa4a91 New 'buddy_format' option
Mikael Berthe <mikael@lilotux.net>
parents: 489
diff changeset
223 if (!bn) {
6c3cd3aa4a91 New 'buddy_format' option
Mikael Berthe <mikael@lilotux.net>
parents: 489
diff changeset
224 bn = g_strdup_printf("<%s/%s>", jid, rn);
6c3cd3aa4a91 New 'buddy_format' option
Mikael Berthe <mikael@lilotux.net>
parents: 489
diff changeset
225 }
6c3cd3aa4a91 New 'buddy_format' option
Mikael Berthe <mikael@lilotux.net>
parents: 489
diff changeset
226
591
5a685e9012b4 Show only the 1st line of the status message, in the log window
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
227 logsmsg = g_strdup(status_msg ? status_msg : "");
655
de6837908702 Use "(...)" when cutting a multi-line status message in the log window
Mikael Berthe <mikael@lilotux.net>
parents: 648
diff changeset
228 replace_nl_with_dots(logsmsg);
591
5a685e9012b4 Show only the 1st line of the status message, in the log window
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
229
516
e5008032edb8 Add option 'show_status_in_buffer'
Mikael Berthe <mikael@lilotux.net>
parents: 514
diff changeset
230 oldstat = roster_getstatus(jid, resname);
510
6c3cd3aa4a91 New 'buddy_format' option
Mikael Berthe <mikael@lilotux.net>
parents: 489
diff changeset
231 scr_LogPrint(LPRINT_LOGNORM, "Buddy status has changed: [%c>%c] %s %s",
591
5a685e9012b4 Show only the 1st line of the status message, in the log window
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
232 imstatus2char[oldstat], imstatus2char[status], bn, logsmsg);
5a685e9012b4 Show only the 1st line of the status message, in the log window
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
233 g_free(logsmsg);
510
6c3cd3aa4a91 New 'buddy_format' option
Mikael Berthe <mikael@lilotux.net>
parents: 489
diff changeset
234 g_free(bn);
514
979eb0fe2969 Show status changes in buddy window, if it is open
Mikael Berthe <mikael@lilotux.net>
parents: 510
diff changeset
235
516
e5008032edb8 Add option 'show_status_in_buffer'
Mikael Berthe <mikael@lilotux.net>
parents: 514
diff changeset
236 if (st_in_buf == 2 ||
e5008032edb8 Add option 'show_status_in_buffer'
Mikael Berthe <mikael@lilotux.net>
parents: 514
diff changeset
237 (st_in_buf == 1 && (status == offline || oldstat == offline))) {
e5008032edb8 Add option 'show_status_in_buffer'
Mikael Berthe <mikael@lilotux.net>
parents: 514
diff changeset
238 // Write the status change in the buddy's buffer, only if it already exists
e5008032edb8 Add option 'show_status_in_buffer'
Mikael Berthe <mikael@lilotux.net>
parents: 514
diff changeset
239 if (scr_BuddyBufferExists(jid)) {
e5008032edb8 Add option 'show_status_in_buffer'
Mikael Berthe <mikael@lilotux.net>
parents: 514
diff changeset
240 bn = g_strdup_printf("Buddy status has changed: [%c>%c] %s",
e5008032edb8 Add option 'show_status_in_buffer'
Mikael Berthe <mikael@lilotux.net>
parents: 514
diff changeset
241 imstatus2char[oldstat], imstatus2char[status],
e5008032edb8 Add option 'show_status_in_buffer'
Mikael Berthe <mikael@lilotux.net>
parents: 514
diff changeset
242 ((status_msg) ? status_msg : ""));
830
80434fde7cfa Display presence notification timestamps when they exist
Mikael Berthe <mikael@lilotux.net>
parents: 808
diff changeset
243 scr_WriteIncomingMessage(jid, bn, timestamp,
80434fde7cfa Display presence notification timestamps when they exist
Mikael Berthe <mikael@lilotux.net>
parents: 808
diff changeset
244 HBB_PREFIX_INFO|HBB_PREFIX_NOFLAG);
516
e5008032edb8 Add option 'show_status_in_buffer'
Mikael Berthe <mikael@lilotux.net>
parents: 514
diff changeset
245 g_free(bn);
e5008032edb8 Add option 'show_status_in_buffer'
Mikael Berthe <mikael@lilotux.net>
parents: 514
diff changeset
246 }
514
979eb0fe2969 Show status changes in buddy window, if it is open
Mikael Berthe <mikael@lilotux.net>
parents: 510
diff changeset
247 }
979eb0fe2969 Show status changes in buddy window, if it is open
Mikael Berthe <mikael@lilotux.net>
parents: 510
diff changeset
248
625
028c01940490 Show presence timestamps in "/info" and "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 614
diff changeset
249 roster_setstatus(jid, rn, prio, status, status_msg, timestamp,
028c01940490 Show presence timestamps in "/info" and "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 614
diff changeset
250 role_none, affil_none, NULL);
120
cfd3df636d5f [/trunk] Changeset 133 by mikael
mikael
parents: 118
diff changeset
251 buddylist_build();
cfd3df636d5f [/trunk] Changeset 133 by mikael
mikael
parents: 118
diff changeset
252 scr_DrawRoster();
830
80434fde7cfa Display presence notification timestamps when they exist
Mikael Berthe <mikael@lilotux.net>
parents: 808
diff changeset
253 hlog_write_status(jid, timestamp, status, status_msg);
355
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
254 // External command
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
255 hk_ext_cmd(jid, 'S', imstatus2char[status], NULL);
113
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
256 }
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
257
536
56f641155579 Status change was not displayed when same status but message removed
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
258 inline void hk_mystatuschange(time_t timestamp, enum imstatus old_status,
56f641155579 Status change was not displayed when same status but message removed
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
259 enum imstatus new_status, const char *msg)
116
1e7e59775f12 [/trunk] Changeset 130 by mikael
mikael
parents: 115
diff changeset
260 {
541
87165382e4ce Fix error introduced in changeset 56f641155579
Mikael Berthe <mikael@lilotux.net>
parents: 536
diff changeset
261 scr_LogPrint(LPRINT_LOGNORM, "Your status has been set: [%c>%c] %s",
536
56f641155579 Status change was not displayed when same status but message removed
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
262 imstatus2char[old_status], imstatus2char[new_status],
56f641155579 Status change was not displayed when same status but message removed
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
263 (msg ? msg : ""));
116
1e7e59775f12 [/trunk] Changeset 130 by mikael
mikael
parents: 115
diff changeset
264 //hlog_write_status(NULL, 0, status);
1e7e59775f12 [/trunk] Changeset 130 by mikael
mikael
parents: 115
diff changeset
265 }
1e7e59775f12 [/trunk] Changeset 130 by mikael
mikael
parents: 115
diff changeset
266
160
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
267
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
268 /* External commands */
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
269
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
270 // hk_ext_cmd_init()
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
271 // Initialize external command variable.
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
272 // Can be called with parameter NULL to reset and free memory.
281
f562b9af2de7 Add "const" specifier in prototypes
Mikael Berthe <mikael@lilotux.net>
parents: 221
diff changeset
273 void hk_ext_cmd_init(const char *command)
160
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
274 {
355
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
275 if (extcmd) {
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
276 g_free(extcmd);
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
277 extcmd = NULL;
160
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
278 }
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
279 if (command)
355
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
280 extcmd = g_strdup(command);
160
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
281 }
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
282
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
283 // hk_ext_cmd()
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
284 // Launch an external command (process) for the given event.
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
285 // For now, data should be NULL.
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
286 void hk_ext_cmd(const char *jid, guchar type, guchar info, const char *data)
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
287 {
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
288 pid_t pid;
355
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
289 char *arg_type = NULL;
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
290 char *arg_info = NULL;
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
291 char *arg_data = NULL;
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
292 char status_str[2];
524
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 516
diff changeset
293 char *datafname = NULL;
160
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
294
355
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
295 if (!extcmd) return;
160
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
296
355
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
297 // Prepare arg_* (external command parameters)
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
298 switch (type) {
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
299 case 'M':
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
300 arg_type = "MSG";
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
301 if (info == 'R')
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
302 arg_info = "IN";
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
303 else if (info == 'S')
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
304 arg_info = "OUT";
453
39e173645f9c External command is called for MUC messages
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
305 break;
39e173645f9c External command is called for MUC messages
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
306 case 'G':
39e173645f9c External command is called for MUC messages
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
307 arg_type = "MSG";
39e173645f9c External command is called for MUC messages
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
308 arg_info = "MUC";
355
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
309 break;
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
310 case 'S':
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
311 arg_type = "STATUS";
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
312 if (strchr(imstatus2char, tolower(info))) {
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
313 status_str[0] = toupper(info);
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
314 status_str[1] = 0;
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
315 arg_info = status_str;
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
316 }
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
317 break;
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
318 default:
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
319 return;
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
320 }
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
321
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
322 if (!arg_type || !arg_info) return;
160
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
323
524
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 516
diff changeset
324 if (strchr("MG", type) && data && settings_opt_get_int("event_log_files")) {
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 516
diff changeset
325 int fd;
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 516
diff changeset
326 const char *prefix;
772
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 735
diff changeset
327 char *data_locale;
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 735
diff changeset
328
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 735
diff changeset
329 data_locale = from_utf8(data);
524
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 516
diff changeset
330 prefix = settings_opt_get("event_log_dir");
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 516
diff changeset
331 if (!prefix)
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 516
diff changeset
332 prefix = ut_get_tmpdir();
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 516
diff changeset
333 datafname = g_strdup_printf("%s/mcabber-%d.XXXXXX", prefix, getpid());
772
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 735
diff changeset
334
524
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 516
diff changeset
335 // XXX Some old systems may require us to set umask first.
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 516
diff changeset
336 fd = mkstemp(datafname);
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 516
diff changeset
337 if (fd == -1) {
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 516
diff changeset
338 g_free(datafname);
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 516
diff changeset
339 datafname = NULL;
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 516
diff changeset
340 scr_LogPrint(LPRINT_LOGNORM,
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 516
diff changeset
341 "Unable to create temp file for external command.");
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 516
diff changeset
342 }
772
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 735
diff changeset
343 write(fd, data_locale, strlen(data_locale));
524
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 516
diff changeset
344 write(fd, "\n", 1);
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 516
diff changeset
345 close(fd);
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 516
diff changeset
346 arg_data = datafname;
772
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 735
diff changeset
347 g_free(data_locale);
524
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 516
diff changeset
348 }
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 516
diff changeset
349
160
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
350 if ((pid=fork()) == -1) {
374
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 364
diff changeset
351 scr_LogPrint(LPRINT_LOGNORM, "Fork error, cannot launch external command.");
774
46304b773a44 Remove useless checks before g_free() calls
Mikael Berthe <mikael@lilotux.net>
parents: 772
diff changeset
352 g_free(datafname);
160
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
353 return;
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
354 }
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
355
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
356 if (pid == 0) { // child
656
29a0637c176f Close standard fds before launching the eventcmd process
Mikael Berthe <mikael@lilotux.net>
parents: 655
diff changeset
357 // Close standard file descriptors
29a0637c176f Close standard fds before launching the eventcmd process
Mikael Berthe <mikael@lilotux.net>
parents: 655
diff changeset
358 close(STDIN_FILENO);
29a0637c176f Close standard fds before launching the eventcmd process
Mikael Berthe <mikael@lilotux.net>
parents: 655
diff changeset
359 close(STDOUT_FILENO);
29a0637c176f Close standard fds before launching the eventcmd process
Mikael Berthe <mikael@lilotux.net>
parents: 655
diff changeset
360 close(STDERR_FILENO);
391
868a350fefca Fix "missing sentinel in function call" warning with gcc4
Mikael Berthe <mikael@lilotux.net>
parents: 384
diff changeset
361 if (execl(extcmd, extcmd, arg_type, arg_info, jid, arg_data, NULL) == -1) {
374
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 364
diff changeset
362 // scr_LogPrint(LPRINT_LOGNORM, "Cannot execute external command.");
160
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
363 exit(1);
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
364 }
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
365 }
774
46304b773a44 Remove useless checks before g_free() calls
Mikael Berthe <mikael@lilotux.net>
parents: 772
diff changeset
366 g_free(datafname);
160
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
367 }
576
8b3db0b555a1 Add Vim modelines
Mikael Berthe <mikael@lilotux.net>
parents: 572
diff changeset
368
580
fed6d1e4d7a9 Fix modelines
Mikael Berthe <mikael@lilotux.net>
parents: 576
diff changeset
369 /* vim: set expandtab cindent cinoptions=>2\:2(0: For Vim users... */