summaryrefslogtreecommitdiff
path: root/desk/sur/tlon/groups.hoon
diff options
context:
space:
mode:
Diffstat (limited to 'desk/sur/tlon/groups.hoon')
-rw-r--r--desk/sur/tlon/groups.hoon383
1 files changed, 383 insertions, 0 deletions
diff --git a/desk/sur/tlon/groups.hoon b/desk/sur/tlon/groups.hoon
new file mode 100644
index 0000000..cf03233
--- /dev/null
+++ b/desk/sur/tlon/groups.hoon
@@ -0,0 +1,383 @@
+|%
+++ epic
+|%
++$ saga
+ $~ [%lev ~]
+ $% [%dex ver=@ud]
+ [%lev ~]
+ [%chi ~]
+ ==
+
++$ epic @ud
+--
+++ meta
+|%
++$ data
+ $: title=cord
+ description=cord
+ image=cord
+ cover=cord
+ ==
++$ diff
+ $% [%title =cord]
+ [%description =cord]
+ [%image =cord]
+ [%cover =cord]
+ ==
+--
+++ e epic
+++ okay `epic:e`2
+++ mar
+ |%
+ ++ act `mark`(rap 3 %group-action '-' (scot %ud okay) ~)
+ ++ upd `mark`(rap 3 %group-update '-' (scot %ud okay) ~)
+ ++ log `mark`(rap 3 %group-log '-' (scot %ud okay) ~)
+ ++ int `mark`(rap 3 %group-init '-' (scot %ud okay) ~)
+ --
+:: $flag: ID for a group
+::
++$ flag (pair ship term)
+::
+:: $nest: ID for a channel, {app}/{ship}/{name}
+::
++$ nest (pair term flag)
+::
+:: $sect: ID for cabal, similar to a role
+::
++$ sect term
+::
+:: $zone: channel grouping
+::
+:: includes its own metadata for display and keeps the order of
+:: channels within.
+::
+:: zone: the term that represents the ID of a zone
+:: realm: the metadata representing the zone and the order of channels
+:: delta: the set of actions that can be taken on a zone
+:: %add: create a zone
+:: %del: delete the zone
+:: %edit: modify the zone metadata
+:: %mov: reorders the zone in the group
+:: %mov-nest: reorders a channel within the zone
+::
+++ zone
+ =< zone
+ |%
+ +$ zone @tas
+ +$ realm
+ $: met=data:meta
+ ord=(list nest)
+ ==
+ +$ diff (pair zone delta)
+ +$ delta
+ $% [%add meta=data:meta]
+ [%del ~]
+ [%edit meta=data:meta]
+ [%mov idx=@ud]
+ [%mov-nest =nest idx=@ud]
+ ==
+ --
+::
+:: $fleet: group members and their associated metadata
+::
+:: vessel: a user's set of sects or roles and the time that they joined
+:: @da default represents an admin added member that has yet to join
+::
+++ fleet
+ =< fleet
+ |%
+ +$ fleet (map ship vessel)
+ +$ vessel
+ $: sects=(set sect)
+ joined=time
+ ==
+ +$ diff
+ $% [%add ~]
+ [%del ~]
+ [%add-sects sects=(set sect)]
+ [%del-sects sects=(set sect)]
+ ==
+ --
+::
+:: $channel: a medium for interaction
+::
+++ channel
+ =< channel
+ |%
+ +$ preview
+ $: =nest
+ meta=data:meta
+ group=^preview
+ ==
+ ::
+ +$ channels (map nest channel)
+ ::
+ :: $channel: a collection of metadata about a specific agent integration
+ ::
+ :: meta: title, description, image, cover
+ :: added: when the channel was created
+ :: zone: what zone or section to bucket in
+ :: join: should the channel be joined by new members
+ :: readers: what sects can see the channel, empty means anyone
+ ::
+ +$ channel
+ $: meta=data:meta
+ added=time
+ =zone
+ join=?
+ readers=(set sect)
+ ==
+ ::
+ :: $diff: represents the set of actions you can take on a channel
+ ::
+ :: add: create a channel
+ :: edit: edit a channel
+ :: del: delete a channel
+ :: add-sects: add sects to readers
+ :: del-sects: delete sects from readers
+ :: zone: change the zone of the channel
+ :: join: toggle default join
+ ::
+ +$ diff
+ $% [%add =channel]
+ [%edit =channel]
+ [%del ~]
+ ::
+ [%add-sects sects=(set sect)]
+ [%del-sects sects=(set sect)]
+ ::
+ [%zone =zone]
+ ::
+ [%join join=_|]
+ ==
+ --
+::
+:: $group: collection of people and the pathways in which they interact
+::
+:: group holds all data around members, permissions, channel
+:: organization, and its own metadata to represent the group
+::
++$ group
+ $: =fleet
+ cabals=(map sect cabal)
+ zones=(map zone realm:zone)
+ zone-ord=(list zone)
+ =bloc
+ =channels:channel
+ imported=(set nest)
+ =cordon
+ secret=?
+ meta=data:meta
+ ==
+::
++$ group-ui [group saga=(unit saga:e)]
+:: $cabal: metadata representing a $sect or role
+::
+++ cabal
+ =< cabal
+ |%
+ ::
+ +$ cabal
+ [meta=data:meta ~]
+ ::
+ +$ diff
+ $% [%add meta=data:meta]
+ [%edit meta=data:meta]
+ [%del ~]
+ ==
+ --
+::
+:: $cordon: group entry and visibility permissions
+::
+++ cordon
+ =< cordon
+ |%
+ ::
+ :: $open: a group with open entry, only bans are barred entry
+ ::
+ ++ open
+ |%
+ :: $ban: set of ships and ranks/classes that are not allowed entry
+ ::
+ :: bans can either be done at the individual ship level or by the
+ :: rank level (comet/moon/etc.)
+ ::
+ +$ ban [ships=(set ship) ranks=(set rank:title)]
+ +$ diff
+ $% [%add-ships p=(set ship)]
+ [%del-ships p=(set ship)]
+ ::
+ [%add-ranks p=(set rank:title)]
+ [%del-ranks p=(set rank:title)]
+ ==
+ --
+ ::
+ :: $shut: a group with closed entry, everyone barred entry
+ ::
+ :: a shut cordon means that the group is closed, but still visible.
+ :: people may request entry and either be accepted or denied or
+ :: they may be invited directly
+ ::
+ :: ask: represents those requesting entry
+ :: pending: represents those who've been invited
+ ::
+ ++ shut
+ |%
+ +$ state [pend=(set ship) ask=(set ship)]
+ +$ kind ?(%ask %pending)
+ +$ diff
+ $% [%add-ships p=kind q=(set ship)]
+ [%del-ships p=kind q=(set ship)]
+ ==
+ --
+ ::
+ :: $cordon: a set of metadata to represent the entry policy for a group
+ ::
+ :: open: a group with open entry, only bans barred entry
+ :: shut: a group with closed entry, everyone barred entry
+ :: afar: a custom entry policy defined by another agent
+ ::
+ +$ cordon
+ $% [%shut state:shut]
+ [%afar =flag =path desc=@t]
+ [%open =ban:open]
+ ==
+ ::
+ :: $diff: the actions you can take on a cordon
+ ::
+ +$ diff
+ $% [%shut p=diff:shut]
+ [%open p=diff:open]
+ [%swap p=cordon]
+ ==
+ --
+::
+:: $bloc: superuser sects
+::
+:: sects in the bloc set are allowed to make modifications to the group
+:: and its various metadata and permissions
+::
+++ bloc
+ =< bloc
+ |%
+ +$ bloc (set sect)
+ +$ diff
+ $% [%add p=(set sect)]
+ [%del p=(set sect)]
+ ==
+ --
+::
+:: $diff: the general set of changes that can be made to a group
+::
++$ diff
+ $% [%fleet p=(set ship) q=diff:fleet]
+ [%cabal p=sect q=diff:cabal]
+ [%channel p=nest q=diff:channel]
+ [%bloc p=diff:bloc]
+ [%cordon p=diff:cordon]
+ [%zone p=diff:zone]
+ [%meta p=data:meta]
+ [%secret p=?]
+ [%create p=group]
+ [%del ~]
+ ==
+::
+:: $action: the complete set of data required to edit a group
+::
++$ action
+ (pair flag update)
+::
+:: $update: a representation in time of a modification of a group
+::
++$ update
+ (pair time diff)
+::
+:: $create: a request to make a group
+::
++$ create
+ $: name=term
+ title=cord
+ description=cord
+ image=cord
+ cover=cord
+ =cordon
+ members=(jug ship sect)
+ secret=?
+ ==
+::
++$ init [=time =group]
+::
+:: $groups-ui: map for frontend to display groups
++$ groups-ui
+ (map flag group-ui)
++$ groups
+ (map flag group)
++$ net-groups
+ (map flag [net group])
+::
+:: $log: a time ordered map of all modifications to groups
+::
++$ log
+ ((mop time diff) lte)
+::
+++ log-on
+ ((on time diff) lte)
+::
+:: $net: an indicator of whether I'm a host or subscriber
+::
++$ net
+ $~ [%pub ~]
+ $% [%pub p=log]
+ [%sub p=time load=_| =saga:e]
+ ==
+::
+:: $join: a join request, can elect to join all channels
+::
++$ join
+ $: =flag
+ join-all=?
+ ==
+::
+:: $knock: a request to enter a closed group
+::
++$ knock flag
+::
+:: $progress: the state of a group join
+::
++$ progress
+ ?(%knocking %adding %watching %done %error)
+::
+:: $claim: a mark for gangs to represent a join in progress
+::
++$ claim
+ $: join-all=?
+ =progress
+ ==
+::
+:: $preview: the metadata and entry policy for a group
+::
++$ preview
+ $: =flag
+ meta=data:meta
+ =cordon
+ =time
+ secret=?
+ ==
+::
++$ previews (map flag preview)
+::
+:: $invite: a marker to show you've been invited to a group
+::
++$ invite (pair flag ship)
+::
+:: $gang: view of foreign group
+::
++$ gang
+ $: cam=(unit claim)
+ pev=(unit preview)
+ vit=(unit invite)
+ ==
+::
++$ gangs (map flag gang)
+::
+--