Merge pull request #1827 from stackernews/welcome
Script for welcome series
This commit is contained in:
commit
1057fcc04d
108
scripts/welcome.js
Executable file
108
scripts/welcome.js
Executable file
@ -0,0 +1,108 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
const SN_API_URL = process.env.SN_API_URL ?? 'http://localhost:3000'
|
||||
// this is the item id of the last bio that was included in the previous post of the series
|
||||
// TODO: make this configurable
|
||||
const FETCH_AFTER = 838433
|
||||
|
||||
async function gql (query, variables = {}) {
|
||||
const response = await fetch(`${SN_API_URL}/api/graphql`, {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({ query, variables })
|
||||
})
|
||||
|
||||
if (response.status !== 200) {
|
||||
throw new Error(`request failed: ${response.statusText}`)
|
||||
}
|
||||
|
||||
const json = await response.json()
|
||||
if (json.errors) {
|
||||
throw new Error(json.errors[0].message)
|
||||
}
|
||||
|
||||
return json.data
|
||||
}
|
||||
|
||||
function fetchRecentBios () {
|
||||
// fetch all recent bios. we assume here there won't be more than 21
|
||||
// since the last bio we already included in a post as defined by FETCH_AFTER.
|
||||
return gql(
|
||||
`query NewBios {
|
||||
items(sort: "recent", type: "bios", limit: 21) {
|
||||
items {
|
||||
id
|
||||
title
|
||||
createdAt
|
||||
user {
|
||||
name
|
||||
since
|
||||
nitems
|
||||
optional {
|
||||
stacked
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}`
|
||||
)
|
||||
}
|
||||
|
||||
function filterBios (bios) {
|
||||
const newBios = bios.filter(b => b.id > FETCH_AFTER)
|
||||
if (newBios.length === bios.length) {
|
||||
throw new Error('last bio not found. increase limit')
|
||||
}
|
||||
return newBios
|
||||
}
|
||||
|
||||
async function printTable (bios) {
|
||||
console.log('| nym | bio (stacking since) | items | sats stacked |')
|
||||
console.log('| --- | -------------------- | ----- | ------------ |')
|
||||
|
||||
for (const bio of bios) {
|
||||
const { user } = bio
|
||||
|
||||
const bioCreatedAt = formatDate(bio.createdAt)
|
||||
let col2 = `[${formatDate(bio.createdAt)}](${itemLink(bio.id)})`
|
||||
if (Number(bio.id) !== user.since) {
|
||||
const since = await fetchItem(user.since)
|
||||
const sinceCreatedAt = formatDate(since.createdAt)
|
||||
// stacking since might not be the same item as the bio
|
||||
// but it can still have been created on the same day
|
||||
if (bioCreatedAt !== sinceCreatedAt) {
|
||||
col2 += ` ([${formatDate(since.createdAt)}](${itemLink(since.id)}))`
|
||||
}
|
||||
}
|
||||
console.log(`| @${user.name} | ${col2} | ${user.nitems} | ${user.optional.stacked || '???'} |`)
|
||||
}
|
||||
|
||||
console.log(`${bios.length} rows`)
|
||||
|
||||
return bios
|
||||
}
|
||||
|
||||
function formatDate (date) {
|
||||
return new Date(date).toLocaleDateString('en-US', { month: 'short', day: 'numeric' })
|
||||
}
|
||||
|
||||
function itemLink (id) {
|
||||
return `https://stacker.news/items/${id}`
|
||||
}
|
||||
|
||||
async function fetchItem (id) {
|
||||
const data = await gql(`
|
||||
query Item($id: ID!) {
|
||||
item(id: $id) {
|
||||
id
|
||||
createdAt
|
||||
}
|
||||
}`, { id }
|
||||
)
|
||||
return data.item
|
||||
}
|
||||
|
||||
fetchRecentBios()
|
||||
.then(data => filterBios(data.items.items))
|
||||
.then(printTable)
|
||||
.catch(console.error)
|
Loading…
x
Reference in New Issue
Block a user