Added fixes to chat style as per Mark's comments

This commit is contained in:
Logan Allen 2019-08-14 11:09:02 -07:00
parent 052903a4ee
commit 19b71d02b4
2 changed files with 364 additions and 391 deletions

View File

@ -28,13 +28,6 @@
/| /css/
/~ ~
==
/= style
/^ octs
/; as-octs:mimes:html
/: /===/app/chat/css/index
/| /css/
/~ ~
==
/= chat-png
/^ (map knot @)
/: /===/app/chat/img /_ /png/
@ -42,6 +35,7 @@
=, chat
::
|%
::
+$ state
$% [%0 str=streams]
==
@ -58,93 +52,59 @@
[%pull wire dock ~]
[%diff diff]
==
::
--
::
|_ [bol=bowl:gall sta=state]
|_ [bol=bowl:gall state]
::
++ this .
::
:: +prep: set up the app, migrate the state once started
:: +prep: set up the app, migrate the state
::
++ prep
|= old=(unit state)
^- (quip move _this)
=/ launcha/poke
[%launch-action [%chat /chattile '/~chat/js/tile.js']]
=/ launcha (launch-poke [/chattile '/~chat/js/tile.js'])
?~ old
=/ inboxpat /circle/inbox/config/group
=/ peer-inbox
%+ hall-peer
/circle/[(scot %p our.bol)]/inbox/config/group
/circle/inbox/config/group
=/ circlespat /circles/[(scot %p our.bol)]
=/ inboxwir /circle/[(scot %p our.bol)]/inbox/config/group
=/ inboxi/poke
:- %hall-action
[%source %inbox %.y (silt [[our.bol %i] ~]~)]
=/ fakeannounce=poke
:- %hall-action
[%create %hall-internal-announcements '' %village]
=/ announce=poke
:- %hall-action
[%create %announcements 'Announcements from Tlon' %journal]
=/ help=poke
:- %hall-action
[%create %urbit-help 'Get help about Urbit' %channel]
=/ dev=poke
:- %hall-action
[%create %urbit-dev 'Chat about developing on Urbit' %channel]
=/ sourcefakeannounce/poke
:- %hall-action
[%source %inbox %.y (silt [[our.bol %hall-internal-announcements] ~]~)]
=/ sourceannounce/poke
:- %hall-action
[%source %inbox %.y (silt [[~marzod %announcements] ~]~)]
=/ hallactions=(list move)
=/ sourceannounce (hall-source [~marzod %announcements])
::
=/ hall-actions=(list move)
?: =((clan:title our.bol) %czar)
~
?: =(our.bol ~marzod)
~& %marzod-chat
:- [ost.bol %poke /announce [our.bol %hall] announce]
[ost.bol %poke /announce [our.bol %hall] sourceannounce]~
:- (hall-create %announcements 'Announcements from Tlon' %journal)
[sourceannounce]~
?: =(our.bol ~dopzod)
~& %dopzod-chat
:- [ost.bol %poke /announce [our.bol %hall] dev]
[ost.bol %poke /announce [our.bol %hall] help]~
:- [ost.bol %poke /announce [our.bol %hall] fakeannounce]
:- [ost.bol %poke /announce [our.bol %hall] sourcefakeannounce]
[ost.bol %poke /announce [our.bol %hall] sourceannounce]~
=/ moves=(list move)
:~ [ost.bol %peer inboxwir [our.bol %hall] inboxpat]
[ost.bol %peer circlespat [our.bol %hall] circlespat]
[ost.bol %connect / [~ /'~chat'] %chat]
[ost.bol %poke /chat [our.bol %hall] inboxi]
[ost.bol %poke /chat [our.bol %launch] launcha]
==
:- (hall-create %urbit-dev 'Chat about developing on Urbit' %channel)
[(hall-create %urbit-help 'Help about Urbit' %channel)]~
:~ (hall-create %hall-internal-announcements '' %village)
(hall-source [our.bol %hall-internal-announcements])
sourceannounce
==
::
=/ actions=(list move)
:~ [ost.bol %connect / [~ /'~chat'] %chat]
launcha
peer-inbox
(hall-peer circlespat circlespat)
(hall-source [our.bol %i])
==
:_ this
%+ weld moves hallactions
:- [ost.bol %poke /chat [our.bol %launch] launcha]~
this(sta u.old)
::
++ construct-tile-json
|= str=streams
^- json
=/ numbers/(list [circle:hall @ud])
%+ turn ~(tap by messages.str)
|= [cir=circle:hall lis=(list envelope:hall)]
^- [circle:hall @ud]
?~ lis
[cir 0]
=/ last (snag (dec (lent lis)) `(list envelope:hall)`lis)
[cir (add num.last 1)]
=/ maptjson=(map @t json)
%- my
:~ ['config' (config-to-json str)]
['numbers' (numbers-to-json numbers)]
==
[%o maptjson]
(weld actions hall-actions)
::
:_ this(+<+ u.old)
[launcha]~
::
++ peer-chattile
|= wir=wire
^- (quip move _this)
:_ this
[ost.bol %diff %json (construct-tile-json str.sta)]~
[ost.bol %diff %json (construct-tile-json str)]~
::
:: +peer-messages: subscribe to subset of messages and updates
::
@ -152,12 +112,12 @@
++ peer-primary
|= wir=wire
^- (quip move _this)
=* messages messages.str.sta
=/ lismov/(list move)
=* messages messages.str
=/ lismov=(list move)
%+ murn ~(tap by messages)
|= [cir=circle:hall lis=(list envelope:hall)]
^- (unit move)
=/ envs/(unit (list envelope:hall)) (~(get by messages) cir)
=/ envs=(unit (list envelope:hall)) (~(get by messages) cir)
?~ envs
~
=/ length/@ (lent u.envs)
@ -174,7 +134,7 @@
[%messages cir start end (swag [start offset] u.envs)]
==
:_ this
[[ost.bol %diff %chat-config str.sta] lismov]
[[ost.bol %diff %chat-config str] lismov]
::
:: +poke-chat: send us an action
::
@ -183,34 +143,14 @@
^- (quip move _this)
:_ this
%+ turn lis.act
|= hac=action:hall
^- move
:* ost.bol
%poke
/p/[(scot %da now.bol)]
[our.bol %hall]
[%hall-action hac]
==
::
:: +send-chat-update: utility func for sending updates to all our subscribers
::
++ send-chat-update
|= [upd=update str=streams]
^- (list move)
=/ updates/(list move)
%+ turn (prey:pubsub:userlib /primary bol)
|= [=bone *]
[bone %diff %chat-update upd]
::
=/ jon/json (construct-tile-json str)
=/ tile-updates/(list move)
%+ turn (prey:pubsub:userlib /chattile bol)
|= [=bone *]
[bone %diff %json jon]
::
%+ weld
updates
tile-updates
|= hac=action:hall
^- move
:* ost.bol
%poke
/p/[(scot %da now.bol)]
[our.bol %hall]
[%hall-action hac]
==
::
::
:: +hall arms
@ -225,109 +165,86 @@
(mean [leaf+"invalid wire for diff: {(spud wir)}"]~)
?+ i.wir
(mean [leaf+"invalid wire for diff: {(spud wir)}"]~)
::
:: %circles wire
::
%circles
?> ?=(%circles -.piz)
:_ this(circles.str cis.piz)
(send-chat-update [[%circles cis.piz] str])
::
:: %circle wire
::
%circle
?> ?=(%circle -.piz)
=/ circle/circle:hall [our.bol &3:wir]
::
:: fill inbox config and remote configs with prize data
::
?: =(circle [our.bol %inbox])
=/ configs
%- ~(uni in configs.str)
^- (map circle:hall (unit config:hall))
(~(run by rem.cos.piz) |=(a=config:hall `a))
::
:: %circles wire
=/ circles=(list circle:hall)
(turn ~(tap in src.loc.cos.piz) head)
::
%circles
?> ?=(%circles -.piz)
=/ str %= str.sta
circles cis.piz
=/ meslis=(list [circle:hall (list envelope:hall)])
%+ turn circles
|= cir=circle:hall
^- [circle:hall (list envelope:hall)]
[cir ~]
::
=/ localpeers=(set @p)
(silt (turn ~(tap by loc.pes.piz) head))
::
=/ peers/(map circle:hall (set @p))
%- ~(rep by rem.pes.piz)
|= [[cir=circle:hall grp=group:hall] acc=(map circle:hall (set @p))]
^- (map circle:hall (set @p))
(~(put by acc) cir (silt (turn ~(tap by grp) head)))
::
:-
%+ turn ~(tap in (~(del in (silt circles)) [our.bol %inbox]))
|= cir=circle:hall
^- move
=/ wir/wire /circle/[(scot %p our.bol)]/[nom.cir]/config/group
=/ pat/path /circle/[nom.cir]/config/group
[ost.bol %peer wir [our.bol %hall] pat]
::
%= this
inbox.str loc.cos.piz
configs.str configs
messages.str (molt meslis)
peers.str (~(put by peers) [our.bol %inbox] localpeers)
==
::
:: fill remote configs with message data
::
=* messages messages.str
=/ circle=circle:hall [`@p`(slav %p &2:wir) &3:wir]
=/ localpeers=(set @p) (silt (turn ~(tap by loc.pes.piz) head))
::
=/ peers=(map circle:hall (set @p))
%- ~(rep by rem.pes.piz)
|= [[cir=circle:hall grp=group:hall] acc=(map circle:hall (set @p))]
^- (map circle:hall (set @p))
(~(put by acc) cir (silt (turn ~(tap by grp) head)))
=/ str
%= str
messages (~(put by messages) circle nes.piz)
peers (~(uni by peers.str) (~(put by peers) circle localpeers))
==
:- (send-chat-update [[%circles cis.piz] str])
this(str.sta str)
::
:: %circle wire
::
%circle
:: ::
:: :: %circle prize
:: ::
:: %circle
?> ?=(%circle -.piz)
=/ circle/circle:hall [our.bol &3:wir]
?: =(circle [our.bol %inbox])
::
:: fill inbox config and remote configs with prize data
::
=/ configs
%- ~(uni in configs.str.sta)
^- (map circle:hall (unit config:hall))
(~(run by rem.cos.piz) |=(a=config:hall `a))
::
=/ circles/(list circle:hall)
%+ turn ~(tap in src.loc.cos.piz)
|= src=source:hall
^- circle:hall
cir.src
::
=/ meslis/(list [circle:hall (list envelope:hall)])
%+ turn circles
|= cir=circle:hall
^- [circle:hall (list envelope:hall)]
[cir ~]
::
=/ localpeers/(set @p)
%- silt %+ turn ~(tap by loc.pes.piz)
|= [shp=@p stat=status:hall]
shp
::
=/ peers/(map circle:hall (set @p))
%- ~(rep by rem.pes.piz)
|= [[cir=circle:hall grp=group:hall] acc=(map circle:hall (set @p))]
^- (map circle:hall (set @p))
=/ newset
%- silt %+ turn ~(tap by grp)
|= [shp=@p stat=status:hall]
shp
(~(put by acc) cir newset)
::
:-
%+ turn ~(tap in (~(del in (silt circles)) [our.bol %inbox]))
|= cir=circle:hall
^- move
=/ wir/wire /circle/[(scot %p our.bol)]/[nom.cir]/config/group
=/ pat/path /circle/[nom.cir]/config/group
[ost.bol %peer wir [our.bol %hall] pat]
::
%= this
inbox.str.sta loc.cos.piz
configs.str.sta configs
messages.str.sta (molt meslis)
peers.str.sta (~(put by peers) [our.bol %inbox] localpeers)
==
::
:: fill remote configs with message data
::
=* messages messages.str.sta
=/ circle/circle:hall [`@p`(slav %p &2:wir) &3:wir]
=/ localpeers/(set @p)
%- silt %+ turn ~(tap by loc.pes.piz)
|= [shp=@p stat=status:hall]
shp
::
=/ peers/(map circle:hall (set @p))
%- ~(rep by rem.pes.piz)
|= [[cir=circle:hall grp=group:hall] acc=(map circle:hall (set @p))]
^- (map circle:hall (set @p))
=/ newset
%- silt %+ turn ~(tap by grp)
|= [shp=@p stat=status:hall]
shp
(~(put by acc) cir newset)
=/ str
%= str.sta
messages (~(put by messages) circle nes.piz)
peers (~(uni by peers.str.sta) (~(put by peers) circle localpeers))
==
=/ messageupdate/update
:* %messages
circle
0
(lent messages)
nes.piz
==
:- (send-chat-update [messageupdate str])
this(str.sta str)
=/ messageupdate=update
:* %messages
circle
0
(lent messages)
nes.piz
==
:- (send-chat-update [messageupdate str])
this(str str)
==
::
:: +diff-hall-rumor: handle updates to hall state
@ -341,195 +258,188 @@
(mean [leaf+"invalid wire for diff: {(spud wir)}"]~)
::
:: %circles
%circles
?> ?=(%circles -.rum)
=/ cis
::
%circles
?> ?=(%circles -.rum)
=/ cis
?: add.rum
(~(put in circles.str) cir.rum)
(~(del in circles.str) cir.rum)
=/ sta
%= str
circles cis
peers
?: add.rum
(~(put in circles.str.sta) cir.rum)
(~(del in circles.str.sta) cir.rum)
=/ str
%= str.sta
circles cis
peers
?: add.rum
(~(put by peers.str.sta) [our.bol cir.rum] ~)
(~(del by peers.str.sta) [our.bol cir.rum])
==
:- (send-chat-update [[%circles cis] str])
this(str.sta str)
(~(put by peers.str) [our.bol cir.rum] ~)
(~(del by peers.str) [our.bol cir.rum])
==
:_ this(str sta)
(send-chat-update [[%circles cis] sta])
::
::
:: %circle: fill remote configs with message data
::
%circle
?> ?=(%circle -.rum)
=* sto rum.rum
?+ -.sto
[~ this]
::
:: %gram:
::
%gram
?> ?=(%gram -.sto)
=* messages messages.str.sta
=/ circle/circle:hall [`@p`(slav %p &2:wir) &3:wir]
=/ unes/(unit (list envelope:hall)) (~(get by messages) circle)
?~ unes
[~ this]
=/ nes u.unes
=/ str
%= str.sta
messages (~(put by messages) circle (snoc nes nev.sto))
==
:- (send-chat-update [[%message circle nev.sto] str])
this(str.sta str)
::
:: %status:
::
%status
?> ?=(%status -.sto)
=/ upeers/(unit (set @p)) (~(get by peers.str.sta) cir.sto)
?~ upeers
[~ this]
=/ peers/(set @p)
?: =(%remove -.dif.sto)
(~(del in u.upeers) who.sto)
(~(put in u.upeers) who.sto)
=/ str
%= str.sta
peers (~(put by peers.str.sta) cir.sto peers)
==
:- (send-chat-update [[%peers cir.sto peers] str])
this(str.sta str)
::
:: %config: config has changed
::
%config
=* circ cir.sto
::
?+ -.dif.sto
[~ this]
::
:: %full: set all of config without side effects
::
%full
=* conf cof.dif.sto
=/ str
%= str.sta
configs (~(put by configs.str.sta) circ `conf)
==
:- (send-chat-update [[%config circ conf] str])
this(str.sta str)
::
:: %read: the read count of one of our configs has changed
::
%read
?: =(circ [our.bol %inbox])
:: ignore when circ is inbox
[~ this]
=/ uconf/(unit config:hall) (~(got by configs.str.sta) circ)
?~ uconf
:: should we crash?
[~ this]
=/ conf/config:hall
%= u.uconf
red red.dif.sto
==
=/ str
%= str.sta
configs (~(put by configs.str.sta) circ `conf)
==
:- (send-chat-update [[%config circ conf] str])
this(str.sta str)
::
:: %source: the sources of our inbox have changed
::
%source
?. =(circ [our.bol %inbox])
:: ignore when circ is not inbox
[~ this]
=* affectedcir cir.src.dif.sto
=/ newwir/wire
/circle/[(scot %p hos.affectedcir)]/[nom.affectedcir]/grams/0/config/group
=/ pat/path /circle/[nom.affectedcir]/grams/0/config/group
:: we've added a source to our inbox
::
?: add.dif.sto
=/ newinbox %= inbox.str.sta
src (~(put in src.inbox.str.sta) src.dif.sto)
==
=/ str
%= str.sta
inbox newinbox
::
configs
?: (~(has by configs.str.sta) affectedcir)
configs.str.sta
(~(put by configs.str.sta) affectedcir ~)
==
::
:_ this(str.sta str)
%+ weld
[ost.bol %peer newwir [hos.affectedcir %hall] pat]~
(send-chat-update [[%inbox newinbox] str])
::
=/ newinbox %= inbox.str.sta
src (~(del in src.inbox.str.sta) src.dif.sto)
==
:: we've removed a source from our inbox
::
=/ str
%= str.sta
inbox newinbox
::
configs (~(del by configs.str.sta) affectedcir)
messages (~(del by messages.str.sta) affectedcir)
peers (~(del by peers.str.sta) affectedcir)
==
=/ fakecir/circle:hall
:- our.bol
%- crip
%+ weld (trip 'hall-internal-') (trip nom.affectedcir)
::
?~ (~(get by configs.str) fakecir)
:: just forward the delete to our clients
::
:_ this(str.sta str)
%+ weld
[ost.bol %pull newwir [hos.affectedcir %hall] ~]~
%+ weld
(send-chat-update [[%inbox newinbox] str])
(send-chat-update [[%delete affectedcir] str])
:: if we get a delete from another ship, delete our fake circle copy
::
=/ deletefake/poke
:- %hall-action
[%delete nom.fakecir ~]
:_ this(str.sta str)
%+ weld
[ost.bol %pull newwir [hos.affectedcir %hall] ~]~
%+ weld
[ost.bol %poke /fake [our.bol %hall] deletefake]~
%+ weld
(send-chat-update [[%inbox newinbox] str])
(send-chat-update [[%delete affectedcir] str])
::
:: %remove: remove a circle
::
%remove
=/ str
%= str.sta
configs (~(del by configs.str.sta) circ)
messages (~(del by messages.str.sta) circ)
peers (~(del by peers.str.sta) circ)
==
:- (send-chat-update [[%delete circ] str])
this(str.sta str)
::
==
:: end of branching on dif.sto type
%circle
?> ?=(%circle -.rum)
=* sto rum.rum
?+ -.sto
[~ this]
::
:: %gram:
::
%gram
?> ?=(%gram -.sto)
=* messages messages.str
=/ circle=circle:hall [`@p`(slav %p &2:wir) &3:wir]
=/ nes=(unit (list envelope:hall)) (~(get by messages) circle)
?~ nes
[~ this]
=/ sta
%= str
messages (~(put by messages) circle (snoc u.nes nev.sto))
==
:: end of branching on sto type
:_ this(str sta)
(send-chat-update [[%message circle nev.sto] sta])
::
:: status:
::
%status
?> ?=(%status -.sto)
=/ upeers=(unit (set @p)) (~(get by peers.str) cir.sto)
?~ upeers
[~ this]
=/ peers=(set @p)
?: =(%remove -.dif.sto)
(~(del in u.upeers) who.sto)
(~(put in u.upeers) who.sto)
=/ sta
%= str
peers (~(put by peers.str) cir.sto peers)
==
:_ this(str sta)
(send-chat-update [[%peers cir.sto peers] sta])
::
:: %config: config has changed
::
%config
=* circ cir.sto
::
?+ -.dif.sto
[~ this]
::
:: %full: set all of config without side effects
::
%full
=* conf cof.dif.sto
=/ sta
%= str
configs (~(put by configs.str) circ `conf)
==
:_ this(str sta)
(send-chat-update [[%config circ conf] sta])
::
:: %read: the read count of one of our configs has changed
::
%read
?: =(circ [our.bol %inbox])
:: ignore when circ is inbox
[~ this]
=/ uconf/(unit config:hall) (~(got by configs.str) circ)
?~ uconf
[~ this]
=/ conf/config:hall
%= u.uconf
red red.dif.sto
==
=/ sta
%= str
configs (~(put by configs.str) circ `conf)
==
:_ this(str sta)
(send-chat-update [[%config circ conf] sta])
::
:: %source: the sources of our inbox have changed
::
%source
?. =(circ [our.bol %inbox])
:: ignore when circ is not inbox
[~ this]
=* affectedcir cir.src.dif.sto
=/ newwir/wire
/circle/(scot %p hos.affectedcir)/[nom.affectedcir]/grams/0/config/group
=/ pat/path /circle/[nom.affectedcir]/grams/0/config/group
:: we've added a source to our inbox
::
?: add.dif.sto
=/ newinbox %= inbox.str
src (~(put in src.inbox.str) src.dif.sto)
==
=/ sta
%= str
inbox newinbox
::
configs
?: (~(has by configs.str) affectedcir)
configs.str
(~(put by configs.str) affectedcir ~)
==
::
:_ this(str sta)
%+ weld
[ost.bol %peer newwir [hos.affectedcir %hall] pat]~
(send-chat-update [[%inbox newinbox] sta])
::
=/ newinbox %= inbox.str
src (~(del in src.inbox.str) src.dif.sto)
==
:: we've removed a source from our inbox
::
=/ sta
%= str
inbox newinbox
::
configs (~(del by configs.str) affectedcir)
messages (~(del by messages.str) affectedcir)
peers (~(del by peers.str) affectedcir)
==
=/ fakecir/circle:hall
:- our.bol
(crip (weld (trip 'hall-internal-') (trip nom.affectedcir)))
::
?~ (~(get by configs.str) fakecir)
:: just forward the delete to our clients
::
:_ this(str sta)
:- [ost.bol %pull newwir [hos.affectedcir %hall] ~]
%+ weld
(send-chat-update [[%inbox newinbox] sta])
(send-chat-update [[%delete affectedcir] sta])
:: if we get a delete from another ship, delete our fake circle copy
::
=/ deletefake [%hall-action [%delete nom.fakecir ~]]
:_ this(str str)
:- [ost.bol %pull newwir [hos.affectedcir %hall] ~]
:- [ost.bol %poke /fake [our.bol %hall] deletefake]
%+ weld
(send-chat-update [[%inbox newinbox] sta])
(send-chat-update [[%delete affectedcir] sta])
::
:: %remove: remove a circle
::
%remove
=/ sta
%= str
configs (~(del by configs.str) circ)
messages (~(del by messages.str) circ)
peers (~(del by peers.str) circ)
==
:- (send-chat-update [[%delete circ] sta])
this(str sta)
::
==
:: end of branching on dif.sto type
==
:: end of branching on sto type
==
:: end of i.wir branching
::
@ -587,7 +497,7 @@
=/ cir/circle:hall [(slav %p &3:site.request-line) &4:site.request-line]
=/ start/@ud (need (rush &5:site.request-line dem))
=/ parsedend/@ud (need (rush &6:site.request-line dem))
=* messages messages.str.sta
=* messages messages.str
=/ envs/(unit (list envelope:hall)) (~(get by messages) cir)
?~ envs
[~ this]
@ -638,7 +548,7 @@
?: =(&3:wir 'inbox')
:_ this
[ost.bol %peer wir [shp %hall] pat]~
?: (~(has in src.inbox.str.sta) [[shp &3:wir] ~])
?: (~(has in src.inbox.str) [[shp &3:wir] ~])
:_ this
[ost.bol %peer wir [shp %hall] pat]~
[~ this]
@ -664,7 +574,7 @@
?: =(&3:wir 'inbox')
:_ this
[ost.bol %peer wir [shp %hall] pat]~
?: (~(has in src.inbox.str.sta) [[shp &3:wir] ~])
?: (~(has in src.inbox.str) [[shp &3:wir] ~])
:_ this
[ost.bol %peer wir [shp %hall] pat]~
[~ this]
@ -674,4 +584,65 @@
[ost.bol %peer wir [our.bol %hall] wir]~
==
::
:: +utilities
::
::
:: +send-chat-update: utility func for sending updates to all our subscribers
::
++ send-chat-update
|= [upd=update str=streams]
^- (list move)
=/ updates=(list move)
%+ turn (prey:pubsub:userlib /primary bol)
|= [=bone *]
[bone %diff %chat-update upd]
::
=/ jon (construct-tile-json str)
=/ tile-updates=(list move)
%+ turn (prey:pubsub:userlib /chattile bol)
|= [=bone *]
[bone %diff %json jon]
::
(weld updates tile-updates)
::
++ construct-tile-json
|= str=streams
^- json
=/ numbers/(list [circle:hall @ud])
%+ turn ~(tap by messages.str)
|= [cir=circle:hall lis=(list envelope:hall)]
^- [circle:hall @ud]
?~ lis
[cir 0]
=/ last (snag (dec (lent lis)) `(list envelope:hall)`lis)
[cir (add num.last 1)]
=/ maptjson=(map @t json)
%- my
:~ ['config' (config-to-json str)]
['numbers' (numbers-to-json numbers)]
==
[%o maptjson]
::
++ launch-poke
|= [=path =cord]
^- move
[ost.bol %poke /chat [our.bol %launch] [%launch-action %chat path cord]]
::
++ hall-peer
|= [wir=wire pat=path]
^- move
[ost.bol %peer wir [our.bol %hall] pat]
::
++ hall-create
|= [name=@tas description=@t =security:hall]
^- move
=/ poke [%hall-action [%create name description security]]
[ost.bol %poke /chat [our.bol %hall] poke]
::
++ hall-source
|= cir=circle:hall
^- move
=/ poke [%hall-action [%source %inbox %.y (silt [cir ~]~)]]
[ost.bol %poke /chat [our.bol %hall] poke]
::
--

View File

@ -1,6 +1,8 @@
/- *chat, hall
/+ hall-json
|%
::
::
++ msg-to-json
=, enjs:format
|= upd=update