UNPKG

soloflow

Version:

Soloflow timetracking CLI tool - Create a user on Soloflow.io at start using our CLI to track your time.

207 lines (163 loc) 6.05 kB
#!/usr/bin/env node const chalk = require('chalk'); const clear = require('clear'); const figlet = require('figlet'); const moment = require('moment'); const program = require('commander'); const soloflow = require('./lib/soloflow'); const files = require('./lib/files'); const Configstore = require('configstore'); const pkg = require('./package.json'); const conf = new Configstore(pkg.name); async function getSoloflowToken() { let userToken = await soloflow.getStoredToken(); if(userToken) { console.log(chalk.yellow("🤙 You are already logged in. If any issues try 'soloflow logout'")); return userToken; } console.log(chalk.blue(figlet.textSync('Soloflow.io', { horizontalLayout: 'full' }))); var credentials = await soloflow.getCredentialsFromConsole(); const userInfo = await soloflow.postUserLogin(credentials); if (userInfo['message'] != undefined) { return ""; }; const projects = await soloflow.getProjects(); return userInfo; } async function getSoloflowProjects() { return new Promise( resolve => { resolve(soloflow.getProjects()); } ); } function convertMiliToFormat(duration) { var hours = +duration / (1000*60*60); var absoluteHours = Math.floor(hours); var h = absoluteHours > 9 ? absoluteHours : '0' + absoluteHours; //Get remainder from hours and convert to minutes var minutes = (hours - absoluteHours) * 60; var absoluteMinutes = Math.floor(minutes); var m = absoluteMinutes > 9 ? absoluteMinutes : '0' + absoluteMinutes; //Get remainder from minutes and convert to seconds var seconds = (minutes - absoluteMinutes) * 60; var absoluteSeconds = Math.floor(seconds); var s = absoluteSeconds > 9 ? absoluteSeconds : '0' + absoluteSeconds; return h + ':' + m + ':' + s; } program.version('1.0.8').description(pkg.name); program.command('login').description('Log in with your soloflow.io email and password').action(() => { //Check if token, or else prompt login const userInfo = getSoloflowToken(); }); program.command('logout').description('Logout').action(() => { console.log(chalk.yellow("🤞 Logging you out...")); conf.delete('soloflow.user'); console.log(chalk.red("💔 Logged out! Use Soloflow login to log in again.")); }); /** * PROJECTS * Author: Tommy Jepsen - tommy@tonsstudio.com **/ program.command('projects').description('See all your projects').action((project, task) => { if(conf.get("soloflow.user") == undefined) { console.log(chalk.red("❌ Something happened. Try log in again.")); conf.delete("soloflow.user"); const userInfo = getSoloflowToken(); return; } getSoloflowProjects().then(function(result) { var projects = conf.get("soloflow.projects"); console.log(chalk.green("🌟 These projects are available:")); for (let i = 0; i < projects.length; i++) { console.log(chalk.yellow("🔵 - ", projects[i]['project_name'])); } });; }); /** * TRACK START * Author: Tommy Jepsen - tommy@tonsstudio.com **/ program.command('start <task> <project>').description('Start a new task and let it run in the background of your terminal').action((task, project) => { //Check if token, or else prompt login if(conf.get("soloflow.user") == undefined) { console.log(chalk.red("❌ Something happened. Try log in again.")); conf.delete("soloflow.user"); const userInfo = getSoloflowToken(); return; } var projects = conf.get("soloflow.projects"); var found = false; for (let i = 0; i < projects.length; i++) { if(projects[i]['project_name'] === project) { found = true; } } if(!found) { console.log(chalk.red("Couldn't find the project. Maybe you misspelled it. Write the fullname within '' like 'Project name here' to choose one.")); console.log(chalk.red("These projects are available:")); for (let i = 0; i < projects.length; i++) { console.log(chalk.yellow("- ", projects[i]['project_name'])); } return; } conf.set('soloflow.track_descr', task); conf.set('soloflow.track_time', new Date()); conf.set('soloflow.track_project', project); console.log(chalk.green("🚀 Tracking: '" + task + "' on project '" + project + "")); console.log(chalk.green("🚀 - 'soloflow status' to see it running")); console.log(chalk.green("🚀 - 'soloflow stop' to post it")); }); /** * TRACK STATS * Author: Tommy Jepsen - tommy@tonsstudio.com **/ async function statusAlive() { return new Promise( resolve => { var descr = conf.get('soloflow.track_descr'); var time = conf.get('soloflow.track_time'); var project = conf.get('soloflow.track_project'); var duration = moment.duration(moment.utc().diff(moment.utc(time))); console.log(chalk.green("🚀 Tracking: '" + descr + "' on project '" + project + "' - " + convertMiliToFormat(duration))); setTimeout(() => { statusAlive(); }, 1000); } ); } program.command('status').description('See a running status of your current tracking').action(() => { if(conf.get('soloflow.track_descr') == undefined) { console.log(chalk.red("❌ You are not tracking anything right now.")); console.log(chalk.red("❌ - 'soloflow start 'task here' 'project name' to start")); return; } statusAlive(); }); /** * TRACK STOP * Author: Tommy Jepsen - tommy@tonsstudio.com **/ program.command('stop').description('Stop your current tracking and post it to the API').action(() => { if(conf.get("soloflow.user") == undefined) { console.log(chalk.red("❌ Something happened. Try log in again.")); conf.delete("soloflow.user"); const userInfo = getSoloflowToken(); return; } soloflow.postTracking(); }); /** * TRACKINGS * Author: Tommy Jepsen - tommy@tonsstudio.com **/ program.command('trackings').description('See your 20 latest trackings').action(() => { if(conf.get("soloflow.user") == undefined) { console.log(chalk.red("❌ Something happened. Try log in again.")); conf.delete("soloflow.user"); const userInfo = getSoloflowToken(); return; } soloflow.getTrackings(); }); program.parse(process.argv);