diff --git a/solanaceae/ngc_hs2/ngc_hs2.cpp b/solanaceae/ngc_hs2/ngc_hs2.cpp index e9b2640..6a9bf90 100644 --- a/solanaceae/ngc_hs2/ngc_hs2.cpp +++ b/solanaceae/ngc_hs2/ngc_hs2.cpp @@ -3,15 +3,26 @@ #include NGCHS2::NGCHS2( + Contact3Registry& cr, + RegistryMessageModelI& rmm, ToxContactModel2& tcm, ToxEventProviderI& tep, NGCFT1& nft ) : + _cr(cr), + _rmm(rmm), + _rmm_sr(_rmm.newSubRef(this)), _tcm(tcm), _tep_sr(tep.newSubRef(this)), _nft(nft), _nftep_sr(_nft.newSubRef(this)) { + _rmm_sr + .subscribe(RegistryMessageModel_Event::message_construct) + .subscribe(RegistryMessageModel_Event::message_updated) + .subscribe(RegistryMessageModel_Event::message_destroy) + ; + _tep_sr .subscribe(TOX_EVENT_GROUP_PEER_JOIN) .subscribe(TOX_EVENT_GROUP_PEER_EXIT) @@ -35,6 +46,18 @@ float NGCHS2::iterate(float delta) { return 1000.f; } +bool NGCHS2::onEvent(const Message::Events::MessageConstruct&) { + return false; +} + +bool NGCHS2::onEvent(const Message::Events::MessageUpdated&) { + return false; +} + +bool NGCHS2::onEvent(const Message::Events::MessageDestory&) { + return false; +} + bool NGCHS2::onEvent(const Events::NGCFT1_recv_request& e) { if ( e.file_kind != NGCFT1_file_kind::HS2_INFO_RANGE_TIME && diff --git a/solanaceae/ngc_hs2/ngc_hs2.hpp b/solanaceae/ngc_hs2/ngc_hs2.hpp index 771203f..d33b605 100644 --- a/solanaceae/ngc_hs2/ngc_hs2.hpp +++ b/solanaceae/ngc_hs2/ngc_hs2.hpp @@ -1,25 +1,55 @@ #pragma once -//#include #include -//#include +#include +#include #include +#include + // fwd class ToxContactModel2; -class NGCHS2 : public ToxEventI, public NGCFT1EventI { +// time ranges +// should we just do last x minutes like zngchs? +// properly done, we need to use: +// - Message::Components::ViewCurserBegin +// - Message::Components::ViewCurserEnd +// +// on startup, manually check all registries for ranges (meh) (do later) +// listen on message events, check if range, see if range satisfied recently +// deal with a queue, and delay (at least 1sec, 3-10sec after a peer con change) +// or we always overrequest (eg 48h), and only fetch messages in, or close to range + +class NGCHS2 : public RegistryMessageModelEventI, public ToxEventI, public NGCFT1EventI { + Contact3Registry& _cr; + RegistryMessageModelI& _rmm; + RegistryMessageModelI::SubscriptionReference _rmm_sr; ToxContactModel2& _tcm; - //Contact3Registry& _cr; - //RegistryMessageModelI& _rmm; ToxEventProviderI::SubscriptionReference _tep_sr; NGCFT1& _nft; NGCFT1EventProviderI::SubscriptionReference _nftep_sr; + // describes our knowlage of a remote peer + struct RemoteInfo { + // list of all ppk+mid+ts they sent us (filtered by reqs, like range, ppk...) + // with when it last sent a range? hmm + }; + entt::dense_map _remote_info; + + // open/running info requests (by c) + + // open/running info responses (by c) + + static const bool _only_send_self_observed {true}; + static const int64_t _max_time_into_past_default {60}; // s + public: NGCHS2( + Contact3Registry& cr, + RegistryMessageModelI& rmm, ToxContactModel2& tcm, ToxEventProviderI& tep, NGCFT1& nf @@ -29,6 +59,15 @@ class NGCHS2 : public ToxEventI, public NGCFT1EventI { float iterate(float delta); + // add to queue with timer + // check and updates all existing cursers for giving reg in queue + void enqueueWantCurser(Message3Handle m); + + protected: + bool onEvent(const Message::Events::MessageConstruct&) override; + bool onEvent(const Message::Events::MessageUpdated&) override; + bool onEvent(const Message::Events::MessageDestory&) override; + protected: bool onEvent(const Events::NGCFT1_recv_request&) override; bool onEvent(const Events::NGCFT1_recv_init&) override; diff --git a/solanaceae/ngc_hs2/spec_ngc_hs2.md b/solanaceae/ngc_hs2/spec_ngc_hs2.md index 8a70aae..a1486f7 100644 --- a/solanaceae/ngc_hs2/spec_ngc_hs2.md +++ b/solanaceae/ngc_hs2/spec_ngc_hs2.md @@ -57,18 +57,18 @@ Manual exceptions to all can be made at the users discretion, eg for other self TODO: is reusing the ft request api a good idea for this? -| fttype | name | content (ft id) | -|------|------|---------------------| -| 0x01 | time range | - ts start
- ts end
- supported compression? | -| | TODO: id range based request? | | -| 0x01 | single message | - ppk
- mid
- ts | +| fttype | name | content (ft id) | +|------------|------|---------------------| +| 0x00000f00 | time range | - ts start
- ts end
- supported compression? | +| | TODO: id range based request? | | +| 0x00000f01 | single message | - ppk
- mid
- ts | ## File transfers -| fttype | name | content | -|--------|------|---------------------| -| 0x01 | time range | - feature bitset (1byte? different compressions?)
- ts start
- ts end
- list size
\\+ entry `ppk`
\\+ entry `mid`
\\+ entry `ts` | -| 0x01 | single message | - message type (text/textaction/file)
- text if text or action, file type and file id if file | +| fttype | name | content | +|------------|------|---------------------| +| 0x00000f00 | time range | - feature bitset (1byte? different compressions?)
- ts start
- ts end
- list size
\\+ entry `ppk`
\\+ entry `mid`
\\+ entry `ts` | +| 0x00000f01 | single message | - message type (text/textaction/file)
- text if text or action, file type and file id if file | ## TODO