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
JavaScript
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);