forked from cory/tildefriends
72 lines
2.1 KiB
JavaScript
72 lines
2.1 KiB
JavaScript
|
|
||
|
async function query(sql, args) {
|
||
|
let rows = [];
|
||
|
await ssb.sqlAsync(sql, args ?? [], function(row) {
|
||
|
rows.push(row);
|
||
|
});
|
||
|
return rows;;
|
||
|
}
|
||
|
|
||
|
async function get_biggest() {
|
||
|
return query(`
|
||
|
select author, sum(length(content)) as size from messages group by author order by size desc limit 10;
|
||
|
`);
|
||
|
}
|
||
|
|
||
|
async function get_names(identities) {
|
||
|
return query(`
|
||
|
SELECT author, name FROM (
|
||
|
SELECT
|
||
|
messages.author,
|
||
|
RANK() OVER (PARTITION BY messages.author ORDER BY messages.sequence DESC) AS author_rank,
|
||
|
messages.content ->> 'name' AS name
|
||
|
FROM messages
|
||
|
JOIN json_each(?) AS identities ON identities.value = messages.author
|
||
|
WHERE
|
||
|
json_extract(messages.content, '$.type') = 'about' AND
|
||
|
content ->> 'about' = messages.author AND name IS NOT NULL)
|
||
|
WHERE author_rank = 1
|
||
|
`, [JSON.stringify(identities)]);
|
||
|
}
|
||
|
|
||
|
function nice_size(bytes) {
|
||
|
let value = bytes;
|
||
|
let index = 0;
|
||
|
let units = ['B', 'kB', 'MB', 'GB'];
|
||
|
while (value > 1024 && index < units.length - 1) {
|
||
|
value /= 1024;
|
||
|
index++;
|
||
|
}
|
||
|
return `${Math.round(value * 10) / 10} ${units[index]}`;
|
||
|
}
|
||
|
|
||
|
async function main() {
|
||
|
await app.setDocument('<p style="color: #fff">Finding the top 10 largest feeds...</p>');
|
||
|
let identities = await ssb.getAllIdentities();
|
||
|
let following1 = await ssb.following(identities, 1);
|
||
|
let following2 = await ssb.following(identities, 2);
|
||
|
let biggest = await get_biggest();
|
||
|
let names = await get_names(biggest.map(x => x.author));
|
||
|
names = Object.fromEntries(names.map(x => [x.author, x.name]));
|
||
|
for (let item of biggest) {
|
||
|
item.name = names[item.author];
|
||
|
item.following =
|
||
|
identities.indexOf(item.author) != -1 ? 0 :
|
||
|
following1[item.author] !== undefined ? 1 :
|
||
|
following2[item.author] !== undefined ? 2 :
|
||
|
undefined;
|
||
|
}
|
||
|
let html = `<body style="color: #000; background-color: #ddd">\n
|
||
|
<h1>Top 10 Accounts by Size</h1>
|
||
|
<ol>`;
|
||
|
for (let item of biggest) {
|
||
|
html += `<li>
|
||
|
<span style="color: #888">${nice_size(item.size)}</span>
|
||
|
<a target="_top" href="/~core/ssb/#${encodeURI(item.author)}">${item.name ?? item.author}</a>
|
||
|
</li>\n`;
|
||
|
}
|
||
|
html += '</ol>\n';
|
||
|
await app.setDocument(html);
|
||
|
}
|
||
|
|
||
|
main().catch(function(e) { print(e); });
|