added room leave and invite sync callbacks

This commit is contained in:
Sorunome 2019-10-20 20:39:52 +02:00
parent efa5431319
commit ca77f6450c
No known key found for this signature in database
GPG key ID: 63E31F7B5993A9C4
2 changed files with 116 additions and 26 deletions

View file

@ -8,6 +8,8 @@
namespace Matrix { namespace Matrix {
typedef void (*eventCallback)(std::string roomId, json_t* event);
class Store { class Store {
public: public:
virtual void setSyncToken(std::string token) = 0; virtual void setSyncToken(std::string token) = 0;
@ -44,7 +46,11 @@ public:
bool isSyncing = false; bool isSyncing = false;
Thread syncThread; Thread syncThread;
RequestError lastRequestError; RequestError lastRequestError;
void (* sync_event_callback)(std::string roomId, json_t* event) = 0; struct {
eventCallback event = NULL;
eventCallback leaveRoom = NULL;
eventCallback inviteRoom = NULL;
} callbacks;
void processSync(json_t* sync); void processSync(json_t* sync);
void registerFilter(); void registerFilter();
json_t* doSync(std::string token, std::string filter, u32 timeout); json_t* doSync(std::string token, std::string filter, u32 timeout);
@ -75,7 +81,9 @@ public:
std::string redactEvent(std::string roomId, std::string eventId, std::string reason = ""); std::string redactEvent(std::string roomId, std::string eventId, std::string reason = "");
void startSyncLoop(); void startSyncLoop();
void stopSyncLoop(); void stopSyncLoop();
void setSyncEventCallback(void (*cb)(std::string roomId, json_t* event)); void setEventCallback(eventCallback cb);
void setLeaveRoomCallback(eventCallback cb);
void setInviteRoomCallback(eventCallback cb);
}; };
}; // namespace Matrix }; // namespace Matrix

View file

@ -357,8 +357,16 @@ void Client::stopSyncLoop() {
isSyncing = false; isSyncing = false;
} }
void Client::setSyncEventCallback(void (*cb)(std::string roomId, json_t* event)) { void Client::setEventCallback(eventCallback cb) {
sync_event_callback = cb; callbacks.event = cb;
}
void Client::setLeaveRoomCallback(eventCallback cb) {
callbacks.leaveRoom = cb;
}
void Client::setInviteRoomCallback(eventCallback cb) {
callbacks.inviteRoom = cb;
} }
void Client::processSync(json_t* sync) { void Client::processSync(json_t* sync) {
@ -375,39 +383,113 @@ void Client::processSync(json_t* sync) {
size_t index; size_t index;
json_t* event; json_t* event;
if (leftRooms) { if (leftRooms && callbacks.leaveRoom) {
json_object_foreach(leftRooms, roomId, room) { json_object_foreach(leftRooms, roomId, room) {
// rooms that we left // rooms that we left
// emit leave event with roomId
}
}
if (invitedRooms) {
json_object_foreach(invitedRooms, roomId, room) {
// rooms that we were invited to
}
}
if (joinedRooms) {
json_object_foreach(joinedRooms, roomId, room) {
// rooms that we are joined
// D printf_top("%s:\n", roomId);
json_t* timeline = json_object_get(room, "timeline"); json_t* timeline = json_object_get(room, "timeline");
if (!timeline) { if (!timeline) {
// D printf_top("no timeline\n");
continue; continue;
} }
json_t* events = json_object_get(timeline, "events"); json_t* events = json_object_get(timeline, "events");
if (!events) { if (!events) {
// D printf_top("no events\n"); continue;
}
json_t* leaveEvent = NULL;
json_array_foreach(events, index, event) {
// check if the event type is m.room.member
json_t* val = json_object_get(event, "type");
if (!val) {
continue;
}
if (strcmp(json_string_value(val), "m.room.member") != 0) {
continue;
}
// check if it is actually us
val = json_object_get(event, "state_key");
if (!val) {
continue;
}
if (strcmp(json_string_value(val), getUserId().c_str()) != 0) {
continue;
}
// we do *not* check for event age as we don't have unsigned stuffs in our timeline due to our filter
// so we just assume that the events arrive in the correct order (probably true)
leaveEvent = event;
}
if (!leaveEvent) {
D printf_top("Left room %s without an event\n", roomId);
continue;
}
callbacks.leaveRoom(roomId, leaveEvent);
}
}
if (invitedRooms && callbacks.inviteRoom) {
json_object_foreach(invitedRooms, roomId, room) {
// rooms that we were invited to
json_t* invite_state = json_object_get(room, "invite_state");
if (!invite_state) {
continue;
}
json_t* events = json_object_get(invite_state, "events");
if (!events) {
continue;
}
json_t* inviteEvent = NULL;
json_array_foreach(events, index, event) {
// check if the event type is m.room.member
json_t* val = json_object_get(event, "type");
if (!val) {
continue;
}
if (strcmp(json_string_value(val), "m.room.member") != 0) {
continue;
}
// check if it is actually us
val = json_object_get(event, "state_key");
if (!val) {
continue;
}
if (strcmp(json_string_value(val), getUserId().c_str()) != 0) {
continue;
}
// check for if it was an invite event
json_t* content = json_object_get(event, "content");
if (!content) {
continue;
}
val = json_object_get(content, "membership");
if (!val) {
continue;
}
if (strcmp(json_string_value(val), "invite") != 0) {
continue;
}
// we do *not* check for event age as we don't have unsigned stuffs in our timeline due to our filter
// so we just assume that the events arrive in the correct order (probably true)
inviteEvent = event;
}
if (!inviteEvent) {
D printf_top("Invite to room %s without an event\n", roomId);
continue;
}
callbacks.inviteRoom(roomId, inviteEvent);
}
}
if (joinedRooms && callbacks.event) {
json_object_foreach(joinedRooms, roomId, room) {
// rooms that we are joined
json_t* timeline = json_object_get(room, "timeline");
if (!timeline) {
continue;
}
json_t* events = json_object_get(timeline, "events");
if (!events) {
continue; continue;
} }
json_array_foreach(events, index, event) { json_array_foreach(events, index, event) {
json_t* eventType = json_object_get(event, "type"); callbacks.event(roomId, event);
// D printf_top("%s\n", json_string_value(eventType));
if (sync_event_callback) {
sync_event_callback(roomId, event);
}
} }
} }
} }