From 59a3a5fe9b579bf76caf594c934fd1a8a9cb46ac Mon Sep 17 00:00:00 2001 From: James Booth Date: Sun, 19 May 2013 23:35:02 +0100 Subject: [PATCH] Use handle in /msg command --- src/command/command.c | 7 ++--- src/xmpp/message.c | 21 ++++++++++----- src/xmpp/roster.c | 63 +++++++++++++++++++++++++++++++++++++------ src/xmpp/roster.h | 1 - src/xmpp/xmpp.h | 1 + 5 files changed, 75 insertions(+), 18 deletions(-) diff --git a/src/command/command.c b/src/command/command.c index 2eb0adc0..53bc39c0 100644 --- a/src/command/command.c +++ b/src/command/command.c @@ -1973,14 +1973,15 @@ _cmd_msg(gchar **args, struct cmd_help_t help) return TRUE; } else { + char *usr_jid = roster_jid_from_handle(usr); if (msg != NULL) { - message_send(msg, usr); - ui_outgoing_msg("me", usr, msg); + message_send(msg, usr_jid); + ui_outgoing_msg("me", usr_jid, msg); if (((win_type == WIN_CHAT) || (win_type == WIN_CONSOLE)) && prefs_get_boolean(PREF_CHLOG)) { const char *jid = jabber_get_jid(); Jid *jidp = jid_create(jid); - chat_log_chat(jidp->barejid, usr, msg, PROF_OUT_LOG, NULL); + chat_log_chat(jidp->barejid, usr_jid, msg, PROF_OUT_LOG, NULL); jid_destroy(jidp); } diff --git a/src/xmpp/message.c b/src/xmpp/message.c index 0f69f4ff..00655bde 100644 --- a/src/xmpp/message.c +++ b/src/xmpp/message.c @@ -32,6 +32,7 @@ #include "profanity.h" #include "xmpp/connection.h" #include "xmpp/message.h" +#include "xmpp/roster.h" #include "xmpp/stanza.h" #include "xmpp/xmpp.h" @@ -59,21 +60,29 @@ message_add_handlers(void) void message_send(const char * const msg, const char * const recipient) { + const char * jid = NULL; + + if (roster_jid_from_handle(recipient) != NULL) { + jid = roster_jid_from_handle(recipient); + } else { + jid = recipient; + } + xmpp_conn_t * const conn = connection_get_conn(); xmpp_ctx_t * const ctx = connection_get_ctx(); if (prefs_get_boolean(PREF_STATES)) { - if (!chat_session_exists(recipient)) { - chat_session_start(recipient, TRUE); + if (!chat_session_exists(jid)) { + chat_session_start(jid, TRUE); } } xmpp_stanza_t *message; - if (prefs_get_boolean(PREF_STATES) && chat_session_get_recipient_supports(recipient)) { - chat_session_set_active(recipient); - message = stanza_create_message(ctx, recipient, STANZA_TYPE_CHAT, + if (prefs_get_boolean(PREF_STATES) && chat_session_get_recipient_supports(jid)) { + chat_session_set_active(jid); + message = stanza_create_message(ctx, jid, STANZA_TYPE_CHAT, msg, STANZA_NAME_ACTIVE, NULL); } else { - message = stanza_create_message(ctx, recipient, STANZA_TYPE_CHAT, + message = stanza_create_message(ctx, jid, STANZA_TYPE_CHAT, msg, NULL, NULL); } diff --git a/src/xmpp/roster.c b/src/xmpp/roster.c index 2d66f4a0..953b91b7 100644 --- a/src/xmpp/roster.c +++ b/src/xmpp/roster.c @@ -43,6 +43,7 @@ static int _roster_handle_result(xmpp_conn_t * const conn, static Autocomplete ac; static Autocomplete resource_ac; static GHashTable *contacts; +static GHashTable *handle_to_jid; static gboolean _key_equals(void *key1, void *key2); static gboolean _datetimes_equal(GDateTime *dt1, GDateTime *dt2); @@ -66,6 +67,12 @@ roster_request(void) xmpp_stanza_release(iq); } +char * +roster_jid_from_handle(const char * const handle) +{ + return g_hash_table_lookup(handle_to_jid, handle); +} + static int _roster_handle_set(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza, void * const userdata) @@ -82,7 +89,9 @@ _roster_handle_set(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza, const char *name = xmpp_stanza_get_attribute(item, STANZA_ATTR_NAME); const char *sub = xmpp_stanza_get_attribute(item, STANZA_ATTR_SUBSCRIPTION); if (g_strcmp0(sub, "remove") == 0) { - roster_remove(jid); + autocomplete_remove(ac, name); + g_hash_table_remove(handle_to_jid, name); + g_hash_table_remove(contacts, jid); return 1; } @@ -142,6 +151,7 @@ roster_init(void) resource_ac = autocomplete_new(); contacts = g_hash_table_new_full(g_str_hash, (GEqualFunc)_key_equals, g_free, (GDestroyNotify)p_contact_free); + handle_to_jid = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); } void @@ -152,6 +162,8 @@ roster_clear(void) g_hash_table_destroy(contacts); contacts = g_hash_table_new_full(g_str_hash, (GEqualFunc)_key_equals, g_free, (GDestroyNotify)p_contact_free); + g_hash_table_destroy(handle_to_jid); + handle_to_jid = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); } void @@ -180,19 +192,19 @@ roster_add(const char * const barejid, const char * const name, contact = p_contact_new(barejid, name, subscription, offline_message, pending_out); g_hash_table_insert(contacts, strdup(barejid), contact); - autocomplete_add(ac, strdup(barejid)); + if (name != NULL) { + autocomplete_add(ac, strdup(name)); + g_hash_table_insert(handle_to_jid, strdup(name), strdup(barejid)); + } else { + autocomplete_add(ac, strdup(barejid)); + g_hash_table_insert(handle_to_jid, strdup(barejid), strdup(barejid)); + } added = TRUE; } return added; } -void -roster_remove(const char * const barejid) -{ - g_hash_table_remove(contacts, barejid); -} - gboolean roster_update_presence(const char * const barejid, Resource *resource, GDateTime *last_activity) @@ -243,6 +255,22 @@ roster_change_handle(const char * const barejid, const char * const handle) { PContact contact = g_hash_table_lookup(contacts, barejid); + if (p_contact_name(contact) != NULL) { + autocomplete_remove(ac, p_contact_name(contact)); + g_hash_table_remove(handle_to_jid, p_contact_name(contact)); + } else { + autocomplete_remove(ac, barejid); + g_hash_table_remove(handle_to_jid, barejid); + } + + if (handle != NULL) { + autocomplete_add(ac, strdup(handle)); + g_hash_table_insert(handle_to_jid, strdup(handle), strdup(barejid)); + } else { + autocomplete_add(ac, strdup(barejid)); + g_hash_table_insert(handle_to_jid, strdup(barejid), strdup(barejid)); + } + if (contact != NULL) { p_contact_set_name(contact, handle); } @@ -262,10 +290,29 @@ roster_update(const char * const barejid, const char * const name, if (contact == NULL) { contact = p_contact_new(barejid, name, subscription, NULL, pending_out); + autocomplete_add(ac, strdup(name)); + g_hash_table_insert(handle_to_jid, strdup(name), strdup(barejid)); g_hash_table_insert(contacts, strdup(barejid), contact); } else { p_contact_set_subscription(contact, subscription); p_contact_set_pending_out(contact, pending_out); + + if (p_contact_name(contact) == NULL) { + if (name != NULL) { + autocomplete_add(ac, strdup(name)); + autocomplete_remove(ac, barejid); + g_hash_table_remove(handle_to_jid, barejid); + g_hash_table_insert(handle_to_jid, strdup(name), strdup(barejid)); + } + } else { + if (name != NULL) { + autocomplete_add(ac, strdup(name)); + autocomplete_remove(ac, p_contact_name(contact)); + g_hash_table_remove(handle_to_jid, p_contact_name(contact)); + g_hash_table_insert(handle_to_jid, strdup(name), strdup(barejid)); + } + } + if (name != NULL) { p_contact_set_name(contact, name); } diff --git a/src/xmpp/roster.h b/src/xmpp/roster.h index 1b16763f..48f6a330 100644 --- a/src/xmpp/roster.h +++ b/src/xmpp/roster.h @@ -26,7 +26,6 @@ void roster_add_handlers(void); void roster_request(void); -void roster_remove(const char * const barejid); void roster_update(const char * const barejid, const char * const name, const char * const subscription, gboolean pending_out); diff --git a/src/xmpp/xmpp.h b/src/xmpp/xmpp.h index 1f3558a9..c18454f4 100644 --- a/src/xmpp/xmpp.h +++ b/src/xmpp/xmpp.h @@ -141,5 +141,6 @@ gboolean roster_add(const char * const barejid, const char * const name, const char * const subscription, const char * const offline_message, gboolean pending_out); void roster_change_handle(const char * const barejid, const char * const handle); +char * roster_jid_from_handle(const char * const handle); #endif