aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEion Robb <eion@robbmob.com>2017-05-28 14:30:19 +1200
committerGitHub <noreply@github.com>2017-05-28 14:30:19 +1200
commit5988e14f1ad6d5f4fd00119ef1b116b7d0d5d540 (patch)
tree0ae5997555650635ac794cbfce2bc68193ee9d37
parenta0e49f377112a01c00ca848a83bc7951816ae56a (diff)
parent4cc8da9456f2169fe48849f53374b21baa7236b9 (diff)
downloadpurple-matrix-5988e14f1ad6d5f4fd00119ef1b116b7d0d5d540.tar.gz
Merge branch 'master' into typing-notifications3
-rw-r--r--libmatrix.c2
-rw-r--r--matrix-api.c16
-rw-r--r--matrix-api.h1
-rw-r--r--matrix-connection.c6
-rw-r--r--matrix-room.c34
5 files changed, 47 insertions, 12 deletions
diff --git a/libmatrix.c b/libmatrix.c
index 5ff40d0..e0a1e64 100644
--- a/libmatrix.c
+++ b/libmatrix.c
@@ -105,6 +105,8 @@ void matrixprpl_login(PurpleAccount *acct)
purple_signal_connect(purple_conversations_get_handle(), "chat-conversation-typing",
acct, PURPLE_CALLBACK(matrixprpl_conv_send_typing), pc);
+
+ pc->flags |= PURPLE_CONNECTION_HTML;
}
diff --git a/matrix-api.c b/matrix-api.c
index f4f009a..b80637a 100644
--- a/matrix-api.c
+++ b/matrix-api.c
@@ -585,7 +585,7 @@ void matrix_api_cancel(MatrixApiRequestData *data)
}
-gchar *_build_login_body(const gchar *username, const gchar *password)
+gchar *_build_login_body(const gchar *username, const gchar *password, const gchar *device_id)
{
JsonObject *body;
JsonNode *node;
@@ -596,7 +596,10 @@ gchar *_build_login_body(const gchar *username, const gchar *password)
json_object_set_string_member(body, "type", "m.login.password");
json_object_set_string_member(body, "user", username);
json_object_set_string_member(body, "password", password);
-
+ json_object_set_string_member(body, "initial_device_display_name", "purple-matrix");
+ if (device_id != NULL)
+ json_object_set_string_member(body, "device_id", device_id);
+
node = json_node_new(JSON_NODE_OBJECT);
json_node_set_object(node, body);
json_object_unref(body);
@@ -612,6 +615,7 @@ gchar *_build_login_body(const gchar *username, const gchar *password)
MatrixApiRequestData *matrix_api_password_login(MatrixConnectionData *conn,
const gchar *username,
const gchar *password,
+ const gchar *device_id,
MatrixApiCallback callback,
gpointer user_data)
{
@@ -625,7 +629,7 @@ MatrixApiRequestData *matrix_api_password_login(MatrixConnectionData *conn,
url = g_strconcat(conn->homeserver, "_matrix/client/api/v1/login",
NULL);
- json = _build_login_body(username, password);
+ json = _build_login_body(username, password, device_id);
fetch_data = matrix_api_start(url, "POST", json, conn, callback,
NULL, NULL, user_data, 0);
@@ -877,7 +881,7 @@ MatrixApiRequestData *matrix_api_upload_file(MatrixConnectionData *conn,
MatrixApiRequestData *fetch_data;
url = g_string_new(conn->homeserver);
- g_string_append(url, "/_matrix/media/r0/upload");
+ g_string_append(url, "_matrix/media/r0/upload");
g_string_append(url, "?access_token=");
g_string_append(url, purple_url_encode(conn->access_token));
@@ -915,10 +919,8 @@ MatrixApiRequestData *matrix_api_download_file(MatrixConnectionData *conn,
return NULL;
}
url = g_string_new(conn->homeserver);
- g_string_append(url, "/_matrix/media/r0/download/");
+ g_string_append(url, "_matrix/media/r0/download/");
g_string_append(url, uri + 6); /* i.e. after the mxc:// */
- g_string_append(url, "?access_token=");
- g_string_append(url, purple_url_encode(conn->access_token));
/* I'd like to validate the headers etc a bit before downloading the
* data (maybe using _handle_header_completed), also I'm not convinced
diff --git a/matrix-api.h b/matrix-api.h
index 59f6b27..22091d8 100644
--- a/matrix-api.h
+++ b/matrix-api.h
@@ -134,6 +134,7 @@ void matrix_api_cancel(MatrixApiRequestData *request);
MatrixApiRequestData *matrix_api_password_login(MatrixConnectionData *conn,
const gchar *username,
const gchar *password,
+ const gchar *device_id,
MatrixApiCallback callback,
gpointer user_data);
diff --git a/matrix-connection.c b/matrix-connection.c
index 893e3db..91c660a 100644
--- a/matrix-connection.c
+++ b/matrix-connection.c
@@ -181,6 +181,8 @@ static void _login_completed(MatrixConnectionData *conn,
conn->access_token = g_strdup(access_token);
conn->user_id = g_strdup(matrix_json_object_get_string_member(root_obj,
"user_id"));
+ purple_account_set_string(pc->account, "device_id",
+ matrix_json_object_get_string_member(root_obj, "device_id"));
/* start the sync loop */
next_batch = purple_account_get_string(pc->account,
@@ -233,7 +235,9 @@ void matrix_connection_start_login(PurpleConnection *pc)
purple_connection_update_progress(pc, _("Logging in"), 0, 3);
matrix_api_password_login(conn, acct->username,
- purple_account_get_password(acct), _login_completed, conn);
+ purple_account_get_password(acct),
+ purple_account_get_string(acct, "device_id", NULL),
+ _login_completed, conn);
}
diff --git a/matrix-room.c b/matrix-room.c
index aae4075..ea38efc 100644
--- a/matrix-room.c
+++ b/matrix-room.c
@@ -169,6 +169,19 @@ static void _on_member_change(PurpleConversation *conv,
new_state->content);
}
+/**
+ * Called when there is a change to the topic.
+ */
+static void _on_topic_change(PurpleConversation *conv,
+ MatrixRoomEvent *new_state)
+{
+ PurpleConvChat *chat = PURPLE_CONV_CHAT(conv);
+
+ purple_conv_chat_set_topic(chat, new_state->sender,
+ matrix_json_object_get_string_member(new_state->content,
+ "topic"));
+}
+
/**
* Called when there is a change list of typing userss.
@@ -270,6 +283,9 @@ static void _on_state_update(const gchar *event_type,
else if(strcmp(event_type, "m.typing") == 0) {
_on_typing(conv, old_state, new_state);
}
+ else if(strcmp(event_type, "m.room.topic") == 0) {
+ _on_topic_change(conv, new_state);
+ }
}
void matrix_room_handle_state_event(struct _PurpleConversation *conv,
@@ -930,7 +946,11 @@ void matrix_room_handle_timeline_event(PurpleConversation *conv,
}
flags = PURPLE_MESSAGE_RECV;
- escaped_body = purple_markup_escape_text(tmp_body ? tmp_body : msg_body, -1);
+ if (purple_strequal(matrix_json_object_get_string_member(json_content_obj, "format"), "org.matrix.custom.html")) {
+ escaped_body = g_strdup(matrix_json_object_get_string_member(json_content_obj, "formatted_body"));
+ } else {
+ escaped_body = purple_markup_escape_text(tmp_body ? tmp_body : msg_body, -1);
+ }
g_free(tmp_body);
purple_debug_info("matrixprpl", "got message from %s in %s\n", sender_id,
room_id);
@@ -1269,7 +1289,7 @@ void matrix_room_send_message(PurpleConversation *conv, const gchar *message)
PurpleConvChat *chat = PURPLE_CONV_CHAT(conv);
const char *type_string = "m.text";
const char *image_start, *image_end;
- gchar *message_to_send;
+ gchar *message_to_send, *message_dup;
GData *image_attribs;
/* Matrix doesn't have messages that have both images and text in, so
@@ -1305,20 +1325,26 @@ void matrix_room_send_message(PurpleConversation *conv, const gchar *message)
* escape the message body. Matrix clients don't unescape the bodies
* either, so they end up seeing &quot; instead of "
*/
- message_to_send = purple_unescape_html(message);
+ message_dup = g_strdup(message);
+ message_to_send = purple_markup_strip_html(message_dup);
if (purple_message_meify(message_to_send, -1)) {
type_string = "m.emote";
+ purple_message_meify(message_dup, -1);
}
content = json_object_new();
json_object_set_string_member(content, "msgtype", type_string);
json_object_set_string_member(content, "body", message_to_send);
+ json_object_set_string_member(content, "formatted_body", message_dup);
+ json_object_set_string_member(content, "format", "org.matrix.custom.html");
_enqueue_event(conv, "m.room.message", content, NULL, NULL);
json_object_unref(content);
purple_conv_chat_write(chat, _get_my_display_name(conv),
- message, PURPLE_MESSAGE_SEND, g_get_real_time()/1000/1000);
+ message_dup, PURPLE_MESSAGE_SEND, g_get_real_time()/1000/1000);
+
g_free(message_to_send);
+ g_free(message_dup);
}