UNPKG

steemkr

Version:

스팀잇 기반 CLI 툴 : CLI(Command Line Interface) Tool for steemit.

195 lines (165 loc) 5.84 kB
const help = require('./help'); const {getLocalTime} = require('../util/wdate'); const {getBeforeDate} = require('../util/wdate'); const {to} = require('../util/wutil'); const {sortByKey} = require('../util/wutil'); const {getTop} = require('../util/wutil'); const {getMoney} = require('../util/wsteem'); const steem = require('steem'); const ora = require('ora'); const dateFormat = require('dateformat'); // 기본값 const STEEM_AUTHOR = process.env.STEEM_AUTHOR; const STEEM_VOTE_DAY = process.env.STEEM_VOTE_DAY; const DEF_SEARCH_DAYS = 7; /* * 파라미터 정보를 초기화 해준다 * @param args 외부로부터 입력받은 파라미터 */ function initParams(args) { // 초기화 args = args?args:[]; // new 처리 하므로 return 처리 해야 됨에 유의 // 1번째 : 작가 if(args.length==0){ if(STEEM_AUTHOR){ args = []; args.push(STEEM_AUTHOR); } } // 2번째 : 날짜 if(args.length==1){ if(STEEM_VOTE_DAY){ args.push(STEEM_VOTE_DAY); }else{ args.push(DEF_SEARCH_DAYS); } } return args; } /* * 비동기 작업을 수행한다 * @param account 계정명 * @param days 조회 일자 */ let spinner; async function processAsyc(account, days){ // 오류처리용 let err; /* item { authorperm: 'lucky2/2fexgq', weight: 317, rshares: 1314663102, percent: 10000, time: '2018-06-26T06:26:57' } */ // 투표 정보 확인 let votes; spinner = ora().start('loading votes'); [err, votes] = await to(steem.api.getAccountVotesAsync(account)); if(err){ // 오류처리 spinner.fail(); return Promise.reject(err.toString()); } spinner.succeed(' '); // 투표 정보 - 정렬 / 최근것이 맨아래 보이도록 함 votes.sort((a,b)=>{ return getLocalTime(a.time).getTime() - getLocalTime(b.time).getTime(); }); // 투표 정보 - 기간 제한 let beforeTime = getBeforeDate(days).getTime(); let f_votes = votes.filter(a=>getLocalTime(a.time).getTime() > beforeTime); // 투표한 글 정보 가져오기 let con_infos = []; for(let fv of f_votes){ let link = fv.authorperm.split('/'); con_infos.push( steem.api.getContentAsync(link[0], link[1]) ); } let cinfos; spinner = ora().start('loading ori contents info'); [err, cinfos] = await to(Promise.all(con_infos)); if(err){ // 오류처리 spinner.fail(); return Promise.reject(err.toString()); } spinner.succeed(' '); // 조회 정보 반환 return Promise.resolve([f_votes, cinfos]); } module.exports = (args)=>{ // 파라미터 초기화 args = initParams(args); // 입력 파라미터 유효성 검증 if(args.length!=2){ console.error('\n [경고] 파라미터 오류 : 아래 메뉴얼을 참조 바랍니다'); help('voteto'); return; } // 비동기 작업을 수행한다 let account = args[0]; let days = args[1]; processAsyc(account, days) .then(result=>{ let f_votes = result[0]; let cinfos = result[1]; let votes = {}; let tvotes = 0; let svotes = 0; // 결과 목록 출력 for(let i=0;i<cinfos.length;i++){ let citem = cinfos[i]; let fitem = f_votes[i]; let url = `https://steemit.com` + citem.url; let p = fitem.percent; let percent = p==0?'( 보팅취소 )':`( ${fitem.percent/100} % )`; let t1 = getLocalTime(fitem.time); let t2 = getLocalTime(citem.created); let time1 = dateFormat(t1,'yyyy-mm-dd HH:MM:ss' ); let time2 = dateFormat(t2,'yyyy-mm-dd HH:MM:ss' ); let gap = Math.floor((t1.getTime() - t2.getTime())/1000/60)/60; // hour let self = account==citem.account?'🔥':'⭐️'; if(p!=0){ // 정보 출력 console.log(`${self} ${citem.root_title}`); console.log(`[ 투표 시간 : ${time1} ] [ 글 작성일 : ${time2} ] [ GAP : ${gap.toFixed(2)} hour ]`); console.log( url ); if(citem.pending_payout_value=='0.000 SBD'){ // payout 지난 글 let m = getMoney(citem.total_payout_value, citem.curator_payout_value); console.log(`보상완료 : ${m.toFixed(3)} SBD / 보팅 : ${citem.active_votes.length} ${percent}`); }else{ // payout 이전 글 console.log(`보상 전 : ${citem.pending_payout_value} / 보팅 : ${citem.active_votes.length} ${percent}`); } console.log(); // 투표정보 카운트 votes[citem.author] = !votes[citem.author]?1:votes[citem.author]+1; tvotes++; if(account==citem.author){ svotes++; } } } // 투표 TOP 3 출력 let top3 = getTop( sortByKey(votes) ); console.log(`____________________________________________________________`); console.log(`${account}'s TOP 3 VOTES in ${days} days`); console.log(`____________________________________________________________`); for(let i=0;i<top3.n.length;i++){ let pc = ((top3.n[i] / tvotes)*100*top3.v[i].length).toFixed(2); console.log( `${top3.n[i]} votes ( ${pc} % ) : ${top3.v[i].join(', ')}` ); } console.log(`____________________________________________________________`); console.log(`total : ${tvotes} votes, self : ${svotes} votes ( ${((svotes/tvotes)*100).toFixed(2)} % ) `); console.log(`____________________________________________________________`); }) .catch(e=>{ console.log(`____________________________________________________________`); console.error(e); console.log(`____________________________________________________________`); console.error('조회가 실패 했습니다 - 조회 기간(7일 이하 추천)이 길거나 보팅 횟수가 많은 경우, 조회 기간을 줄여주세요'); console.log(`____________________________________________________________`); }); };