aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--matrix-api.c7
-rw-r--r--matrix-api.h8
-rw-r--r--matrix-login.c70
-rw-r--r--matrix-room.c39
-rw-r--r--matrix-room.h3
5 files changed, 74 insertions, 53 deletions
diff --git a/matrix-api.c b/matrix-api.c
index 828585c..8cd8f9a 100644
--- a/matrix-api.c
+++ b/matrix-api.c
@@ -167,23 +167,20 @@ static PurpleUtilFetchUrlData *matrix_api_start(const gchar *url,
data->user_data = user_data;
/* TODO: implement the per-account proxy settings */
-
- purple_debug_info("matrixprpl", "sending HTTP request to %s", url);
-
return purple_util_fetch_url_request_len(url, TRUE, NULL, TRUE, NULL,
TRUE, max_len,
matrix_api_complete, data);
}
-PurpleUtilFetchUrlData *matrix_initialsync(MatrixAccount *account,
+PurpleUtilFetchUrlData *matrix_sync(MatrixAccount *account,
MatrixApiCallback callback,
gpointer user_data)
{
gchar *url;
PurpleUtilFetchUrlData *fetch_data;
- url = g_strdup_printf("https://%s/_matrix/client/api/v1/initialSync?"
+ url = g_strdup_printf("https://%s/_matrix/client/v2_alpha/sync?"
"access_token=%s",
account->homeserver, account->access_token);
diff --git a/matrix-api.h b/matrix-api.h
index d81c027..6783fe8 100644
--- a/matrix-api.h
+++ b/matrix-api.h
@@ -55,14 +55,14 @@ typedef void (*MatrixApiCallback)(MatrixAccount *account,
/**
- * call the /initialsync API
+ * call the /sync API
*
* @param account The MatrixAccount for which to make the request
* @param callback Function to be called when the request completes
* @param user_data Opaque data to be passed to the callback
*/
-PurpleUtilFetchUrlData *matrix_initialsync(MatrixAccount *account,
- MatrixApiCallback callback,
- gpointer user_data);
+PurpleUtilFetchUrlData *matrix_sync(MatrixAccount *account,
+ MatrixApiCallback callback,
+ gpointer user_data);
#endif
diff --git a/matrix-login.c b/matrix-login.c
index 77300a3..de1654b 100644
--- a/matrix-login.c
+++ b/matrix-login.c
@@ -34,37 +34,30 @@
#include "matrix-room.h"
/* TODO: make this configurable */
-#define MATRIX_HOMESERVER "matrix.org"
+#define MATRIX_HOMESERVER "www.sw1v.org"
/**
- * handle a room within the initialSync response
+ * handle a room within the initial sync response
*/
-static void matrixprpl_handle_initialsync_room(JsonArray *rooms,
- guint room_idx,
- JsonNode *room,
- gpointer user_data)
+static void matrixprpl_handle_initial_sync_room(
+ const gchar *room_id, JsonObject *room_data, MatrixAccount *ma)
{
- MatrixAccount *ma = (MatrixAccount *)user_data;
- JsonObject *room_obj;
- JsonArray *state_array;
- const gchar *room_id;
+ JsonObject *state_object, *event_map;
+ JsonArray *state_array;
const gchar *room_name;
PurpleConversation *conv;
PurpleChat *chat;
PurpleGroup *group;
MatrixRoomStateEventTable *state_table;
- /* TODO: error handling */
- room_obj = matrix_json_node_get_object(room);
- room_id = matrix_json_object_get_string_member(room_obj, "room_id");
- state_array = matrix_json_object_get_array_member(room_obj, "state");
+ event_map = matrix_json_object_get_object_member(room_data, "event_map");
+ state_object = matrix_json_object_get_object_member(room_data, "state");
+ state_array = matrix_json_object_get_array_member(state_object, "events");
- purple_debug_info("matrixprpl", "got room %s\n", room_id);
-
/* parse the room state */
state_table = g_hash_table_new(g_str_hash, g_str_equal); /* TODO: free */
if(state_array != NULL)
- matrix_room_parse_state_events(state_table, state_array);
+ matrix_room_parse_state_events(state_table, state_array, event_map);
/* todo: distinguish between 1-1 chats and group chats? */
@@ -100,16 +93,31 @@ static void matrixprpl_handle_initialsync_room(JsonArray *rooms,
/**
* handle the results of the intialSync request
*/
-static void matrixprpl_handle_initialsync(MatrixAccount *ma, JsonNode *body)
+static void matrixprpl_handle_initial_sync(MatrixAccount *ma, JsonNode *body)
{
JsonObject *rootObj;
- JsonArray *rooms;
+ JsonObject *rooms;
+ JsonObject *joined_rooms;
+ GList *room_ids, *elem;
+
+ rootObj = matrix_json_node_get_object(body);
+ rooms = matrix_json_object_get_object_member(rootObj, "rooms");
+ joined_rooms = matrix_json_object_get_object_member(rooms, "joined");
- /* TODO: error handling */
- rootObj = json_node_get_object(body);
- rooms = json_object_get_array_member(rootObj, "rooms");
+ if(joined_rooms == NULL) {
+ purple_debug_warning("matrixprpl", "didn't find joined rooms list\n");
+ return;
+ }
- json_array_foreach_element(rooms, matrixprpl_handle_initialsync_room, ma);
+ room_ids = json_object_get_members(joined_rooms);
+ for(elem = room_ids; elem; elem = elem->next) {
+ const gchar *room_id = elem->data;
+ JsonObject *room_data = matrix_json_object_get_object_member(
+ joined_rooms, room_id);
+ purple_debug_info("matrixprpl", "got room %s\n", room_id);
+ matrixprpl_handle_initial_sync_room(room_id, room_data, ma);
+ }
+ g_list_free(room_ids);
#if 0
/* tell purple about everyone on our buddy list who's connected */
@@ -141,7 +149,7 @@ static void matrixprpl_handle_initialsync(MatrixAccount *ma, JsonNode *body)
}
-static void matrixprpl_initialsync_complete(MatrixAccount *ma,
+static void matrixprpl_sync_complete(MatrixAccount *ma,
gpointer user_data,
int http_response_code,
const gchar *http_response_msg,
@@ -150,7 +158,7 @@ static void matrixprpl_initialsync_complete(MatrixAccount *ma,
const gchar *error_message)
{
if (error_message) {
- purple_debug_info("matrixprpl", "initialsync gave error %s\n",
+ purple_debug_info("matrixprpl", "initial sync gave error %s\n",
error_message);
purple_connection_error_reason(ma->pc,
PURPLE_CONNECTION_ERROR_NETWORK_ERROR, error_message);
@@ -158,7 +166,7 @@ static void matrixprpl_initialsync_complete(MatrixAccount *ma,
}
if (http_response_code >= 400) {
- purple_debug_info("matrixprpl", "initialsync gave response %s: %s\n",
+ purple_debug_info("matrixprpl", "initial sync gave response %s: %s\n",
http_response_msg, body_start);
purple_connection_error_reason(ma->pc,
PURPLE_CONNECTION_ERROR_OTHER_ERROR, http_response_msg);
@@ -168,17 +176,17 @@ static void matrixprpl_initialsync_complete(MatrixAccount *ma,
purple_connection_update_progress(ma->pc, _("Connected"), 2, 3);
purple_connection_set_state(ma->pc, PURPLE_CONNECTED);
- matrixprpl_handle_initialsync(ma, body);
+ matrixprpl_handle_initial_sync(ma, body);
}
/*
- * do the initialsync after login, to get room state
+ * do the initial sync after login, to get room state
*/
-static void matrixprpl_start_initialsync(MatrixAccount *ma)
+static void matrixprpl_start_sync(MatrixAccount *ma)
{
purple_connection_set_state(ma->pc, PURPLE_CONNECTING);
purple_connection_update_progress(ma->pc, _("Initial Sync"), 1, 3);
- matrix_initialsync(ma, matrixprpl_initialsync_complete, ma);
+ matrix_sync(ma, matrixprpl_sync_complete, ma);
}
void matrixprpl_login(PurpleAccount *acct)
@@ -201,5 +209,5 @@ void matrixprpl_login(PurpleAccount *acct)
*/
ma->access_token = g_strdup(acct->username);
- matrixprpl_start_initialsync(ma);
+ matrixprpl_start_sync(ma);
}
diff --git a/matrix-room.c b/matrix-room.c
index 0390cf7..a4fe75d 100644
--- a/matrix-room.c
+++ b/matrix-room.c
@@ -29,31 +29,45 @@ typedef struct _MatrixRoomStateEvent {
JsonObject *content;
} MatrixRoomStateEvent;
+typedef struct _RoomStateParserData {
+ JsonObject *event_map;
+ MatrixRoomStateEventTable *state_table;
+} RoomStateParserData;
/**
- * handle a state entry for a room
+ * handle a state event for a room
*/
static void _matrix_room_handle_roomstate(JsonArray *state,
guint state_idx, JsonNode *state_entry, gpointer user_data)
{
- MatrixRoomStateEventTable *state_table =
- (MatrixRoomStateEventTable *)user_data;
+ RoomStateParserData *data = user_data;
+ MatrixRoomStateEventTable *state_table = data->state_table;
+ JsonObject *event_map = data->event_map;
GHashTable *state_table_entry;
- JsonObject *json_state_obj, *json_content_obj;
+ JsonObject *json_event_obj, *json_content_obj;
MatrixRoomStateEvent *event;
- const gchar *event_type, *state_key;
+ const gchar *event_id, *event_type, *state_key;
- json_state_obj = matrix_json_node_get_object(state_entry);
- if(json_state_obj == NULL)
+ event_id = matrix_json_node_get_string(state_entry);
+ if(event_id == NULL) {
+ purple_debug_warning("prplmatrix", "non-string event_id");
return;
+ }
+
+ json_event_obj = matrix_json_object_get_object_member(
+ event_map, event_id);
+ if(json_event_obj == NULL) {
+ purple_debug_warning("prplmatrix", "unknown event_id %s", event_id);
+ return;
+ }
event_type = matrix_json_object_get_string_member(
- json_state_obj, "type");
+ json_event_obj, "type");
state_key = matrix_json_object_get_string_member(
- json_state_obj, "state_key");
+ json_event_obj, "state_key");
json_content_obj = matrix_json_object_get_object_member(
- json_state_obj, "content");
+ json_event_obj, "content");
if(event_type == NULL || state_key == NULL || json_content_obj == NULL)
return;
@@ -73,10 +87,11 @@ static void _matrix_room_handle_roomstate(JsonArray *state,
void matrix_room_parse_state_events(MatrixRoomStateEventTable *state_table,
- JsonArray *state_array)
+ JsonArray *state_array, JsonObject *event_map)
{
+ RoomStateParserData data = {event_map, state_table};
json_array_foreach_element(state_array, _matrix_room_handle_roomstate,
- state_table);
+ &data);
}
static MatrixRoomStateEvent *matrix_room_get_state_event(
diff --git a/matrix-room.h b/matrix-room.h
index 9537feb..b40df45 100644
--- a/matrix-room.h
+++ b/matrix-room.h
@@ -30,13 +30,14 @@ struct _PurpleConnection;
typedef GHashTable MatrixRoomStateEventTable;
struct _JsonArray;
+struct _JsonObject;
/**
* Parse a json list of room state into a MatrixRoomStateEventTable
*/
void matrix_room_parse_state_events(MatrixRoomStateEventTable *state_table,
- struct _JsonArray *state_array);
+ struct _JsonArray *state_array, struct _JsonObject *event_map);
/**