shrub/sur/hall.hoon

260 lines
15 KiB
Plaintext

::
:::: /sur/hall/hoon
::
|%
::
::TODO use different words for different kinds of burdens
::TODO rename det/delta in most place? they may be (different kinds of) deltas,
:: but location in control flow already indicates delta-ness.
::
:> #
:> # %wrappers
:> #
:> wrapper molds, for semantic clarity.
+|
::
::TODO rename
++ name term :< circle name
++ nick cord :< local nickname
::
:> #
:> # %query-models
:> #
:> models relating to queries, their results and updates.
+|
::
++ query :> query paths
$% {$client $~} :< shared ui state
{$circles who/ship} :< readable circles
{$public $~} :< public memberships
{$burden who/ship} ::TODO eventually, nom/name. :< duties to share
{$report $~} :< duty reports
{$peers nom/name} :< readers of story
$: $circle :> story query
nom/name :< circle name
wer/(unit circle) :< from source
wat/(set circle-data) :< data to get
ran/range :< query duration
== ::
::TODO in the future, we may want much more ::
:: detailed querying abilities. ::
== ::
++ circle-data :> kinds of circle data
$? $grams :< messages
$group-l :< local presence
$group-r :< remote presences
$config-l :< local config
$config-r :< remote configs
== ::
++ range :> inclusive msg range
%- unit :< ~ means everything
$: hed/place :< start of range
tal/(unit place) :< opt end of range
== ::
++ place :> range indicators
$% {$da @da} :< date
{$ud @ud} :< message number
== ::
++ prize :> query result
$% {$client prize-client} :< /client
{$circles cis/(set name)} :< /circles
{$public cis/(set circle)} :< /public
{$burden sos/(map name burden)} :< /burden
{$report $~} :< /report
{$peers pes/(jar ship query)} :< /peers
{$circle package} :< /circle
== ::
++ prize-client :> shared ui state
$: gys/(jug char audience) :< glyph bindings
nis/(map ship nick) :< local nicknames
== ::
++ rumor :> query result change
$% {$client rum/rumor-client} :< /client
{$circles add/? cir/name} :< /circles
{$public add/? cir/circle} :< /public
{$burden nom/name rum/rumor-story} :< /burden
{$peers add/? who/ship qer/query} :< /peers
{$circle rum/rumor-story} :< /circle
== ::
++ rumor-client :> changed ui state
$% {$glyph diff-glyph} :< un/bound glyph
{$nick diff-nick} :< changed nickname
== ::
++ shipment :> standard payload
$: cos/lobby :< loc & rem configs
pes/crowd :< loc & rem presences
== ::
++ burden :> full story state
$: gaz/(list telegram) :< all messages
shipment :< metadata
== ::
++ package :> story state
$: nes/(list envelope) :< messages
shipment :< metadata
== ::
++ diff-glyph {bin/? gyf/char aud/audience} :< un/bound glyph
++ diff-nick {who/ship nic/nick} :< changed nickname
++ diff-story :> story change
$% {$new cof/config} :< new story
{$bear bur/burden} :< new inherited story
{$peer add/? who/ship qer/query} :< gain/lose subscriber
{$config cir/circle dif/diff-config} :< new/changed config
{$status cir/circle who/ship dif/diff-status} :< new/changed status
{$remove $~} :< removed story
== ::
++ rumor-story :> story rumor
$? diff-story :< both in & outward
$% {$gram src/circle nev/envelope} :< new/changed message
== == ::
++ diff-config :> config change
$% {$full cof/config} :< set w/o side-effects
{$source add/? src/source} :< add/rem sources
{$caption cap/cord} :< changed description
{$filter fit/filter} :< changed filter
{$secure sec/security} :< changed security
{$permit add/? sis/(set ship)} :< add/rem to b/w-list
{$remove $~} :< removed config
== ::
++ diff-status :> status change
$% {$full sat/status} :< fully changed status
{$presence pec/presence} :< changed presence
{$human dif/diff-human} :< changed name
{$remove $~} :< removed status
== ::
++ diff-human :> name change
$% {$full man/human} :< fully changed name
{$handle han/(unit cord)} :< changed handle
{$true tru/(unit truename)} :< changed true name
== ::
::
:> #
:> # %client-communication
:> #
:> hall interfaces for clients.
+|
::
++ action :> user action
$% :: circle configuration ::
{$create nom/name des/cord sec/security} :< create circle
{$delete nom/name why/(unit cord)} :< delete + announce
{$depict nom/name des/cord} :< change description
{$filter nom/name fit/filter} :< change message rules
{$permit nom/name inv/? sis/(set ship)} :< invite/banish
{$source nom/name sub/? srs/(set source)} :< un/sub to/from src
:: messaging ::
{$convey tos/(list thought)} :< post exact
{$phrase aud/audience ses/(list speech)} :< post easy
:: personal metadata ::
{$notify aud/audience pes/(unit presence)} :< our presence update
{$naming aud/audience man/human} :< our name update
:: changing shared ui ::
{$glyph gyf/char aud/audience bin/?} :< un/bind a glyph
{$nick who/ship nic/nick} :< new identity
:: misc changes ::
{$public add/? cir/circle} :< show/hide membership
== ::
::
:> #
:> # %hall-communication
:> #
:> structures for communicating between halls.
+|
::
++ command :> effect on story
$% {$publish tos/(list thought)} :< deliver
{$present nos/(set name) dif/diff-status} :< status update
{$bearing $~} :< prompt to listen
== ::
::
:> #
:> # %circles
:> #
:> messaging targets and their metadata.
+|
::
++ circle {hos/ship nom/name} :< native target
:: circle configurations. ::
++ lobby {loc/config rem/(map circle config)} :< our & srcs configs
++ config :> circle config
$: src/(set source) :< active sources
cap/cord :< description
fit/filter :< message rules
con/control :< restrictions
== ::
++ source {cir/circle ran/range} :< subscription target
++ filter :> content filters
$: cas/? :< dis/allow capitals
utf/? :< dis/allow non-ascii
::TODO maybe message length
== ::
++ control {sec/security sis/(set ship)} :< access control
++ security :> security mode
$? $channel :< blacklist
$village :< whitelist
$journal :< pub r, whitelist w
$mailbox :< our r, blacklist w
== ::
:: participant metadata. ::
++ crowd {loc/group rem/(map circle group)} :< our & srcs presences
++ group (map ship status) :< presence map
++ status {pec/presence man/human} :< participant
++ presence :> status type
$? $gone :< absent
$idle :< idle
$hear :< present
$talk :< typing
== ::
++ human :> human identifier
$: han/(unit cord) :< handle
tru/(unit truename) :< true name
== ::
++ truename {fir/cord mid/(unit cord) las/cord} :< real-life name
::
:> #
:> # %message-data
:> #
:> structures for containing main message data.
+|
::
::TODO some structure for extra message state
:: local (to clients): delivery state, read flags
:: remote (to halls): sequence nr
++ envelope {num/@ud gam/telegram} :< outward message
++ telegram {aut/ship thought} :< whose message
++ thought :> inner message
$: uid/serial :< unique identifier
aud/audience :< destinations
wen/@da :< timestamp
sep/speech :< content
== ::
++ speech :> content body
$% {$lin pat/? msg/cord} :< no/@ text line
{$url url/purf:eyre} :< parsed url
{$exp exp/cord res/(list tank)} :< hoon line
{$ire top/serial sep/speech} :< in reply to
{$fat tac/attache sep/speech} :< attachment
{$app app/term sep/speech} :< app message
{$inv inv/? cir/circle} :< inv/ban for circle
== ::
++ attache :> attachment
$% {$name nom/cord tac/attache} :< named attachment
{$text (list cord)} :< text lines
{$tank (list tank)} :< tank list
== ::
::
:> #
:> # %message-metadata
:> #
:> structures for containing message metadata.
+|
::
++ serial @uvH :< unique identifier
++ audience (set circle) :< destinations
++ tracking (map circle delivery) :> delivery per target
++ delivery :> delivery state
$? $pending :< undelivered
$accepted :< received
$rejected :< denied
== ::
--