urbit/pkg/landscape/app/hark-invite-hook.hoon
2021-09-29 14:48:27 +10:00

172 lines
4.1 KiB
Plaintext

/- hark=hark-store, invite=invite-store
/+ verb, dbug, default-agent, agentio, resource, metadata=metadata-store
|%
+$ card card:agent:gall
+$ versioned-state
$% state-0
==
::
+$ state-0
$: blocked=(jug resource [uid=serial:invite =invite:invite])
~
==
--
%+ verb |
%- agent:dbug
^- agent:gall
=| state-0
=* state -
=<
|_ =bowl:gall
+* this .
def ~(. (default-agent this %|) bowl)
io ~(. agentio bowl)
pass pass:io
cc ~(. +> bowl)
++ on-init
:_ this
~[watch:invite-store:cc]
::
++ on-load
|= =vase
:_ this
(drop safe-watch:invite-store:cc)
++ on-save !>(state)
::
++ on-poke on-poke:def
++ on-peek on-peek:def
++ on-watch on-watch:def
++ on-agent
|= [=wire =sign:agent:gall]
|^
?+ wire (on-agent:def wire sign)
[%invites ~] take-invites
::
[%groups @ @ @ ~]
=/ rid=resource (de-path:resource t.wire)
(take-groups rid)
==
++ take-groups
|= rid=resource
=/ blocking (~(get ju blocked) rid)
|^
?+ -.sign (on-agent:def wire sign)
::
%kick
?: =(~ blocking) `this
(flush-blocking (rap 3 (scot %p entity.rid) '/' name.rid ~))
::
%fact
?. ?=(%metadata-hook-update p.cage.sign) `this
=+ !<(=hook-update:metadata q.cage.sign)
?. ?=(%preview -.hook-update) `this
(flush-blocking title.metadatum.hook-update)
==
::
++ flush-blocking
|= to=cord
:_ this(blocked (~(del by blocked) rid))
%+ turn ~(tap in blocking)
|= [uid=serial:invite =invite:invite]
(~(created inv:cc %groups uid) invite to)
--
::
++ take-invites
?- -.sign
?(%poke-ack %watch-ack) (on-agent:def wire sign)
%kick :_(this (drop safe-watch:invite-store:cc))
::
%fact
?. ?=(%invite-update p.cage.sign) `this
=+ !<(=update:invite q.cage.sign)
?+ -.update `this
::
%accepted
:_ this
~(dismissed inv:cc [term uid]:update)^~
::
%decline
~& decline/uid.update
:_ this
~(dismissed inv:cc [term uid]:update)^~
::
%invite
=* rid resource.invite.update
?+ term.update
:: default
=/ fallback (rap 3 (scot %p entity.rid) '/' name.rid ~)
:_ this
(~(created inv:cc [term uid]:update) invite.update fallback)^~
::
%groups
=. blocked (~(put ju blocked) rid [uid invite]:update)
:_ this
(drop ~(safe-watch preview:cc rid))
::
%graph
:_ this
(~(created inv:cc [term uid]:update) invite.update 'a group chat')^~
==
==
==
--
::
++ on-arvo on-arvo:def
++ on-fail on-fail:def
++ on-leave on-leave:def
--
|_ =bowl:gall
+* io ~(. agentio bowl)
pass pass:io
++ ha
|%
++ pass ~(. ^pass /hark)
++ poke
|=(=action:hark (poke-our:pass %hark-store hark-action+!>(action)))
--
++ invite-store
|%
++ path /updates
++ wire /invites
++ pass ~(. ^pass wire)
++ watch (watch-our:pass %invite-store path)
++ watching (~(has by wex.bowl) [wire our.bowl %invite-store])
++ safe-watch `(unit card)`?:(watching ~ `watch)
--
::
++ preview
|_ rid=resource
++ path preview+(en-path:resource rid)
++ wire groups+(en-path:resource rid)
++ pass ~(. ^pass wire)
++ watching (~(has by wex.bowl) [wire our.bowl %metadata-pull-hook])
++ watch (watch-our:pass %metadata-pull-hook path)
++ safe-watch `(unit card)`?:(watching ~ `watch)
--
::
++ inv
|_ [=term uid=serial:invite]
++ bin [/ place]
++ path /[term]/(scot %uv uid)
++ place `place:hark`[q.byk.bowl path]
++ dismissed
(poke:ha %del-place place)
++ created
|= [=invite:invite to=cord]
=; =body:hark
(poke:ha %add-note bin body)
=, invite
=/ title=@t
(rap 3 'You have been invited to ' to ' by ' ~)
:* ~[text+title ship+ship]
~[text+text]
now.bowl
/
invite+path
==
--
--