From 7f57a4c42293f098b38b73adacdb219284c006ce Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Tue, 26 Feb 2019 17:34:07 -0800 Subject: [PATCH] modules/client/sync: Sketch various preliminary linear sync handlers. --- modules/client/sync/account_data.cc | 9 ++- modules/client/sync/rooms.cc | 66 ++++++++++++++----- modules/client/sync/rooms/account_data.cc | 10 ++- modules/client/sync/rooms/ephemeral.cc | 28 +++++++- .../client/sync/rooms/ephemeral/receipt.cc | 15 ++++- modules/client/sync/rooms/state.cc | 13 ++-- modules/client/sync/rooms/timeline.cc | 40 ++--------- .../client/sync/rooms/unread_notifications.cc | 34 +++++++++- 8 files changed, 152 insertions(+), 63 deletions(-) diff --git a/modules/client/sync/account_data.cc b/modules/client/sync/account_data.cc index 46833f5af..2d417a239 100644 --- a/modules/client/sync/account_data.cc +++ b/modules/client/sync/account_data.cc @@ -34,7 +34,14 @@ ircd::m::sync::account_data bool ircd::m::sync::account_data_linear(data &data) { - return false; + assert(data.event); + assert(data.event_idx); + json::stack::array array + { + *data.out, "events" + }; + + return account_data_(data, *data.event, data.event_idx); } bool diff --git a/modules/client/sync/rooms.cc b/modules/client/sync/rooms.cc index 6381080dc..20c1bc3d4 100644 --- a/modules/client/sync/rooms.cc +++ b/modules/client/sync/rooms.cc @@ -47,41 +47,75 @@ ircd::m::sync::rooms_linear(data &data) json::get<"room_id"_>(event) }; - const scope_restore theirs + const scope_restore their_room { data.room, &room }; - bool ret{false}; - ret |= _rooms_linear(data, "invite"); - ret |= _rooms_linear(data, "join"); - ret |= _rooms_linear(data, "leave"); - ret |= _rooms_linear(data, "ban"); - return ret; -} + char membuf[32]; + const string_view &membership + { + data.room->membership(membuf, data.user) + }; -bool -ircd::m::sync::_rooms_linear(data &data, - const string_view &membership) -{ - const scope_restore theirs + if(!membership) + return false; + + const scope_restore their_membership { data.membership, membership }; - bool ret{false}; + const event::idx room_head + { + head_idx(std::nothrow, *data.room) + }; + + const scope_restore their_head + { + data.room_head, room_head + }; + + json::stack::checkpoint checkpoint + { + *data.out + }; + + json::stack::object membership_ + { + *data.out, membership + }; + + json::stack::object room_ + { + *data.out, data.room->room_id + }; + + bool ret(false); m::sync::for_each("rooms", [&data, &ret] (item &item) { + json::stack::checkpoint checkpoint + { + *data.out + }; + json::stack::object object { *data.out, item.member_name() }; - ret |= item.linear(data); - return true; + if(item.linear(data)) + ret = true; + else + checkpoint.rollback(); + + return !ret; }); + if(!ret) + checkpoint.rollback(); + return ret; } diff --git a/modules/client/sync/rooms/account_data.cc b/modules/client/sync/rooms/account_data.cc index 988bdbb29..eda47c4f8 100644 --- a/modules/client/sync/rooms/account_data.cc +++ b/modules/client/sync/rooms/account_data.cc @@ -19,6 +19,7 @@ namespace ircd::m::sync static bool room_account_data_polylog_events_event(data &, const m::event &); static bool room_account_data_polylog_events(data &); static bool room_account_data_polylog(data &); + static bool room_account_data_linear(data &); extern item room_account_data; } @@ -27,9 +28,16 @@ decltype(ircd::m::sync::room_account_data) ircd::m::sync::room_account_data { "rooms.account_data", - room_account_data_polylog + room_account_data_polylog, + room_account_data_linear }; +bool +ircd::m::sync::room_account_data_linear(data &data) +{ + return false; +} + bool ircd::m::sync::room_account_data_polylog(data &data) { diff --git a/modules/client/sync/rooms/ephemeral.cc b/modules/client/sync/rooms/ephemeral.cc index 534c57b21..bbd83ef3a 100644 --- a/modules/client/sync/rooms/ephemeral.cc +++ b/modules/client/sync/rooms/ephemeral.cc @@ -33,7 +33,33 @@ ircd::m::sync::rooms_ephemeral bool ircd::m::sync::rooms_ephemeral_linear(data &data) { - return false; + assert(data.event); + if(json::get<"event_id"_>(*data.event)) + return false; + + json::stack::array array + { + *data.out, "events" + }; + + bool ret{false}; + m::sync::for_each("rooms.ephemeral", [&data, &ret] + (item &item) + { + json::stack::checkpoint checkpoint + { + *data.out + }; + + if(item.linear(data)) + ret = true; + else + checkpoint.rollback(); + + return true; + }); + + return ret; } bool diff --git a/modules/client/sync/rooms/ephemeral/receipt.cc b/modules/client/sync/rooms/ephemeral/receipt.cc index 779bfbc59..565b4eeee 100644 --- a/modules/client/sync/rooms/ephemeral/receipt.cc +++ b/modules/client/sync/rooms/ephemeral/receipt.cc @@ -19,6 +19,7 @@ namespace ircd::m::sync static bool _handle_message_receipt(data &, const m::event &); static bool _handle_message(data &, const m::event::idx &); static bool room_ephemeral_m_receipt_m_read_polylog(data &); + static bool room_ephemeral_m_receipt_m_read_linear(data &); extern item room_ephemeral_m_receipt_m_read; } @@ -26,9 +27,21 @@ decltype(ircd::m::sync::room_ephemeral_m_receipt_m_read) ircd::m::sync::room_ephemeral_m_receipt_m_read { "rooms.ephemeral.m_receipt", - room_ephemeral_m_receipt_m_read_polylog + room_ephemeral_m_receipt_m_read_polylog, + room_ephemeral_m_receipt_m_read_linear }; +bool +ircd::m::sync::room_ephemeral_m_receipt_m_read_linear(data &data) +{ + assert(data.event); + if(json::get<"type"_>(*data.event) != "m.receipt") + return false; + + _handle_message_receipt(data, *data.event); + return true; +} + bool ircd::m::sync::room_ephemeral_m_receipt_m_read_polylog(data &data) { diff --git a/modules/client/sync/rooms/state.cc b/modules/client/sync/rooms/state.cc index ee4af7963..08f1887bf 100644 --- a/modules/client/sync/rooms/state.cc +++ b/modules/client/sync/rooms/state.cc @@ -63,17 +63,16 @@ bool ircd::m::sync::room_state_linear(data &data) { assert(data.event); - assert(data.room); - assert(json::get<"room_id"_>(*data.event)); - if(!json::get<"state_key"_>(*data.event)) return false; - if(!data.room->membership(data.user, data.membership)) - return false; + json::stack::array array + { + *data.out, "events" + }; - //data.array->append(*data.event); - return false; + array.append(*data.event); + return true; } bool diff --git a/modules/client/sync/rooms/timeline.cc b/modules/client/sync/rooms/timeline.cc index 10267f80e..c973b0cf4 100644 --- a/modules/client/sync/rooms/timeline.cc +++ b/modules/client/sync/rooms/timeline.cc @@ -19,7 +19,6 @@ namespace ircd::m::sync static event::id::buf _room_timeline_polylog_events(data &, const m::room &, bool &, bool &); static bool room_timeline_polylog(data &); - static event::id::buf _room_timeline_linear_events(data &, const m::room &, bool &); static bool room_timeline_linear(data &); extern const event::keys::include default_keys; @@ -52,46 +51,17 @@ ircd::m::sync::default_keys bool ircd::m::sync::room_timeline_linear(data &data) { - json::stack::object object - { - *data.out - }; + assert(data.event); + if(!json::get<"event_id"_>(*data.event)) + return false; - m::room room; - - // events - bool limited{false}; - m::event::id::buf prev - { - _room_timeline_linear_events(data, room, limited) - }; - - // prev_batch - json::stack::member - { - object, "prev_batch", string_view{prev} - }; - - // limited - json::stack::member - { - object, "limited", json::value{limited} - }; - - return false; -} - -ircd::m::event::id::buf -ircd::m::sync::_room_timeline_linear_events(data &data, - const m::room &room, - bool &limited) -{ json::stack::array array { *data.out, "events" }; - return {}; + array.append(*data.event); + return true; } bool diff --git a/modules/client/sync/rooms/unread_notifications.cc b/modules/client/sync/rooms/unread_notifications.cc index 5e4909b56..620ff5148 100644 --- a/modules/client/sync/rooms/unread_notifications.cc +++ b/modules/client/sync/rooms/unread_notifications.cc @@ -34,7 +34,39 @@ ircd::m::sync::room_unread_notifications bool ircd::m::sync::room_unread_notifications_linear(data &data) { - return false; + assert(data.event); + if(!json::get<"event_id"_>(*data.event)) + return false; + + const auto &room{*data.room}; + m::event::id::buf last_read; + if(!m::receipt::read(last_read, room.room_id, data.user)) + return false; + + const auto start_idx + { + index(last_read) + }; + + // highlight_count + json::stack::member + { + *data.out, "highlight_count", json::value + { + _highlight_count(room, data.user, start_idx, data.range.second) + } + }; + + // notification_count + json::stack::member + { + *data.out, "notification_count", json::value + { + _notification_count(room, start_idx, data.range.second) + } + }; + + return true; } bool