mirror of
https://github.com/tloncorp/landscape.git
synced 2024-11-26 22:40:41 +03:00
meta: 412 compat
This commit is contained in:
parent
11eeb54975
commit
19504208ea
@ -1,254 +0,0 @@
|
||||
/- sur=hark-store
|
||||
^?
|
||||
=, sur
|
||||
=< [. sur]
|
||||
|%
|
||||
|
||||
++ enjs
|
||||
=, enjs:format
|
||||
|%
|
||||
++ update
|
||||
|= upd=^update
|
||||
^- json
|
||||
%+ frond -.upd
|
||||
?+ -.upd a+~
|
||||
%added (notification +.upd)
|
||||
%add-note (add-note +.upd)
|
||||
%timebox (timebox +.upd)
|
||||
%more (more +.upd)
|
||||
%read-each (read-each +.upd)
|
||||
%read-count (place +.upd)
|
||||
%unread-each (read-each +.upd)
|
||||
%unread-count (unread-count +.upd)
|
||||
%saw-place (saw-place +.upd)
|
||||
%all-stats (all-stats +.upd)
|
||||
%del-place (place +.upd)
|
||||
::%read-note (index +.upd)
|
||||
::%note-read (note-read +.upd)
|
||||
%archived (archived +.upd)
|
||||
==
|
||||
::
|
||||
++ add-note
|
||||
|= [bi=^bin bo=^body]
|
||||
%- pairs
|
||||
:~ bin+(bin bi)
|
||||
body+(body bo)
|
||||
==
|
||||
::
|
||||
++ saw-place
|
||||
|= [p=^place t=(unit ^time)]
|
||||
%- pairs
|
||||
:~ place+(place p)
|
||||
time+?~(t ~ (time u.t))
|
||||
==
|
||||
::
|
||||
++ archived
|
||||
|= [t=^time l=^lid n=^notification]
|
||||
%- pairs
|
||||
:~ lid+(lid l)
|
||||
time+s+(scot %ud t)
|
||||
notification+(notification n)
|
||||
==
|
||||
::
|
||||
++ note-read
|
||||
|= *
|
||||
(pairs ~)
|
||||
::
|
||||
++ all-stats
|
||||
|= places=(map ^place ^stats)
|
||||
^- json
|
||||
:- %a
|
||||
^- (list json)
|
||||
%+ turn ~(tap by places)
|
||||
|= [p=^place s=^stats]
|
||||
%- pairs
|
||||
:~ stats+(stats s)
|
||||
place+(place p)
|
||||
==
|
||||
::
|
||||
++ stats
|
||||
|= s=^stats
|
||||
^- json
|
||||
%- pairs
|
||||
:~ each+a+(turn ~(tap in each.s) (cork spat (lead %s)))
|
||||
last+(time last.s)
|
||||
count+(numb count.s)
|
||||
==
|
||||
++ more
|
||||
|= upds=(list ^update)
|
||||
^- json
|
||||
a+(turn upds update)
|
||||
::
|
||||
++ place
|
||||
|= =^place
|
||||
%- pairs
|
||||
:~ desk+s+desk.place
|
||||
path+s+(spat path.place)
|
||||
==
|
||||
::
|
||||
++ bin
|
||||
|= =^bin
|
||||
%- pairs
|
||||
:~ place+(place place.bin)
|
||||
path+s+(spat path.bin)
|
||||
==
|
||||
++ notification
|
||||
|= ^notification
|
||||
^- json
|
||||
%- pairs
|
||||
:~ time+(time date)
|
||||
bin+(^bin bin)
|
||||
body+(bodies body)
|
||||
==
|
||||
++ bodies
|
||||
|= bs=(list ^body)
|
||||
^- json
|
||||
a+(turn bs body)
|
||||
::
|
||||
++ contents
|
||||
|= cs=(list ^content)
|
||||
^- json
|
||||
a+(turn cs content)
|
||||
::
|
||||
++ content
|
||||
|= c=^content
|
||||
^- json
|
||||
%+ frond -.c
|
||||
?- -.c
|
||||
%ship s+(scot %p ship.c)
|
||||
%text s+cord.c
|
||||
==
|
||||
::
|
||||
++ body
|
||||
|= ^body
|
||||
^- json
|
||||
%- pairs
|
||||
:~ title+(contents title)
|
||||
content+(contents content)
|
||||
time+(^time time)
|
||||
link+s+(spat link)
|
||||
==
|
||||
::
|
||||
++ binned-notification
|
||||
|= [=^bin =^notification]
|
||||
%- pairs
|
||||
:~ bin+(^bin bin)
|
||||
notification+(^notification notification)
|
||||
==
|
||||
++ lid
|
||||
|= l=^lid
|
||||
^- json
|
||||
%+ frond -.l
|
||||
?- -.l
|
||||
?(%seen %unseen) ~
|
||||
%archive s+(scot %ud time.l)
|
||||
==
|
||||
::
|
||||
++ timebox
|
||||
|= [li=^lid l=(list ^notification)]
|
||||
^- json
|
||||
%- pairs
|
||||
:~ lid+(lid li)
|
||||
notifications+a+(turn l notification)
|
||||
==
|
||||
::
|
||||
++ read-each
|
||||
|= [p=^place pax=^path]
|
||||
%- pairs
|
||||
:~ place+(place p)
|
||||
path+(path pax)
|
||||
==
|
||||
::
|
||||
++ unread-count
|
||||
|= [p=^place inc=? count=@ud]
|
||||
%- pairs
|
||||
:~ place+(place p)
|
||||
inc+b+inc
|
||||
count+(numb count)
|
||||
==
|
||||
--
|
||||
++ dejs
|
||||
=, dejs:format
|
||||
|%
|
||||
++ ship (su ;~(pfix sig fed:ag))
|
||||
:: TODO: fix +stab
|
||||
::
|
||||
++ pa
|
||||
|= j=json
|
||||
^- path
|
||||
?> ?=(%s -.j)
|
||||
?: =('/' p.j) /
|
||||
(stab p.j)
|
||||
::
|
||||
++ place
|
||||
%- ot
|
||||
:~ desk+so
|
||||
path+pa
|
||||
==
|
||||
::
|
||||
++ bin
|
||||
%- ot
|
||||
:~ path+pa
|
||||
place+place
|
||||
==
|
||||
::
|
||||
++ read-each
|
||||
%- ot
|
||||
:~ place+place
|
||||
path+pa
|
||||
==
|
||||
::
|
||||
:: parse date as @ud
|
||||
:: TODO: move to zuse
|
||||
++ sd
|
||||
|= jon=json
|
||||
^- @da
|
||||
?> ?=(%s -.jon)
|
||||
`@da`(rash p.jon dem:ag)
|
||||
::
|
||||
++ lid
|
||||
%- of
|
||||
:~ archive+sd
|
||||
unseen+ul
|
||||
seen+ul
|
||||
==
|
||||
::
|
||||
++ archive
|
||||
%- ot
|
||||
:~ lid+lid
|
||||
bin+bin
|
||||
==
|
||||
++ content
|
||||
%- of
|
||||
:~ text+so
|
||||
ship+ship
|
||||
==
|
||||
::
|
||||
++ body
|
||||
%- ot
|
||||
:~ title+(ar content)
|
||||
content+(ar content)
|
||||
time+di
|
||||
binned+pa
|
||||
link+pa
|
||||
==
|
||||
::
|
||||
++ add-note
|
||||
%- ot
|
||||
:~ bin+bin
|
||||
body+body
|
||||
==
|
||||
::
|
||||
++ action
|
||||
^- $-(json ^action)
|
||||
%- of
|
||||
:~ archive-all+ul
|
||||
archive+archive
|
||||
opened+ul
|
||||
read-count+place
|
||||
read-each+read-each
|
||||
read-note+bin
|
||||
add-note+add-note
|
||||
==
|
||||
--
|
||||
--
|
@ -1,159 +0,0 @@
|
||||
^?
|
||||
::
|
||||
:: %hark-store: Notification, unreads store
|
||||
::
|
||||
:: Timeboxing & binning:
|
||||
::
|
||||
:: Unread notifications accumulate in $unreads. They are grouped by
|
||||
:: their $bin. A notification may become read by either:
|
||||
:: a) being read by a %read-count or %read-each or %read-note
|
||||
:: b) being read by a %seen
|
||||
::
|
||||
:: If a) then we insert the corresponding bin into $reads at the
|
||||
:: current timestamp
|
||||
:: If b) then we empty $unreads and move all bins to $reads at the
|
||||
:: current timestamp
|
||||
::
|
||||
:: Unread tracking:
|
||||
:: Unread tracking has two 'modes' which may be used concurrently,
|
||||
:: if necessary.
|
||||
::
|
||||
:: count:
|
||||
:: This stores the unreads as a simple atom, describing the number
|
||||
:: of unread items. May be increased with %unread-count and
|
||||
:: set to zero with %read-count. Ideal for high-frequency linear
|
||||
:: datastructures, e.g. chat
|
||||
:: each:
|
||||
:: This stores the unreads as a set of paths, describing the set of
|
||||
:: unread items. Unreads may be added to the set with %unread-each
|
||||
:: and removed with %read-each. Ideal for non-linear, low-frequency
|
||||
:: datastructures, e.g. blogs
|
||||
::
|
||||
|%
|
||||
:: $place: A location, under which landscape stores stats
|
||||
::
|
||||
:: .desk must match q.byk.bowl
|
||||
:: Examples:
|
||||
:: A chat:
|
||||
:: [%landscape /~dopzod/urbit-help]
|
||||
:: A note in a notebook:
|
||||
:: [%landscape /~darrux-landes/feature-requests/12374893234232]
|
||||
:: A group:
|
||||
:: [%hark-group-hook /~bitbet-bolbel/urbit-community]
|
||||
:: Comments on a link
|
||||
:: [%landscape /~dabben-larbet/urbit-in-the-news/17014118450499614194868/2]
|
||||
::
|
||||
+$ place [=desk =path]
|
||||
::
|
||||
:: $bin: Identifier for grouping notifications
|
||||
::
|
||||
:: Examples
|
||||
:: A mention in a chat:
|
||||
:: [/mention %landscape /~dopzod/urbit-help]
|
||||
:: New messages in a chat
|
||||
:: [/message %landscape /~dopzod/urbit-help]
|
||||
:: A new comment in a notebook:
|
||||
:: [/comment %landscape /~darrux-landes/feature-requests/12374893234232/2]
|
||||
::
|
||||
+$ bin [=path =place]
|
||||
::
|
||||
:: $lid: Reference to a timebox
|
||||
::
|
||||
+$ lid
|
||||
$% [%archive =time]
|
||||
[%seen ~]
|
||||
[%unseen ~]
|
||||
==
|
||||
:: $content: Notification content
|
||||
+$ content
|
||||
$% [%ship =ship]
|
||||
[%text =cord]
|
||||
==
|
||||
::
|
||||
:: $body: A notification body
|
||||
::
|
||||
+$ body
|
||||
$: title=(list content)
|
||||
content=(list content)
|
||||
=time
|
||||
binned=path
|
||||
link=path
|
||||
==
|
||||
::
|
||||
+$ notification
|
||||
[date=@da =bin body=(list body)]
|
||||
:: $timebox: Group of notificatons
|
||||
+$ timebox
|
||||
(map bin notification)
|
||||
:: $archive: Archived notifications, ordered by time
|
||||
+$ archive
|
||||
((mop @da timebox) gth)
|
||||
::
|
||||
+$ action
|
||||
$% :: hook actions
|
||||
::
|
||||
:: %add-note: add a notification
|
||||
[%add-note =bin =body]
|
||||
::
|
||||
:: %del-place: Underlying resource disappeared, remove all
|
||||
:: associated notifications
|
||||
[%del-place =place]
|
||||
:: %unread-count: Change unread count by .count
|
||||
[%unread-count =place inc=? count=@ud]
|
||||
:: %unread-each: Add .path to list of unreads for .place
|
||||
[%unread-each =place =path]
|
||||
:: %saw-place: Update last-updated for .place to now.bowl
|
||||
[%saw-place =place time=(unit time)]
|
||||
:: store actions
|
||||
::
|
||||
:: %archive: archive single notification
|
||||
:: if .time is ~, then archiving unread notification
|
||||
:: else, archiving read notification
|
||||
[%archive =lid =bin]
|
||||
:: %read-count: set unread count to zero
|
||||
[%read-count =place]
|
||||
:: %read-each: remove path from unreads for .place
|
||||
[%read-each =place =path]
|
||||
:: %read-note: Read note at .bin
|
||||
[%read-note =bin]
|
||||
:: %archive-all: Archive all notifications
|
||||
[%archive-all ~]
|
||||
:: %opened: User opened notifications, reset timeboxing logic.
|
||||
::
|
||||
[%opened ~]
|
||||
::
|
||||
:: XX: previously in hark-store, now deprecated
|
||||
:: the hooks responsible for creating notifications may offer pokes
|
||||
:: similar to this
|
||||
:: [%read-graph =resource]
|
||||
:: [%read-group =resource]
|
||||
:: [%remove-graph =resource]
|
||||
::
|
||||
==
|
||||
:: .stats: Statistics for a .place
|
||||
::
|
||||
+$ stats
|
||||
$: count=@ud
|
||||
each=(set path)
|
||||
last=@da
|
||||
timebox=(unit @da)
|
||||
==
|
||||
::
|
||||
+$ update
|
||||
$% action
|
||||
:: %more: more updates
|
||||
[%archived =time =lid =notification]
|
||||
[%more more=(list update)]
|
||||
:: %note-read: note has been read with timestamp
|
||||
[%note-read =time =bin]
|
||||
[%added =notification]
|
||||
:: %timebox: description of timebox.
|
||||
::
|
||||
[%timebox =lid =(list notification)]
|
||||
:: %place-stats: description of .stats for a .place
|
||||
[%place-stats =place =stats]
|
||||
:: %place-stats: stats for all .places
|
||||
[%all-stats places=(map place stats)]
|
||||
==
|
||||
--
|
||||
|
@ -174,11 +174,9 @@
|
||||
=^ cards state
|
||||
?+ path (on-watch:def path)
|
||||
[%http-response *]
|
||||
?> (team:title [our src]:bowl)
|
||||
`state
|
||||
::
|
||||
[%charges ~]
|
||||
?> (team:title [our src]:bowl)
|
||||
`state
|
||||
::
|
||||
[%glob @ @ ~]
|
||||
|
@ -1,9 +1,7 @@
|
||||
/- g=groups, graph-store
|
||||
/- g=groups
|
||||
/- meta
|
||||
/- metadata-store
|
||||
/- cite
|
||||
/- e=epic
|
||||
/+ lib-graph=graph-store
|
||||
|%
|
||||
:: $writ: a chat message
|
||||
+$ writ [seal memo]
|
||||
@ -333,15 +331,4 @@
|
||||
readers=(set sect:g)
|
||||
writers=(set sect:g)
|
||||
==
|
||||
++ met metadata-store
|
||||
+$ club-import [ships=(set ship) =association:met =graph:gra]
|
||||
+$ club-imports (map flag club-import)
|
||||
::
|
||||
+$ import [writers=(set ship) =association:met =update-log:gra =graph:gra]
|
||||
::
|
||||
+$ imports (map flag import)
|
||||
::
|
||||
++ gra graph-store
|
||||
++ orm-gra orm:lib-graph
|
||||
++ orm-log-gra orm-log:lib-graph
|
||||
--
|
||||
|
@ -1,9 +1,7 @@
|
||||
/- g=groups, graph-store
|
||||
/- g=groups
|
||||
/- meta
|
||||
/- metadata-store
|
||||
/- cite
|
||||
/- e=epic
|
||||
/+ lib-graph=graph-store
|
||||
|%
|
||||
:: $writ: a chat message
|
||||
+$ writ [seal memo]
|
||||
@ -338,15 +336,4 @@
|
||||
readers=(set sect:g)
|
||||
writers=(set sect:g)
|
||||
==
|
||||
++ met metadata-store
|
||||
+$ club-import [ships=(set ship) =association:met =graph:gra]
|
||||
+$ club-imports (map flag club-import)
|
||||
::
|
||||
+$ import [writers=(set ship) =association:met =update-log:gra =graph:gra]
|
||||
::
|
||||
+$ imports (map flag import)
|
||||
::
|
||||
++ gra graph-store
|
||||
++ orm-gra orm:lib-graph
|
||||
++ orm-log-gra orm-log:lib-graph
|
||||
--
|
||||
|
@ -1,9 +1,7 @@
|
||||
/- g=groups, graph-store, uno=chat-1, zer=chat-0
|
||||
/- g=groups, uno=chat-1, zer=chat-0
|
||||
/- meta
|
||||
/- metadata-store
|
||||
/- cite
|
||||
/- e=epic
|
||||
/+ lib-graph=graph-store
|
||||
|%
|
||||
++ old
|
||||
|%
|
||||
@ -358,15 +356,4 @@
|
||||
readers=(set sect:g)
|
||||
writers=(set sect:g)
|
||||
==
|
||||
++ met metadata-store
|
||||
+$ club-import [ships=(set ship) =association:met =graph:gra]
|
||||
+$ club-imports (map flag club-import)
|
||||
::
|
||||
+$ import [writers=(set ship) =association:met =update-log:gra =graph:gra]
|
||||
::
|
||||
+$ imports (map flag import)
|
||||
::
|
||||
++ gra graph-store
|
||||
++ orm-gra orm:lib-graph
|
||||
++ orm-log-gra orm-log:lib-graph
|
||||
--
|
||||
|
@ -53,7 +53,7 @@
|
||||
?> ?=(%finished -.rep)
|
||||
?~ full-file.rep (pure:m !>(~))
|
||||
=/ body=cord q.data.u.full-file.rep
|
||||
=/ parsed=(unit json) (de-json:html body)
|
||||
=/ parsed=(unit json) (de:json:html body)
|
||||
?~ parsed (pure:m !>(~))
|
||||
?~ u.parsed (pure:m !>(~))
|
||||
=/ mined (mine-json u.parsed)
|
||||
|
@ -18,7 +18,7 @@
|
||||
header-list=['Content-Type'^'application/json' ~]
|
||||
^= body
|
||||
%- some %- as-octt:mimes:html
|
||||
%- en-json:html
|
||||
%- en:json:html
|
||||
%- pairs:enjs:format
|
||||
:~ ['key' s+(crip api-key)]
|
||||
==
|
||||
|
@ -24,7 +24,7 @@
|
||||
^= body
|
||||
%- some
|
||||
%- as-octt:mimes:html
|
||||
%- en-json:html
|
||||
%- en:json:html
|
||||
%- pairs:enjs:format
|
||||
:~ ['key' s+(crip api-key)]
|
||||
['template_name' s+(crip template-name)]
|
||||
|
@ -18,7 +18,7 @@
|
||||
^= body
|
||||
%- some
|
||||
%- as-octt:mimes:html
|
||||
%- en-json:html
|
||||
%- en:json:html
|
||||
%- pairs:enjs:format
|
||||
:~ ['key' s+(crip api-key)]
|
||||
:- 'message'
|
||||
|
@ -27,7 +27,7 @@
|
||||
^= body
|
||||
%- some
|
||||
%- as-octt:mimes:html
|
||||
%- en-json:html
|
||||
%- en:json:html
|
||||
%- pairs:enjs:format
|
||||
['merge_fields' o+vars]~
|
||||
==
|
||||
|
@ -1,103 +0,0 @@
|
||||
/- hark=hark-store
|
||||
/+ *test, re=hark-unreads
|
||||
/= agent /app/hark-store
|
||||
|%
|
||||
++ place
|
||||
^- place:hark
|
||||
[%landscape /graph/~zod/test]
|
||||
::
|
||||
++ bin
|
||||
^- bin:hark
|
||||
[/ place]
|
||||
|
||||
::
|
||||
++ body
|
||||
|= run=@
|
||||
:* ~[text/'Title']
|
||||
~[text/(crip "Contents {(scow %ud run)}")]
|
||||
`time`(add (mul ~s1 run) *time)
|
||||
/
|
||||
/test
|
||||
==
|
||||
::
|
||||
++ add-note
|
||||
|= run=@
|
||||
^- action:hark
|
||||
[%add-note bin (body run)]
|
||||
::
|
||||
++ read-count
|
||||
^- action:hark
|
||||
[%read-count place]
|
||||
::
|
||||
+$ state
|
||||
$: %9
|
||||
places=(map place:hark stats:hark)
|
||||
seen=timebox:hark
|
||||
unseen=timebox:hark
|
||||
=archive:hark
|
||||
half-open=(map bin:hark @da)
|
||||
==
|
||||
++ bowl
|
||||
|= run=@ud
|
||||
^- bowl:gall
|
||||
:* [~zod ~zod %hark-store]
|
||||
[~ ~]
|
||||
[run `@uvJ`(shax run) (add (mul run ~s1) *time) [~zod %garden ud+run]]
|
||||
==
|
||||
--
|
||||
|%
|
||||
::
|
||||
++ test-half-open
|
||||
=| run=@ud
|
||||
=^ mov1 agent
|
||||
(~(on-poke agent (bowl run)) %hark-action !>((add-note run)))
|
||||
=^ mova agent
|
||||
(~(on-poke agent (bowl run)) %noun !>(%sane))
|
||||
=. run +(run)
|
||||
=^ mov2 agent
|
||||
(~(on-poke agent (bowl run)) %hark-action !>(read-count))
|
||||
=^ mov3 agent
|
||||
(~(on-poke agent (bowl run)) %noun !>(%sane))
|
||||
=/ expected-archive=notification:hark
|
||||
[(add *time (mul ~s1 0)) bin ~[(body 0)]]
|
||||
=+ !<(=state on-save:agent)
|
||||
=/ actual-archive=notification:hark
|
||||
(~(got re archive.state) (add *time ~s1) bin)
|
||||
(expect-eq !>(expected-archive) !>(actual-archive))
|
||||
::
|
||||
++ test-half-open-double
|
||||
=| run=@ud
|
||||
=^ mov1 agent
|
||||
(~(on-poke agent (bowl run)) %hark-action !>((add-note run)))
|
||||
=. run +(run)
|
||||
=^ mov2 agent
|
||||
(~(on-poke agent (bowl run)) %hark-action !>(read-count))
|
||||
=. run +(run)
|
||||
=^ mov3 agent
|
||||
(~(on-poke agent (bowl run)) %hark-action !>((add-note run)))
|
||||
=. run +(run)
|
||||
=^ mov4 agent
|
||||
(~(on-poke agent (bowl run)) %hark-action !>(read-count))
|
||||
=. run +(run)
|
||||
=^ mov5 agent
|
||||
(~(on-poke agent (bowl run)) %noun !>(%sane))
|
||||
=/ expected-archive=notification:hark
|
||||
[(add *time (mul ~s1 2)) bin ~[(body 2) (body 0)]]
|
||||
=+ !<(=state on-save:agent)
|
||||
=/ actual-archive=notification:hark
|
||||
(~(got re archive.state) (add *time ~s1) bin)
|
||||
(expect-eq !>(expected-archive) !>(actual-archive))
|
||||
::
|
||||
++ test-half-open-capped
|
||||
=| run=@ud
|
||||
|-
|
||||
?: =(run 31)
|
||||
=+ !<(=state on-save:agent)
|
||||
(expect-eq !>(~) !>(half-open.state))
|
||||
=^ movs agent
|
||||
(~(on-poke agent (bowl run)) %hark-action !>((add-note run)))
|
||||
=^ mavs agent
|
||||
(~(on-poke agent (bowl run)) %hark-action !>(read-count))
|
||||
$(run +(run))
|
||||
::
|
||||
--
|
Loading…
Reference in New Issue
Block a user