UNPKG

phunt

Version:

Product Hunt Command Line Client

264 lines (236 loc) 8.8 kB
#!/usr/bin/env node 'use strict'; var fildes = require('fildes'); var oshd = require('os-homedir'); var vorpal = require('vorpal')(); var unirest = require('unirest'); var inquirer = require('inquirer'); var chalk = require('chalk'); var wrap = require('wordwrap')(60); var emoji = require('node-emoji'); var config_file = oshd() + '/.phunt'; var api_url = 'https://api.producthunt.com/v1'; /** * Initial */ function init(){ fildes.open(config_file, {'flag': 'r'}) .then(function(fd){ fildes.readFile(config_file) .then(function(buffer){ var config = JSON.parse(buffer); me(config.token, function(response){ (response.code == 401) ? install(response.body.error_description) : start(config.token, response.body.user.username); }); }); }) .catch(function(error){ install('Before you use PHUNT, you need to add an application and create token from : https://www.producthunt.com/v1/oauth/applications.'); }); } /** * Installation */ function install(message){ splash(); console.log(wrap(chalk.dim(message) + '\n\n')); var questions = [ { type : "password", name : "token", message : "Token: " + chalk.dim('(hidden)') } ]; inquirer.prompt(questions, function(answers) { me(answers.token, function(response) { if(response.code == 401){ install(response.body.error_description); } else { fildes.write(config_file, {'token': answers.token}); start(answers.token, response.body.user.username) } }); }); } /** * Get current user * @param {String} token * @param {Function} cb */ function me(token, cb){ unirest .get(api_url + '/me') .header({ 'Accept' : 'application/json', 'Content-Type' : 'application/json', 'Authorization' : 'Bearer ' + token }) .end(function (response) { cb(response) }); } /** * Show posts from a query. * @param {String} token * @param {Function} cb */ function posts(token, query, cb){ var endpoint_url = '/posts'; if (query) { if (query == 'all') { endpoint_url = '/posts/all'; } else { endpoint_url = '/posts/all?search[category]=' + query; } } unirest .get(api_url + endpoint_url) .header({ 'Accept' : 'application/json', 'Content-Type' : 'application/json', 'Authorization' : 'Bearer ' + token }) .end(function (response) { cb(response) }); } /** * Splash screen */ function splash(){ console.log(chalk.dim('ttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt')); console.log(chalk.dim('ttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt')); console.log(chalk.dim('ttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt')); console.log(chalk.dim('ttttttttttttttttttt; `ttttttttttttttttttttt')); console.log(chalk.dim('ttttttttttttttttttt; ttttttttttttttttttt')); console.log(chalk.dim('ttttttttttttttttttt; tttttttttttttttttt')); console.log(chalk.dim('ttttttttttttttttttt; ;ttttttttttt, ttttttttttttttttt')); console.log(chalk.dim('ttttttttttttttttttt; ;tttttttttttt, ;tttttttttttttttt')); console.log(chalk.dim('ttttttttttttttttttt; ;tttttttttttt, ;tttttttttttttttt')); console.log(chalk.dim('ttttttttttttttttttt; ;ttttttttttt, ttttttttttttttttt')); console.log(chalk.dim('ttttttttttttttttttt; tttttttttttttttttt')); console.log(chalk.dim('ttttttttttttttttttt; ttttttttttttttttttt')); console.log(chalk.dim('ttttttttttttttttttt; ,ttttttttttttttttttttt')); console.log(chalk.dim('ttttttttttttttttttt; ;ttttttttttttttttttttttttttttttttttt')); console.log(chalk.dim('ttttttttttttttttttt; ;ttttttttttttttttttttttttttttttttttt')); console.log(chalk.dim('ttttttttttttttttttt; ;ttttttttttttttttttttttttttttttttttt')); console.log(chalk.dim('ttttttttttttttttttt; ;ttttttttttttttttttttttttttttttttttt')); console.log(chalk.dim('ttttttttttttttttttt; ;ttttttttttttttttttttttttttttttttttt')); console.log(chalk.dim('ttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt')); console.log(chalk.dim('ttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt')); console.log(chalk.dim('ttttttttttt ttttttttttt')); console.log(chalk.dim('ttttttttttt ') + chalk.bold('------------ PHUNT ------------') + chalk.dim(' ttttttttttt')); console.log(chalk.dim('ttttttttttt PRODUCTHUNT COMMAND LINE CLIENT ttttttttttt')); console.log(chalk.dim('ttttttttttt ttttttttttt')); console.log(chalk.dim('ttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt')); console.log(chalk.dim('ttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt\n')); } /** * Start application * @param {String} token * @param {String} username */ function start(token, username){ splash(); /** * Me * Get current user */ vorpal .command('me', 'Get current user') .action(function(args, callback) { me(token, function(response){ var user = response.body.user; vorpal.log('\n ' + chalk.bold.blue(user.name) + ' ' + chalk.bold('(@' + user.username + ')')); vorpal.log(' ' + chalk.italic(user.headline)); vorpal.log(' ' + chalk.dim('Followers') + ': ' + chalk.bold(user.followers_count) + ' ' + chalk.dim('Followings') + ': ' + chalk.bold(user.followings_count)); vorpal.log(' ' + chalk.italic.underline.dim(user.profile_url) + '\n'); callback(); }); }); /** * Posts * Get the tech posts of today * If [category] is empty, then show all category */ vorpal .command('posts [category]', 'Get the posts of specific category, default to show all category') .action(function(args, callback) { posts(token, args.category, function(response){ var body = response.body; var posts = body.posts; for (var i in posts) { vorpal.log(chalk.bold.blue('\n- ' + posts[i].name)); vorpal.log(' ' + chalk.italic(posts[i].tagline)); vorpal.log(' ' + emoji.get(':heart:') + ' ' + posts[i].votes_count + ' ' + emoji.get(':thought_balloon:') + ' ' + posts[i].comments_count); vorpal.log(' ' + chalk.italic.underline.dim(posts[i].discussion_url) + '\n'); } callback(); }); }); /** * Posts * Get all the (50) newest posts */ vorpal .command('posts new', 'Get all the (50) newest posts') .action(function(args, callback) { posts(token, 'all', function(response){ var body = response.body; var posts = body.posts; for (var i in posts) { vorpal.log(chalk.bold.blue('\n- ' + posts[i].name)); vorpal.log(' ' + chalk.italic(posts[i].tagline)); vorpal.log(' ' + emoji.get(':heart:') + ' ' + posts[i].votes_count + ' ' + emoji.get(':thought_balloon:') + ' ' + posts[i].comments_count); vorpal.log(' ' + chalk.italic.underline.dim(posts[i].discussion_url) + '\n'); } callback(); }); }); /** * Me Posts * See all posts created by current user */ vorpal .command('me posts', 'See all posts created by current user') .action(function(args, callback) { me(token, function(response){ var posts = response.body.user.posts; posts.forEach(function(post) { vorpal.log('\n ' + chalk.bold.blue(post.name)); vorpal.log(' ' + chalk.italic(post.tagline)); vorpal.log(' ' + chalk.dim('Votes') + ': ' + chalk.bold(post.votes_count) + ' ' + chalk.dim('Comments') + ': ' + chalk.bold(post.comments_count)); vorpal.log(' ' + chalk.italic.underline.dim(post.discussion_url) + '\n'); }) callback(); }); }); /** * Me Products * See all Products created by current user */ vorpal .command('me products', 'See all products created by current user') .action(function(args, callback) { me(token, function(response){ var makerOf = response.body.user.maker_of; makerOf.forEach(function(product) { vorpal.log('\n ' + chalk.bold.blue(product.name)); vorpal.log(' ' + chalk.italic(product.tagline)); vorpal.log(' ' + chalk.dim('Votes') + ': ' + chalk.bold(product.votes_count) + ' ' + chalk.dim('Comments') + ': ' + chalk.bold(product.comments_count)); vorpal.log(' ' + chalk.italic.underline.dim(product.discussion_url) + '\n'); }) callback(); }); }); vorpal.delimiter('@' + username + ' => ').show(); } // Here we go! init();