urbit/pkg/arvo/app/hark-graph-hook.hoon

454 lines
11 KiB
Plaintext
Raw Normal View History

2020-10-21 09:02:51 +03:00
:: hark-graph-hook: notifications for graph-store [landscape]
::
2021-01-28 09:13:57 +03:00
/- post, group-store, metadata=metadata-store, hook=hark-graph-hook, store=hark-store
/+ resource, mdl=metadata, default-agent, dbug, graph-store, graph, grouplib=group, store=hark-store
2020-10-21 09:02:51 +03:00
::
::
~% %hark-graph-hook-top ..part ~
2020-10-21 09:02:51 +03:00
|%
+$ card card:agent:gall
+$ versioned-state
$% state-0
state-1
2020-10-21 09:02:51 +03:00
==
::
+$ state-0
[%0 base-state-0]
::
+$ state-1
[%1 base-state-0]
::
+$ base-state-0
$: watching=(set [resource index:post])
mentions=_&
watch-on-self=_&
2020-10-21 09:02:51 +03:00
==
::
++ scry
|* [[our=@p now=@da] =mold p=path]
?> ?=(^ p)
?> ?=(^ t.p)
.^(mold i.p (scot %p our) i.t.p (scot %da now) t.t.p)
::
++ scry-notif-conversion
|= [[our=@p now=@da] desk=term =mark]
^- $-(indexed-post:graph-store (unit notif-kind:hook))
%^ scry [our now]
$-(indexed-post:graph-store (unit notif-kind:hook))
/cf/[desk]/[mark]/notification-kind
2020-10-21 09:02:51 +03:00
--
::
=| state-1
2020-10-21 09:02:51 +03:00
=* state -
::
=<
2020-10-21 09:02:51 +03:00
%- agent:dbug
^- agent:gall
~% %hark-graph-hook-agent ..card ~
|_ =bowl:gall
+* this .
ha ~(. +> bowl)
def ~(. (default-agent this %|) bowl)
2021-01-28 09:13:57 +03:00
met ~(. mdl bowl)
grp ~(. grouplib bowl)
2020-12-01 08:46:28 +03:00
gra ~(. graph bowl)
2020-10-21 09:02:51 +03:00
::
++ on-init
:_ this
~[watch-graph:ha]
::
++ on-save !>(state)
++ on-load
|= =vase
2020-10-21 09:02:51 +03:00
^- (quip card _this)
=+ !<(old=versioned-state vase)
=| cards=(list card)
|-
?: ?=(%0 -.old)
%_ $
-.old %1
::
cards
:_ cards
[%pass / %agent [our dap]:bowl %poke noun+!>(%rewatch-dms)]
==
:_ this(state old)
=. cards (flop cards)
?: (~(has by wex.bowl) [/graph our.bowl %graph-store])
cards
[watch-graph:ha cards]
2020-10-21 09:02:51 +03:00
::
++ on-watch
|= =path
^- (quip card _this)
=^ cards state
?+ path (on-watch:def path)
::
[%updates ~]
:_ state
%+ give:ha ~
:* %initial
watching
mentions
watch-on-self
==
==
[cards this]
2020-10-21 09:02:51 +03:00
::
++ on-poke
~/ %hark-graph-hook-poke
|= [=mark =vase]
^- (quip card _this)
|^
?> (team:title our.bowl src.bowl)
=^ cards state
?+ mark (on-poke:def mark vase)
%hark-graph-hook-action
(hark-graph-hook-action !<(action:hook vase))
%noun
(poke-noun !<(* vase))
2020-10-21 09:02:51 +03:00
==
[cards this]
::
++ poke-noun
|= non=*
[~ state]
:: ?> ?=(%rewatch-dms non)
:: =/ graphs=(list resource)
:: ~(tap in get-keys:gra)
:: %_ state
:: watching
:: %- ~(gas in watching)
:: (murn graphs |=(rid=resource ?:((should-watch:ha rid) `[rid ~] ~)))
:: ==
::
2020-10-21 09:02:51 +03:00
++ hark-graph-hook-action
|= =action:hook
^- (quip card _state)
|^
2020-11-10 06:32:48 +03:00
:- (give:ha ~[/updates] action)
2020-10-21 09:02:51 +03:00
?- -.action
%listen (listen +.action)
%ignore (ignore +.action)
%set-mentions (set-mentions +.action)
%set-watch-on-self (set-watch-on-self +.action)
2020-10-21 09:02:51 +03:00
==
++ listen
|= [graph=resource =index:post]
2020-11-11 03:36:32 +03:00
^+ state
state(watching (~(put in watching) [graph index]))
2020-10-21 09:02:51 +03:00
::
++ ignore
|= [graph=resource =index:post]
2020-11-11 03:36:32 +03:00
^+ state
state(watching (~(del in watching) [graph index]))
2020-10-21 09:02:51 +03:00
::
++ set-mentions
|= ment=?
2020-11-10 06:32:48 +03:00
^+ state
state(mentions ment)
::
++ set-watch-on-self
|= self=?
2020-11-10 06:32:48 +03:00
^+ state
state(watch-on-self self)
2020-10-21 09:02:51 +03:00
--
--
::
++ on-agent
~/ %hark-graph-hook-agent
|= [=wire =sign:agent:gall]
^- (quip card _this)
|^
?+ -.sign (on-agent:def wire sign)
%kick
:_ this
?. ?=([%graph ~] wire)
~
~[watch-graph:ha]
::
%fact
2021-04-14 23:49:54 +03:00
?. ?=(%graph-update-2 p.cage.sign)
2020-10-21 09:02:51 +03:00
(on-agent:def wire sign)
=^ cards state
(graph-update !<(update:graph-store q.cage.sign))
[cards this]
==
2020-12-17 09:10:26 +03:00
::
++ graph-update
|= =update:graph-store
^- (quip card _state)
?+ -.q.update `state
%add-graph (add-graph resource.q.update)
::
?(%remove-graph %archive-graph)
(remove-graph resource.q.update)
::
2021-04-14 00:30:35 +03:00
%remove-posts
(remove-posts resource.q.update indices.q.update)
::
2020-12-17 09:10:26 +03:00
%add-nodes
=* rid resource.q.update
=/ assoc=(unit association:metadata)
(peek-association:met %graph rid)
(check-nodes ~(val by nodes.q.update) rid assoc)
2020-12-17 09:10:26 +03:00
==
:: this is awful, but notification kind should always switch
:: on the index, so hopefully doesn't matter
:: TODO: rethink this
2021-04-14 00:30:35 +03:00
++ remove-posts
|= [rid=resource indices=(set index:graph-store)]
=/ to-remove
%- ~(gas by *(set [resource index:graph-store]))
(turn ~(tap in indices) (lead rid))
:_ state(watching (~(dif in watching) to-remove))
=/ convert (get-conversion:ha rid)
%+ roll
~(tap in indices)
|= [=index:graph-store out=(list card)]
=| =indexed-post:graph-store
=. index.p.indexed-post index
=/ notif-kind=(unit notif-kind:hook)
(convert indexed-post)
?~ notif-kind out
=/ =stats-index:store
[%graph rid (scag parent.index-len.u.notif-kind index)]
?. ?=(%each mode.u.notif-kind) out
2021-01-12 01:15:14 +03:00
:_ out
(poke-hark %read-each stats-index index)
::
++ poke-hark
|= =action:store
^- card
[%pass / %agent [our.bowl %hark-store] %poke hark-action+!>(action)]
2020-12-17 09:10:26 +03:00
::
++ remove-graph
|= rid=resource
=/ unwatched
%- ~(gas in *(set [resource index:graph-store]))
2020-12-17 09:10:26 +03:00
%+ skim ~(tap in watching)
|= [r=resource idx=index:graph-store]
=(r rid)
:_ state(watching (~(dif in watching) unwatched))
^- (list card)
:- (poke-hark:ha %remove-graph rid)
%- zing
%+ turn ~(tap in unwatched)
|= [r=resource =index:graph-store]
(give:ha ~[/updates] %ignore r index)
::
++ add-graph
|= rid=resource
^- (quip card _state)
=/ graph=graph:graph-store :: graph in subscription is bunted
(get-graph-mop:gra rid)
=/ node=(unit node:graph-store)
(bind (pry:orm:graph-store graph) |=([@ =node:graph-store] node))
=/ assoc=(unit association:metadata)
(peek-association:met %graph rid)
=^ cards state
(check-nodes (drop node) rid assoc)
?. (should-watch:ha rid assoc)
[cards state]
:_ state(watching (~(put in watching) [rid ~]))
(weld cards (give:ha ~[/updates] %listen [rid ~]))
2020-10-21 09:02:51 +03:00
::
2020-12-01 08:46:28 +03:00
++ check-nodes
|= $: nodes=(list node:graph-store)
2020-12-01 08:46:28 +03:00
rid=resource
assoc=(unit association:metadata)
2020-12-01 08:46:28 +03:00
==
abet:check:(abed:handle-update:ha rid nodes)
2020-10-21 09:02:51 +03:00
--
::
++ on-peek on-peek:def
::
++ on-leave on-leave:def
2020-12-01 08:46:28 +03:00
++ on-arvo
|= [=wire =sign-arvo]
^- (quip card _this)
?+ wire (on-arvo:def wire sign-arvo)
::
:: no longer necessary
[%validator @ ~] [~ this]
2020-12-01 08:46:28 +03:00
==
2020-10-21 09:02:51 +03:00
++ on-fail on-fail:def
--
::
|_ =bowl:gall
2021-01-28 09:13:57 +03:00
+* met ~(. mdl bowl)
grp ~(. grouplib bowl)
gra ~(. graph bowl)
::
++ get-conversion
|= rid=resource
^- $-(indexed-post:graph-store (unit notif-kind:hook))
=+ %^ scry [our now]:bowl
,mark=(unit mark)
/gx/graph-store/graph/(scot %p entity.rid)/[name.rid]/mark/noun
?~ mark
|=(=indexed-post:graph-store ~)
(scry-notif-conversion [our now]:bowl q.byk.bowl u.mark)
::
++ give
|= [paths=(list path) =update:hook]
^- (list card)
[%give %fact paths hark-graph-hook-update+!>(update)]~
::
++ watch-graph
^- card
[%pass /graph %agent [our.bowl %graph-store] %watch /updates]
::
++ poke-hark
|= =action:store
^- card
=- [%pass / %agent [our.bowl %hark-store] %poke -]
hark-action+!>(action)
::
++ is-mention
|= contents=(list content:post)
^- ?
?. mentions %.n
?~ contents %.n
?. ?=(%mention -.i.contents)
$(contents t.contents)
?: =(our.bowl ship.i.contents)
%.y
$(contents t.contents)
::
++ should-watch
|= [rid=resource assoc=(unit association:metadata)]
^- ?
?~ assoc
%.y
&(watch-on-self =(our.bowl entity.rid))
::
++ handle-update
|_ $: rid=resource :: input
updates=(list node:graph-store)
mark=(unit mark)
hark-pokes=(list action:store) :: output
new-watches=(list index:graph-store)
==
++ update-core .
::
++ abed
|= [r=resource upds=(list node:graph-store)]
=/ m=(unit ^mark)
(get-mark:gra r)
update-core(rid r, updates upds, mark m)
::
++ get-conversion
~+ (^get-conversion rid)
::
++ abet
^- (quip card _state)
:_ state(watching (~(uni in watching) (silt (turn new-watches (lead rid)))))
^- (list card)
%+ welp (turn (flop hark-pokes) poke-hark)
%- zing
%+ turn (flop new-watches)
|=(=index:graph-store (give ~[/updates] [%listen rid index]))
::
++ hark
|= =action:store
^+ update-core
update-core(hark-pokes [action hark-pokes])
::
++ new-watch
|= [=index:graph-store =watch-for:hook =index-len:hook]
=? new-watches =(%siblings watch-for)
[(scag parent.index-len index) new-watches]
=? new-watches =(%children watch-for)
[(scag self.index-len index) new-watches]
update-core
::
++ check
|- ^+ update-core
?~ updates
update-core
=/ core=_update-core
(check-node i.updates)
=. updates.core t.updates
$(update-core core)
::
++ check-node-children
|= =node:graph-store
^+ update-core
?: ?=(%empty -.children.node)
update-core
=/ children=(list [=atom =node:graph-store])
(tap:orm:graph-store p.children.node)
|- ^+ update-core
?~ children
update-core
=. update-core (check-node node.i.children)
$(children t.children)
::
++ check-node
|= =node:graph-store
^+ update-core
=. update-core (check-node-children node)
2021-04-14 00:30:35 +03:00
?: ?=(%| -.post.node)
update-core
=* pos p.post.node
=/ notif-kind=(unit notif-kind:hook)
(get-conversion [0 pos])
?~ notif-kind
update-core
=/ desc=@t
2021-04-14 00:30:35 +03:00
?: (is-mention contents.pos)
%mention
name.u.notif-kind
=* not-kind u.notif-kind
=/ parent=index:post
2021-04-14 00:30:35 +03:00
(scag parent.index-len.not-kind index.pos)
=/ notif-index=index:store
[%graph rid mark desc parent]
2021-04-14 00:30:35 +03:00
?: =(our.bowl author.pos)
(self-post node notif-index not-kind)
=. update-core
2021-04-14 00:30:35 +03:00
(update-unread-count not-kind notif-index [time-sent index]:pos)
=? update-core
?| =(desc %mention)
(~(has in watching) [rid parent])
=(mark `%graph-validator-dm)
==
=/ =contents:store
2021-04-14 00:30:35 +03:00
[%graph (limo pos ~)]
(add-unread notif-index [time-sent.pos %.n contents])
update-core
::
++ update-unread-count
|= [=notif-kind:hook =index:store time=@da ref=index:graph-store]
2020-12-16 07:22:23 +03:00
=/ =stats-index:store
(to-stats-index:store index)
?- mode.notif-kind
%count (hark %unread-count stats-index time)
%each (hark %unread-each stats-index ref time)
%none update-core
==
::
++ self-post
|= $: =node:graph-store
=index:store
=notif-kind:hook
==
^+ update-core
2021-04-14 00:30:35 +03:00
?> ?=(%& -.post.node)
2020-12-16 07:22:23 +03:00
=/ =stats-index:store
(to-stats-index:store index)
=. update-core
2021-04-14 00:30:35 +03:00
(hark %seen-index time-sent.p.post.node stats-index)
=? update-core ?=(%count mode.notif-kind)
2020-12-16 07:22:23 +03:00
(hark %read-count stats-index)
=? update-core watch-on-self
2021-04-14 00:30:35 +03:00
(new-watch index.p.post.node [watch-for index-len]:notif-kind)
update-core
::
++ add-unread
|= [=index:store =notification:store]
(hark %add-note index notification)
--
--