diff options
author | Sebastien Helleu <flashcode@flashtux.org> | 2009-01-15 15:29:05 +0100 |
---|---|---|
committer | Sebastien Helleu <flashcode@flashtux.org> | 2009-01-15 15:29:05 +0100 |
commit | 18a62f1dac870c96152063d69336ecfaf563da69 (patch) | |
tree | 7989acb4aebf8749f7ddb5e48e13431f93e0ce33 /src/plugins/jabber/jabber-completion.c | |
parent | c717d206cd73c0445a9edd1a5b723ea79a107676 (diff) | |
download | weechat-18a62f1dac870c96152063d69336ecfaf563da69.zip |
Add Jabber plugin (alpha version, many Jabber features are missing)
This commit introduces Jabber/XMPP protocol for WeeChat. It uses iksemel lib.
Please note many major Jabber features are missing:
- roster management (add/remove/.. buddies),
- MUC,
- transports.
It is possible to define servers (with /jabber), connect to them (with
/jconnect), disconnect (/jdisconnect) and chat with buddies (with /jchat).
Diffstat (limited to 'src/plugins/jabber/jabber-completion.c')
-rw-r--r-- | src/plugins/jabber/jabber-completion.c | 448 |
1 files changed, 448 insertions, 0 deletions
diff --git a/src/plugins/jabber/jabber-completion.c b/src/plugins/jabber/jabber-completion.c new file mode 100644 index 000000000..e08f665b1 --- /dev/null +++ b/src/plugins/jabber/jabber-completion.c @@ -0,0 +1,448 @@ +/* + * Copyright (c) 2009 by FlashCode <flashcode@flashtux.org> + * See README for License detail, AUTHORS for developers list. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +/* jabber-completion.c: completion for Jabber commands */ + + +#include <stdlib.h> +#include <stdio.h> +#include <string.h> + +#include "../weechat-plugin.h" +#include "jabber.h" +#include "jabber-buddy.h" +#include "jabber-buffer.h" +#include "jabber-completion.h" +#include "jabber-config.h" +#include "jabber-muc.h" +#include "jabber-server.h" + + +/* + * jabber_completion_server_cb: callback for completion with current server + */ + +int +jabber_completion_server_cb (void *data, const char *completion_item, + struct t_gui_buffer *buffer, + struct t_gui_completion *completion) +{ + JABBER_GET_SERVER(buffer); + + /* make C compiler happy */ + (void) data; + (void) completion_item; + + if (ptr_server) + { + weechat_hook_completion_list_add (completion, ptr_server->name, + 0, WEECHAT_LIST_POS_SORT); + } + + return WEECHAT_RC_OK; +} + +/* + * jabber_completion_server_local_name_cb: callback for completion with local + * name on server + */ + +int +jabber_completion_server_local_name_cb (void *data, + const char *completion_item, + struct t_gui_buffer *buffer, + struct t_gui_completion *completion) +{ + const char *local_name; + + JABBER_GET_SERVER(buffer); + + /* make C compiler happy */ + (void) data; + (void) completion_item; + + if (ptr_server) + { + local_name = jabber_server_get_local_name (ptr_server); + if (local_name && local_name[0]) + { + weechat_hook_completion_list_add (completion, local_name, + 1, WEECHAT_LIST_POS_SORT); + } + } + + return WEECHAT_RC_OK; +} + +/* + * jabber_completion_server_buddies_cb: callback for completion with buddies + * of current server + */ + +int +jabber_completion_server_buddies_cb (void *data, const char *completion_item, + struct t_gui_buffer *buffer, + struct t_gui_completion *completion) +{ + struct t_jabber_muc *ptr_muc2; + struct t_jabber_buddy *ptr_buddy; + const char *local_name; + + JABBER_GET_SERVER_MUC(buffer); + + /* make C compiler happy */ + (void) data; + (void) completion_item; + + if (ptr_server) + { + for (ptr_muc2 = ptr_server->mucs; ptr_muc2; + ptr_muc2 = ptr_muc2->next_muc) + { + if (ptr_muc2->type == JABBER_MUC_TYPE_MUC) + { + for (ptr_buddy = ptr_muc2->buddies; ptr_buddy; + ptr_buddy = ptr_buddy->next_buddy) + { + weechat_hook_completion_list_add (completion, + ptr_buddy->name, + 1, WEECHAT_LIST_POS_SORT); + } + } + } + + local_name = jabber_server_get_local_name (ptr_server); + + if (local_name && local_name[0]) + { + /* add local name at the end */ + weechat_hook_completion_list_add (completion, local_name, + 1, WEECHAT_LIST_POS_END); + } + } + + return WEECHAT_RC_OK; +} + +/* + * jabber_completion_servers_cb: callback for completion with servers + */ + +int +jabber_completion_servers_cb (void *data, const char *completion_item, + struct t_gui_buffer *buffer, + struct t_gui_completion *completion) +{ + struct t_jabber_server *ptr_server; + + /* make C compiler happy */ + (void) data; + (void) completion_item; + (void) buffer; + + for (ptr_server = jabber_servers; ptr_server; + ptr_server = ptr_server->next_server) + { + weechat_hook_completion_list_add (completion, ptr_server->name, + 0, WEECHAT_LIST_POS_SORT); + } + + return WEECHAT_RC_OK; +} + +/* + * jabber_completion_muc_cb: callback for completion with current MUC + */ + +int +jabber_completion_muc_cb (void *data, const char *completion_item, + struct t_gui_buffer *buffer, + struct t_gui_completion *completion) +{ + JABBER_GET_SERVER_MUC(buffer); + + /* make C compiler happy */ + (void) data; + (void) completion_item; + + if (ptr_muc) + { + weechat_hook_completion_list_add (completion, ptr_muc->name, + 0, WEECHAT_LIST_POS_SORT); + } + + return WEECHAT_RC_OK; +} + +/* + * jabber_completion_muc_buddies_cb: callback for completion with buddies + * of current MUC + */ + +int +jabber_completion_muc_buddies_cb (void *data, const char *completion_item, + struct t_gui_buffer *buffer, + struct t_gui_completion *completion) +{ + struct t_jabber_buddy *ptr_buddy; + const char *buddy, *local_name; + int list_size, i, j; + + JABBER_GET_SERVER_MUC(buffer); + + /* make C compiler happy */ + (void) data; + (void) completion_item; + + if (ptr_muc) + { + switch (ptr_muc->type) + { + case JABBER_MUC_TYPE_MUC: + for (ptr_buddy = ptr_muc->buddies; ptr_buddy; + ptr_buddy = ptr_buddy->next_buddy) + { + weechat_hook_completion_list_add (completion, + ptr_buddy->name, + 1, + WEECHAT_LIST_POS_SORT); + } + /* add buddies speaking recently on this MUC */ + if (weechat_config_boolean (jabber_config_look_nick_completion_smart)) + { + /* 0 => buddy speaking ; 1 => buddy speaking to me + (with highlight) */ + for (i = 0; i < 2; i++) + { + if (ptr_muc->buddies_speaking[i]) + { + list_size = weechat_list_size (ptr_muc->buddies_speaking[i]); + for (j = 0; j < list_size; j++) + { + buddy = weechat_list_string (weechat_list_get (ptr_muc->buddies_speaking[i], j)); + if (buddy && jabber_buddy_search (NULL, ptr_muc, buddy)) + { + weechat_hook_completion_list_add (completion, + buddy, + 1, + WEECHAT_LIST_POS_BEGINNING); + } + } + } + } + } + /* add local name at the end */ + local_name = jabber_server_get_local_name (ptr_server); + if (local_name && local_name[0]) + { + weechat_hook_completion_list_add (completion, + local_name, + 1, + WEECHAT_LIST_POS_END); + } + break; + case JABBER_MUC_TYPE_PRIVATE: + weechat_hook_completion_list_add (completion, + ptr_muc->name, + 0, + WEECHAT_LIST_POS_SORT); + break; + } + ptr_muc->nick_completion_reset = 0; + } + + return WEECHAT_RC_OK; +} + +/* + * jabber_completion_muc_buddies_hosts_cb: callback for completion with buddies + * and hosts of current MUC + */ + +int +jabber_completion_muc_buddies_hosts_cb (void *data, + const char *completion_item, + struct t_gui_buffer *buffer, + struct t_gui_completion *completion) +{ + struct t_jabber_buddy *ptr_buddy; + char *buf; + int length; + + JABBER_GET_SERVER_MUC(buffer); + + /* make C compiler happy */ + (void) data; + (void) completion_item; + + if (ptr_muc) + { + switch (ptr_muc->type) + { + case JABBER_MUC_TYPE_MUC: + for (ptr_buddy = ptr_muc->buddies; ptr_buddy; + ptr_buddy = ptr_buddy->next_buddy) + { + weechat_hook_completion_list_add (completion, + ptr_buddy->name, + 1, + WEECHAT_LIST_POS_SORT); + if (ptr_buddy->host) + { + length = strlen (ptr_buddy->name) + 1 + + strlen (ptr_buddy->host) + 1; + buf = malloc (length); + if (buf) + { + snprintf (buf, length, "%s!%s", + ptr_buddy->name, ptr_buddy->host); + weechat_hook_completion_list_add (completion, + buf, + 0, + WEECHAT_LIST_POS_SORT); + free (buf); + } + } + } + break; + case JABBER_MUC_TYPE_PRIVATE: + weechat_hook_completion_list_add (completion, + ptr_muc->name, + 0, + WEECHAT_LIST_POS_SORT); + } + } + + return WEECHAT_RC_OK; +} + +/* + * jabber_completion_muc_topic_cb: callback for completion with topic of + * current MUC + */ + +int +jabber_completion_muc_topic_cb (void *data, const char *completion_item, + struct t_gui_buffer *buffer, + struct t_gui_completion *completion) +{ + JABBER_GET_SERVER_MUC(buffer); + + /* make C compiler happy */ + (void) data; + (void) completion_item; + + if (ptr_muc && ptr_muc->topic && ptr_muc->topic[0]) + { + weechat_hook_completion_list_add (completion, + ptr_muc->topic, + 0, + WEECHAT_LIST_POS_SORT); + } + + return WEECHAT_RC_OK; +} + +/* + * jabber_completion_mucs_cb: callback for completion with MUCs + */ + +int +jabber_completion_mucs_cb (void *data, const char *completion_item, + struct t_gui_buffer *buffer, + struct t_gui_completion *completion) +{ + (void) completion; + + struct t_jabber_server *ptr_server; + struct t_jabber_muc *ptr_muc; + + /* make C compiler happy */ + (void) data; + (void) completion_item; + (void) buffer; + + for (ptr_server = jabber_servers; ptr_server; + ptr_server = ptr_server->next_server) + { + for (ptr_muc = ptr_server->mucs; ptr_muc; ptr_muc = ptr_muc->next_muc) + { + weechat_hook_completion_list_add (completion, + ptr_muc->name, + 0, + WEECHAT_LIST_POS_SORT); + } + } + + return WEECHAT_RC_OK; +} + +/* + * jabber_completion_msg_part_cb: callback for completion with default part + * message + */ + +int +jabber_completion_msg_part_cb (void *data, const char *completion_item, + struct t_gui_buffer *buffer, + struct t_gui_completion *completion) +{ + /* make C compiler happy */ + (void) data; + (void) completion_item; + (void) buffer; + + if (weechat_config_string (jabber_config_network_default_msg_part) + && weechat_config_string (jabber_config_network_default_msg_part)[0]) + { + weechat_hook_completion_list_add (completion, + weechat_config_string (jabber_config_network_default_msg_part), + 0, WEECHAT_LIST_POS_SORT); + } + + return WEECHAT_RC_OK; +} + +/* + * jabber_completion_init: init completion for Jabber plugin + */ + +void +jabber_completion_init () +{ + weechat_hook_completion ("jabber_server", + &jabber_completion_server_cb, NULL); + weechat_hook_completion ("jabber_server_local_name", + &jabber_completion_server_local_name_cb, NULL); + weechat_hook_completion ("jabber_server_buddies", + &jabber_completion_server_buddies_cb, NULL); + weechat_hook_completion ("jabber_servers", + &jabber_completion_servers_cb, NULL); + weechat_hook_completion ("jabber_muc", + &jabber_completion_muc_cb, NULL); + weechat_hook_completion ("buddy", + &jabber_completion_muc_buddies_cb, NULL); + weechat_hook_completion ("jabber_muc_buddies_hosts", + &jabber_completion_muc_buddies_hosts_cb, NULL); + weechat_hook_completion ("jabber_muc_topic", + &jabber_completion_muc_topic_cb, NULL); + weechat_hook_completion ("jabber_mucs", + &jabber_completion_mucs_cb, NULL); + weechat_hook_completion ("jabber_msg_part", + &jabber_completion_msg_part_cb, NULL); +} |