::  invite-hook: receive invites from any source
::
::    only handles %invite actions. accepts json, but only from the host team.
::    can be poked by the host team to send an invite out to someone.
::    can be poked by foreign ships to send an invite to us.
::
/+  *invite-json, default-agent, verb
::
|%
+$  state-0  [%0 ~]
::
+$  card  card:agent:gall
--
::
=|  state-0
=*  state  -
::
%+  verb  |
^-  agent:gall
=<
  |_  =bowl:gall
  +*  this  .
      do    ~(. +> bowl)
      def   ~(. (default-agent this %|) bowl)
  ::
  ++  on-init
    ^-  (quip card _this)
    [~ this]
  ::
  ++  on-save  !>(state)
  ++  on-load
    |=  old=vase
    ^-  (quip card _this)
    [~ this(state !<(state-0 old))]
  ::
  ++  on-poke
    |=  [=mark =vase]
    ^-  (quip card _this)
    :_  this
    ?+  mark  (on-poke:def mark vase)
        %json
      ::  only accept json from ourselves.
      ::
      ?>  (team:title our.bowl src.bowl)
      =/  act  (json-to-action !<(json vase))
      ?>  ?=(%invite -.act)
      [(invite-hook-poke:do recipient.invite.act act)]~
    ::
        %invite-action
      =/  act=invite-action  !<(invite-action vase)
      ?.  ?=(%invite -.act)  ~
      ::  if the sender is us,
      ::
      ?:  (team:title our.bowl src.bowl)
        ::  outgoing. we must be inviting another ship. send them the invite.
        ::
        ?>  !(team:title our.bowl ship.invite.act)
        [(invite-hook-poke:do recipient.invite.act act)]~
      ::  else incoming. ensure invitatory exists and invite is not a duplicate.
      ::
      ?>  ?=(^ (invitatory-scry:do path.act))
      ?>  ?=(~ (invite-scry:do path.act uid.act))
      [(invite-poke:do path.act act)]~
    ==
  ::
  ++  on-peek   on-peek:def
  ++  on-watch  on-watch:def
  ++  on-leave  on-leave:def
  ++  on-agent  on-agent:def
  ++  on-arvo   on-arvo:def
  ++  on-fail   on-fail:def
  --
::
|_  =bowl:gall
::
++  invite-hook-poke
  |=  [=ship action=invite-action]
  ^-  card
  :*  %pass
      /invite-hook
      %agent
      [ship %invite-hook]
      %poke
      %invite-action
      !>(action)
  ==
::
++  invite-poke
  |=  [=path action=invite-action]
  ^-  card
  :*  %pass
      path
      %agent
      [our.bowl %invite-store]
      %poke
      %invite-action
      !>(action)
  ==
::
++  invitatory-scry
  |=  pax=path
  ^-  (unit invitatory)
  =.  pax
    ;:(weld /=invite-store/(scot %da now.bowl)/invitatory pax /noun)
  .^((unit invitatory) %gx pax)
::
++  invite-scry
  |=  [pax=path uid=serial]
  ^-  (unit invite)
  =.  pax
    ;:(weld /=invite-store/(scot %da now.bowl)/invite pax /(scot %uv uid)/noun)
  .^((unit invite) %gx pax)
--