annotate mcabber/src/hooks.c @ 1197:6f602d3270a4

Add /pgp [-]force With this command it becomes possible to enforce PGP encryption without checking if the remote client has PGP support. It can be used to send encrypted offline messages too.
author Mikael Berthe <mikael@lilotux.net>
date Fri, 27 Apr 2007 00:37:57 +0200
parents ef40688d87bd
children e802ec0c02d2
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
1107
1db3d045e95c Fix 2 hooks bugs
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
36 static const char *COMMAND_ME = "/me ";
1db3d045e95c Fix 2 hooks bugs
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
37
1058
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1055
diff changeset
38 inline void hk_message_in(const char *bjid, const char *resname,
1055
6eb1efea75d0 PGP: Visual encryption flag
Mikael Berthe <mikael@lilotux.net>
parents: 1010
diff changeset
39 time_t timestamp, const char *msg, const char *type,
6eb1efea75d0 PGP: Visual encryption flag
Mikael Berthe <mikael@lilotux.net>
parents: 1010
diff changeset
40 guint encrypted)
113
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
41 {
141
6533a231a65e [/trunk] Changeset 153 by mikael
mikael
parents: 120
diff changeset
42 int new_guy = FALSE;
477
d11e5ce2582c Improve hk_message_in()
Mikael Berthe <mikael@lilotux.net>
parents: 468
diff changeset
43 int is_groupchat = FALSE; // groupchat message
d11e5ce2582c Improve hk_message_in()
Mikael Berthe <mikael@lilotux.net>
parents: 468
diff changeset
44 int is_room = FALSE; // window is a room window
d11e5ce2582c Improve hk_message_in()
Mikael Berthe <mikael@lilotux.net>
parents: 468
diff changeset
45 int log_muc_conf = FALSE;
1129
1a109ebf3f24 Add option "events_ignore_active_window"
Mikael Berthe <mikael@lilotux.net>
parents: 1116
diff changeset
46 int active_window = FALSE;
447
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
47 int message_flags = 0;
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
48 guint rtype = ROSTER_TYPE_USER;
567
6f490c725999 Handle "/me " in messages
Mikael Berthe <mikael@lilotux.net>
parents: 541
diff changeset
49 char *wmsg = NULL, *bmsg = NULL, *mmsg = NULL;
447
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
50 GSList *roster_usr;
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
51
1055
6eb1efea75d0 PGP: Visual encryption flag
Mikael Berthe <mikael@lilotux.net>
parents: 1010
diff changeset
52 if (encrypted)
6eb1efea75d0 PGP: Visual encryption flag
Mikael Berthe <mikael@lilotux.net>
parents: 1010
diff changeset
53 message_flags |= HBB_PREFIX_PGPCRYPT;
6eb1efea75d0 PGP: Visual encryption flag
Mikael Berthe <mikael@lilotux.net>
parents: 1010
diff changeset
54
447
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
55 if (type && !strcmp(type, "groupchat")) {
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
56 rtype = ROSTER_TYPE_ROOM;
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
57 is_groupchat = TRUE;
477
d11e5ce2582c Improve hk_message_in()
Mikael Berthe <mikael@lilotux.net>
parents: 468
diff changeset
58 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
59 if (!resname) {
648
16cd6c858a5d MUC: No new_message flag for server messages
Mikael Berthe <mikael@lilotux.net>
parents: 646
diff changeset
60 message_flags = HBB_PREFIX_INFO | HBB_PREFIX_NOFLAG;
447
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
61 resname = "";
1107
1db3d045e95c Fix 2 hooks bugs
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
62 wmsg = bmsg = g_strdup_printf("~ %s", msg);
646
a8cb28ca5ff4 MUC: Server messages are prefixed with "~ " instead of "<> "
Mikael Berthe <mikael@lilotux.net>
parents: 625
diff changeset
63 } else {
1107
1db3d045e95c Fix 2 hooks bugs
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
64 wmsg = bmsg = g_strdup_printf("<%s> %s", resname, msg);
1db3d045e95c Fix 2 hooks bugs
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
65 if (!strncmp(msg, COMMAND_ME, strlen(COMMAND_ME)))
1db3d045e95c Fix 2 hooks bugs
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
66 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
67 }
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
68 } else {
1116
14e458020e23 Fix a bug in the history logging (incoming "/me " messages)
Mikael Berthe <mikael@lilotux.net>
parents: 1109
diff changeset
69 bmsg = g_strdup(msg);
1188
ef40688d87bd Add option 'buddy_me_fulljid'
Mikael Berthe <mikael@lilotux.net>
parents: 1167
diff changeset
70 if (!strncmp(msg, COMMAND_ME, strlen(COMMAND_ME))) {
ef40688d87bd Add option 'buddy_me_fulljid'
Mikael Berthe <mikael@lilotux.net>
parents: 1167
diff changeset
71 gchar *shortid = g_strdup(bjid);
ef40688d87bd Add option 'buddy_me_fulljid'
Mikael Berthe <mikael@lilotux.net>
parents: 1167
diff changeset
72 if (settings_opt_get_int("buddy_me_fulljid") == FALSE) {
ef40688d87bd Add option 'buddy_me_fulljid'
Mikael Berthe <mikael@lilotux.net>
parents: 1167
diff changeset
73 gchar *p = strchr(shortid, '@'); // Truncate the jid
ef40688d87bd Add option 'buddy_me_fulljid'
Mikael Berthe <mikael@lilotux.net>
parents: 1167
diff changeset
74 if (p)
ef40688d87bd Add option 'buddy_me_fulljid'
Mikael Berthe <mikael@lilotux.net>
parents: 1167
diff changeset
75 *p = '\0';
ef40688d87bd Add option 'buddy_me_fulljid'
Mikael Berthe <mikael@lilotux.net>
parents: 1167
diff changeset
76 }
ef40688d87bd Add option 'buddy_me_fulljid'
Mikael Berthe <mikael@lilotux.net>
parents: 1167
diff changeset
77 wmsg = mmsg = g_strdup_printf("*%s %s", shortid, msg+4);
ef40688d87bd Add option 'buddy_me_fulljid'
Mikael Berthe <mikael@lilotux.net>
parents: 1167
diff changeset
78 g_free(shortid);
ef40688d87bd Add option 'buddy_me_fulljid'
Mikael Berthe <mikael@lilotux.net>
parents: 1167
diff changeset
79 } else
567
6f490c725999 Handle "/me " in messages
Mikael Berthe <mikael@lilotux.net>
parents: 541
diff changeset
80 wmsg = (char*) msg;
447
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
81 }
141
6533a231a65e [/trunk] Changeset 153 by mikael
mikael
parents: 120
diff changeset
82
6533a231a65e [/trunk] Changeset 153 by mikael
mikael
parents: 120
diff changeset
83 // If this user isn't in the roster, we add it
1058
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1055
diff changeset
84 roster_usr = roster_find(bjid, jidsearch, 0);
447
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
85 if (!roster_usr) {
141
6533a231a65e [/trunk] Changeset 153 by mikael
mikael
parents: 120
diff changeset
86 new_guy = TRUE;
1058
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1055
diff changeset
87 roster_usr = roster_add_user(bjid, NULL, NULL, rtype, sub_none);
477
d11e5ce2582c Improve hk_message_in()
Mikael Berthe <mikael@lilotux.net>
parents: 468
diff changeset
88 if (!roster_usr) { // Shouldn't happen...
d11e5ce2582c Improve hk_message_in()
Mikael Berthe <mikael@lilotux.net>
parents: 468
diff changeset
89 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
90 g_free(bmsg);
46304b773a44 Remove useless checks before g_free() calls
Mikael Berthe <mikael@lilotux.net>
parents: 772
diff changeset
91 g_free(mmsg);
477
d11e5ce2582c Improve hk_message_in()
Mikael Berthe <mikael@lilotux.net>
parents: 468
diff changeset
92 return;
d11e5ce2582c Improve hk_message_in()
Mikael Berthe <mikael@lilotux.net>
parents: 468
diff changeset
93 }
489
21ab22a60bcb Auto-convert a roster item to "room" type when receiving a groupchat message
Mikael Berthe <mikael@lilotux.net>
parents: 485
diff changeset
94 } 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
95 // 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
96 buddy_settype(roster_usr->data, ROSTER_TYPE_ROOM);
477
d11e5ce2582c Improve hk_message_in()
Mikael Berthe <mikael@lilotux.net>
parents: 468
diff changeset
97 }
d11e5ce2582c Improve hk_message_in()
Mikael Berthe <mikael@lilotux.net>
parents: 468
diff changeset
98
d11e5ce2582c Improve hk_message_in()
Mikael Berthe <mikael@lilotux.net>
parents: 468
diff changeset
99 is_room = !!(buddy_gettype(roster_usr->data) & ROSTER_TYPE_ROOM);
d11e5ce2582c Improve hk_message_in()
Mikael Berthe <mikael@lilotux.net>
parents: 468
diff changeset
100
728
421b337dc6d2 Chat window: Highlight the flag in our messages
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
101 if (is_room) {
421b337dc6d2 Chat window: Highlight the flag in our messages
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
102 if (!is_groupchat) {
421b337dc6d2 Chat window: Highlight the flag in our messages
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
103 // This is a private message from a room participant
1108
a0e9eaa9f5b4 Fix small memory leak in hk_message_in()
Mikael Berthe <mikael@lilotux.net>
parents: 1107
diff changeset
104 g_free(bmsg);
734
1d9f0efcfcee MUC: Do not mark error messages as private
Mikael Berthe <mikael@lilotux.net>
parents: 729
diff changeset
105 if (!resname) {
728
421b337dc6d2 Chat window: Highlight the flag in our messages
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
106 resname = "";
734
1d9f0efcfcee MUC: Do not mark error messages as private
Mikael Berthe <mikael@lilotux.net>
parents: 729
diff changeset
107 wmsg = bmsg = g_strdup(msg);
1d9f0efcfcee MUC: Do not mark error messages as private
Mikael Berthe <mikael@lilotux.net>
parents: 729
diff changeset
108 } else {
1d9f0efcfcee MUC: Do not mark error messages as private
Mikael Berthe <mikael@lilotux.net>
parents: 729
diff changeset
109 wmsg = bmsg = g_strdup_printf("PRIV#<%s> %s", resname, msg);
1108
a0e9eaa9f5b4 Fix small memory leak in hk_message_in()
Mikael Berthe <mikael@lilotux.net>
parents: 1107
diff changeset
110 if (!strncmp(msg, COMMAND_ME, strlen(COMMAND_ME))) {
a0e9eaa9f5b4 Fix small memory leak in hk_message_in()
Mikael Berthe <mikael@lilotux.net>
parents: 1107
diff changeset
111 g_free(mmsg);
734
1d9f0efcfcee MUC: Do not mark error messages as private
Mikael Berthe <mikael@lilotux.net>
parents: 729
diff changeset
112 wmsg = mmsg = g_strdup_printf("PRIV#*%s %s", resname, msg+4);
1108
a0e9eaa9f5b4 Fix small memory leak in hk_message_in()
Mikael Berthe <mikael@lilotux.net>
parents: 1107
diff changeset
113 }
734
1d9f0efcfcee MUC: Do not mark error messages as private
Mikael Berthe <mikael@lilotux.net>
parents: 729
diff changeset
114 }
728
421b337dc6d2 Chat window: Highlight the flag in our messages
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
115 } else {
421b337dc6d2 Chat window: Highlight the flag in our messages
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
116 // This is a regular chatroom message.
421b337dc6d2 Chat window: Highlight the flag in our messages
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
117 // 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
118 // highlight it.
421b337dc6d2 Chat window: Highlight the flag in our messages
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
119 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
120 if (resname && nick && !strcmp(resname, nick))
421b337dc6d2 Chat window: Highlight the flag in our messages
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
121 message_flags |= HBB_PREFIX_HLIGHT;
421b337dc6d2 Chat window: Highlight the flag in our messages
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
122 }
141
6533a231a65e [/trunk] Changeset 153 by mikael
mikael
parents: 120
diff changeset
123 }
6533a231a65e [/trunk] Changeset 153 by mikael
mikael
parents: 120
diff changeset
124
325
ff6fb51bfd78 Handle "error" message type
Mikael Berthe <mikael@lilotux.net>
parents: 318
diff changeset
125 if (type && !strcmp(type, "error")) {
ff6fb51bfd78 Handle "error" message type
Mikael Berthe <mikael@lilotux.net>
parents: 318
diff changeset
126 message_flags = HBB_PREFIX_ERR | HBB_PREFIX_IN;
1058
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1055
diff changeset
127 scr_LogPrint(LPRINT_LOGNORM, "Error message received from <%s>", bjid);
447
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
128 }
325
ff6fb51bfd78 Handle "error" message type
Mikael Berthe <mikael@lilotux.net>
parents: 318
diff changeset
129
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 160
diff changeset
130 // Note: the hlog_write should not be called first, because in some
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 160
diff changeset
131 // cases scr_WriteIncomingMessage() will load the history and we'd
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 160
diff changeset
132 // have the message twice...
1058
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1055
diff changeset
133 scr_WriteIncomingMessage(bjid, wmsg, timestamp, message_flags);
447
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
134
567
6f490c725999 Handle "/me " in messages
Mikael Berthe <mikael@lilotux.net>
parents: 541
diff changeset
135 // 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
136 if (wmsg == mmsg)
6f490c725999 Handle "/me " in messages
Mikael Berthe <mikael@lilotux.net>
parents: 541
diff changeset
137 wmsg = bmsg;
6f490c725999 Handle "/me " in messages
Mikael Berthe <mikael@lilotux.net>
parents: 541
diff changeset
138
477
d11e5ce2582c Improve hk_message_in()
Mikael Berthe <mikael@lilotux.net>
parents: 468
diff changeset
139 // - 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
140 // - 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
141 // - 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
142 // option is off (and it is not a history line)
d11e5ce2582c Improve hk_message_in()
Mikael Berthe <mikael@lilotux.net>
parents: 468
diff changeset
143 if (!(message_flags & HBB_PREFIX_ERR) &&
d11e5ce2582c Improve hk_message_in()
Mikael Berthe <mikael@lilotux.net>
parents: 468
diff changeset
144 (!is_room || (is_groupchat && log_muc_conf && !timestamp)))
1058
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1055
diff changeset
145 hlog_write_message(bjid, timestamp, FALSE, wmsg);
447
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
146
1129
1a109ebf3f24 Add option "events_ignore_active_window"
Mikael Berthe <mikael@lilotux.net>
parents: 1116
diff changeset
147 if (settings_opt_get_int("events_ignore_active_window") &&
1a109ebf3f24 Add option "events_ignore_active_window"
Mikael Berthe <mikael@lilotux.net>
parents: 1116
diff changeset
148 current_buddy && scr_get_chatmode()) {
1a109ebf3f24 Add option "events_ignore_active_window"
Mikael Berthe <mikael@lilotux.net>
parents: 1116
diff changeset
149 gpointer bud = BUDDATA(current_buddy);
1a109ebf3f24 Add option "events_ignore_active_window"
Mikael Berthe <mikael@lilotux.net>
parents: 1116
diff changeset
150 if (bud) {
1a109ebf3f24 Add option "events_ignore_active_window"
Mikael Berthe <mikael@lilotux.net>
parents: 1116
diff changeset
151 const char *cjid = buddy_getjid(bud);
1a109ebf3f24 Add option "events_ignore_active_window"
Mikael Berthe <mikael@lilotux.net>
parents: 1116
diff changeset
152 if (cjid && !strcasecmp(cjid, bjid))
1a109ebf3f24 Add option "events_ignore_active_window"
Mikael Berthe <mikael@lilotux.net>
parents: 1116
diff changeset
153 active_window = TRUE;
1a109ebf3f24 Add option "events_ignore_active_window"
Mikael Berthe <mikael@lilotux.net>
parents: 1116
diff changeset
154 }
1a109ebf3f24 Add option "events_ignore_active_window"
Mikael Berthe <mikael@lilotux.net>
parents: 1116
diff changeset
155 }
1a109ebf3f24 Add option "events_ignore_active_window"
Mikael Berthe <mikael@lilotux.net>
parents: 1116
diff changeset
156
355
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
157 // External command
477
d11e5ce2582c Improve hk_message_in()
Mikael Berthe <mikael@lilotux.net>
parents: 468
diff changeset
158 // - 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
159 // - We do call hk_ext_cmd() for private messages in a room
1129
1a109ebf3f24 Add option "events_ignore_active_window"
Mikael Berthe <mikael@lilotux.net>
parents: 1116
diff changeset
160 // - We do call hk_ext_cmd() for messages to the current window
1a109ebf3f24 Add option "events_ignore_active_window"
Mikael Berthe <mikael@lilotux.net>
parents: 1116
diff changeset
161 if (!active_window && ((is_groupchat && !timestamp) || !is_groupchat))
1058
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1055
diff changeset
162 hk_ext_cmd(bjid, (is_groupchat ? 'G' : 'M'), 'R', wmsg);
447
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
163
808
4a6ce276ffca New option "log_display_sender"
Mikael Berthe <mikael@lilotux.net>
parents: 774
diff changeset
164 // Display the sender in the log window
4a6ce276ffca New option "log_display_sender"
Mikael Berthe <mikael@lilotux.net>
parents: 774
diff changeset
165 if ((!is_groupchat) && !(message_flags & HBB_PREFIX_ERR) &&
4a6ce276ffca New option "log_display_sender"
Mikael Berthe <mikael@lilotux.net>
parents: 774
diff changeset
166 settings_opt_get_int("log_display_sender")) {
1058
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1055
diff changeset
167 const char *name = roster_getname(bjid);
808
4a6ce276ffca New option "log_display_sender"
Mikael Berthe <mikael@lilotux.net>
parents: 774
diff changeset
168 if (!name) name = "";
4a6ce276ffca New option "log_display_sender"
Mikael Berthe <mikael@lilotux.net>
parents: 774
diff changeset
169 scr_LogPrint(LPRINT_NORMAL, "Message received from %s <%s/%s>",
1058
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1055
diff changeset
170 name, bjid, (resname ? resname : ""));
808
4a6ce276ffca New option "log_display_sender"
Mikael Berthe <mikael@lilotux.net>
parents: 774
diff changeset
171 }
4a6ce276ffca New option "log_display_sender"
Mikael Berthe <mikael@lilotux.net>
parents: 774
diff changeset
172
675
ae7016aae014 New "beep_on_message" option
Mikael Berthe <mikael@lilotux.net>
parents: 656
diff changeset
173 // Beep, if enabled
887
df4bb1535ef8 Fix beep_on_message in rooms
Mikael Berthe <mikael@lilotux.net>
parents: 856
diff changeset
174 if ((!is_groupchat) && !(message_flags & HBB_PREFIX_ERR) &&
df4bb1535ef8 Fix beep_on_message in rooms
Mikael Berthe <mikael@lilotux.net>
parents: 856
diff changeset
175 settings_opt_get_int("beep_on_message")) {
675
ae7016aae014 New "beep_on_message" option
Mikael Berthe <mikael@lilotux.net>
parents: 656
diff changeset
176 scr_Beep();
887
df4bb1535ef8 Fix beep_on_message in rooms
Mikael Berthe <mikael@lilotux.net>
parents: 856
diff changeset
177 }
675
ae7016aae014 New "beep_on_message" option
Mikael Berthe <mikael@lilotux.net>
parents: 656
diff changeset
178
1010
54405d09b15a Add a call to buddylist_build()
Mikael Berthe <mikael@lilotux.net>
parents: 967
diff changeset
179 // We need to update the roster if the sender is unknown or
146
50f23c38743a [/trunk] Changeset 158 by mikael
mikael
parents: 141
diff changeset
180 // if the sender is offline/invisible and hide_offline_buddies is set
50f23c38743a [/trunk] Changeset 158 by mikael
mikael
parents: 141
diff changeset
181 if (new_guy ||
477
d11e5ce2582c Improve hk_message_in()
Mikael Berthe <mikael@lilotux.net>
parents: 468
diff changeset
182 (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
183 buddylist_get_hide_offline_buddies()))
146
50f23c38743a [/trunk] Changeset 158 by mikael
mikael
parents: 141
diff changeset
184 {
141
6533a231a65e [/trunk] Changeset 153 by mikael
mikael
parents: 120
diff changeset
185 update_roster = TRUE;
6533a231a65e [/trunk] Changeset 153 by mikael
mikael
parents: 120
diff changeset
186 }
447
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
187
774
46304b773a44 Remove useless checks before g_free() calls
Mikael Berthe <mikael@lilotux.net>
parents: 772
diff changeset
188 g_free(bmsg);
46304b773a44 Remove useless checks before g_free() calls
Mikael Berthe <mikael@lilotux.net>
parents: 772
diff changeset
189 g_free(mmsg);
113
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
190 }
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
191
484
00e2d3821a5b Display PRIV for private messages in a room when using /say_to
Mikael Berthe <mikael@lilotux.net>
parents: 483
diff changeset
192 // 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
193 // 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
194 // normal messages.
1058
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1055
diff changeset
195 inline void hk_message_out(const char *bjid, const char *nick,
1055
6eb1efea75d0 PGP: Visual encryption flag
Mikael Berthe <mikael@lilotux.net>
parents: 1010
diff changeset
196 time_t timestamp, const char *msg, guint encrypted)
113
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
197 {
772
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 735
diff changeset
198 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
199
567
6f490c725999 Handle "/me " in messages
Mikael Berthe <mikael@lilotux.net>
parents: 541
diff changeset
200 if (nick) {
6f490c725999 Handle "/me " in messages
Mikael Berthe <mikael@lilotux.net>
parents: 541
diff changeset
201 wmsg = bmsg = g_strdup_printf("PRIV#<%s> %s", nick, msg);
1109
7e383aa48b3d Fix a small mistake introduced in changeset 1db3d045e95c
Mikael Berthe <mikael@lilotux.net>
parents: 1108
diff changeset
202 if (!strncmp(msg, COMMAND_ME, strlen(COMMAND_ME))) {
7e383aa48b3d Fix a small mistake introduced in changeset 1db3d045e95c
Mikael Berthe <mikael@lilotux.net>
parents: 1108
diff changeset
203 const char *mynick = roster_getnickname(bjid);
7e383aa48b3d Fix a small mistake introduced in changeset 1db3d045e95c
Mikael Berthe <mikael@lilotux.net>
parents: 1108
diff changeset
204 wmsg = mmsg = g_strdup_printf("PRIV#<%s> *%s %s", nick,
7e383aa48b3d Fix a small mistake introduced in changeset 1db3d045e95c
Mikael Berthe <mikael@lilotux.net>
parents: 1108
diff changeset
205 (mynick ? mynick : "me"), msg+4);
7e383aa48b3d Fix a small mistake introduced in changeset 1db3d045e95c
Mikael Berthe <mikael@lilotux.net>
parents: 1108
diff changeset
206 }
567
6f490c725999 Handle "/me " in messages
Mikael Berthe <mikael@lilotux.net>
parents: 541
diff changeset
207 } else {
6f490c725999 Handle "/me " in messages
Mikael Berthe <mikael@lilotux.net>
parents: 541
diff changeset
208 wmsg = (char*)msg;
1107
1db3d045e95c Fix 2 hooks bugs
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
209 if (!strncmp(msg, COMMAND_ME, strlen(COMMAND_ME))) {
567
6f490c725999 Handle "/me " in messages
Mikael Berthe <mikael@lilotux.net>
parents: 541
diff changeset
210 const char *myid = settings_opt_get("username");
6f490c725999 Handle "/me " in messages
Mikael Berthe <mikael@lilotux.net>
parents: 541
diff changeset
211 if (myid)
6f490c725999 Handle "/me " in messages
Mikael Berthe <mikael@lilotux.net>
parents: 541
diff changeset
212 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
213 msg+4);
6f490c725999 Handle "/me " in messages
Mikael Berthe <mikael@lilotux.net>
parents: 541
diff changeset
214 }
6f490c725999 Handle "/me " in messages
Mikael Berthe <mikael@lilotux.net>
parents: 541
diff changeset
215 }
484
00e2d3821a5b Display PRIV for private messages in a room when using /say_to
Mikael Berthe <mikael@lilotux.net>
parents: 483
diff changeset
216
485
55aa45eb7ece Fix a small display bug
Mikael Berthe <mikael@lilotux.net>
parents: 484
diff changeset
217 // 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
218 // 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
219 // have the message twice...
1058
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1055
diff changeset
220 scr_WriteOutgoingMessage(bjid, wmsg, (encrypted ? HBB_PREFIX_PGPCRYPT : 0));
485
55aa45eb7ece Fix a small display bug
Mikael Berthe <mikael@lilotux.net>
parents: 484
diff changeset
221
55aa45eb7ece Fix a small display bug
Mikael Berthe <mikael@lilotux.net>
parents: 484
diff changeset
222 // We don't log private messages
1107
1db3d045e95c Fix 2 hooks bugs
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
223 if (!nick)
1db3d045e95c Fix 2 hooks bugs
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
224 hlog_write_message(bjid, timestamp, TRUE, msg);
485
55aa45eb7ece Fix a small display bug
Mikael Berthe <mikael@lilotux.net>
parents: 484
diff changeset
225
355
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
226 // External command
1058
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1055
diff changeset
227 hk_ext_cmd(bjid, '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
228
774
46304b773a44 Remove useless checks before g_free() calls
Mikael Berthe <mikael@lilotux.net>
parents: 772
diff changeset
229 g_free(bmsg);
46304b773a44 Remove useless checks before g_free() calls
Mikael Berthe <mikael@lilotux.net>
parents: 772
diff changeset
230 g_free(mmsg);
113
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
231 }
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
232
1058
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1055
diff changeset
233 inline void hk_statuschange(const char *bjid, const char *resname, gchar prio,
438
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
234 time_t timestamp, enum imstatus status,
b44be19d6229 Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
235 const char *status_msg)
113
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
236 {
510
6c3cd3aa4a91 New 'buddy_format' option
Mikael Berthe <mikael@lilotux.net>
parents: 489
diff changeset
237 int buddy_format;
516
e5008032edb8 Add option 'show_status_in_buffer'
Mikael Berthe <mikael@lilotux.net>
parents: 514
diff changeset
238 int st_in_buf;
e5008032edb8 Add option 'show_status_in_buffer'
Mikael Berthe <mikael@lilotux.net>
parents: 514
diff changeset
239 enum imstatus oldstat;
510
6c3cd3aa4a91 New 'buddy_format' option
Mikael Berthe <mikael@lilotux.net>
parents: 489
diff changeset
240 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
241 char *logsmsg;
614
d3020b2c4da2 Show empty resources
Mikael Berthe <mikael@lilotux.net>
parents: 603
diff changeset
242 const char *rn = (resname ? resname : "");
510
6c3cd3aa4a91 New 'buddy_format' option
Mikael Berthe <mikael@lilotux.net>
parents: 489
diff changeset
243
516
e5008032edb8 Add option 'show_status_in_buffer'
Mikael Berthe <mikael@lilotux.net>
parents: 514
diff changeset
244 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
245 buddy_format = settings_opt_get_int("buddy_format");
6c3cd3aa4a91 New 'buddy_format' option
Mikael Berthe <mikael@lilotux.net>
parents: 489
diff changeset
246 if (buddy_format) {
1058
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1055
diff changeset
247 const char *name = roster_getname(bjid);
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1055
diff changeset
248 if (name && strcmp(name, bjid)) {
510
6c3cd3aa4a91 New 'buddy_format' option
Mikael Berthe <mikael@lilotux.net>
parents: 489
diff changeset
249 if (buddy_format == 1)
1058
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1055
diff changeset
250 bn = g_strdup_printf("%s <%s/%s>", name, bjid, rn);
510
6c3cd3aa4a91 New 'buddy_format' option
Mikael Berthe <mikael@lilotux.net>
parents: 489
diff changeset
251 else if (buddy_format == 2)
6c3cd3aa4a91 New 'buddy_format' option
Mikael Berthe <mikael@lilotux.net>
parents: 489
diff changeset
252 bn = g_strdup_printf("%s/%s", name, rn);
6c3cd3aa4a91 New 'buddy_format' option
Mikael Berthe <mikael@lilotux.net>
parents: 489
diff changeset
253 else if (buddy_format == 3)
6c3cd3aa4a91 New 'buddy_format' option
Mikael Berthe <mikael@lilotux.net>
parents: 489
diff changeset
254 bn = g_strdup_printf("%s", name);
6c3cd3aa4a91 New 'buddy_format' option
Mikael Berthe <mikael@lilotux.net>
parents: 489
diff changeset
255 }
6c3cd3aa4a91 New 'buddy_format' option
Mikael Berthe <mikael@lilotux.net>
parents: 489
diff changeset
256 }
6c3cd3aa4a91 New 'buddy_format' option
Mikael Berthe <mikael@lilotux.net>
parents: 489
diff changeset
257
6c3cd3aa4a91 New 'buddy_format' option
Mikael Berthe <mikael@lilotux.net>
parents: 489
diff changeset
258 if (!bn) {
1058
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1055
diff changeset
259 bn = g_strdup_printf("<%s/%s>", bjid, rn);
510
6c3cd3aa4a91 New 'buddy_format' option
Mikael Berthe <mikael@lilotux.net>
parents: 489
diff changeset
260 }
6c3cd3aa4a91 New 'buddy_format' option
Mikael Berthe <mikael@lilotux.net>
parents: 489
diff changeset
261
591
5a685e9012b4 Show only the 1st line of the status message, in the log window
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
262 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
263 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
264
1058
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1055
diff changeset
265 oldstat = roster_getstatus(bjid, resname);
510
6c3cd3aa4a91 New 'buddy_format' option
Mikael Berthe <mikael@lilotux.net>
parents: 489
diff changeset
266 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
267 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
268 g_free(logsmsg);
510
6c3cd3aa4a91 New 'buddy_format' option
Mikael Berthe <mikael@lilotux.net>
parents: 489
diff changeset
269 g_free(bn);
514
979eb0fe2969 Show status changes in buddy window, if it is open
Mikael Berthe <mikael@lilotux.net>
parents: 510
diff changeset
270
516
e5008032edb8 Add option 'show_status_in_buffer'
Mikael Berthe <mikael@lilotux.net>
parents: 514
diff changeset
271 if (st_in_buf == 2 ||
e5008032edb8 Add option 'show_status_in_buffer'
Mikael Berthe <mikael@lilotux.net>
parents: 514
diff changeset
272 (st_in_buf == 1 && (status == offline || oldstat == offline))) {
e5008032edb8 Add option 'show_status_in_buffer'
Mikael Berthe <mikael@lilotux.net>
parents: 514
diff changeset
273 // Write the status change in the buddy's buffer, only if it already exists
1058
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1055
diff changeset
274 if (scr_BuddyBufferExists(bjid)) {
516
e5008032edb8 Add option 'show_status_in_buffer'
Mikael Berthe <mikael@lilotux.net>
parents: 514
diff changeset
275 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
276 imstatus2char[oldstat], imstatus2char[status],
e5008032edb8 Add option 'show_status_in_buffer'
Mikael Berthe <mikael@lilotux.net>
parents: 514
diff changeset
277 ((status_msg) ? status_msg : ""));
1058
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1055
diff changeset
278 scr_WriteIncomingMessage(bjid, bn, timestamp,
830
80434fde7cfa Display presence notification timestamps when they exist
Mikael Berthe <mikael@lilotux.net>
parents: 808
diff changeset
279 HBB_PREFIX_INFO|HBB_PREFIX_NOFLAG);
516
e5008032edb8 Add option 'show_status_in_buffer'
Mikael Berthe <mikael@lilotux.net>
parents: 514
diff changeset
280 g_free(bn);
e5008032edb8 Add option 'show_status_in_buffer'
Mikael Berthe <mikael@lilotux.net>
parents: 514
diff changeset
281 }
514
979eb0fe2969 Show status changes in buddy window, if it is open
Mikael Berthe <mikael@lilotux.net>
parents: 510
diff changeset
282 }
979eb0fe2969 Show status changes in buddy window, if it is open
Mikael Berthe <mikael@lilotux.net>
parents: 510
diff changeset
283
1058
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1055
diff changeset
284 roster_setstatus(bjid, rn, prio, status, status_msg, timestamp,
625
028c01940490 Show presence timestamps in "/info" and "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 614
diff changeset
285 role_none, affil_none, NULL);
120
cfd3df636d5f [/trunk] Changeset 133 by mikael
mikael
parents: 118
diff changeset
286 buddylist_build();
cfd3df636d5f [/trunk] Changeset 133 by mikael
mikael
parents: 118
diff changeset
287 scr_DrawRoster();
1058
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1055
diff changeset
288 hlog_write_status(bjid, timestamp, status, status_msg);
355
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
289 // External command
1058
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1055
diff changeset
290 hk_ext_cmd(bjid, 'S', imstatus2char[status], NULL);
113
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
291 }
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
292
536
56f641155579 Status change was not displayed when same status but message removed
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
293 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
294 enum imstatus new_status, const char *msg)
116
1e7e59775f12 [/trunk] Changeset 130 by mikael
mikael
parents: 115
diff changeset
295 {
541
87165382e4ce Fix error introduced in changeset 56f641155579
Mikael Berthe <mikael@lilotux.net>
parents: 536
diff changeset
296 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
297 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
298 (msg ? msg : ""));
116
1e7e59775f12 [/trunk] Changeset 130 by mikael
mikael
parents: 115
diff changeset
299 //hlog_write_status(NULL, 0, status);
1e7e59775f12 [/trunk] Changeset 130 by mikael
mikael
parents: 115
diff changeset
300 }
1e7e59775f12 [/trunk] Changeset 130 by mikael
mikael
parents: 115
diff changeset
301
160
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
302
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
303 /* External commands */
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
304
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
305 // hk_ext_cmd_init()
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
306 // Initialize external command variable.
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
307 // 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
308 void hk_ext_cmd_init(const char *command)
160
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
309 {
355
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
310 if (extcmd) {
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
311 g_free(extcmd);
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
312 extcmd = NULL;
160
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
313 }
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
314 if (command)
1167
9726c78a91f3 Allow '~' (HOME directory) in config options
Mikael Berthe <mikael@lilotux.net>
parents: 1129
diff changeset
315 extcmd = expand_filename(command);
160
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
316 }
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
317
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
318 // hk_ext_cmd()
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
319 // Launch an external command (process) for the given event.
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
320 // For now, data should be NULL.
1058
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1055
diff changeset
321 void hk_ext_cmd(const char *bjid, guchar type, guchar info, const char *data)
160
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
322 {
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
323 pid_t pid;
355
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
324 char *arg_type = NULL;
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
325 char *arg_info = NULL;
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
326 char *arg_data = NULL;
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
327 char status_str[2];
524
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 516
diff changeset
328 char *datafname = NULL;
160
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
329
355
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
330 if (!extcmd) return;
160
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
331
355
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
332 // Prepare arg_* (external command parameters)
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
333 switch (type) {
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
334 case 'M':
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
335 arg_type = "MSG";
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
336 if (info == 'R')
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
337 arg_info = "IN";
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
338 else if (info == 'S')
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
339 arg_info = "OUT";
453
39e173645f9c External command is called for MUC messages
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
340 break;
39e173645f9c External command is called for MUC messages
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
341 case 'G':
39e173645f9c External command is called for MUC messages
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
342 arg_type = "MSG";
39e173645f9c External command is called for MUC messages
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
343 arg_info = "MUC";
355
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
344 break;
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
345 case 'S':
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
346 arg_type = "STATUS";
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
347 if (strchr(imstatus2char, tolower(info))) {
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
348 status_str[0] = toupper(info);
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
349 status_str[1] = 0;
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
350 arg_info = status_str;
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
351 }
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
352 break;
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
353 default:
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
354 return;
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
355 }
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
356
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
357 if (!arg_type || !arg_info) return;
160
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
358
524
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 516
diff changeset
359 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
360 int fd;
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 516
diff changeset
361 const char *prefix;
1167
9726c78a91f3 Allow '~' (HOME directory) in config options
Mikael Berthe <mikael@lilotux.net>
parents: 1129
diff changeset
362 char *prefix_xp = NULL;
772
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 735
diff changeset
363 char *data_locale;
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 735
diff changeset
364
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 735
diff changeset
365 data_locale = from_utf8(data);
524
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 516
diff changeset
366 prefix = settings_opt_get("event_log_dir");
1167
9726c78a91f3 Allow '~' (HOME directory) in config options
Mikael Berthe <mikael@lilotux.net>
parents: 1129
diff changeset
367 if (prefix)
9726c78a91f3 Allow '~' (HOME directory) in config options
Mikael Berthe <mikael@lilotux.net>
parents: 1129
diff changeset
368 prefix = prefix_xp = expand_filename(prefix);
9726c78a91f3 Allow '~' (HOME directory) in config options
Mikael Berthe <mikael@lilotux.net>
parents: 1129
diff changeset
369 else
524
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 516
diff changeset
370 prefix = ut_get_tmpdir();
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 516
diff changeset
371 datafname = g_strdup_printf("%s/mcabber-%d.XXXXXX", prefix, getpid());
1167
9726c78a91f3 Allow '~' (HOME directory) in config options
Mikael Berthe <mikael@lilotux.net>
parents: 1129
diff changeset
372 g_free(prefix_xp);
772
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 735
diff changeset
373
524
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 516
diff changeset
374 // 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
375 fd = mkstemp(datafname);
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 516
diff changeset
376 if (fd == -1) {
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 516
diff changeset
377 g_free(datafname);
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 516
diff changeset
378 datafname = NULL;
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 516
diff changeset
379 scr_LogPrint(LPRINT_LOGNORM,
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 516
diff changeset
380 "Unable to create temp file for external command.");
1107
1db3d045e95c Fix 2 hooks bugs
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
381 } else {
1db3d045e95c Fix 2 hooks bugs
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
382 write(fd, data_locale, strlen(data_locale));
1db3d045e95c Fix 2 hooks bugs
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
383 write(fd, "\n", 1);
1db3d045e95c Fix 2 hooks bugs
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
384 close(fd);
1db3d045e95c Fix 2 hooks bugs
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
385 arg_data = datafname;
524
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 516
diff changeset
386 }
772
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 735
diff changeset
387 g_free(data_locale);
524
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 516
diff changeset
388 }
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 516
diff changeset
389
160
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
390 if ((pid=fork()) == -1) {
374
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 364
diff changeset
391 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
392 g_free(datafname);
160
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
393 return;
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
394 }
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
395
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
396 if (pid == 0) { // child
656
29a0637c176f Close standard fds before launching the eventcmd process
Mikael Berthe <mikael@lilotux.net>
parents: 655
diff changeset
397 // Close standard file descriptors
29a0637c176f Close standard fds before launching the eventcmd process
Mikael Berthe <mikael@lilotux.net>
parents: 655
diff changeset
398 close(STDIN_FILENO);
29a0637c176f Close standard fds before launching the eventcmd process
Mikael Berthe <mikael@lilotux.net>
parents: 655
diff changeset
399 close(STDOUT_FILENO);
29a0637c176f Close standard fds before launching the eventcmd process
Mikael Berthe <mikael@lilotux.net>
parents: 655
diff changeset
400 close(STDERR_FILENO);
1058
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1055
diff changeset
401 if (execl(extcmd, extcmd, arg_type, arg_info, bjid, arg_data, NULL) == -1) {
374
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 364
diff changeset
402 // scr_LogPrint(LPRINT_LOGNORM, "Cannot execute external command.");
160
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
403 exit(1);
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
404 }
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
405 }
774
46304b773a44 Remove useless checks before g_free() calls
Mikael Berthe <mikael@lilotux.net>
parents: 772
diff changeset
406 g_free(datafname);
160
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
407 }
576
8b3db0b555a1 Add Vim modelines
Mikael Berthe <mikael@lilotux.net>
parents: 572
diff changeset
408
580
fed6d1e4d7a9 Fix modelines
Mikael Berthe <mikael@lilotux.net>
parents: 576
diff changeset
409 /* vim: set expandtab cindent cinoptions=>2\:2(0: For Vim users... */