aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libempathy-gtk/empathy-chat.c212
1 files changed, 127 insertions, 85 deletions
diff --git a/libempathy-gtk/empathy-chat.c b/libempathy-gtk/empathy-chat.c
index b598afb38..71b19b771 100644
--- a/libempathy-gtk/empathy-chat.c
+++ b/libempathy-gtk/empathy-chat.c
@@ -377,7 +377,7 @@ chat_sent_message_get_last (EmpathyChat *chat)
}
static void
-chat_join_command_cb (EmpathyDispatchOperation *dispatch,
+chat_command_join_cb (EmpathyDispatchOperation *dispatch,
const GError *error,
gpointer user_data)
{
@@ -391,7 +391,7 @@ chat_join_command_cb (EmpathyDispatchOperation *dispatch,
}
static void
-chat_query_command_cb (EmpathyDispatchOperation *dispatch,
+chat_command_query_cb (EmpathyDispatchOperation *dispatch,
const GError *error,
gpointer user_data)
{
@@ -407,14 +407,14 @@ chat_query_command_cb (EmpathyDispatchOperation *dispatch,
typedef struct {
EmpathyChat *chat;
gchar *msg;
-} ChatMsgCommandData;
+} ChatCommandMsgData;
static void
-chat_msg_command_cb (EmpathyDispatchOperation *dispatch,
+chat_command_msg_cb (EmpathyDispatchOperation *dispatch,
const GError *error,
gpointer user_data)
{
- ChatMsgCommandData *data = user_data;
+ ChatCommandMsgData *data = user_data;
EmpathyTpChat *tpchat;
if (error != NULL) {
@@ -445,110 +445,152 @@ chat_msg_command_cb (EmpathyDispatchOperation *dispatch,
OUT:
g_free (data->msg);
- g_slice_free (ChatMsgCommandData, data);
+ g_slice_free (ChatCommandMsgData, data);
}
static void
-chat_send (EmpathyChat *chat,
- const gchar *msg)
+chat_command_clear (EmpathyChat *chat,
+ const gchar *str)
{
- EmpathyChatPriv *priv;
- EmpathyMessage *message;
- TpConnection *connection;
- gchar *join = NULL;
+ empathy_chat_view_clear (chat->view);
+}
- if (EMP_STR_EMPTY (msg)) {
+static void
+chat_command_topic (EmpathyChat *chat,
+ const gchar *str)
+{
+ EmpathyChatPriv *priv = GET_PRIV (chat);
+ EmpathyTpChatProperty *property;
+ GValue value = {0, };
+
+ property = empathy_tp_chat_get_property (priv->tp_chat, "subject");
+ if (property == NULL) {
+ empathy_chat_view_append_event (chat->view,
+ _("This conversation does not have topic"));
return;
}
- priv = GET_PRIV (chat);
+ if (!(property->flags & TP_PROPERTY_FLAG_WRITE)) {
+ empathy_chat_view_append_event (chat->view,
+ _("You need to be a channel operator to do that"));
+ return;
+ }
- chat_sent_message_add (chat, msg);
+ g_value_init (&value, G_TYPE_STRING);
+ g_value_set_string (&value, str);
+ empathy_tp_chat_set_property (priv->tp_chat, "subject", &value);
+ g_value_unset (&value);
+}
- connection = empathy_tp_chat_get_connection (priv->tp_chat);
- if (strcmp (msg, "/clear") == 0) {
- empathy_chat_view_clear (chat->view);
- return;
- } else if (g_str_has_prefix (msg, "/topic ")) {
- EmpathyTpChatProperty *property;
- GValue value = {0, };
- gchar *topic;
-
- property = empathy_tp_chat_get_property (priv->tp_chat, "subject");
- if (property == NULL) {
- empathy_chat_view_append_event (chat->view,
- _("This conversation does not have topic"));
- return;
- }
+static void
+chat_command_join (EmpathyChat *chat,
+ const gchar *str)
+{
+ EmpathyChatPriv *priv = GET_PRIV (chat);
+ TpConnection *connection;
- if (!(property->flags & TP_PROPERTY_FLAG_WRITE)) {
- empathy_chat_view_append_event (chat->view,
- _("You need to be a channel operator to do that"));
- return;
- }
+ connection = empathy_tp_chat_get_connection (priv->tp_chat);
+ empathy_dispatcher_join_muc (connection, str,
+ chat_command_join_cb,
+ chat);
+}
- topic = g_strstrip (g_strdup (msg + strlen ("/topic ")));
- g_value_init (&value, G_TYPE_STRING);
- g_value_take_string (&value, topic);
- empathy_tp_chat_set_property (priv->tp_chat, "subject", &value);
- g_value_unset (&value);
+static void
+chat_command_query (EmpathyChat *chat,
+ const gchar *str)
+{
+ EmpathyChatPriv *priv = GET_PRIV (chat);
+ TpConnection *connection;
- return;
- } else if (g_str_has_prefix (msg, "/join ")) {
- join = g_strstrip (g_strdup (msg + strlen ("/join ")));
- } else if (g_str_has_prefix (msg, "/j ")) {
- join = g_strstrip (g_strdup (msg + strlen ("/j ")));
- } else if (g_str_has_prefix (msg, "/query ")) {
- gchar *id;
-
- /* FIXME: We should probably search in members alias. But this
- * is enough for IRC */
- id = g_strstrip (g_strdup (msg + strlen ("/query ")));
- empathy_dispatcher_chat_with_contact_id (connection, id,
- chat_query_command_cb,
- chat);
- g_free (id);
- return;
- } else if (g_str_has_prefix (msg, "/msg ")) {
- gchar *id, *index;
- ChatMsgCommandData *data;
-
- id = g_strstrip (g_strdup (msg + strlen ("/msg ")));
- index = strchr (id, ' ');
- if (index != NULL) {
- *index = '\0';
- g_strstrip (++index);
- }
+ /* FIXME: We should probably search in members alias. But this
+ * is enough for IRC */
+ connection = empathy_tp_chat_get_connection (priv->tp_chat);
+ empathy_dispatcher_chat_with_contact_id (connection, str,
+ chat_command_query_cb,
+ chat);
+}
- if (EMP_STR_EMPTY (id) || EMP_STR_EMPTY (index)) {
- empathy_chat_view_append_event (chat->view,
- _("Usage: /msg pseudo message"));
- g_free (id);
- return;
+static void
+chat_command_msg (EmpathyChat *chat,
+ const gchar *str)
+{
+ EmpathyChatPriv *priv = GET_PRIV (chat);
+ TpConnection *connection;
+ ChatCommandMsgData *data;
+ gchar *id, *msg = NULL;
+
+ id = g_strdup (str);
+ if (id != NULL) {
+ msg = strchr (id, ' ');
+ if (msg != NULL) {
+ *msg = '\0';
+ g_strstrip (++msg);
}
+ }
- /* FIXME: We should probably search in members alias. But this
- * is enough for IRC */
- data = g_slice_new (ChatMsgCommandData);
- data->chat = chat;
- data->msg = g_strdup (index);
- empathy_dispatcher_chat_with_contact_id (connection, id,
- chat_msg_command_cb,
- data);
+ if (EMP_STR_EMPTY (id) || EMP_STR_EMPTY (msg)) {
+ empathy_chat_view_append_event (chat->view,
+ _("Usage: /msg pseudo message"));
g_free (id);
return;
}
- if (join != NULL) {
- TpConnection *connection;
+ /* FIXME: We should probably search in members alias. But this
+ * is enough for IRC */
+ data = g_slice_new (ChatCommandMsgData);
+ data->chat = chat;
+ data->msg = g_strdup (msg);
+ connection = empathy_tp_chat_get_connection (priv->tp_chat);
+ empathy_dispatcher_chat_with_contact_id (connection, id,
+ chat_command_msg_cb,
+ data);
+ g_free (id);
+}
- connection = empathy_tp_chat_get_connection (priv->tp_chat);
- empathy_dispatcher_join_muc (connection, join,
- chat_join_command_cb, chat);
- g_free (join);
+typedef void (*ChatCommandFunc) (EmpathyChat *chat, const gchar *str);
+
+typedef struct {
+ const gchar *str;
+ ChatCommandFunc func;
+} ChatCommandItem;
+
+static ChatCommandItem commands[] = {
+ {"/clear", chat_command_clear},
+ {"/topic ", chat_command_topic},
+ {"/join ", chat_command_join},
+ {"/j ", chat_command_join},
+ {"/query ", chat_command_query},
+ {"/msg ", chat_command_msg},
+ {NULL, NULL}
+};
+
+static void
+chat_send (EmpathyChat *chat,
+ const gchar *msg)
+{
+ EmpathyChatPriv *priv;
+ EmpathyMessage *message;
+ guint i;
+
+ if (EMP_STR_EMPTY (msg)) {
return;
}
+ priv = GET_PRIV (chat);
+
+ chat_sent_message_add (chat, msg);
+
+ for (i = 0; commands[i].str != NULL; i++) {
+ if (g_str_has_prefix (msg, commands[i].str)) {
+ gchar *str;
+
+ str = g_strstrip (g_strdup (msg + strlen (commands[i].str)));
+ commands[i].func (chat, str);
+ g_free (str);
+ return;
+ }
+ }
+
message = empathy_message_new_from_entry (msg);
if (message == NULL) {