mirror of
https://github.com/tloncorp/landscape.git
synced 2024-12-19 23:01:46 +03:00
3b3797135a
There is a (somewhat poorly understood) case where the group associated with a chat may not actually contain that chat in its channels listing. Here, instead of assuming the channel is always present, we ask for it more gently, and simply skip to the next-most-active channel if it turns out to be missing. We also remove a stray debug printf, and add a trace print in case anything else goes wrong here.
100 lines
2.8 KiB
Plaintext
100 lines
2.8 KiB
Plaintext
:: summarize: utilities for summarizing groups/chat state in various ways
|
|
::
|
|
/- chat, groups
|
|
::
|
|
|_ [our=@p now=@da]
|
|
:: +range: period of time to summarize over
|
|
:: +limit: max amount of msgs to count per channel
|
|
::
|
|
++ range ~d7
|
|
++ limit 9.999
|
|
::
|
|
++ scry-path
|
|
|= [=term =spur]
|
|
[(scot %p our) term (scot %da now) spur]
|
|
::
|
|
++ summarize-activity
|
|
^- $: sent=@ud
|
|
received=@ud
|
|
most-sent-group=@t
|
|
==
|
|
=- :+ s r
|
|
=/ g=flag:chat
|
|
=< -
|
|
::TODO crashes if no groups
|
|
%+ snag 0
|
|
%+ sort ~(tap by g)
|
|
|=([[* a=@ud] [* b=@ud]] (gth a b))
|
|
=< title.meta
|
|
.^ group:groups
|
|
%gx
|
|
(scry-path %groups /groups/(scot %p p.g)/[q.g]/group)
|
|
==
|
|
%+ roll
|
|
%~ tap in
|
|
.^ (map flag:chat chat:chat)
|
|
%gx
|
|
(scry-path %chat /chats/chats)
|
|
==
|
|
=* onn ((on time writ:chat) lte)
|
|
|= [[c=flag:chat chat:chat] g=(map flag:chat @ud) s=@ud r=@ud]
|
|
=+ .^ log=((mop time writ:chat) lte)
|
|
%gx
|
|
%+ scry-path %chat
|
|
/chat/(scot %p p.c)/[q.c]/writs/newer/(scot %ud (sub now range))/(scot %ud limit)/chat-writs
|
|
==
|
|
:- %+ ~(put by g) group.perm
|
|
(add (~(gut by g) group.perm 0) (wyt:onn log))
|
|
%+ roll (tap:onn log)
|
|
|= [[time writ:chat] s=_s r=_r]
|
|
?:(=(our author) [+(s) r] [s +(r)])
|
|
::
|
|
++ summarize-inactivity
|
|
^- $: unread-dms=@ud :: unread dm count
|
|
unread-etc=@ud :: unread chats count
|
|
top-group=@t :: most active group
|
|
top-channel=@t :: most active channel
|
|
==
|
|
=+ .^ =briefs:chat
|
|
%gx
|
|
(scry-path %chat /briefs/chat-briefs)
|
|
==
|
|
:: accumulate unread counts
|
|
::
|
|
=/ [dum=@ud duc=@ud]
|
|
%- ~(rep by briefs)
|
|
|= [[w=whom:chat brief:briefs:chat] n=@ud m=@ud]
|
|
?: ?=(%flag -.w) [n (add m count)]
|
|
[(add n count) m]
|
|
:+ dum duc
|
|
:: gather all chat channels & their groups & unread counts
|
|
::
|
|
=/ faz=(list [g=flag:chat c=flag:chat n=@ud])
|
|
%+ turn
|
|
%~ tap in
|
|
.^ (map flag:chat chat:chat)
|
|
%gx
|
|
(scry-path %chat /chats/chats)
|
|
==
|
|
|= [c=flag:chat chat:chat]
|
|
:+ group.perm c
|
|
count:(~(gut by briefs) flag+c *brief:briefs:chat)
|
|
=. faz (sort faz |=([[* * a=@ud] [* * b=@ud]] (gth a b)))
|
|
:: get display titles of most active channel and its group
|
|
::
|
|
::NOTE in rare cases, we might not know of the existence of the associated
|
|
:: group. simply skip past it and try the next one...
|
|
=+ .^ =groups:groups
|
|
%gx
|
|
(scry-path %groups /groups/groups)
|
|
==
|
|
|-
|
|
?~ faz ['???' '???'] ::TODO better copy
|
|
~| i.faz
|
|
?. (~(has by groups) g.i.faz)
|
|
$(faz t.faz)
|
|
=/ =group:^groups (~(got by groups) g.i.faz)
|
|
?~ chat=(~(get by channels.group) %chat c.i.faz)
|
|
$(faz t.faz)
|
|
[title.meta.group title.meta.u.chat]
|
|
-- |