From 81020e6d4378e98039f1ba91bbba748c4283e7d1 Mon Sep 17 00:00:00 2001 From: James Booth Date: Sat, 20 Apr 2013 20:18:13 +0100 Subject: Added /invite for direct MUC invitations --- src/command/command.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ src/xmpp/message.c | 29 ++++++++++++----------------- src/xmpp/stanza.c | 24 ++++++++++++++++++++++++ src/xmpp/stanza.h | 3 +++ src/xmpp/xmpp.h | 2 ++ 5 files changed, 85 insertions(+), 17 deletions(-) diff --git a/src/command/command.c b/src/command/command.c index d3279a01..1a0596b6 100644 --- a/src/command/command.c +++ b/src/command/command.c @@ -101,6 +101,7 @@ static gboolean _cmd_tiny(gchar **args, struct cmd_help_t help); static gboolean _cmd_close(gchar **args, struct cmd_help_t help); static gboolean _cmd_clear(gchar **args, struct cmd_help_t help); static gboolean _cmd_join(gchar **args, struct cmd_help_t help); +static gboolean _cmd_invite(gchar **args, struct cmd_help_t help); static gboolean _cmd_rooms(gchar **args, struct cmd_help_t help); static gboolean _cmd_disco(gchar **args, struct cmd_help_t help); static gboolean _cmd_set_beep(gchar **args, struct cmd_help_t help); @@ -338,6 +339,16 @@ static struct cmd_t main_commands[] = "Example : /join jdev (as user@jabber.org will join jdev@conference.jabber.org)", NULL } } }, + { "/invite", + _cmd_invite, parse_args_with_freetext, 1, 2, + { "/invite jid [message]", "Invite contact to chat room.", + { "/invite jid [message]", + "--------------------------", + "Send a direct invite to the specified contact to the current chat room.", + "The jid must be a contact in your roster.", + "If a message is supplied it will be send as the reason for the invite.", + NULL } } }, + { "/rooms", _cmd_rooms, parse_args, 0, 1, { "/rooms [conference-service]", "List chat rooms.", @@ -1079,6 +1090,8 @@ _cmd_complete_parameters(char *input, int *size) contact_list_find_resource); } + _parameter_autocomplete(input, size, "/invite", contact_list_find_contact); + _parameter_autocomplete(input, size, "/connect", accounts_find_enabled); _parameter_autocomplete_with_ac(input, size, "/sub", sub_ac); @@ -2122,6 +2135,37 @@ _cmd_join(gchar **args, struct cmd_help_t help) return TRUE; } +static gboolean +_cmd_invite(gchar **args, struct cmd_help_t help) +{ + char *contact = args[0]; + char *reason = args[1]; + char *room = NULL; + jabber_conn_status_t conn_status = jabber_get_connection_status(); + + if (conn_status != JABBER_CONNECTED) { + cons_show("You are not currently connected."); + return TRUE; + } + + if (!win_current_is_groupchat()) { + cons_show("You must be in a chat room to send an invite."); + return TRUE; + } + + room = win_current_get_recipient(); + message_send_invite(room, contact, reason); + if (reason != NULL) { + cons_show("Room invite sent, contact: %s, room: %s, reason: \"%s\".", + contact, room, reason); + } else { + cons_show("Room invite sent, contact: %s, room: %s.", + contact, room); + } + + return TRUE; +} + static gboolean _cmd_rooms(gchar **args, struct cmd_help_t help) { diff --git a/src/xmpp/message.c b/src/xmpp/message.c index ace42a31..d18abd62 100644 --- a/src/xmpp/message.c +++ b/src/xmpp/message.c @@ -93,6 +93,18 @@ message_send_groupchat(const char * const msg, const char * const recipient) xmpp_stanza_release(message); } +void +message_send_invite(const char * const room, const char * const contact, + const char * const reason) +{ + xmpp_conn_t * const conn = connection_get_conn(); + xmpp_ctx_t * const ctx = connection_get_ctx(); + xmpp_stanza_t *stanza = stanza_create_invite(ctx, room, contact, reason); + + xmpp_send(conn, stanza); + xmpp_stanza_release(stanza); +} + void message_send_composing(const char * const recipient) { @@ -149,23 +161,6 @@ static int _conference_message_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza, void * const userdata) { -/* - * - * - * - * Join the room! - * - * - * - * Join the room! - * - * - * prof4@panesar/2572c43f-aa3d-42fa-a74e-c322a80a90b8 invited you to the room test@conference.panesar (Join the room!) - * - * - * - */ - xmpp_stanza_t *x_muc = xmpp_stanza_get_child_by_ns(stanza, STANZA_NS_MUC_USER); xmpp_stanza_t *x_groupchat = xmpp_stanza_get_child_by_ns(stanza, STANZA_NS_CONFERENCE); char *from = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_FROM); diff --git a/src/xmpp/stanza.c b/src/xmpp/stanza.c index 47f809ae..68232382 100644 --- a/src/xmpp/stanza.c +++ b/src/xmpp/stanza.c @@ -86,6 +86,30 @@ stanza_create_message(xmpp_ctx_t *ctx, const char * const recipient, return msg; } +xmpp_stanza_t * +stanza_create_invite(xmpp_ctx_t *ctx, const char * const room, + const char * const contact, const char * const reason) +{ + xmpp_stanza_t *message, *x; + + message = xmpp_stanza_new(ctx); + xmpp_stanza_set_name(message, STANZA_NAME_MESSAGE); + xmpp_stanza_set_attribute(message, STANZA_ATTR_TO, contact); + + x = xmpp_stanza_new(ctx); + xmpp_stanza_set_name(x, STANZA_NAME_X); + xmpp_stanza_set_ns(x, STANZA_NS_CONFERENCE); + + xmpp_stanza_set_attribute(x, STANZA_ATTR_JID, room); + if (reason != NULL) { + xmpp_stanza_set_attribute(x, STANZA_ATTR_REASON, reason); + } + + xmpp_stanza_add_child(message, x); + + return message; +} + xmpp_stanza_t * stanza_create_room_join_presence(xmpp_ctx_t * const ctx, const char * const full_room_jid) diff --git a/src/xmpp/stanza.h b/src/xmpp/stanza.h index f86b213d..3aa0cf6f 100644 --- a/src/xmpp/stanza.h +++ b/src/xmpp/stanza.h @@ -134,6 +134,9 @@ xmpp_stanza_t* stanza_create_ping_iq(xmpp_ctx_t *ctx); xmpp_stanza_t* stanza_create_disco_info_iq(xmpp_ctx_t *ctx, const char * const id, const char * const to, const char * const node); +xmpp_stanza_t* stanza_create_invite(xmpp_ctx_t *ctx, const char * const room, + const char * const contact, const char * const reason); + gboolean stanza_contains_chat_state(xmpp_stanza_t *stanza); gboolean stanza_get_delay(xmpp_stanza_t * const stanza, GTimeVal *tv_stamp); diff --git a/src/xmpp/xmpp.h b/src/xmpp/xmpp.h index 9b4000ad..0fa8cdf8 100644 --- a/src/xmpp/xmpp.h +++ b/src/xmpp/xmpp.h @@ -97,6 +97,8 @@ void message_send_inactive(const char * const recipient); void message_send_composing(const char * const recipient); void message_send_paused(const char * const recipient); void message_send_gone(const char * const recipient); +void message_send_invite(const char * const room, const char * const contact, + const char * const reason); // presence functions void presence_subscription(const char * const jid, const jabber_subscr_t action); -- cgit 1.4.1-2-gfad0