From 798db7368a2df832924be1f28c9720ae6bc60236 Mon Sep 17 00:00:00 2001 From: Diogo Sousa Date: Tue, 9 Jul 2013 20:21:16 +0100 Subject: Added hexchat_hook_server_attrs() and hexchat_hook_print_attrs() to the plugin interface. This hooks are similar to hexchat_hook_{server,print}() except the callback passes an extra argument with the (new) structure hexchat_event_attrs. This structure contains attributes related to the event; by now it only contains the server_time_utc member which is non-zero if server-time is enabled and the server used this extension to pass a timestamp. See issue #661. (Note: this hooks are still not called by hexchat in this commit.) --- src/common/plugin.c | 79 +++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 67 insertions(+), 12 deletions(-) (limited to 'src/common/plugin.c') diff --git a/src/common/plugin.c b/src/common/plugin.c index 5a6a42a6..90c6bbc4 100644 --- a/src/common/plugin.c +++ b/src/common/plugin.c @@ -74,6 +74,11 @@ struct _hexchat_hook int pri; /* fd */ /* priority / fd for HOOK_FD only */ }; +struct _hexchat_event_attrs +{ + time_t server_time_utc; /* 0 if not used */ +}; + struct _hexchat_list { int type; /* LIST_* */ @@ -86,6 +91,8 @@ struct _hexchat_list typedef int (hexchat_cmd_cb) (char *word[], char *word_eol[], void *user_data); typedef int (hexchat_serv_cb) (char *word[], char *word_eol[], void *user_data); typedef int (hexchat_print_cb) (char *word[], void *user_data); +typedef int (hexchat_serv_attrs_cb) (char *word[], char *word_eol[], hexchat_event_attrs *attrs, void *user_data); +typedef int (hexchat_print_attrs_cb) (char *word[], hexchat_event_attrs *attrs, void *user_data); typedef int (hexchat_fd_cb) (int fd, int flags, void *user_data); typedef int (hexchat_timer_cb) (void *user_data); typedef int (hexchat_init_func) (hexchat_plugin *, char **, char **, char **, char *); @@ -102,12 +109,14 @@ enum enum { - HOOK_COMMAND, /* /command */ - HOOK_SERVER, /* PRIVMSG, NOTICE, numerics */ - HOOK_PRINT, /* All print events */ - HOOK_TIMER, /* timeouts */ - HOOK_FD, /* sockets & fds */ - HOOK_DELETED /* marked for deletion */ + HOOK_COMMAND, /* /command */ + HOOK_SERVER, /* PRIVMSG, NOTICE, numerics */ + HOOK_SERVER_ATTRS, /* same as above, with attributes */ + HOOK_PRINT, /* All print events */ + HOOK_PRINT_ATTRS, /* same as above, with attributes */ + HOOK_TIMER, /* timeouts */ + HOOK_FD, /* sockets & fds */ + HOOK_DELETED /* marked for deletion */ }; GSList *plugin_list = NULL; /* export for plugingui.c */ @@ -289,6 +298,8 @@ plugin_add (session *sess, char *filename, void *handle, void *init_func, pl->hexchat_pluginpref_get_int = hexchat_pluginpref_get_int; pl->hexchat_pluginpref_delete = hexchat_pluginpref_delete; pl->hexchat_pluginpref_list = hexchat_pluginpref_list; + pl->hexchat_hook_server_attrs = hexchat_hook_server_attrs; + pl->hexchat_hook_print_attrs = hexchat_hook_print_attrs; /* incase new plugins are loaded on older HexChat */ pl->hexchat_dummy4 = hexchat_dummy; @@ -539,7 +550,8 @@ plugin_hook_find (GSList *list, int type, char *name) /* check for plugin hooks and run them */ static int -plugin_hook_run (session *sess, char *name, char *word[], char *word_eol[], int type) +plugin_hook_run (session *sess, char *name, char *word[], char *word_eol[], + hexchat_event_attrs *attrs, int type) { GSList *list, *next; hexchat_hook *hook; @@ -562,9 +574,15 @@ plugin_hook_run (session *sess, char *name, char *word[], char *word_eol[], int case HOOK_COMMAND: ret = ((hexchat_cmd_cb *)hook->callback) (word, word_eol, hook->userdata); break; + case HOOK_PRINT_ATTRS: + ret = ((hexchat_print_attrs_cb *)hook->callback) (word, attrs, hook->userdata); + break; case HOOK_SERVER: ret = ((hexchat_serv_cb *)hook->callback) (word, word_eol, hook->userdata); break; + case HOOK_SERVER_ATTRS: + ret = ((hexchat_serv_attrs_cb *)hook->callback) (word, word_eol, attrs, hook->userdata); + break; default: /*case HOOK_PRINT:*/ ret = ((hexchat_print_cb *)hook->callback) (word, hook->userdata); break; @@ -606,7 +624,7 @@ xit: int plugin_emit_command (session *sess, char *name, char *word[], char *word_eol[]) { - return plugin_hook_run (sess, name, word, word_eol, HOOK_COMMAND); + return plugin_hook_run (sess, name, word, word_eol, NULL, HOOK_COMMAND); } /* got a server PRIVMSG, NOTICE, numeric etc... */ @@ -614,7 +632,18 @@ plugin_emit_command (session *sess, char *name, char *word[], char *word_eol[]) int plugin_emit_server (session *sess, char *name, char *word[], char *word_eol[]) { - return plugin_hook_run (sess, name, word, word_eol, HOOK_SERVER); + return plugin_hook_run (sess, name, word, word_eol, NULL, HOOK_SERVER); +} + +int +plugin_emit_server_attr (session *sess, char *name, char *word[], char *word_eol[], + time_t server_time) +{ + hexchat_event_attrs attrs; + + attrs.server_time_utc=server_time; + + return plugin_hook_run (sess, name, word, word_eol, &attrs, HOOK_SERVER_ATTRS); } /* see if any plugins are interested in this print event */ @@ -622,7 +651,17 @@ plugin_emit_server (session *sess, char *name, char *word[], char *word_eol[]) int plugin_emit_print (session *sess, char *word[]) { - return plugin_hook_run (sess, word[0], word, NULL, HOOK_PRINT); + return plugin_hook_run (sess, word[0], word, NULL, NULL, HOOK_PRINT); +} + +int +plugin_emit_print_attr (session *sess, char *word[], time_t server_time) +{ + hexchat_event_attrs attrs; + + attrs.server_time_utc=server_time; + + return plugin_hook_run (sess, word[0], word, NULL, &attrs, HOOK_PRINT_ATTRS); } int @@ -635,7 +674,7 @@ plugin_emit_dummy_print (session *sess, char *name) for (i = 1; i < 32; i++) word[i] = "\000"; - return plugin_hook_run (sess, name, word, NULL, HOOK_PRINT); + return plugin_hook_run (sess, name, word, NULL, NULL, HOOK_PRINT); } int @@ -663,7 +702,7 @@ plugin_emit_keypress (session *sess, unsigned int state, unsigned int keyval, for (i = 5; i < PDIWORDS; i++) word[i] = "\000"; - return plugin_hook_run (sess, word[0], word, NULL, HOOK_PRINT); + return plugin_hook_run (sess, word[0], word, NULL, NULL, HOOK_PRINT); } static int @@ -868,6 +907,14 @@ hexchat_hook_server (hexchat_plugin *ph, const char *name, int pri, return plugin_add_hook (ph, HOOK_SERVER, pri, name, 0, callb, 0, userdata); } +hexchat_hook * +hexchat_hook_server_attrs (hexchat_plugin *ph, const char *name, int pri, + hexchat_serv_attrs_cb *callb, void *userdata) +{ + return plugin_add_hook (ph, HOOK_SERVER_ATTRS, pri, name, 0, callb, 0, + userdata); +} + hexchat_hook * hexchat_hook_print (hexchat_plugin *ph, const char *name, int pri, hexchat_print_cb *callb, void *userdata) @@ -875,6 +922,14 @@ hexchat_hook_print (hexchat_plugin *ph, const char *name, int pri, return plugin_add_hook (ph, HOOK_PRINT, pri, name, 0, callb, 0, userdata); } +hexchat_hook * +hexchat_hook_print_attrs (hexchat_plugin *ph, const char *name, int pri, + hexchat_print_attrs_cb *callb, void *userdata) +{ + return plugin_add_hook (ph, HOOK_PRINT_ATTRS, pri, name, 0, callb, 0, + userdata); +} + hexchat_hook * hexchat_hook_timer (hexchat_plugin *ph, int timeout, hexchat_timer_cb *callb, void *userdata) -- cgit 1.4.1