mirror of https://github.com/IoTcat/todo-ddl.git
parent
7baee0aa25
commit
0e812392c0
16 changed files with 1850 additions and 694 deletions
@ -1,700 +1,25 @@ |
|||||||
#!/usr/bin/env node
|
#!/usr/bin/env node
|
||||||
const request = require('request'); |
var yargs = require('yargs'); |
||||||
require('shelljs/global'); |
|
||||||
const ora = require('ora'); |
|
||||||
const boxen = require('boxen'); |
|
||||||
const table = require('cli-table'); |
|
||||||
const colors = require('colors'); |
|
||||||
const fs = require('fs'); |
|
||||||
const md5 = require('md5'); |
|
||||||
|
|
||||||
const conf = new (require('conf'))({ |
|
||||||
email: { |
|
||||||
type: "string", |
|
||||||
format: "email" |
|
||||||
}, |
|
||||||
url: { |
|
||||||
type: "string", |
|
||||||
format: "url", |
|
||||||
default: "https://api.yimian.xyz/todo-ddl/" |
|
||||||
}, |
|
||||||
taskData: { |
|
||||||
type: "array", |
|
||||||
default: [] |
|
||||||
}, |
|
||||||
ddlData: { |
|
||||||
type: "array", |
|
||||||
default: [] |
|
||||||
} |
|
||||||
}); |
|
||||||
|
|
||||||
if(conf.get('url') == undefined) conf.set('url', "https://api.yimian.xyz/todo-ddl/"); |
/* help */ |
||||||
if(conf.get('email') == undefined) conf.set('email', ""); |
yargs = require(__dirname + '/modules/help.js')(yargs); |
||||||
if(conf.get('taskData') == undefined) conf.set('taskData', []); |
/* version */ |
||||||
if(conf.get('ddlData') == undefined) conf.set('ddlData', []); |
yargs = require(__dirname + '/modules/version.js')(yargs); |
||||||
|
|
||||||
|
/* systemctl */ |
||||||
|
yargs = require(__dirname + '/modules/systemctl.js')(yargs); |
||||||
|
|
||||||
const tds = ['todo', 'task', 'history', 'ash']; |
/* config */ |
||||||
|
yargs = require(__dirname + '/modules/config.js')(yargs); |
||||||
|
|
||||||
var tools = { |
/* td */ |
||||||
_parseTime: t => { |
yargs = require(__dirname + '/modules/td.js')(yargs); |
||||||
var st = new Date(t); |
|
||||||
return `${st.getFullYear()}-${st.getMonth()+1}-${st.getDate()} ${st.getHours()}:${st.getMinutes()}:${st.getSeconds()}`; |
|
||||||
}, |
|
||||||
_showInfo: (arr, head, value) => { |
|
||||||
var info = new table({ |
|
||||||
'head': head |
|
||||||
}); |
|
||||||
arr.forEach((i, index) => { |
|
||||||
var item = conf.get('taskData')[i]; |
|
||||||
info.push(value(item)); |
|
||||||
if(index == arr.length-1){ |
|
||||||
console.log(info.toString()); |
|
||||||
} |
|
||||||
}); |
|
||||||
}, |
|
||||||
td: { |
|
||||||
_filter: condition => new Promise(resolve => { |
|
||||||
var arr = []; |
|
||||||
conf.get('taskData').forEach((item, index) => { |
|
||||||
if(condition(item)){ |
|
||||||
arr.push(index); |
|
||||||
} |
|
||||||
if(index == conf.get('taskData').length-1){ |
|
||||||
resolve(arr); |
|
||||||
} |
|
||||||
}); |
|
||||||
}), |
|
||||||
task: { |
|
||||||
_: item => (!item.isDel && item.tt == null), |
|
||||||
_head: ['id', 'class', 'name', 'Create Time'], |
|
||||||
_value: item => [item.id, item.class, item.name, tools._parseTime(item.st)], |
|
||||||
ls: {} |
|
||||||
}, |
|
||||||
todo: { |
|
||||||
_: item => !item.isDel && item.tt != null && item.et == null, |
|
||||||
_head: ['id', 'class', 'name', 'Create Time', 'Start Time'], |
|
||||||
_value: item => [item.id, item.class, item.name, tools._parseTime(item.st), tools._parseTime(item.tt)], |
|
||||||
ls: {} |
|
||||||
}, |
|
||||||
history: { |
|
||||||
_: item => !item.isDel && item.tt != null && item.et != null, |
|
||||||
_head: ['id', 'class', 'name', 'Create Time', 'Start Time', 'Finish Time'], |
|
||||||
_value: item => [item.id, item.class, item.name, tools._parseTime(item.st), tools._parseTime(item.tt), tools._parseTime(item.et)], |
|
||||||
ls: {} |
|
||||||
}, |
|
||||||
ash: { |
|
||||||
_: item => item.isDel, |
|
||||||
_head: ['id', 'class', 'name', 'Create Time', 'Start Time', 'Finish Time'], |
|
||||||
_value: item => [item.id, item.class, item.name, tools._parseTime(item.st), tools._parseTime(item.tt), tools._parseTime(item.et)], |
|
||||||
ls: {} |
|
||||||
} |
|
||||||
} |
|
||||||
}; |
|
||||||
|
|
||||||
tds.forEach(item => { |
|
||||||
tools.td[item].ls.all = async () => { |
|
||||||
tools._showInfo(await tools.td._filter(tools.td[item]._), tools.td[item]._head, tools.td[item]._value); |
|
||||||
}; |
|
||||||
tools.td[item].__ = async () => new Promise(async resolve => { |
|
||||||
var arr = []; |
|
||||||
var index = await tools.td._filter(tools.td[item]._); |
|
||||||
index.forEach((i, ind) => { |
|
||||||
arr.push(conf.get('taskData')[i]); |
|
||||||
if(ind == index.length-1){ |
|
||||||
resolve(arr); |
|
||||||
} |
|
||||||
}); |
|
||||||
}); |
|
||||||
}); |
|
||||||
|
|
||||||
|
|
||||||
const getIDs = (id, data, zone) => new Promise(resolve => { |
|
||||||
var ban = ora('Searching IDs...').start(); |
|
||||||
var arr = []; |
|
||||||
data.forEach((item, index) => { |
|
||||||
if(item.id.substring(0, String(id).length) == id && tools.td[zone]._(item)){ |
|
||||||
arr.push(index); |
|
||||||
ban.info(item.id); |
|
||||||
ban = new ora('Searching IDs...').start(); |
|
||||||
} |
|
||||||
if(index == data.length-1){ |
|
||||||
ban.succeed('Search finished!! Found '+arr.length+' result!!'); |
|
||||||
resolve(arr); |
|
||||||
} |
|
||||||
}); |
|
||||||
}); |
|
||||||
|
|
||||||
const getID = async (id, data, zone) => { |
|
||||||
var arr = await getIDs(id, data, zone); |
|
||||||
if(arr.length > 1){ |
|
||||||
console.error(boxen('Which ID do you want?')); |
|
||||||
return null; |
|
||||||
} |
|
||||||
if(arr.length < 1){ |
|
||||||
console.error(boxen('No ID Found!! Please use '+'td task|todo|history|ddl ls'.blue+' to check!!')); |
|
||||||
return null; |
|
||||||
} |
|
||||||
return arr[0]; |
|
||||||
}; |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
const argv = require('yargs') |
|
||||||
.command("config", "Set todo-ddl tool confignation..", yargs => { |
|
||||||
var argv = yargs |
|
||||||
.reset() |
|
||||||
.command("show", "Show config details..", yargs2 => { |
|
||||||
var argv = yargs2 |
|
||||||
.reset() |
|
||||||
.version(false) |
|
||||||
.help("") |
|
||||||
.argv |
|
||||||
return argv; |
|
||||||
}, yargs2 => { |
|
||||||
var configInfo = new table(); |
|
||||||
configInfo.push({email: conf.get('email')},{remote: conf.get('url')}); |
|
||||||
console.log(configInfo.toString()); |
|
||||||
}) |
|
||||||
.command("reset", "Reset All config..", yargs2 => { |
|
||||||
var argv = yargs2 |
|
||||||
.reset() |
|
||||||
.version(false) |
|
||||||
.help("") |
|
||||||
.argv |
|
||||||
return argv; |
|
||||||
}, yargs2 => { |
|
||||||
conf.set('url', "https://api.yimian.xyz/todo-ddl/"); |
|
||||||
conf.set('email', ""); |
|
||||||
}) |
|
||||||
.option("e", { |
|
||||||
alias: "email", |
|
||||||
default: "", |
|
||||||
describe: "Your Email to login.", |
|
||||||
demand: false, |
|
||||||
type: 'string' |
|
||||||
}) |
|
||||||
.option("r", { |
|
||||||
alias: "remote", |
|
||||||
default: "", |
|
||||||
describe: "Remote todo-ddl server URL.", |
|
||||||
demand: false, |
|
||||||
type: 'string' |
|
||||||
}) |
|
||||||
.version(false) |
|
||||||
.argv |
|
||||||
|
|
||||||
return argv; |
|
||||||
}, yargs => { |
|
||||||
if(yargs.e == "" && yargs.r == ""){ |
|
||||||
console.error(boxen('Please use '+'td config -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
|
||||||
return; |
|
||||||
} |
|
||||||
if(yargs.e != ""){ |
|
||||||
conf.set('email', yargs.e); |
|
||||||
} |
|
||||||
if(yargs.r != ""){ |
|
||||||
conf.set('url', yargs.r); |
|
||||||
} |
|
||||||
var configInfo = new table(); |
|
||||||
configInfo.push({email: conf.get('email')},{remote: conf.get('url')}); |
|
||||||
console.log(configInfo.toString()); |
|
||||||
}) |
|
||||||
|
|
||||||
|
|
||||||
/* init */ |
|
||||||
.command("init", "Set todo-ddl tool confignation..", yargs => { |
|
||||||
var argv = yargs |
|
||||||
.reset() |
|
||||||
.version(false) |
|
||||||
.argv |
|
||||||
|
|
||||||
return argv; |
|
||||||
}, yargs => { |
|
||||||
var t = (new Date()).valueOf(); |
|
||||||
var ban = ora('Clear Data...').start(); |
|
||||||
var data = conf.get('taskData'); |
|
||||||
for(var i = 0; i < data.length; i ++){ |
|
||||||
ban.succeed(data[i].id.red); |
|
||||||
ban = new ora('Clear Data...').start(); |
|
||||||
} |
|
||||||
conf.set('taskData', []); |
|
||||||
ban.succeed(`Finished in ${(new Date()).valueOf() - t} ms!!`); |
|
||||||
}) |
|
||||||
|
|
||||||
|
|
||||||
/* ls */ |
|
||||||
.command("ls", "= td todo ls..", yargs => { |
|
||||||
var argv = yargs |
|
||||||
.reset() |
|
||||||
.version(false) |
|
||||||
.argv |
|
||||||
|
|
||||||
return argv; |
|
||||||
}, yargs => { |
|
||||||
tools.td.todo.ls.all(); |
|
||||||
}) |
|
||||||
|
|
||||||
/* lst */ |
|
||||||
.command("lst", "= td todo ls..", yargs => { |
|
||||||
var argv = yargs |
|
||||||
.reset() |
|
||||||
.version(false) |
|
||||||
.argv |
|
||||||
|
|
||||||
return argv; |
|
||||||
}, yargs => { |
|
||||||
tools.td.task.ls.all(); |
|
||||||
}) |
|
||||||
|
|
||||||
/* lsh */ |
|
||||||
.command("lsh", "= td todo ls..", yargs => { |
|
||||||
var argv = yargs |
|
||||||
.reset() |
|
||||||
.version(false) |
|
||||||
.argv |
|
||||||
|
|
||||||
return argv; |
|
||||||
}, yargs => { |
|
||||||
tools.td.history.ls.all(); |
|
||||||
}) |
|
||||||
|
|
||||||
/* lsa */ |
|
||||||
.command("lsa", "= td todo ls..", yargs => { |
|
||||||
var argv = yargs |
|
||||||
.reset() |
|
||||||
.version(false) |
|
||||||
.argv |
|
||||||
|
|
||||||
return argv; |
|
||||||
}, yargs => { |
|
||||||
tools.td.ash.ls.all(); |
|
||||||
}) |
|
||||||
|
|
||||||
/* new */ |
|
||||||
.command("new", "= td task add -n <name> -c [class]..", yargs => { |
|
||||||
var argv = yargs |
|
||||||
.reset() |
|
||||||
.version(false) |
|
||||||
.argv |
|
||||||
|
|
||||||
return argv; |
|
||||||
}, yargs => { |
|
||||||
if(yargs._.length < 2 || yargs._.length > 3){ |
|
||||||
return; |
|
||||||
} |
|
||||||
if(yargs._.length == 2){ |
|
||||||
yargs._[2] = "default"; |
|
||||||
} |
|
||||||
if(yargs._[1].length > 30){ |
|
||||||
console.error(boxen('Too Long Name!!!\nPlease shorten your task name!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
|
||||||
return; |
|
||||||
} |
|
||||||
var data = conf.get('taskData'); |
|
||||||
data.push({ |
|
||||||
id: md5((new Date()).valueOf()).substring(0, 6), |
|
||||||
name: yargs._[1], |
|
||||||
class: yargs._[2], |
|
||||||
st: (new Date()).valueOf(), |
|
||||||
tt: null, |
|
||||||
et: null, |
|
||||||
isDel: false |
|
||||||
}); |
|
||||||
conf.set('taskData', data); |
|
||||||
tools.td.task.ls.all(); |
|
||||||
}) |
|
||||||
|
|
||||||
/* add */ |
|
||||||
.command("add", "= td todo add..", yargs => { |
|
||||||
var argv = yargs |
|
||||||
.reset() |
|
||||||
.version(false) |
|
||||||
.argv |
|
||||||
|
|
||||||
return argv; |
|
||||||
}, async yargs => { |
|
||||||
if(yargs._.length != 2) { |
|
||||||
return; |
|
||||||
} |
|
||||||
var data = conf.get('taskData'); |
|
||||||
var index = await getID(yargs._[1], data, 'task'); |
|
||||||
if(index==null){ |
|
||||||
console.error(boxen('Illegal operation!!!\nPlease use '+'td todo -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
|
||||||
return; |
|
||||||
} |
|
||||||
data[index].tt = (new Date()).valueOf(); |
|
||||||
conf.set('taskData', data); |
|
||||||
tools.td.todo.ls.all(); |
|
||||||
}) |
|
||||||
|
|
||||||
|
|
||||||
/* done */ |
|
||||||
.command("done", "= td todo done..", yargs => { |
|
||||||
var argv = yargs |
|
||||||
.reset() |
|
||||||
.version(false) |
|
||||||
.argv |
|
||||||
|
|
||||||
return argv; |
|
||||||
}, async yargs => { |
|
||||||
if(yargs._.length != 2) { |
|
||||||
return; |
|
||||||
} |
|
||||||
var data = conf.get('taskData'); |
|
||||||
var index = await getID(yargs._[1], data, 'todo'); |
|
||||||
if(index==null){ |
|
||||||
console.error(boxen('Illegal operation!!!\nPlease use '+'td todo -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
|
||||||
return; |
|
||||||
} |
|
||||||
data[index].et = (new Date()).valueOf(); |
|
||||||
conf.set('taskData', data); |
|
||||||
tools.td.todo.ls.all(); |
|
||||||
}) |
|
||||||
|
|
||||||
|
|
||||||
/* return */ |
|
||||||
.command("return", "= td todo return..", yargs => { |
|
||||||
var argv = yargs |
|
||||||
.reset() |
|
||||||
.version(false) |
|
||||||
.argv |
|
||||||
|
|
||||||
return argv; |
|
||||||
}, async yargs => { |
|
||||||
if(yargs._.length != 2) { |
|
||||||
return; |
|
||||||
} |
|
||||||
var data = conf.get('taskData'); |
|
||||||
var index = await getID(yargs._[1], data, 'todo'); |
|
||||||
if(index == null) index = getID(yargs._[1], data, 'history'); |
|
||||||
if(index==null){ |
|
||||||
console.error(boxen('Illegal operation!!!\nPlease use '+'td todo -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
|
||||||
return; |
|
||||||
} |
|
||||||
data[index].tt = null; |
|
||||||
data[index].et = null; |
|
||||||
conf.set('taskData', data); |
|
||||||
tools.td.todo.ls.all(); |
|
||||||
}) |
|
||||||
|
|
||||||
|
|
||||||
/* rm */ |
|
||||||
.command("rm", "= td task del..", yargs => { |
|
||||||
var argv = yargs |
|
||||||
.reset() |
|
||||||
.version(false) |
|
||||||
.argv |
|
||||||
|
|
||||||
return argv; |
|
||||||
}, async yargs => { |
|
||||||
if(yargs._.length != 2) { |
|
||||||
return; |
|
||||||
} |
|
||||||
var data = conf.get('taskData'); |
|
||||||
var index = await getID(yargs._[1], data, 'todo'); |
|
||||||
if(index == null) index = getID(yargs._[1], data, 'task'); |
|
||||||
if(index == null) index = getID(yargs._[1], data, 'history'); |
|
||||||
if(index==null){ |
|
||||||
console.error(boxen('Illegal operation!!!\nPlease use '+'td todo -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
|
||||||
return; |
|
||||||
} |
|
||||||
data[index].isDel = true; |
|
||||||
conf.set('taskData', data); |
|
||||||
//tools.td.todo.ls.all();
|
|
||||||
}) |
|
||||||
|
|
||||||
/* tasks */ |
|
||||||
.command("task", "Add, del and change tasks..", yargs => { |
|
||||||
var argv = yargs |
|
||||||
.reset() |
|
||||||
.command("ls", "Show all tasks..", yargs2 => { |
|
||||||
var argv = yargs2 |
|
||||||
.reset() |
|
||||||
.version(false) |
|
||||||
.help("") |
|
||||||
.argv |
|
||||||
return argv; |
|
||||||
}, yargs2 => { |
|
||||||
tools.td.task.ls.all(); |
|
||||||
}) |
|
||||||
.command("add", "td task add -n <name> -c [class]".green+" Add new task..", yargs2 => { |
|
||||||
var argv = yargs2 |
|
||||||
.reset() |
|
||||||
.option("n", { |
|
||||||
alias: "name", |
|
||||||
default: "", |
|
||||||
describe: "Task name.", |
|
||||||
demand: true, |
|
||||||
type: 'string' |
|
||||||
}) |
|
||||||
.option("c", { |
|
||||||
alias: "class", |
|
||||||
default: "", |
|
||||||
describe: "Task class.", |
|
||||||
demand: false, |
|
||||||
type: 'string' |
|
||||||
}) |
|
||||||
.version(false) |
|
||||||
.help("") |
|
||||||
.argv |
|
||||||
return argv; |
|
||||||
}, yargs2 => { |
|
||||||
if(yargs2.n == "" && yargs2.c == ""){ |
|
||||||
console.error(boxen('Please use '+'td task -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
|
||||||
return; |
|
||||||
} |
|
||||||
if(yargs2.n == ""){ |
|
||||||
console.error(boxen('No Task Name!!!\nPlease use '+'td task -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
|
||||||
return; |
|
||||||
} |
|
||||||
if(yargs2.c == ""){ |
|
||||||
yargs2.c = "default"; |
|
||||||
} |
|
||||||
if(yargs2.c.length > 30){ |
|
||||||
console.error(boxen('Too Long Name!!!\nPlease shorten your task name!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
|
||||||
return; |
|
||||||
} |
|
||||||
var data = conf.get('taskData'); |
|
||||||
data.push({ |
|
||||||
id: md5((new Date()).valueOf()).substring(0, 6), |
|
||||||
name: yargs2.n, |
|
||||||
class: yargs2.c, |
|
||||||
st: (new Date()).valueOf(), |
|
||||||
tt: null, |
|
||||||
et: null, |
|
||||||
isDel: false |
|
||||||
}); |
|
||||||
conf.set('taskData', data); |
|
||||||
tools.td.task.ls.all(); |
|
||||||
}) |
|
||||||
|
|
||||||
.command("del", "td del -i <id>".green+" Delete task..", yargs2 => { |
|
||||||
var argv = yargs2 |
|
||||||
.reset() |
|
||||||
.option("i", { |
|
||||||
alias: "id", |
|
||||||
default: "", |
|
||||||
describe: "Task id.", |
|
||||||
demand: true, |
|
||||||
type: 'string' |
|
||||||
}) |
|
||||||
.version(false) |
|
||||||
.help("") |
|
||||||
.argv |
|
||||||
return argv; |
|
||||||
}, async yargs2 => { |
|
||||||
if(yargs2.i == ""){ |
|
||||||
console.error(boxen('No Task ID!!!\nPlease use '+'td task -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
|
||||||
return; |
|
||||||
} |
|
||||||
var data = conf.get('taskData'); |
|
||||||
var index = await getID(yargs2.i, data, 'task'); |
|
||||||
if(index==null){ |
|
||||||
console.error(boxen('Illegal operation!!!\nPlease use '+'td todo -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
|
||||||
return; |
|
||||||
} |
|
||||||
data[index].isDel = true; |
|
||||||
conf.set('taskData', data); |
|
||||||
tools.td.task.ls.all(); |
|
||||||
}) |
|
||||||
.version(false) |
|
||||||
.argv |
|
||||||
|
|
||||||
return argv; |
|
||||||
}, yargs => { |
|
||||||
console.error(boxen('Please use '+'td task -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
|
||||||
return; |
|
||||||
}) |
|
||||||
|
|
||||||
|
|
||||||
/* todo */ |
|
||||||
.command("todo", "Add, return and done todos..", yargs => { |
|
||||||
var argv = yargs |
|
||||||
.reset() |
|
||||||
.command("ls", "td todo ls".green+" Show all todos..", yargs2 => { |
|
||||||
var argv = yargs2 |
|
||||||
.reset() |
|
||||||
.version(false) |
|
||||||
.help("") |
|
||||||
.argv |
|
||||||
return argv; |
|
||||||
}, yargs2 => { |
|
||||||
tools.td.todo.ls.all(); |
|
||||||
}) |
|
||||||
|
|
||||||
.command("add", "td todo add -i <id>".green+" Add new todo from tasks..", yargs2 => { |
|
||||||
var argv = yargs2 |
|
||||||
.reset() |
|
||||||
.option("i", { |
|
||||||
alias: "id", |
|
||||||
default: "", |
|
||||||
describe: "Task ID.", |
|
||||||
demand: true, |
|
||||||
type: 'string' |
|
||||||
}) |
|
||||||
.version(false) |
|
||||||
.help("") |
|
||||||
.argv |
|
||||||
return argv; |
|
||||||
}, async yargs2 => { |
|
||||||
if(yargs2.i == ""){ |
|
||||||
console.error(boxen('Please use '+'td todo -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
|
||||||
return; |
|
||||||
} |
|
||||||
var data = conf.get('taskData'); |
|
||||||
var index = await getID(yargs2.i, data, 'task'); |
|
||||||
if(index==null){ |
|
||||||
console.error(boxen('Illegal operation!!!\nPlease use '+'td todo -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
|
||||||
return; |
|
||||||
} |
|
||||||
data[index].tt = (new Date()).valueOf(); |
|
||||||
conf.set('taskData', data); |
|
||||||
tools.td.todo.ls.all(); |
|
||||||
}) |
|
||||||
|
|
||||||
.command("return", "td todo return -i <id>".green+" Delete task..", yargs2 => { |
|
||||||
var argv = yargs2 |
|
||||||
.reset() |
|
||||||
.option("i", { |
|
||||||
alias: "id", |
|
||||||
default: "", |
|
||||||
describe: "Task id.", |
|
||||||
demand: true, |
|
||||||
type: 'string' |
|
||||||
}) |
|
||||||
.version(false) |
|
||||||
.help("") |
|
||||||
.argv |
|
||||||
return argv; |
|
||||||
}, async yargs2 => { |
|
||||||
if(yargs2.i == ""){ |
|
||||||
console.error(boxen('No Task ID!!!\nPlease use '+'td todo -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
|
||||||
return; |
|
||||||
} |
|
||||||
var data = conf.get('taskData'); |
|
||||||
var index = await getID(yargs2.i, data, 'todo'); |
|
||||||
if(index==null){ |
|
||||||
console.error(boxen('Illegal operation!!!\nPlease use '+'td todo -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
|
||||||
return; |
|
||||||
} |
|
||||||
data[index].tt = null; |
|
||||||
conf.set('taskData', data); |
|
||||||
tools.td.todo.ls.all(); |
|
||||||
}) |
|
||||||
|
|
||||||
|
|
||||||
.command("done", "td todo done -i <id>".green+" Delete task..", yargs2 => { |
|
||||||
var argv = yargs2 |
|
||||||
.reset() |
|
||||||
.option("i", { |
|
||||||
alias: "id", |
|
||||||
default: "", |
|
||||||
describe: "Task id.", |
|
||||||
demand: true, |
|
||||||
type: 'string' |
|
||||||
}) |
|
||||||
.version(false) |
|
||||||
.help("") |
|
||||||
.argv |
|
||||||
return argv; |
|
||||||
}, async yargs2 => { |
|
||||||
if(yargs2.i == ""){ |
|
||||||
console.error(boxen('No Task ID!!!\nPlease use '+'td task -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
|
||||||
return; |
|
||||||
} |
|
||||||
var data = conf.get('taskData'); |
|
||||||
var index = await getID(yargs2.i, data, 'todo'); |
|
||||||
if(index==null){ |
|
||||||
console.error(boxen('Illegal operation!!!\nPlease use '+'td todo -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
|
||||||
return; |
|
||||||
} |
|
||||||
data[index].et = (new Date()).valueOf(); |
|
||||||
conf.set('taskData', data); |
|
||||||
tools.td.todo.ls.all(); |
|
||||||
}) |
|
||||||
.version(false) |
|
||||||
.argv |
|
||||||
|
|
||||||
return argv; |
|
||||||
}, yargs => { |
|
||||||
console.error(boxen('Please use '+'td todo -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
|
||||||
return; |
|
||||||
}) |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* history */ |
|
||||||
.command("history", "Check history..", yargs => { |
|
||||||
var argv = yargs |
|
||||||
.reset() |
|
||||||
.command("ls", "td history ls".green+" Show all history..", yargs2 => { |
|
||||||
var argv = yargs2 |
|
||||||
.reset() |
|
||||||
.option("a", { |
|
||||||
alias: "ash", |
|
||||||
default: "", |
|
||||||
describe: "Show ash bin..", |
|
||||||
demand: false, |
|
||||||
type: 'string' |
|
||||||
}) |
|
||||||
.version(false) |
|
||||||
.help("") |
|
||||||
.argv |
|
||||||
return argv; |
|
||||||
}, yargs2 => { |
|
||||||
if(yargs2.a == ""){ |
|
||||||
tools.td.history.ls.all(); |
|
||||||
}else{ |
|
||||||
tools.td.ash.ls.all(); |
|
||||||
} |
|
||||||
}) |
|
||||||
|
|
||||||
.command("return", "td history return -i <id>".green+" Return item to tasks..", yargs2 => { |
|
||||||
var argv = yargs2 |
|
||||||
.reset() |
|
||||||
.option("i", { |
|
||||||
alias: "id", |
|
||||||
default: "", |
|
||||||
describe: "Task id.", |
|
||||||
demand: true, |
|
||||||
type: 'string' |
|
||||||
}) |
|
||||||
.version(false) |
|
||||||
.help("") |
|
||||||
.argv |
|
||||||
return argv; |
|
||||||
}, async yargs2 => { |
|
||||||
if(yargs2.i == ""){ |
|
||||||
console.error(boxen('No Task ID!!!\nPlease use '+'td history -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
|
||||||
return; |
|
||||||
} |
|
||||||
var data = conf.get('taskData'); |
|
||||||
var index = await getID(yargs2.i, data, 'history'); |
|
||||||
if(index==null){ |
|
||||||
console.error(boxen('Illegal operation!!!\nPlease use '+'td history -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
|
||||||
return; |
|
||||||
} |
|
||||||
data[index].tt = null; |
|
||||||
data[index].et = null; |
|
||||||
conf.set('taskData', data); |
|
||||||
tools.td.history.ls.all(); |
|
||||||
}) |
|
||||||
.version(false) |
|
||||||
.argv |
|
||||||
|
|
||||||
return argv; |
|
||||||
}, yargs => { |
|
||||||
console.error(boxen('Please use '+'td history -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
|
||||||
return; |
|
||||||
}) |
|
||||||
.help() |
|
||||||
.alias("h", "help") |
|
||||||
.alias("v", "version") |
|
||||||
//.recommendCommands()
|
|
||||||
.epilogue("") |
|
||||||
.argv; |
|
||||||
|
|
||||||
|
/* log */ |
||||||
|
yargs = require(__dirname + '/modules/log.js')(yargs); |
||||||
|
|
||||||
|
/* push */ |
||||||
|
yargs = require(__dirname + '/modules/sync.js')(yargs); |
||||||
|
|
||||||
|
argv = yargs.epilogue("hhh").argv; |
@ -0,0 +1,88 @@ |
|||||||
|
module.exports = (yargs) => { |
||||||
|
|
||||||
|
var o = { |
||||||
|
email: { |
||||||
|
set: s => { |
||||||
|
if(!o.email.check(s)){ |
||||||
|
return 'Illegal Email!!'; |
||||||
|
} |
||||||
|
data.config.email(s); |
||||||
|
return; |
||||||
|
}, |
||||||
|
get: () => data.config.email(), |
||||||
|
check: s => { |
||||||
|
var reg = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/; |
||||||
|
return reg.test(s); |
||||||
|
} |
||||||
|
}, |
||||||
|
remote: { |
||||||
|
set: s => { |
||||||
|
if(!o.remote.check(s)){ |
||||||
|
return 'Illegal URL!!'; |
||||||
|
} |
||||||
|
data.config.remote(s); |
||||||
|
return; |
||||||
|
}, |
||||||
|
get: () => data.config.remote(), |
||||||
|
check: s => { |
||||||
|
var reg = /./;///^((https|http|ftp|rtsp|mms):\/\/)(([0-9a-z_!~*'().&=+$%-]+: )?[0-9a-z_!~*'().&=+$%-]+@)?(([0-9]{1,3}.){3}[0-9]{1,3}|([0-9a-z_!~*'()-]+.)*([0-9a-z][0-9a-z-]{0,61})?[0-9a-z].[a-z]{2,6})(:[0-9]{1,4})?((\/?)|(\/[0-9a-z_!~*'().;?:@&=+$,%#-]+)+\/?)$/;
|
||||||
|
return reg.test(s); |
||||||
|
} |
||||||
|
}, |
||||||
|
show: () => { |
||||||
|
let configInfo = new table(); |
||||||
|
configInfo.push({email: o.email.get()},{remote: o.remote.get()}); |
||||||
|
console.log(configInfo.toString()); |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
var data = require(__dirname + '/../utilities/data.js')(); |
||||||
|
const colors = require('colors'); |
||||||
|
const boxen = require('boxen'); |
||||||
|
const table = require('cli-table'); |
||||||
|
|
||||||
|
yargs = yargs |
||||||
|
.command("config", "td config [-e email] [-r remote]".green + " Config Email or/and remote url..", yargs => { |
||||||
|
return yargs |
||||||
|
.option("e", { |
||||||
|
alias: "email", |
||||||
|
default: "", |
||||||
|
describe: "Your Email to login.", |
||||||
|
demand: false, |
||||||
|
type: 'string' |
||||||
|
}) |
||||||
|
.option("r", { |
||||||
|
alias: "remote", |
||||||
|
default: "", |
||||||
|
describe: "Remote todo-ddl server URL.", |
||||||
|
demand: false, |
||||||
|
type: 'string' |
||||||
|
}) |
||||||
|
.help() |
||||||
|
.version(false) |
||||||
|
.argv; |
||||||
|
}, argv => { |
||||||
|
if(argv.e == "" && argv.r == ""){ |
||||||
|
o.show(); |
||||||
|
console.error(boxen('Please use '+'td config -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
||||||
|
return; |
||||||
|
} |
||||||
|
if(argv.e != ""){ |
||||||
|
var m = o.email.set(argv.e); |
||||||
|
if(m){ |
||||||
|
console.error(boxen(m, {padding: 1, margin: 1, borderStyle: 'double'})); |
||||||
|
return; |
||||||
|
} |
||||||
|
} |
||||||
|
if(argv.r != ""){ |
||||||
|
var m = o.remote.set(argv.r); |
||||||
|
if(m){ |
||||||
|
console.error(boxen(m, {padding: 1, margin: 1, borderStyle: 'double'})); |
||||||
|
return; |
||||||
|
} |
||||||
|
} |
||||||
|
o.show(); |
||||||
|
}) |
||||||
|
|
||||||
|
return yargs; |
||||||
|
} |
@ -0,0 +1,7 @@ |
|||||||
|
module.exports = yargs => { |
||||||
|
yargs = yargs |
||||||
|
.help() |
||||||
|
.alias("h", "help") |
||||||
|
|
||||||
|
return yargs; |
||||||
|
} |
@ -0,0 +1,46 @@ |
|||||||
|
module.exports = yargs => { |
||||||
|
|
||||||
|
const tools = require(__dirname + '/../utilities/tdTools.js')(); |
||||||
|
const colors = require('colors'); |
||||||
|
const boxen = require('boxen'); |
||||||
|
const table = require('cli-table'); |
||||||
|
|
||||||
|
yargs = yargs |
||||||
|
|
||||||
|
.command('ll', "td ll".green + " List all logs..", yargs => yargs, argv => { |
||||||
|
let msg = tools.ll(); |
||||||
|
if(msg){ |
||||||
|
console.error(boxen(msg, {padding: 1, margin: 1, borderStyle: 'double'})); |
||||||
|
return; |
||||||
|
} |
||||||
|
}) |
||||||
|
|
||||||
|
.command('log', "td log <content>".green + " Add new log..", yargs => yargs, argv => { |
||||||
|
let msg = tools.log(argv._[1]); |
||||||
|
if(msg){ |
||||||
|
console.error(boxen(msg, {padding: 1, margin: 1, borderStyle: 'double'})); |
||||||
|
return; |
||||||
|
} |
||||||
|
}) |
||||||
|
|
||||||
|
.command('select', "td select <id>".green + " Select a task to record logs..", yargs => yargs, argv => { |
||||||
|
if(argv._.length != 2){ |
||||||
|
console.error(boxen('Please use '+'td -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
||||||
|
return; |
||||||
|
} |
||||||
|
let msg = tools.select(argv._[1]); |
||||||
|
if(msg){ |
||||||
|
console.error(boxen(msg, {padding: 1, margin: 1, borderStyle: 'double'})); |
||||||
|
return; |
||||||
|
} |
||||||
|
}) |
||||||
|
|
||||||
|
.command('rml', "td rml <logID>".green + " Remove log..", yargs => yargs, argv => { |
||||||
|
let msg = tools.rml(argv._[1]); |
||||||
|
if(msg){ |
||||||
|
console.error(boxen(msg, {padding: 1, margin: 1, borderStyle: 'double'})); |
||||||
|
return; |
||||||
|
} |
||||||
|
}) |
||||||
|
return yargs; |
||||||
|
} |
@ -0,0 +1,72 @@ |
|||||||
|
module.exports = (yargs) => { |
||||||
|
var o = { |
||||||
|
push: () => { |
||||||
|
let ban = ora(`Pushing...`).start(); |
||||||
|
request.post(data.config.remote(), { |
||||||
|
form:{ |
||||||
|
action: 'push', |
||||||
|
email: data.config.email(), |
||||||
|
data: JSON.stringify({ |
||||||
|
td: data.td(), |
||||||
|
ddl: data.ddl() |
||||||
|
}) |
||||||
|
}
|
||||||
|
}, (err, res, body) => { |
||||||
|
if(err){ |
||||||
|
ban.fail('Push data failed with errors!!'); |
||||||
|
}else{ |
||||||
|
ban.succeed('Push data to remote successfully!!'); |
||||||
|
|
||||||
|
} |
||||||
|
process.exit(); |
||||||
|
}); |
||||||
|
}, |
||||||
|
pull: (f) => { |
||||||
|
let ban = ora(`Pulling...`).start(); |
||||||
|
request.post(data.config.remote(), { |
||||||
|
form:{ |
||||||
|
action: 'pull', |
||||||
|
email: data.config.email(), |
||||||
|
data: JSON.stringify({}) |
||||||
|
}
|
||||||
|
}, (err, res, body) => { |
||||||
|
if(err){ |
||||||
|
ban.fail('Pull data failed with errors!!'); |
||||||
|
}else{ |
||||||
|
try{ |
||||||
|
body = JSON.parse(body); |
||||||
|
}catch(e){ |
||||||
|
ban.fail('Pull data failed with errors!!'); |
||||||
|
process.exit(); |
||||||
|
} |
||||||
|
let d = find.merge({td: data.td(), ddl: data.ddl()}, body); |
||||||
|
data.td(d.td); |
||||||
|
data.ddl(d.ddl); |
||||||
|
ban.succeed('Push data to remote successfully!!'); |
||||||
|
if(typeof f != "undefined") f(); |
||||||
|
} |
||||||
|
process.exit(); |
||||||
|
}); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
const request = require('request'); |
||||||
|
const ora = require('ora'); |
||||||
|
var data = require(__dirname + '/../utilities/data.js')(); |
||||||
|
var find = require(__dirname + '/../utilities/find.js')(); |
||||||
|
|
||||||
|
yargs = yargs |
||||||
|
.command('push', "td push".green + " Push local data to remote..", yargs => yargs, argv => { |
||||||
|
o.push(); |
||||||
|
}) |
||||||
|
.command('pull', "td pull".green + " Pull remote data to local..", yargs => yargs, argv => { |
||||||
|
o.pull(); |
||||||
|
}) |
||||||
|
.command('sync', "td sync".green + " Sync remote and local data..", yargs => yargs, argv => { |
||||||
|
o.pull(()=>{ |
||||||
|
o.push(); |
||||||
|
}); |
||||||
|
}) |
||||||
|
|
||||||
|
return yargs; |
||||||
|
} |
@ -0,0 +1,15 @@ |
|||||||
|
module.exports = (yargs) => { |
||||||
|
|
||||||
|
yargs = yargs |
||||||
|
.command('init', "td init".green + " Clear All Data..", yargs => yargs, argv => { |
||||||
|
data.td([]); |
||||||
|
data.ddl([]); |
||||||
|
data.log('null'); |
||||||
|
}) |
||||||
|
|
||||||
|
var data = require(__dirname + '/../utilities/data.js')(); |
||||||
|
const colors = require('colors'); |
||||||
|
const boxen = require('boxen'); |
||||||
|
|
||||||
|
return yargs; |
||||||
|
} |
@ -0,0 +1,100 @@ |
|||||||
|
module.exports = yargs => { |
||||||
|
|
||||||
|
const tools = require(__dirname + '/../utilities/tdTools.js')(); |
||||||
|
const colors = require('colors'); |
||||||
|
const boxen = require('boxen'); |
||||||
|
const table = require('cli-table'); |
||||||
|
|
||||||
|
yargs = yargs |
||||||
|
.command('lt', "td lt".green + " List all todos..", yargs => yargs, argv => { |
||||||
|
tools.__.show(tools.todo.getAll()); |
||||||
|
}) |
||||||
|
|
||||||
|
.command('ls', "td ls".green + " List all tasks..", yargs => yargs, argv => { |
||||||
|
tools.__.show(tools.task.getAll()); |
||||||
|
}) |
||||||
|
|
||||||
|
.command('history', "td history".green + " List all history..", yargs => yargs, argv => { |
||||||
|
tools.__.show(tools.history.getAll()); |
||||||
|
}) |
||||||
|
|
||||||
|
.command('new', "td new <name> [class]".green + " Create new todo..", yargs => yargs, argv => { |
||||||
|
if(argv._.length < 2 || argv._.length > 3){ |
||||||
|
console.error(boxen('Please use '+'td -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
||||||
|
return; |
||||||
|
} |
||||||
|
let msg = tools.new(argv._[1], (argv._.length == 2)?null:argv._[2]); |
||||||
|
if(msg){ |
||||||
|
console.error(boxen(msg, {padding: 1, margin: 1, borderStyle: 'double'})); |
||||||
|
return; |
||||||
|
} |
||||||
|
tools.__.show(tools.todo.getAll()); |
||||||
|
}) |
||||||
|
|
||||||
|
.command('add', "td add <id>".green + " Add todo to task..", yargs => yargs, argv => { |
||||||
|
if(argv._.length != 2){ |
||||||
|
console.error(boxen('Please use '+'td -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
||||||
|
return; |
||||||
|
} |
||||||
|
let msg = tools.add(argv._[1]); |
||||||
|
if(msg){ |
||||||
|
console.error(boxen(msg, {padding: 1, margin: 1, borderStyle: 'double'})); |
||||||
|
return; |
||||||
|
} |
||||||
|
tools.__.show(tools.task.getAll()); |
||||||
|
}) |
||||||
|
|
||||||
|
.command('done', "td done <id>".green + " Finish task..", yargs => yargs, argv => { |
||||||
|
if(argv._.length != 2){ |
||||||
|
console.error(boxen('Please use '+'td -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
||||||
|
return; |
||||||
|
} |
||||||
|
let msg = tools.done(argv._[1]); |
||||||
|
if(msg){ |
||||||
|
console.error(boxen(msg, {padding: 1, margin: 1, borderStyle: 'double'})); |
||||||
|
return; |
||||||
|
} |
||||||
|
tools.__.show(tools.task.getAll()); |
||||||
|
}) |
||||||
|
|
||||||
|
.command('rm', "td rm <id>".green + " Remove task..", yargs => yargs, argv => { |
||||||
|
if(argv._.length != 2){ |
||||||
|
console.error(boxen('Please use '+'td -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
||||||
|
return; |
||||||
|
} |
||||||
|
let msg = tools.rm(argv._[1]); |
||||||
|
if(msg){ |
||||||
|
console.error(boxen(msg, {padding: 1, margin: 1, borderStyle: 'double'})); |
||||||
|
return; |
||||||
|
} |
||||||
|
console.log(argv._[1]); |
||||||
|
}) |
||||||
|
|
||||||
|
.command('return', "td return <id>".green + " Return task to todo..", yargs => yargs, argv => { |
||||||
|
if(argv._.length != 2){ |
||||||
|
console.error(boxen('Please use '+'td -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
||||||
|
return; |
||||||
|
} |
||||||
|
let msg = tools.return(argv._[1]); |
||||||
|
if(msg){ |
||||||
|
console.error(boxen(msg, {padding: 1, margin: 1, borderStyle: 'double'})); |
||||||
|
return; |
||||||
|
} |
||||||
|
tools.__.show(tools.task.getAll()); |
||||||
|
}) |
||||||
|
|
||||||
|
.command('recover', "td recover <id>".green + " Recover from history to task..", yargs => yargs, argv => { |
||||||
|
if(argv._.length != 2){ |
||||||
|
console.error(boxen('Please use '+'td -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
||||||
|
return; |
||||||
|
} |
||||||
|
let msg = tools.recover(argv._[1]); |
||||||
|
if(msg){ |
||||||
|
console.error(boxen(msg, {padding: 1, margin: 1, borderStyle: 'double'})); |
||||||
|
return; |
||||||
|
} |
||||||
|
tools.__.show(tools.task.getAll()); |
||||||
|
}) |
||||||
|
|
||||||
|
return yargs; |
||||||
|
} |
@ -0,0 +1,6 @@ |
|||||||
|
module.exports = yargs => { |
||||||
|
yargs = yargs |
||||||
|
.alias("v", "version") |
||||||
|
|
||||||
|
return yargs; |
||||||
|
} |
@ -0,0 +1,700 @@ |
|||||||
|
#!/usr/bin/env node
|
||||||
|
const request = require('request'); |
||||||
|
require('shelljs/global'); |
||||||
|
const ora = require('ora'); |
||||||
|
const boxen = require('boxen'); |
||||||
|
const table = require('cli-table'); |
||||||
|
const colors = require('colors'); |
||||||
|
const fs = require('fs'); |
||||||
|
const md5 = require('md5'); |
||||||
|
|
||||||
|
const conf = new (require('conf'))({ |
||||||
|
email: { |
||||||
|
type: "string", |
||||||
|
format: "email" |
||||||
|
}, |
||||||
|
url: { |
||||||
|
type: "string", |
||||||
|
format: "url", |
||||||
|
default: "https://api.yimian.xyz/todo-ddl/" |
||||||
|
}, |
||||||
|
taskData: { |
||||||
|
type: "array", |
||||||
|
default: [] |
||||||
|
}, |
||||||
|
ddlData: { |
||||||
|
type: "array", |
||||||
|
default: [] |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
if(conf.get('url') == undefined) conf.set('url', "https://api.yimian.xyz/todo-ddl/"); |
||||||
|
if(conf.get('email') == undefined) conf.set('email', ""); |
||||||
|
if(conf.get('taskData') == undefined) conf.set('taskData', []); |
||||||
|
if(conf.get('ddlData') == undefined) conf.set('ddlData', []); |
||||||
|
|
||||||
|
|
||||||
|
const tds = ['todo', 'task', 'history', 'ash']; |
||||||
|
|
||||||
|
var tools = { |
||||||
|
_parseTime: t => { |
||||||
|
var st = new Date(t); |
||||||
|
return `${st.getFullYear()}-${st.getMonth()+1}-${st.getDate()} ${st.getHours()}:${st.getMinutes()}:${st.getSeconds()}`; |
||||||
|
}, |
||||||
|
_showInfo: (arr, head, value) => { |
||||||
|
var info = new table({ |
||||||
|
'head': head |
||||||
|
}); |
||||||
|
arr.forEach((i, index) => { |
||||||
|
var item = conf.get('taskData')[i]; |
||||||
|
info.push(value(item)); |
||||||
|
if(index == arr.length-1){ |
||||||
|
console.log(info.toString()); |
||||||
|
} |
||||||
|
}); |
||||||
|
}, |
||||||
|
td: { |
||||||
|
_filter: condition => new Promise(resolve => { |
||||||
|
var arr = []; |
||||||
|
conf.get('taskData').forEach((item, index) => { |
||||||
|
if(condition(item)){ |
||||||
|
arr.push(index); |
||||||
|
} |
||||||
|
if(index == conf.get('taskData').length-1){ |
||||||
|
resolve(arr); |
||||||
|
} |
||||||
|
}); |
||||||
|
}), |
||||||
|
task: { |
||||||
|
_: item => (!item.isDel && item.tt == null), |
||||||
|
_head: ['id', 'class', 'name', 'Create Time'], |
||||||
|
_value: item => [item.id, item.class, item.name, tools._parseTime(item.st)], |
||||||
|
ls: {} |
||||||
|
}, |
||||||
|
todo: { |
||||||
|
_: item => !item.isDel && item.tt != null && item.et == null, |
||||||
|
_head: ['id', 'class', 'name', 'Create Time', 'Start Time'], |
||||||
|
_value: item => [item.id, item.class, item.name, tools._parseTime(item.st), tools._parseTime(item.tt)], |
||||||
|
ls: {} |
||||||
|
}, |
||||||
|
history: { |
||||||
|
_: item => !item.isDel && item.tt != null && item.et != null, |
||||||
|
_head: ['id', 'class', 'name', 'Create Time', 'Start Time', 'Finish Time'], |
||||||
|
_value: item => [item.id, item.class, item.name, tools._parseTime(item.st), tools._parseTime(item.tt), tools._parseTime(item.et)], |
||||||
|
ls: {} |
||||||
|
}, |
||||||
|
ash: { |
||||||
|
_: item => item.isDel, |
||||||
|
_head: ['id', 'class', 'name', 'Create Time', 'Start Time', 'Finish Time'], |
||||||
|
_value: item => [item.id, item.class, item.name, tools._parseTime(item.st), tools._parseTime(item.tt), tools._parseTime(item.et)], |
||||||
|
ls: {} |
||||||
|
} |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
tds.forEach(item => { |
||||||
|
tools.td[item].ls.all = async () => { |
||||||
|
tools._showInfo(await tools.td._filter(tools.td[item]._), tools.td[item]._head, tools.td[item]._value); |
||||||
|
}; |
||||||
|
tools.td[item].__ = async () => new Promise(async resolve => { |
||||||
|
var arr = []; |
||||||
|
var index = await tools.td._filter(tools.td[item]._); |
||||||
|
index.forEach((i, ind) => { |
||||||
|
arr.push(conf.get('taskData')[i]); |
||||||
|
if(ind == index.length-1){ |
||||||
|
resolve(arr); |
||||||
|
} |
||||||
|
}); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
|
||||||
|
const getIDs = (id, data, zone) => new Promise(resolve => { |
||||||
|
var ban = ora('Searching IDs...').start(); |
||||||
|
var arr = []; |
||||||
|
data.forEach((item, index) => { |
||||||
|
if(item.id.substring(0, String(id).length) == id && tools.td[zone]._(item)){ |
||||||
|
arr.push(index); |
||||||
|
ban.info(item.id); |
||||||
|
ban = new ora('Searching IDs...').start(); |
||||||
|
} |
||||||
|
if(index == data.length-1){ |
||||||
|
ban.succeed('Search finished!! Found '+arr.length+' result!!'); |
||||||
|
resolve(arr); |
||||||
|
} |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
const getID = async (id, data, zone) => { |
||||||
|
var arr = await getIDs(id, data, zone); |
||||||
|
if(arr.length > 1){ |
||||||
|
console.error(boxen('Which ID do you want?')); |
||||||
|
return null; |
||||||
|
} |
||||||
|
if(arr.length < 1){ |
||||||
|
console.error(boxen('No ID Found!! Please use '+'td task|todo|history|ddl ls'.blue+' to check!!')); |
||||||
|
return null; |
||||||
|
} |
||||||
|
return arr[0]; |
||||||
|
}; |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
const argv = require('yargs') |
||||||
|
.command("config", "Set todo-ddl tool confignation..", yargs => { |
||||||
|
var argv = yargs |
||||||
|
.reset() |
||||||
|
.command("show", "Show config details..", yargs2 => { |
||||||
|
var argv = yargs2 |
||||||
|
.reset() |
||||||
|
.version(false) |
||||||
|
.help("") |
||||||
|
.argv |
||||||
|
return argv; |
||||||
|
}, yargs2 => { |
||||||
|
var configInfo = new table(); |
||||||
|
configInfo.push({email: conf.get('email')},{remote: conf.get('url')}); |
||||||
|
console.log(configInfo.toString()); |
||||||
|
}) |
||||||
|
.command("reset", "Reset All config..", yargs2 => { |
||||||
|
var argv = yargs2 |
||||||
|
.reset() |
||||||
|
.version(false) |
||||||
|
.help("") |
||||||
|
.argv |
||||||
|
return argv; |
||||||
|
}, yargs2 => { |
||||||
|
conf.set('url', "https://api.yimian.xyz/todo-ddl/"); |
||||||
|
conf.set('email', ""); |
||||||
|
}) |
||||||
|
.option("e", { |
||||||
|
alias: "email", |
||||||
|
default: "", |
||||||
|
describe: "Your Email to login.", |
||||||
|
demand: false, |
||||||
|
type: 'string' |
||||||
|
}) |
||||||
|
.option("r", { |
||||||
|
alias: "remote", |
||||||
|
default: "", |
||||||
|
describe: "Remote todo-ddl server URL.", |
||||||
|
demand: false, |
||||||
|
type: 'string' |
||||||
|
}) |
||||||
|
.version(false) |
||||||
|
.argv |
||||||
|
|
||||||
|
return argv; |
||||||
|
}, yargs => { |
||||||
|
if(yargs.e == "" && yargs.r == ""){ |
||||||
|
console.error(boxen('Please use '+'td config -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
||||||
|
return; |
||||||
|
} |
||||||
|
if(yargs.e != ""){ |
||||||
|
conf.set('email', yargs.e); |
||||||
|
} |
||||||
|
if(yargs.r != ""){ |
||||||
|
conf.set('url', yargs.r); |
||||||
|
} |
||||||
|
var configInfo = new table(); |
||||||
|
configInfo.push({email: conf.get('email')},{remote: conf.get('url')}); |
||||||
|
console.log(configInfo.toString()); |
||||||
|
}) |
||||||
|
|
||||||
|
|
||||||
|
/* init */ |
||||||
|
.command("init", "Set todo-ddl tool confignation..", yargs => { |
||||||
|
var argv = yargs |
||||||
|
.reset() |
||||||
|
.version(false) |
||||||
|
.argv |
||||||
|
|
||||||
|
return argv; |
||||||
|
}, yargs => { |
||||||
|
var t = (new Date()).valueOf(); |
||||||
|
var ban = ora('Clear Data...').start(); |
||||||
|
var data = conf.get('taskData'); |
||||||
|
for(var i = 0; i < data.length; i ++){ |
||||||
|
ban.succeed(data[i].id.red); |
||||||
|
ban = new ora('Clear Data...').start(); |
||||||
|
} |
||||||
|
conf.set('taskData', []); |
||||||
|
ban.succeed(`Finished in ${(new Date()).valueOf() - t} ms!!`); |
||||||
|
}) |
||||||
|
|
||||||
|
|
||||||
|
/* ls */ |
||||||
|
.command("ls", "= td todo ls..", yargs => { |
||||||
|
var argv = yargs |
||||||
|
.reset() |
||||||
|
.version(false) |
||||||
|
.argv |
||||||
|
|
||||||
|
return argv; |
||||||
|
}, yargs => { |
||||||
|
tools.td.todo.ls.all(); |
||||||
|
}) |
||||||
|
|
||||||
|
/* lst */ |
||||||
|
.command("lst", "= td todo ls..", yargs => { |
||||||
|
var argv = yargs |
||||||
|
.reset() |
||||||
|
.version(false) |
||||||
|
.argv |
||||||
|
|
||||||
|
return argv; |
||||||
|
}, yargs => { |
||||||
|
tools.td.task.ls.all(); |
||||||
|
}) |
||||||
|
|
||||||
|
/* lsh */ |
||||||
|
.command("lsh", "= td todo ls..", yargs => { |
||||||
|
var argv = yargs |
||||||
|
.reset() |
||||||
|
.version(false) |
||||||
|
.argv |
||||||
|
|
||||||
|
return argv; |
||||||
|
}, yargs => { |
||||||
|
tools.td.history.ls.all(); |
||||||
|
}) |
||||||
|
|
||||||
|
/* lsa */ |
||||||
|
.command("lsa", "= td todo ls..", yargs => { |
||||||
|
var argv = yargs |
||||||
|
.reset() |
||||||
|
.version(false) |
||||||
|
.argv |
||||||
|
|
||||||
|
return argv; |
||||||
|
}, yargs => { |
||||||
|
tools.td.ash.ls.all(); |
||||||
|
}) |
||||||
|
|
||||||
|
/* new */ |
||||||
|
.command("new", "= td task add -n <name> -c [class]..", yargs => { |
||||||
|
var argv = yargs |
||||||
|
.reset() |
||||||
|
.version(false) |
||||||
|
.argv |
||||||
|
|
||||||
|
return argv; |
||||||
|
}, yargs => { |
||||||
|
if(yargs._.length < 2 || yargs._.length > 3){ |
||||||
|
return; |
||||||
|
} |
||||||
|
if(yargs._.length == 2){ |
||||||
|
yargs._[2] = "default"; |
||||||
|
} |
||||||
|
if(yargs._[1].length > 30){ |
||||||
|
console.error(boxen('Too Long Name!!!\nPlease shorten your task name!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
||||||
|
return; |
||||||
|
} |
||||||
|
var data = conf.get('taskData'); |
||||||
|
data.push({ |
||||||
|
id: md5((new Date()).valueOf()).substring(0, 6), |
||||||
|
name: yargs._[1], |
||||||
|
class: yargs._[2], |
||||||
|
st: (new Date()).valueOf(), |
||||||
|
tt: null, |
||||||
|
et: null, |
||||||
|
isDel: false |
||||||
|
}); |
||||||
|
conf.set('taskData', data); |
||||||
|
tools.td.task.ls.all(); |
||||||
|
}) |
||||||
|
|
||||||
|
/* add */ |
||||||
|
.command("add", "= td todo add..", yargs => { |
||||||
|
var argv = yargs |
||||||
|
.reset() |
||||||
|
.version(false) |
||||||
|
.argv |
||||||
|
|
||||||
|
return argv; |
||||||
|
}, async yargs => { |
||||||
|
if(yargs._.length != 2) { |
||||||
|
return; |
||||||
|
} |
||||||
|
var data = conf.get('taskData'); |
||||||
|
var index = await getID(yargs._[1], data, 'task'); |
||||||
|
if(index==null){ |
||||||
|
console.error(boxen('Illegal operation!!!\nPlease use '+'td todo -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
||||||
|
return; |
||||||
|
} |
||||||
|
data[index].tt = (new Date()).valueOf(); |
||||||
|
conf.set('taskData', data); |
||||||
|
tools.td.todo.ls.all(); |
||||||
|
}) |
||||||
|
|
||||||
|
|
||||||
|
/* done */ |
||||||
|
.command("done", "= td todo done..", yargs => { |
||||||
|
var argv = yargs |
||||||
|
.reset() |
||||||
|
.version(false) |
||||||
|
.argv |
||||||
|
|
||||||
|
return argv; |
||||||
|
}, async yargs => { |
||||||
|
if(yargs._.length != 2) { |
||||||
|
return; |
||||||
|
} |
||||||
|
var data = conf.get('taskData'); |
||||||
|
var index = await getID(yargs._[1], data, 'todo'); |
||||||
|
if(index==null){ |
||||||
|
console.error(boxen('Illegal operation!!!\nPlease use '+'td todo -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
||||||
|
return; |
||||||
|
} |
||||||
|
data[index].et = (new Date()).valueOf(); |
||||||
|
conf.set('taskData', data); |
||||||
|
tools.td.todo.ls.all(); |
||||||
|
}) |
||||||
|
|
||||||
|
|
||||||
|
/* return */ |
||||||
|
.command("return", "= td todo return..", yargs => { |
||||||
|
var argv = yargs |
||||||
|
.reset() |
||||||
|
.version(false) |
||||||
|
.argv |
||||||
|
|
||||||
|
return argv; |
||||||
|
}, async yargs => { |
||||||
|
if(yargs._.length != 2) { |
||||||
|
return; |
||||||
|
} |
||||||
|
var data = conf.get('taskData'); |
||||||
|
var index = await getID(yargs._[1], data, 'todo'); |
||||||
|
if(index == null) index = getID(yargs._[1], data, 'history'); |
||||||
|
if(index==null){ |
||||||
|
console.error(boxen('Illegal operation!!!\nPlease use '+'td todo -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
||||||
|
return; |
||||||
|
} |
||||||
|
data[index].tt = null; |
||||||
|
data[index].et = null; |
||||||
|
conf.set('taskData', data); |
||||||
|
tools.td.todo.ls.all(); |
||||||
|
}) |
||||||
|
|
||||||
|
|
||||||
|
/* rm */ |
||||||
|
.command("rm", "= td task del..", yargs => { |
||||||
|
var argv = yargs |
||||||
|
.reset() |
||||||
|
.version(false) |
||||||
|
.argv |
||||||
|
|
||||||
|
return argv; |
||||||
|
}, async yargs => { |
||||||
|
if(yargs._.length != 2) { |
||||||
|
return; |
||||||
|
} |
||||||
|
var data = conf.get('taskData'); |
||||||
|
var index = await getID(yargs._[1], data, 'todo'); |
||||||
|
if(index == null) index = getID(yargs._[1], data, 'task'); |
||||||
|
if(index == null) index = getID(yargs._[1], data, 'history'); |
||||||
|
if(index==null){ |
||||||
|
console.error(boxen('Illegal operation!!!\nPlease use '+'td todo -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
||||||
|
return; |
||||||
|
} |
||||||
|
data[index].isDel = true; |
||||||
|
conf.set('taskData', data); |
||||||
|
//tools.td.todo.ls.all();
|
||||||
|
}) |
||||||
|
|
||||||
|
/* tasks */ |
||||||
|
.command("task", "Add, del and change tasks..", yargs => { |
||||||
|
var argv = yargs |
||||||
|
.reset() |
||||||
|
.command("ls", "Show all tasks..", yargs2 => { |
||||||
|
var argv = yargs2 |
||||||
|
.reset() |
||||||
|
.version(false) |
||||||
|
.help("") |
||||||
|
.argv |
||||||
|
return argv; |
||||||
|
}, yargs2 => { |
||||||
|
tools.td.task.ls.all(); |
||||||
|
}) |
||||||
|
.command("add", "td task add -n <name> -c [class]".green+" Add new task..", yargs2 => { |
||||||
|
var argv = yargs2 |
||||||
|
.reset() |
||||||
|
.option("n", { |
||||||
|
alias: "name", |
||||||
|
default: "", |
||||||
|
describe: "Task name.", |
||||||
|
demand: true, |
||||||
|
type: 'string' |
||||||
|
}) |
||||||
|
.option("c", { |
||||||
|
alias: "class", |
||||||
|
default: "", |
||||||
|
describe: "Task class.", |
||||||
|
demand: false, |
||||||
|
type: 'string' |
||||||
|
}) |
||||||
|
.version(false) |
||||||
|
.help("") |
||||||
|
.argv |
||||||
|
return argv; |
||||||
|
}, yargs2 => { |
||||||
|
if(yargs2.n == "" && yargs2.c == ""){ |
||||||
|
console.error(boxen('Please use '+'td task -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
||||||
|
return; |
||||||
|
} |
||||||
|
if(yargs2.n == ""){ |
||||||
|
console.error(boxen('No Task Name!!!\nPlease use '+'td task -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
||||||
|
return; |
||||||
|
} |
||||||
|
if(yargs2.c == ""){ |
||||||
|
yargs2.c = "default"; |
||||||
|
} |
||||||
|
if(yargs2.c.length > 30){ |
||||||
|
console.error(boxen('Too Long Name!!!\nPlease shorten your task name!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
||||||
|
return; |
||||||
|
} |
||||||
|
var data = conf.get('taskData'); |
||||||
|
data.push({ |
||||||
|
id: md5((new Date()).valueOf()).substring(0, 6), |
||||||
|
name: yargs2.n, |
||||||
|
class: yargs2.c, |
||||||
|
st: (new Date()).valueOf(), |
||||||
|
tt: null, |
||||||
|
et: null, |
||||||
|
isDel: false |
||||||
|
}); |
||||||
|
conf.set('taskData', data); |
||||||
|
tools.td.task.ls.all(); |
||||||
|
}) |
||||||
|
|
||||||
|
.command("del", "td del -i <id>".green+" Delete task..", yargs2 => { |
||||||
|
var argv = yargs2 |
||||||
|
.reset() |
||||||
|
.option("i", { |
||||||
|
alias: "id", |
||||||
|
default: "", |
||||||
|
describe: "Task id.", |
||||||
|
demand: true, |
||||||
|
type: 'string' |
||||||
|
}) |
||||||
|
.version(false) |
||||||
|
.help("") |
||||||
|
.argv |
||||||
|
return argv; |
||||||
|
}, async yargs2 => { |
||||||
|
if(yargs2.i == ""){ |
||||||
|
console.error(boxen('No Task ID!!!\nPlease use '+'td task -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
||||||
|
return; |
||||||
|
} |
||||||
|
var data = conf.get('taskData'); |
||||||
|
var index = await getID(yargs2.i, data, 'task'); |
||||||
|
if(index==null){ |
||||||
|
console.error(boxen('Illegal operation!!!\nPlease use '+'td todo -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
||||||
|
return; |
||||||
|
} |
||||||
|
data[index].isDel = true; |
||||||
|
conf.set('taskData', data); |
||||||
|
tools.td.task.ls.all(); |
||||||
|
}) |
||||||
|
.version(false) |
||||||
|
.argv |
||||||
|
|
||||||
|
return argv; |
||||||
|
}, yargs => { |
||||||
|
console.error(boxen('Please use '+'td task -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
||||||
|
return; |
||||||
|
}) |
||||||
|
|
||||||
|
|
||||||
|
/* todo */ |
||||||
|
.command("todo", "Add, return and done todos..", yargs => { |
||||||
|
var argv = yargs |
||||||
|
.reset() |
||||||
|
.command("ls", "td todo ls".green+" Show all todos..", yargs2 => { |
||||||
|
var argv = yargs2 |
||||||
|
.reset() |
||||||
|
.version(false) |
||||||
|
.help("") |
||||||
|
.argv |
||||||
|
return argv; |
||||||
|
}, yargs2 => { |
||||||
|
tools.td.todo.ls.all(); |
||||||
|
}) |
||||||
|
|
||||||
|
.command("add", "td todo add -i <id>".green+" Add new todo from tasks..", yargs2 => { |
||||||
|
var argv = yargs2 |
||||||
|
.reset() |
||||||
|
.option("i", { |
||||||
|
alias: "id", |
||||||
|
default: "", |
||||||
|
describe: "Task ID.", |
||||||
|
demand: true, |
||||||
|
type: 'string' |
||||||
|
}) |
||||||
|
.version(false) |
||||||
|
.help("") |
||||||
|
.argv |
||||||
|
return argv; |
||||||
|
}, async yargs2 => { |
||||||
|
if(yargs2.i == ""){ |
||||||
|
console.error(boxen('Please use '+'td todo -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
||||||
|
return; |
||||||
|
} |
||||||
|
var data = conf.get('taskData'); |
||||||
|
var index = await getID(yargs2.i, data, 'task'); |
||||||
|
if(index==null){ |
||||||
|
console.error(boxen('Illegal operation!!!\nPlease use '+'td todo -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
||||||
|
return; |
||||||
|
} |
||||||
|
data[index].tt = (new Date()).valueOf(); |
||||||
|
conf.set('taskData', data); |
||||||
|
tools.td.todo.ls.all(); |
||||||
|
}) |
||||||
|
|
||||||
|
.command("return", "td todo return -i <id>".green+" Delete task..", yargs2 => { |
||||||
|
var argv = yargs2 |
||||||
|
.reset() |
||||||
|
.option("i", { |
||||||
|
alias: "id", |
||||||
|
default: "", |
||||||
|
describe: "Task id.", |
||||||
|
demand: true, |
||||||
|
type: 'string' |
||||||
|
}) |
||||||
|
.version(false) |
||||||
|
.help("") |
||||||
|
.argv |
||||||
|
return argv; |
||||||
|
}, async yargs2 => { |
||||||
|
if(yargs2.i == ""){ |
||||||
|
console.error(boxen('No Task ID!!!\nPlease use '+'td todo -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
||||||
|
return; |
||||||
|
} |
||||||
|
var data = conf.get('taskData'); |
||||||
|
var index = await getID(yargs2.i, data, 'todo'); |
||||||
|
if(index==null){ |
||||||
|
console.error(boxen('Illegal operation!!!\nPlease use '+'td todo -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
||||||
|
return; |
||||||
|
} |
||||||
|
data[index].tt = null; |
||||||
|
conf.set('taskData', data); |
||||||
|
tools.td.todo.ls.all(); |
||||||
|
}) |
||||||
|
|
||||||
|
|
||||||
|
.command("done", "td todo done -i <id>".green+" Delete task..", yargs2 => { |
||||||
|
var argv = yargs2 |
||||||
|
.reset() |
||||||
|
.option("i", { |
||||||
|
alias: "id", |
||||||
|
default: "", |
||||||
|
describe: "Task id.", |
||||||
|
demand: true, |
||||||
|
type: 'string' |
||||||
|
}) |
||||||
|
.version(false) |
||||||
|
.help("") |
||||||
|
.argv |
||||||
|
return argv; |
||||||
|
}, async yargs2 => { |
||||||
|
if(yargs2.i == ""){ |
||||||
|
console.error(boxen('No Task ID!!!\nPlease use '+'td task -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
||||||
|
return; |
||||||
|
} |
||||||
|
var data = conf.get('taskData'); |
||||||
|
var index = await getID(yargs2.i, data, 'todo'); |
||||||
|
if(index==null){ |
||||||
|
console.error(boxen('Illegal operation!!!\nPlease use '+'td todo -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
||||||
|
return; |
||||||
|
} |
||||||
|
data[index].et = (new Date()).valueOf(); |
||||||
|
conf.set('taskData', data); |
||||||
|
tools.td.todo.ls.all(); |
||||||
|
}) |
||||||
|
.version(false) |
||||||
|
.argv |
||||||
|
|
||||||
|
return argv; |
||||||
|
}, yargs => { |
||||||
|
console.error(boxen('Please use '+'td todo -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
||||||
|
return; |
||||||
|
}) |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* history */ |
||||||
|
.command("history", "Check history..", yargs => { |
||||||
|
var argv = yargs |
||||||
|
.reset() |
||||||
|
.command("ls", "td history ls".green+" Show all history..", yargs2 => { |
||||||
|
var argv = yargs2 |
||||||
|
.reset() |
||||||
|
.option("a", { |
||||||
|
alias: "ash", |
||||||
|
default: "", |
||||||
|
describe: "Show ash bin..", |
||||||
|
demand: false, |
||||||
|
type: 'string' |
||||||
|
}) |
||||||
|
.version(false) |
||||||
|
.help("") |
||||||
|
.argv |
||||||
|
return argv; |
||||||
|
}, yargs2 => { |
||||||
|
if(yargs2.a == ""){ |
||||||
|
tools.td.history.ls.all(); |
||||||
|
}else{ |
||||||
|
tools.td.ash.ls.all(); |
||||||
|
} |
||||||
|
}) |
||||||
|
|
||||||
|
.command("return", "td history return -i <id>".green+" Return item to tasks..", yargs2 => { |
||||||
|
var argv = yargs2 |
||||||
|
.reset() |
||||||
|
.option("i", { |
||||||
|
alias: "id", |
||||||
|
default: "", |
||||||
|
describe: "Task id.", |
||||||
|
demand: true, |
||||||
|
type: 'string' |
||||||
|
}) |
||||||
|
.version(false) |
||||||
|
.help("") |
||||||
|
.argv |
||||||
|
return argv; |
||||||
|
}, async yargs2 => { |
||||||
|
if(yargs2.i == ""){ |
||||||
|
console.error(boxen('No Task ID!!!\nPlease use '+'td history -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
||||||
|
return; |
||||||
|
} |
||||||
|
var data = conf.get('taskData'); |
||||||
|
var index = await getID(yargs2.i, data, 'history'); |
||||||
|
if(index==null){ |
||||||
|
console.error(boxen('Illegal operation!!!\nPlease use '+'td history -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
||||||
|
return; |
||||||
|
} |
||||||
|
data[index].tt = null; |
||||||
|
data[index].et = null; |
||||||
|
conf.set('taskData', data); |
||||||
|
tools.td.history.ls.all(); |
||||||
|
}) |
||||||
|
.version(false) |
||||||
|
.argv |
||||||
|
|
||||||
|
return argv; |
||||||
|
}, yargs => { |
||||||
|
console.error(boxen('Please use '+'td history -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
||||||
|
return; |
||||||
|
}) |
||||||
|
.help() |
||||||
|
.alias("h", "help") |
||||||
|
.alias("v", "version") |
||||||
|
//.recommendCommands()
|
||||||
|
.epilogue("") |
||||||
|
.argv; |
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,35 @@ |
|||||||
|
const app = require('express')(); |
||||||
|
const fs = require('fs'); |
||||||
|
const bodyParser = require('body-parser'); |
||||||
|
|
||||||
|
const find = require(__dirname + '/utilities/find.js')(); |
||||||
|
|
||||||
|
app.use(bodyParser.urlencoded({ extended: false })); |
||||||
|
|
||||||
|
var data = JSON.parse(fs.readFileSync(__dirname + '/var/data.json')); |
||||||
|
|
||||||
|
app.listen(13233 /*default port*/, () => console.log('todo-ddl listening on port 13233!')); |
||||||
|
|
||||||
|
app.post('/', (req, res) => { |
||||||
|
let query = req.body; |
||||||
|
query.data = JSON.parse(query.data); |
||||||
|
if(!query.action || !query.email || !query.data){ |
||||||
|
return; |
||||||
|
} |
||||||
|
if(query.action == 'push'){ |
||||||
|
if(data.hasOwnProperty(query.email)){ |
||||||
|
data[query.email] = find.merge(data[query.email], query.data); |
||||||
|
}else{ |
||||||
|
data[query.email] = query.data; |
||||||
|
} |
||||||
|
fs.writeFile(__dirname + '/var/data.json', JSON.stringify(data), ()=>{}); |
||||||
|
res.send('ok'); |
||||||
|
} |
||||||
|
if(query.action == 'pull'){ |
||||||
|
if(data.hasOwnProperty(query.email)){ |
||||||
|
res.send(data[query.email]); |
||||||
|
}else{ |
||||||
|
res.status(404).send(''); |
||||||
|
} |
||||||
|
} |
||||||
|
}); |
@ -0,0 +1,60 @@ |
|||||||
|
module.exports = () => { |
||||||
|
|
||||||
|
var o = { |
||||||
|
__: (c, w, s) => { |
||||||
|
var data = conf.get(c); |
||||||
|
if(typeof s != "undefined"){ |
||||||
|
data[w] = s; |
||||||
|
conf.set(c, data); |
||||||
|
} |
||||||
|
return data[w]; |
||||||
|
}, |
||||||
|
//config
|
||||||
|
config: { |
||||||
|
email: s => o.__('config', 'email', s), |
||||||
|
remote: s => o.__('config', 'remote', s) |
||||||
|
}, |
||||||
|
//data
|
||||||
|
td: s => o.__('data', 'td', s), |
||||||
|
ddl: s => o.__('data', 'ddl', s), |
||||||
|
log: s => { |
||||||
|
if(typeof s != "undefined"){ |
||||||
|
conf.set('log', s); |
||||||
|
} |
||||||
|
return conf.get('log'); |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
const conf = new (require('conf'))({ |
||||||
|
config: { |
||||||
|
type: "object", |
||||||
|
default: { |
||||||
|
email: '', |
||||||
|
remote: "https://api.yimian.xyz/todo-ddl/" |
||||||
|
} |
||||||
|
}, |
||||||
|
data: { |
||||||
|
type: "object", |
||||||
|
default: { |
||||||
|
td: [], |
||||||
|
ddl: [] |
||||||
|
} |
||||||
|
}, |
||||||
|
log: { |
||||||
|
type: 'string', |
||||||
|
default: 'null' |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
if(conf.get('config') == undefined) conf.set('config', { |
||||||
|
email: '', |
||||||
|
remote: "https://api.yimian.xyz/todo-ddl/" |
||||||
|
}); |
||||||
|
if(conf.get('data') == undefined) conf.set('data', { |
||||||
|
td: [], |
||||||
|
ddl: [] |
||||||
|
}); |
||||||
|
if(conf.get('log') == undefined) conf.set('log', 'null'); |
||||||
|
|
||||||
|
return o; |
||||||
|
} |
@ -0,0 +1,113 @@ |
|||||||
|
module.exports = () => { |
||||||
|
var o = { |
||||||
|
search: (s, w, zone) => { |
||||||
|
let res = []; |
||||||
|
let ban = ora(`Searching ${w}s...`).start(); |
||||||
|
for(const cla of zone){ |
||||||
|
for(const i of cla){ |
||||||
|
let pos = i[w].indexOf(s); |
||||||
|
if(pos != -1 && res.indexOf(i[w]) == -1){ |
||||||
|
res.push(i[w]); |
||||||
|
ban.info(i[w].substring(0, pos) + String(s).yellow + i[w].substring(pos + String(s).length) + ' ' + ((typeof i.name == "undefined")?'':i.name) + ((typeof i.content == "undefined")?'':i.content)); |
||||||
|
ban = new ora(`Searching ${w}s...`).start(); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
ban.succeed('Search finished!! Found '+res.length+' results!!'); |
||||||
|
return res; |
||||||
|
}, |
||||||
|
byIDs: (id, arr) => arr.filter(item => id.indexOf(item.id) >= 0), |
||||||
|
updateTd: (id, w, s) => { |
||||||
|
let d = data.td(); |
||||||
|
for(let i = 0; i < d.length; i ++){ |
||||||
|
if(d[i].id == id){ |
||||||
|
d[i][w] = s; |
||||||
|
d[i]['lastOperateTime'] = (new Date()).valueOf(); |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
data.td(d); |
||||||
|
}, |
||||||
|
mergeArray: (a, b) => Array.from(new Set(a.concat(b))), |
||||||
|
merge: (a, b) => { |
||||||
|
let td = []; |
||||||
|
|
||||||
|
for(let td1 of a.td){ |
||||||
|
for(let td2 of b.td){ |
||||||
|
|
||||||
|
if(td1.id == td2.id && !td.some(item => item.id == td2.id)){ |
||||||
|
let obj = {}; |
||||||
|
let logs = []; |
||||||
|
for(let l2 of td2.logs){ |
||||||
|
if(!logs.some(item => item.id == l2.id)){ |
||||||
|
let l1 = td1.logs.filter(item => item.id == l2.id); |
||||||
|
if(l1){ |
||||||
|
l1 = l1[0]; |
||||||
|
if(l1.lastOperateTime < l2.lastOperateTime){ |
||||||
|
logs.push(l2); |
||||||
|
}else{ |
||||||
|
logs.push(l1); |
||||||
|
} |
||||||
|
}else{ |
||||||
|
logs.push(l2); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
for(let l1 of td1.logs){ |
||||||
|
if(!logs.some(item => item.id == l1.id)){ |
||||||
|
let l2 = td2.logs.filter(item => item.id == l1.id); |
||||||
|
if(l2){ |
||||||
|
l2 = l2[0]; |
||||||
|
if(l2.lastOperateTime < l1.lastOperateTime){ |
||||||
|
logs.push(l1); |
||||||
|
}else{ |
||||||
|
logs.push(l2); |
||||||
|
} |
||||||
|
}else{ |
||||||
|
logs.push(l1); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if(td1.lastOperateTime < td2.lastOperateTime){ |
||||||
|
obj = td2; |
||||||
|
}else{ |
||||||
|
obj = td1; |
||||||
|
} |
||||||
|
obj.logs = logs; |
||||||
|
td.push(obj); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
for(let td1 of a.td){ |
||||||
|
if(!td.some(item => item.id == td1.id)){ |
||||||
|
td.push(td1); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
for(let td2 of b.td){ |
||||||
|
if(!td.some(item => item.id == td2.id)){ |
||||||
|
td.push(td2); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/* ddl */ |
||||||
|
//console.log(td);
|
||||||
|
return { |
||||||
|
'td': td, |
||||||
|
'ddl': [] |
||||||
|
}; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
const colors = require('colors'); |
||||||
|
const ora = require('ora'); |
||||||
|
var data = require(__dirname + '/../utilities/data.js')(); |
||||||
|
|
||||||
|
return o; |
||||||
|
} |
@ -0,0 +1,244 @@ |
|||||||
|
module.exports = () => { |
||||||
|
var o = { |
||||||
|
__: { |
||||||
|
id: (aid, zone) => { |
||||||
|
const ids = find.search(aid, 'id', zone); |
||||||
|
if(zone.length > 1){ |
||||||
|
return find.byIDs(ids, data.td()); |
||||||
|
} |
||||||
|
return find.byIDs(ids, zone[0]); |
||||||
|
}, |
||||||
|
name: (aname, zone) => { |
||||||
|
const names = find.search(aname, 'name', zone); |
||||||
|
return find.byIDs(names); |
||||||
|
}, |
||||||
|
getLogs: id => data.td().filter(item => item.id == id)[0].logs.filter(item2 => !item2.isDel), |
||||||
|
getAllLogs: id => data.td().filter(item => item.id == id)[0].logs, |
||||||
|
resetLog: id => { |
||||||
|
if(id == data.log()) { |
||||||
|
data.log('null'); |
||||||
|
} |
||||||
|
}, |
||||||
|
addLog: (id, content) => { |
||||||
|
let logs = o.__.getAllLogs(id); |
||||||
|
logs.push({ |
||||||
|
'id': o.__.generateID(16), |
||||||
|
'content': content, |
||||||
|
createTime: (new Date()).valueOf(), |
||||||
|
lastOperateTime: (new Date()).valueOf(), |
||||||
|
isDel: false |
||||||
|
}); |
||||||
|
find.updateTd(id, 'logs', logs); |
||||||
|
}, |
||||||
|
rmLog: (id, lid) => { |
||||||
|
let logs = o.__.getAllLogs(id); |
||||||
|
for(let i of logs){ |
||||||
|
if(i.id == lid){ |
||||||
|
i.isDel = true; |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
find.updateTd(id, 'logs', logs); |
||||||
|
}, |
||||||
|
getAllClass: (zone) => { |
||||||
|
let arr = []; |
||||||
|
for(const cla of zone){ |
||||||
|
for(const i of cla){ |
||||||
|
if(arr.indexOf(i.class) != -1){ |
||||||
|
arr.push(i.class); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
return arr; |
||||||
|
}, |
||||||
|
parseTime: t => { |
||||||
|
if(!t){ |
||||||
|
return 'null'; |
||||||
|
} |
||||||
|
const st = new Date(t); |
||||||
|
return `${st.getFullYear()}-${st.getMonth()+1}-${st.getDate()} ${st.getHours()}:${st.getMinutes()}:${st.getSeconds()}`; |
||||||
|
}, |
||||||
|
generateID: (l) => md5((new Date()).valueOf()).substring(0, l), |
||||||
|
show: arr => { |
||||||
|
let configInfo = new table({ |
||||||
|
head: ['id', 'class', 'name', 'createTime', 'todoTime', 'endTime'] |
||||||
|
}); |
||||||
|
for(const i of arr){ |
||||||
|
configInfo.push([i.id, i.class, i.name, o.__.parseTime(i.createTime), o.__.parseTime(i.todoTime), o.__.parseTime(i.endTime)]); |
||||||
|
} |
||||||
|
console.log(configInfo.toString()); |
||||||
|
}, |
||||||
|
showLogs: arr => { |
||||||
|
let configInfo = new table({ |
||||||
|
head: ['id', 'content', 'createTime'] |
||||||
|
}); |
||||||
|
for(const i of arr){ |
||||||
|
configInfo.push([i.id, i.content, o.__.parseTime(i.createTime)]); |
||||||
|
} |
||||||
|
console.log(configInfo.toString()); |
||||||
|
} |
||||||
|
}, |
||||||
|
getAll: () => data.td(), |
||||||
|
getAllClass: () => o.__.getAllClass([data.td()]), |
||||||
|
getByaID: id => o.__.id(id, [data.td()]), |
||||||
|
getByaName: name => o.__.name(name, [data.td()]), |
||||||
|
new: (name, cla) => { |
||||||
|
let d = data.td(); |
||||||
|
if(!cla){ |
||||||
|
cla = 'default'; |
||||||
|
} |
||||||
|
if(!name){ |
||||||
|
return 'Name should not be empty!!'; |
||||||
|
} |
||||||
|
if(name.length > 25){ |
||||||
|
return 'Name too Long!!'; |
||||||
|
} |
||||||
|
d.push({ |
||||||
|
id: o.__.generateID(8), |
||||||
|
'name': name, |
||||||
|
'class': cla, |
||||||
|
createTime: (new Date()).valueOf(), |
||||||
|
todoTime: null, |
||||||
|
endTime: null, |
||||||
|
lastOperateTime: (new Date()).valueOf(), |
||||||
|
idDel: false, |
||||||
|
logs: [{ |
||||||
|
id: o.__.generateID(16), |
||||||
|
content: 'Todo Item Created!!', |
||||||
|
createTime: (new Date()).valueOf(), |
||||||
|
lastOperateTime: (new Date()).valueOf() |
||||||
|
}] |
||||||
|
}); |
||||||
|
data.td(d); |
||||||
|
return; |
||||||
|
}, |
||||||
|
rm: aid => { |
||||||
|
let items = o.__.id(aid, [o.todo.getAll(), o.task.getAll(), o.history.getAll()]); |
||||||
|
if(items.length > 1){ |
||||||
|
return 'Which id do you want to remove?'; |
||||||
|
} |
||||||
|
if(items.length <= 0){ |
||||||
|
return 'Not found!!'; |
||||||
|
} |
||||||
|
find.updateTd(items[0].id, 'isDel', true); |
||||||
|
console.log(items[0].id); |
||||||
|
o.__.resetLog(items[0].id); |
||||||
|
}, |
||||||
|
add: aid => { |
||||||
|
let items = o.__.id(aid, [o.todo.getAll()]); |
||||||
|
if(items.length > 1){ |
||||||
|
return 'Which id do you want to add to task?'; |
||||||
|
} |
||||||
|
if(items.length <= 0){ |
||||||
|
return 'Not found!!'; |
||||||
|
} |
||||||
|
find.updateTd(items[0].id, 'todoTime', (new Date()).valueOf()); |
||||||
|
}, |
||||||
|
return: aid => { |
||||||
|
let items = o.__.id(aid, [o.task.getAll()]); |
||||||
|
if(items.length > 1){ |
||||||
|
return 'Which id do you want to return?'; |
||||||
|
} |
||||||
|
if(items.length <= 0){ |
||||||
|
return 'Not found!!'; |
||||||
|
} |
||||||
|
find.updateTd(items[0].id, 'todoTime', null); |
||||||
|
o.__.resetLog(items[0].id); |
||||||
|
}, |
||||||
|
done: aid => { |
||||||
|
let items = o.__.id(aid, [o.task.getAll()]); |
||||||
|
if(items.length > 1){ |
||||||
|
return 'Which id do you want to finish?'; |
||||||
|
} |
||||||
|
if(items.length <= 0){ |
||||||
|
return 'Not found!!'; |
||||||
|
} |
||||||
|
find.updateTd(items[0].id, 'endTime', (new Date()).valueOf()); |
||||||
|
o.__.resetLog(items[0].id); |
||||||
|
}, |
||||||
|
recover: aid => { |
||||||
|
let items = o.__.id(aid, [o.history.getAll()]); |
||||||
|
if(items.length > 1){ |
||||||
|
return 'Which id do you want to recover?'; |
||||||
|
} |
||||||
|
if(items.length <= 0){ |
||||||
|
return 'Not found!!'; |
||||||
|
} |
||||||
|
find.updateTd(items[0].id, 'endTime', null); |
||||||
|
}, |
||||||
|
/* log */ |
||||||
|
ll: () => { |
||||||
|
if(data.log() == 'null'){ |
||||||
|
return 'No Task Pointed!! Please select a task to begin!!'; |
||||||
|
} |
||||||
|
let logs = o.__.getLogs(data.log()); |
||||||
|
console.log('At task ' + data.log() + ' ' + o.__.id(data.log(), [data.td()])[0].name); |
||||||
|
o.__.showLogs(logs); |
||||||
|
}, |
||||||
|
select: aid => { |
||||||
|
let items = o.__.id(aid, [o.task.getAll()]); |
||||||
|
if(items.length > 1){ |
||||||
|
return 'Which id do you want to add to task?'; |
||||||
|
} |
||||||
|
if(items.length <= 0){ |
||||||
|
return 'Not found!!'; |
||||||
|
} |
||||||
|
data.log(items[0].id); |
||||||
|
console.log(items[0].id); |
||||||
|
}, |
||||||
|
log: content => { |
||||||
|
if(data.log() == "null"){ |
||||||
|
return 'No Task Pointed!! Please select a task to begin!!'; |
||||||
|
} |
||||||
|
o.__.addLog(data.log(), content); |
||||||
|
}, |
||||||
|
rml: aid => { |
||||||
|
if(data.log() == "null"){ |
||||||
|
return 'No Task Pointed!! Please select a task to begin!!'; |
||||||
|
} |
||||||
|
let items = o.__.id(aid, [o.__.id(data.log(), [data.td()])[0].logs]); |
||||||
|
if(items.length > 1){ |
||||||
|
return 'Which id do you want to add to task?'; |
||||||
|
} |
||||||
|
if(items.length <= 0){ |
||||||
|
return 'Not found!!'; |
||||||
|
} |
||||||
|
o.__.rmLog(data.log(), items[0].id); |
||||||
|
console.log(items[0].id); |
||||||
|
}, |
||||||
|
/* sub */ |
||||||
|
todo: { |
||||||
|
getAll: () => data.td().filter(item => !item.isDel && item.todoTime == null), |
||||||
|
getByaID: id => o.__.id(id, [o.todo.getAll()]), |
||||||
|
getByaName: name => o.__.name(name, [o.todo.getAll()]), |
||||||
|
getAllClass: () => o.__.getAllClass([o.todo.getAll()]), |
||||||
|
}, |
||||||
|
task: { |
||||||
|
getAll: () => data.td().filter(item => !item.isDel && item.todoTime != null && item.endTime == null), |
||||||
|
getByaID: id => o.__.id(id, [o.task.getAll()]), |
||||||
|
getByaName: name => o.__.name(name, [o.task.getAll()]), |
||||||
|
getAllClass: () => o.__.getAllClass([o.task.getAll()]), |
||||||
|
}, |
||||||
|
history: { |
||||||
|
getAll: () => data.td().filter(item => !item.isDel && item.todoTime != null && item.endTime != null), |
||||||
|
getByaID: id => o.__.id(id, [o.history.getAll()]), |
||||||
|
getByaName: name => o.__.name(name, [o.history.getAll()]), |
||||||
|
getAllClass: () => o.__.getAllClass([o.history.getAll()]), |
||||||
|
}, |
||||||
|
ash: { |
||||||
|
getAll: () => data.td().filter(item => item.isDel), |
||||||
|
getByaID: id => o.__.id(id, [o.ash.getAll()]), |
||||||
|
getByaName: name => o.__.name(name, [o.ash.getAll()]), |
||||||
|
getAllClass: () => o.__.getAllClass([o.ash.getAll()]), |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
var data = require(__dirname + '/../utilities/data.js')(); |
||||||
|
const find = require(__dirname + '/../utilities/find.js')(); |
||||||
|
const colors = require('colors'); |
||||||
|
const boxen = require('boxen'); |
||||||
|
const table = require('cli-table'); |
||||||
|
const md5 = require('md5'); |
||||||
|
|
||||||
|
return o; |
||||||
|
} |
Loading…
Reference in new issue