Added /roster command with nick option to change handle

This commit is contained in:
James Booth
2013-05-19 02:07:01 +01:00
parent 905571bfb7
commit d300e8e763
8 changed files with 102 additions and 29 deletions

View File

@@ -79,6 +79,7 @@ _roster_handle_set(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza,
}
const char *jid = xmpp_stanza_get_attribute(item, STANZA_ATTR_JID);
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);
@@ -91,7 +92,7 @@ _roster_handle_set(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza,
pending_out = TRUE;
}
roster_update_subscription(jid, sub, pending_out);
roster_update(jid, name, sub, pending_out);
return 1;
}
@@ -238,17 +239,36 @@ roster_contact_offline(const char * const barejid,
}
void
roster_update_subscription(const char * const barejid,
roster_change_handle(const char * const barejid, const char * const handle)
{
PContact contact = g_hash_table_lookup(contacts, barejid);
if (contact != NULL) {
p_contact_set_name(contact, handle);
}
xmpp_conn_t * const conn = connection_get_conn();
xmpp_ctx_t * const ctx = connection_get_ctx();
xmpp_stanza_t *iq = stanza_create_roster_set(ctx, barejid, handle);
xmpp_send(conn, iq);
xmpp_stanza_release(iq);
}
void
roster_update(const char * const barejid, const char * const name,
const char * const subscription, gboolean pending_out)
{
PContact contact = g_hash_table_lookup(contacts, barejid);
if (contact == NULL) {
contact = p_contact_new_subscription(barejid, subscription, pending_out);
contact = p_contact_new(barejid, name, subscription, NULL, pending_out);
g_hash_table_insert(contacts, strdup(barejid), contact);
} else {
p_contact_set_subscription(contact, subscription);
p_contact_set_pending_out(contact, pending_out);
if (name != NULL) {
p_contact_set_name(contact, name);
}
}
}

View File

@@ -27,7 +27,7 @@ void roster_add_handlers(void);
void roster_request(void);
void roster_remove(const char * const barejid);
void roster_update_subscription(const char * const barejid,
void roster_update(const char * const barejid, const char * const name,
const char * const subscription, gboolean pending_out);
#endif

View File

@@ -89,6 +89,29 @@ stanza_create_message(xmpp_ctx_t *ctx, const char * const recipient,
return msg;
}
xmpp_stanza_t *
stanza_create_roster_set(xmpp_ctx_t *ctx, const char * const jid,
const char * const handle)
{
xmpp_stanza_t *iq = xmpp_stanza_new(ctx);
xmpp_stanza_set_name(iq, STANZA_NAME_IQ);
xmpp_stanza_set_type(iq, STANZA_TYPE_SET);
xmpp_stanza_t *query = xmpp_stanza_new(ctx);
xmpp_stanza_set_name(query, STANZA_NAME_QUERY);
xmpp_stanza_set_ns(query, XMPP_NS_ROSTER);
xmpp_stanza_t *item = xmpp_stanza_new(ctx);
xmpp_stanza_set_name(item, STANZA_NAME_ITEM);
xmpp_stanza_set_attribute(item, STANZA_ATTR_JID, jid);
xmpp_stanza_set_attribute(item, STANZA_ATTR_NAME, handle);
xmpp_stanza_add_child(query, item);
xmpp_stanza_add_child(iq, query);
return iq;
}
xmpp_stanza_t *
stanza_create_invite(xmpp_ctx_t *ctx, const char * const room,
const char * const contact, const char * const reason)

View File

@@ -177,4 +177,7 @@ xmpp_stanza_t * stanza_create_disco_items_iq(xmpp_ctx_t *ctx, const char * const
char * stanza_get_status(xmpp_stanza_t *stanza, char *def);
char * stanza_get_show(xmpp_stanza_t *stanza, char *def);
xmpp_stanza_t * stanza_create_roster_set(xmpp_ctx_t *ctx, const char * const jid,
const char * const handle);
#endif

View File

@@ -140,5 +140,6 @@ char * roster_find_resource(char *search_str);
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);
#endif