newsletter script
This commit is contained in:
		
							parent
							
								
									29d17dce21
								
							
						
					
					
						commit
						40a01789ec
					
				
							
								
								
									
										90
									
								
								scripts/newsletter.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										90
									
								
								scripts/newsletter.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,90 @@
 | 
			
		||||
const { ApolloClient, InMemoryCache, HttpLink, gql } = require('@apollo/client')
 | 
			
		||||
 | 
			
		||||
const ITEMS = gql`
 | 
			
		||||
  query items ($sort: String, $when: String, $sub: String) {
 | 
			
		||||
    items (sort: $sort, when: $when, sub: $sub) {
 | 
			
		||||
      cursor
 | 
			
		||||
      items {
 | 
			
		||||
        id
 | 
			
		||||
        title
 | 
			
		||||
        url
 | 
			
		||||
        ncomments
 | 
			
		||||
        sats
 | 
			
		||||
        company
 | 
			
		||||
        maxBid
 | 
			
		||||
        status
 | 
			
		||||
        location
 | 
			
		||||
        remote
 | 
			
		||||
        boost
 | 
			
		||||
        user {
 | 
			
		||||
          id
 | 
			
		||||
          name
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
`
 | 
			
		||||
 | 
			
		||||
const client = new ApolloClient({
 | 
			
		||||
  link: new HttpLink({ uri: 'https://stacker.news/api/graphql' }),
 | 
			
		||||
  cache: new InMemoryCache()
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
const abbrNum = n => {
 | 
			
		||||
  if (n < 1e4) return n
 | 
			
		||||
  if (n >= 1e4 && n < 1e6) return +(n / 1e3).toFixed(1) + 'k'
 | 
			
		||||
  if (n >= 1e6 && n < 1e9) return +(n / 1e6).toFixed(1) + 'm'
 | 
			
		||||
  if (n >= 1e9 && n < 1e12) return +(n / 1e9).toFixed(1) + 'b'
 | 
			
		||||
  if (n >= 1e12) return +(n / 1e12).toFixed(1) + 't'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
async function main () {
 | 
			
		||||
  const top = await client.query({
 | 
			
		||||
    query: ITEMS,
 | 
			
		||||
    variables: { sort: 'top', when: 'week' }
 | 
			
		||||
  })
 | 
			
		||||
 | 
			
		||||
  const meta = await client.query({
 | 
			
		||||
    query: ITEMS,
 | 
			
		||||
    variables: { sort: 'top', when: 'week', sub: 'meta' }
 | 
			
		||||
  })
 | 
			
		||||
 | 
			
		||||
  const jobs = await client.query({
 | 
			
		||||
    query: ITEMS,
 | 
			
		||||
    variables: { sub: 'jobs' }
 | 
			
		||||
  })
 | 
			
		||||
 | 
			
		||||
  process.stdout.write(
 | 
			
		||||
`Happy Sat-urday Stackers,
 | 
			
		||||
 | 
			
		||||
Have a great weekend!
 | 
			
		||||
 | 
			
		||||
##### Top Posts
 | 
			
		||||
${top.data.items.items.slice(0, 10).map((item, i) =>
 | 
			
		||||
  `${i + 1}. [${item.title}](https://stacker.news/items/${item.id})${item.url ? `\n    - ${item.url}` : ''}
 | 
			
		||||
    - ${abbrNum(item.sats)} sats \\ ${item.sats} boost \\ ${item.ncomments} comments\n`).join('')}
 | 
			
		||||
 | 
			
		||||
##### Don't miss
 | 
			
		||||
${top.data.items.items.slice(0, 15).map((item, i) =>
 | 
			
		||||
  `- [${item.title}](https://stacker.news/items/${item.id})\n`).join('')}
 | 
			
		||||
 | 
			
		||||
##### Top meta
 | 
			
		||||
${meta.data.items.items.slice(0, 10).map((item, i) =>
 | 
			
		||||
  `- [${item.title}](https://stacker.news/items/${item.id})\n`).join('')}
 | 
			
		||||
 | 
			
		||||
[**all of this week's top posts**](https://stacker.news/top/posts/week)
 | 
			
		||||
 | 
			
		||||
##### Promoted jobs
 | 
			
		||||
${jobs.data.items.items.filter(i => i.maxBid > 0 && i.status === 'ACTIVE').slice(0, 5).map((item, i) =>
 | 
			
		||||
  `${i + 1}. [${item.title.trim()} \\ ${item.company} \\ ${item.location}${item.remote ? ' or Remote' : ''}](https://stacker.news/items/${item.id})\n`).join('')}
 | 
			
		||||
 | 
			
		||||
[**all jobs**](https://stacker.news/~jobs)
 | 
			
		||||
 | 
			
		||||
Yeehaw,
 | 
			
		||||
Keyan
 | 
			
		||||
A guy who works on Stacker News
 | 
			
		||||
 | 
			
		||||
[Watch](https://www.youtube.com/@stackernews/live) or [Listen](https://www.fountain.fm/show/Mg1AWuvkeZSFhsJZ3BW2) to SN's top stories every week.`)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
main()
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user