diff options
-rw-r--r-- | matrix-api.c | 7 | ||||
-rw-r--r-- | matrix-api.h | 8 | ||||
-rw-r--r-- | matrix-login.c | 70 | ||||
-rw-r--r-- | matrix-room.c | 39 | ||||
-rw-r--r-- | matrix-room.h | 3 |
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); /** |