aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libempathy-gtk/empathy-chat.c83
-rw-r--r--libempathy/empathy-message.c56
-rw-r--r--libempathy/empathy-message.h1
3 files changed, 69 insertions, 71 deletions
diff --git a/libempathy-gtk/empathy-chat.c b/libempathy-gtk/empathy-chat.c
index df76a02fc..c2a88b2d5 100644
--- a/libempathy-gtk/empathy-chat.c
+++ b/libempathy-gtk/empathy-chat.c
@@ -508,6 +508,31 @@ chat_command_msg (EmpathyChat *chat,
chat_command_msg_internal (chat, strv[1], strv[2]);
}
+static void
+chat_command_me (EmpathyChat *chat,
+ GStrv strv)
+{
+ EmpathyChatPriv *priv = GET_PRIV (chat);
+ EmpathyMessage *message;
+
+ message = empathy_message_new (strv[1]);
+ empathy_message_set_tptype (message, TP_CHANNEL_TEXT_MESSAGE_TYPE_ACTION);
+ empathy_tp_chat_send (priv->tp_chat, message);
+ g_object_unref (message);
+}
+
+static void
+chat_command_say (EmpathyChat *chat,
+ GStrv strv)
+{
+ EmpathyChatPriv *priv = GET_PRIV (chat);
+ EmpathyMessage *message;
+
+ message = empathy_message_new (strv[1]);
+ empathy_tp_chat_send (priv->tp_chat, message);
+ g_object_unref (message);
+}
+
static void chat_command_help (EmpathyChat *chat, GStrv strv);
typedef void (*ChatCommandFunc) (EmpathyChat *chat, GStrv strv);
@@ -539,6 +564,14 @@ static ChatCommandItem commands[] = {
{"msg", 3, 3, chat_command_msg,
N_("/msg <contact id> <message>, open a private chat")},
+ {"me", 2, 2, chat_command_me,
+ N_("/me <message>, send an ACTION message to the current conversation")},
+
+ {"say", 2, 2, chat_command_say,
+ N_("/say <message>, send <message> to the current conversation. "
+ "This is used to send a message starting with a '/'. For example: "
+ "\"/say /join is used to join a new chatroom\"")},
+
{"help", 1, 2, chat_command_help,
N_("/help [<command>], show all supported commands. "
"If <command> is defined, show its usage.")},
@@ -572,7 +605,7 @@ chat_command_help (EmpathyChat *chat,
}
for (i = 0; i < G_N_ELEMENTS (commands); i++) {
- if (!tp_strdiff (strv[1], commands[i].prefix)) {
+ if (g_ascii_strcasecmp (strv[1], commands[i].prefix) == 0) {
chat_command_show_help (chat, &commands[i]);
return;
}
@@ -592,12 +625,13 @@ chat_command_parse (const gchar *text, guint max_parts)
const gchar *end;
/* Skip white spaces */
- while (*text == ' ') {
+ while (g_ascii_isspace (*text)) {
text++;
}
- end = strchr (text, ' ');
- if (end == NULL) {
+ /* Search the end of this part, until first space. */
+ for (end = text; *end != '\0' && !g_ascii_isspace (*end); end++);
+ if (*end == '\0') {
break;
}
@@ -624,6 +658,13 @@ chat_command_parse (const gchar *text, guint max_parts)
return (GStrv) g_ptr_array_free (array, FALSE);
}
+static gboolean
+has_prefix_case (const gchar *s,
+ const gchar *prefix)
+{
+ return g_ascii_strncasecmp (s, prefix, strlen (prefix)) == 0;
+}
+
static void
chat_send (EmpathyChat *chat,
const gchar *msg)
@@ -641,11 +682,14 @@ chat_send (EmpathyChat *chat,
chat_sent_message_add (chat, msg);
if (msg[0] == '/') {
+ gboolean second_slash = FALSE;
+ const gchar *iter = msg + 1;
+
for (i = 0; i < G_N_ELEMENTS (commands); i++) {
GStrv strv;
guint strv_len;
- if (!g_str_has_prefix (msg + 1, commands[i].prefix)) {
+ if (!has_prefix_case (msg + 1, commands[i].prefix)) {
continue;
}
@@ -654,7 +698,7 @@ chat_send (EmpathyChat *chat,
* between args */
strv = chat_command_parse (msg + 1, commands[i].max_parts);
- if (tp_strdiff (strv[0], commands[i].prefix)) {
+ if (g_ascii_strcasecmp (strv[0], commands[i].prefix) != 0) {
g_strfreev (strv);
continue;
}
@@ -671,17 +715,28 @@ chat_send (EmpathyChat *chat,
g_strfreev (strv);
return;
}
- }
- message = empathy_message_new_from_entry (msg);
+ /* Also allow messages with two slashes before the
+ * first space, so it is possible to send a /unix/path.
+ * This heuristic is kind of crap. */
+ while (*iter != '\0' && !g_ascii_isspace (*iter)) {
+ if (*iter == '/') {
+ second_slash = TRUE;
+ break;
+ }
+ iter++;
+ }
- if (message == NULL) {
- empathy_chat_view_append_event (chat->view,
- _("Unsupported command"));
- } else {
- empathy_tp_chat_send (priv->tp_chat, message);
- g_object_unref (message);
+ if (!second_slash) {
+ empathy_chat_view_append_event (chat->view,
+ _("Unsupported command"));
+ return;
+ }
}
+
+ message = empathy_message_new (msg);
+ empathy_tp_chat_send (priv->tp_chat, message);
+ g_object_unref (message);
}
static void
diff --git a/libempathy/empathy-message.c b/libempathy/empathy-message.c
index a403766e4..705bd224b 100644
--- a/libempathy/empathy-message.c
+++ b/libempathy/empathy-message.c
@@ -234,62 +234,6 @@ message_set_property (GObject *object,
};
}
-static gboolean
-has_prefix_case (const gchar *s,
- const gchar *prefix)
-{
- return g_ascii_strncasecmp (s, prefix, strlen (prefix)) == 0;
-}
-
-/*
- * Constructs an EmpathyMessage based on user input, which may include "/me"
- * and friends.
- *
- * Returns: an #EmpathyMessage if @message could be parsed, or %NULL if
- * @message was an unknown command.
- */
-EmpathyMessage *
-empathy_message_new_from_entry (const gchar *message)
-{
- TpChannelTextMessageType t = TP_CHANNEL_TEXT_MESSAGE_TYPE_NORMAL;
-
- g_return_val_if_fail (message != NULL, NULL);
-
- if (message[0] == '/') {
- if (g_ascii_strcasecmp (message, "/me") == 0) {
- message = "";
- t = TP_CHANNEL_TEXT_MESSAGE_TYPE_ACTION;
- } else if (has_prefix_case (message, "/me ")) {
- message += strlen ("/me ");
- t = TP_CHANNEL_TEXT_MESSAGE_TYPE_ACTION;
- } else if (has_prefix_case (message, "/say ")) {
- message += strlen ("/say ");
- } else {
- /* Also allow messages with two slashes before the
- * first space, so it is possible to send a /unix/path.
- * This heuristic is kind of crap.
- */
- gboolean second_slash = FALSE;
- const gchar *m = message + 1;
-
- while (!second_slash && *m != '\0' && *m != ' ') {
- if (*m == '/')
- second_slash = TRUE;
-
- m++;
- }
-
- if (!second_slash)
- return NULL;
- }
- }
-
- return g_object_new (EMPATHY_TYPE_MESSAGE,
- "type", t,
- "body", message,
- NULL);
-}
-
EmpathyMessage *
empathy_message_new (const gchar *body)
{
diff --git a/libempathy/empathy-message.h b/libempathy/empathy-message.h
index 7ca624031..09175e625 100644
--- a/libempathy/empathy-message.h
+++ b/libempathy/empathy-message.h
@@ -52,7 +52,6 @@ struct _EmpathyMessageClass {
};
GType empathy_message_get_type (void) G_GNUC_CONST;
-EmpathyMessage * empathy_message_new_from_entry (const gchar *message);
EmpathyMessage * empathy_message_new (const gchar *body);
TpChannelTextMessageType empathy_message_get_tptype (EmpathyMessage *message);
void empathy_message_set_tptype (EmpathyMessage *message,