Mercurial > ~mikael > mcabber > hg
comparison mcabber/src/hooks.c @ 1607:14690e624e9d
Add modules
author | Myhailo Danylenko <isbear@ukrpost.net> |
---|---|
date | Sun, 11 Oct 2009 16:01:52 +0200 |
parents | 351427ef0b4b |
children | f9bf561e54d0 |
comparison
equal
deleted
inserted
replaced
1606:d7f26538c24c | 1607:14690e624e9d |
---|---|
33 #include "settings.h" | 33 #include "settings.h" |
34 #include "utils.h" | 34 #include "utils.h" |
35 #include "utf8.h" | 35 #include "utf8.h" |
36 #include "commands.h" | 36 #include "commands.h" |
37 #include "fifo.h" | 37 #include "fifo.h" |
38 | |
39 #ifdef MODULES_ENABLE | |
40 #include <glib.h> | |
41 | |
42 typedef struct { | |
43 hk_handler_t handler; | |
44 gpointer userdata; | |
45 } hook_list_data_t; | |
46 | |
47 static GSList *hk_handler_queue = NULL; | |
48 | |
49 void hk_add_handler (hk_handler_t handler, gpointer userdata) | |
50 { | |
51 hook_list_data_t *h = g_new (hook_list_data_t, 1); | |
52 h->handler = handler; | |
53 h->userdata = userdata; | |
54 hk_handler_queue = g_slist_append (hk_handler_queue, h); | |
55 } | |
56 | |
57 static gint hk_queue_search_cb (hook_list_data_t *a, hook_list_data_t *b) | |
58 { | |
59 if (a->handler == b->handler && a->userdata == b->userdata) | |
60 return 0; | |
61 else | |
62 return 1; | |
63 } | |
64 | |
65 void hk_del_handler (hk_handler_t handler, gpointer userdata) | |
66 { | |
67 hook_list_data_t h = { handler, userdata }; | |
68 GSList *el = g_slist_find_custom (hk_handler_queue, &h, (GCompareFunc) hk_queue_search_cb); | |
69 if (el) { | |
70 g_free (el->data); | |
71 hk_handler_queue = g_slist_delete_link (hk_handler_queue, el); | |
72 } | |
73 } | |
74 #endif | |
38 | 75 |
39 static char *extcmd; | 76 static char *extcmd; |
40 | 77 |
41 static const char *COMMAND_ME = "/me "; | 78 static const char *COMMAND_ME = "/me "; |
42 | 79 |
207 } | 244 } |
208 | 245 |
209 if (settings_opt_get_int("eventcmd_use_nickname")) | 246 if (settings_opt_get_int("eventcmd_use_nickname")) |
210 ename = roster_getname(bjid); | 247 ename = roster_getname(bjid); |
211 | 248 |
249 #ifdef MODULES_ENABLE | |
250 { | |
251 GSList *h = hk_handler_queue; | |
252 if (h) { | |
253 #if 0 | |
254 hk_arg_t *args = g_new (hk_arg_t, 5); | |
255 args[0].name = "hook"; | |
256 args[0].value = "hook-message-in"; | |
257 args[1].name = "jid"; | |
258 args[1].value = bjid; | |
259 args[2].name = "message"; | |
260 args[2].value = wmsg; | |
261 args[3].name = "groupchat"; | |
262 args[3].value = is_groupchat ? "true" : "false"; | |
263 args[4].name = NULL; | |
264 args[4].value = NULL; | |
265 #else | |
266 // We can use a const array for keys/static values, so modules | |
267 // can do fast known to them args check by just comparing pointers... | |
268 hk_arg_t args[] = { | |
269 { "hook", "hook-message-in" }, | |
270 { "jid", bjid }, | |
271 { "message", wmsg }, | |
272 { "groupchat", is_groupchat ? "true" : "false" }, | |
273 { NULL, NULL }, | |
274 }; | |
275 #endif | |
276 while (h) { | |
277 hook_list_data_t *data = h->data; | |
278 (data->handler) (args, data->userdata); | |
279 h = g_slist_next (h); | |
280 } | |
281 } | |
282 } | |
283 #endif | |
284 | |
212 // External command | 285 // External command |
213 // - We do not call hk_ext_cmd() for history lines in MUC | 286 // - We do not call hk_ext_cmd() for history lines in MUC |
214 // - We do call hk_ext_cmd() for private messages in a room | 287 // - We do call hk_ext_cmd() for private messages in a room |
215 // - We do call hk_ext_cmd() for messages to the current window | 288 // - We do call hk_ext_cmd() for messages to the current window |
216 if (!active_window && ((is_groupchat && !timestamp) || !is_groupchat)) | 289 if (!active_window && ((is_groupchat && !timestamp) || !is_groupchat)) |
284 scr_WriteOutgoingMessage(bjid, wmsg, cryptflag, xep184); | 357 scr_WriteOutgoingMessage(bjid, wmsg, cryptflag, xep184); |
285 | 358 |
286 // We don't log private messages | 359 // We don't log private messages |
287 if (!nick) | 360 if (!nick) |
288 hlog_write_message(bjid, timestamp, 1, msg); | 361 hlog_write_message(bjid, timestamp, 1, msg); |
362 | |
363 #ifdef MODULES_ENABLE | |
364 { | |
365 GSList *h = hk_handler_queue; | |
366 if (h) { | |
367 hk_arg_t args[] = { | |
368 { "hook", "hook-message-out" }, | |
369 { "jid", bjid }, | |
370 { "message", wmsg }, | |
371 { NULL, NULL }, | |
372 }; | |
373 while (h) { | |
374 hook_list_data_t *data = h->data; | |
375 (data->handler) (args, data->userdata); | |
376 h = g_slist_next (h); | |
377 } | |
378 } | |
379 } | |
380 #endif | |
289 | 381 |
290 // External command | 382 // External command |
291 hk_ext_cmd(bjid, 'M', 'S', NULL); | 383 hk_ext_cmd(bjid, 'M', 'S', NULL); |
292 | 384 |
293 g_free(bmsg); | 385 g_free(bmsg); |
355 roster_setstatus(bjid, rn, prio, status, status_msg, timestamp, | 447 roster_setstatus(bjid, rn, prio, status, status_msg, timestamp, |
356 role_none, affil_none, NULL); | 448 role_none, affil_none, NULL); |
357 buddylist_build(); | 449 buddylist_build(); |
358 scr_DrawRoster(); | 450 scr_DrawRoster(); |
359 hlog_write_status(bjid, timestamp, status, status_msg); | 451 hlog_write_status(bjid, timestamp, status, status_msg); |
452 | |
453 #ifdef MODULES_ENABLE | |
454 { | |
455 GSList *h = hk_handler_queue; | |
456 if (h) { | |
457 char os[2] = " \0"; | |
458 char ns[2] = " \0"; | |
459 hk_arg_t args[] = { | |
460 { "hook", "hook-status-change" }, | |
461 { "jid", bjid }, | |
462 { "resource", rn }, | |
463 { "old_status", os }, | |
464 { "new_status", ns }, | |
465 { "message", status_msg ? status_msg : "" }, | |
466 { NULL, NULL }, | |
467 }; | |
468 os[0] = imstatus2char[oldstat]; | |
469 ns[0] = imstatus2char[status]; | |
470 while (h) { | |
471 hook_list_data_t *data = h->data; | |
472 (data->handler) (args, data->userdata); | |
473 h = g_slist_next (h); | |
474 } | |
475 } | |
476 } | |
477 #endif | |
478 | |
360 // External command | 479 // External command |
361 hk_ext_cmd(ename ? ename : bjid, 'S', imstatus2char[status], NULL); | 480 hk_ext_cmd(ename ? ename : bjid, 'S', imstatus2char[status], NULL); |
362 } | 481 } |
363 | 482 |
364 void hk_mystatuschange(time_t timestamp, enum imstatus old_status, | 483 void hk_mystatuschange(time_t timestamp, enum imstatus old_status, |
365 enum imstatus new_status, const char *msg) | 484 enum imstatus new_status, const char *msg) |
366 { | 485 { |
367 scr_LogPrint(LPRINT_LOGNORM, "Your status has been set: [%c>%c] %s", | 486 scr_LogPrint(LPRINT_LOGNORM, "Your status has been set: [%c>%c] %s", |
368 imstatus2char[old_status], imstatus2char[new_status], | 487 imstatus2char[old_status], imstatus2char[new_status], |
369 (msg ? msg : "")); | 488 (msg ? msg : "")); |
489 | |
490 #ifdef MODULES_ENABLE | |
491 { | |
492 GSList *h = hk_handler_queue; | |
493 if (h) { | |
494 char ns[2] = " \0"; | |
495 hk_arg_t args[] = { | |
496 { "hook", "hook-my-status-change" }, | |
497 { "new_status", ns }, | |
498 { "message", msg ? msg : "" }, | |
499 { NULL, NULL }, | |
500 }; | |
501 ns[0] = imstatus2char[new_status]; | |
502 while (h) { | |
503 hook_list_data_t *data = h->data; | |
504 (data->handler) (args, data->userdata); | |
505 h = g_slist_next (h); | |
506 } | |
507 } | |
508 } | |
509 #endif | |
510 | |
370 //hlog_write_status(NULL, 0, status); | 511 //hlog_write_status(NULL, 0, status); |
371 } | 512 } |
372 | 513 |
373 | 514 |
374 /* Internal commands */ | 515 /* Internal commands */ |
387 scr_LogPrint(LPRINT_LOGNORM, "%s", buf); | 528 scr_LogPrint(LPRINT_LOGNORM, "%s", buf); |
388 | 529 |
389 cmdline = from_utf8(hook_command); | 530 cmdline = from_utf8(hook_command); |
390 if (process_command(cmdline, TRUE) == 255) | 531 if (process_command(cmdline, TRUE) == 255) |
391 mcabber_set_terminate_ui(); | 532 mcabber_set_terminate_ui(); |
533 | |
534 #ifdef MODULES_ENABLE | |
535 { | |
536 GSList *h = hk_handler_queue; | |
537 if (h) { | |
538 hk_arg_t args[] = { | |
539 { "hook", hookname }, | |
540 { NULL, NULL }, | |
541 }; | |
542 while (h) { | |
543 hook_list_data_t *data = h->data; | |
544 (data->handler) (args, data->userdata); | |
545 h = g_slist_next (h); | |
546 } | |
547 } | |
548 } | |
549 #endif | |
392 | 550 |
393 g_free(cmdline); | 551 g_free(cmdline); |
394 g_free(buf); | 552 g_free(buf); |
395 } | 553 } |
396 | 554 |