about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorJames Booth <boothj5@gmail.com>2013-04-20 20:18:13 +0100
committerJames Booth <boothj5@gmail.com>2013-04-20 20:18:13 +0100
commit81020e6d4378e98039f1ba91bbba748c4283e7d1 (patch)
treebde9e4eb6e9377a5451275b4a5a9ed46c5f156ba /src
parent91d587a19fde76a04560b3c100298253fd7d7aa5 (diff)
downloadprofani-tty-81020e6d4378e98039f1ba91bbba748c4283e7d1.tar.gz
Added /invite for direct MUC invitations
Diffstat (limited to 'src')
-rw-r--r--src/command/command.c44
-rw-r--r--src/xmpp/message.c29
-rw-r--r--src/xmpp/stanza.c24
-rw-r--r--src/xmpp/stanza.h3
-rw-r--r--src/xmpp/xmpp.h2
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);
@@ -2123,6 +2136,37 @@ _cmd_join(gchar **args, struct cmd_help_t help)
 }
 
 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)
 {
     jabber_conn_status_t conn_status = jabber_get_connection_status();
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
@@ -94,6 +94,18 @@ message_send_groupchat(const char * const msg, const char * const recipient)
 }
 
 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)
 {
     xmpp_conn_t * const conn = connection_get_conn();
@@ -149,23 +161,6 @@ static int
 _conference_message_handler(xmpp_conn_t * const conn,
     xmpp_stanza_t * const stanza, void * const userdata)
 {
-/*
- * <message to="prof2@panesar" from="test@conference.panesar">
- *      <x xmlns="http://jabber.org/protocol/muc#user">
- *          <invite from="prof4@panesar/2572c43f-aa3d-42fa-a74e-c322a80a90b8">
- *              <reason>Join the room!</reason>
- *          </invite>
- *      </x>
- *      <x jid="test@conference.panesar" xmlns="jabber:x:conference">
- *          Join the room!
- *      </x>
- *      <body>
- *          prof4@panesar/2572c43f-aa3d-42fa-a74e-c322a80a90b8 invited you to the room test@conference.panesar (Join the room!)
- *      </body>
- * </message>
- *
- */
-
     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
@@ -87,6 +87,30 @@ stanza_create_message(xmpp_ctx_t *ctx, const char * const recipient,
 }
 
 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);