Passed
Push — master ( 5dd578...227b43 )
by Pavel
01:44
created

index.ts ➔ printSummary   A

Complexity

Conditions 2

Size

Total Lines 6
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 6
dl 0
loc 6
rs 10
c 0
b 0
f 0
1
import * as core from '@actions/core';
2
import {HttpClient} from '@actions/http-client';
3
import {Octokit} from '@octokit/rest';
4
import {config} from 'dotenv';
5
import {resolve} from 'path';
6
import formatLine from './formatLine';
7
8
config({path: resolve(__dirname, '../.env')});
9
10
const GH_TOKEN = core.getInput('GH_TOKEN', {required: true});
11
const WAKA_API_KEY = core.getInput('WAKA_API_KEY', {required: true});
12
// const GIST_ID = core.getInput('GIST_ID', {required: true});
13
const GIST_ID = 'test-on-github';
14
const MAX_RESULT = Number(core.getInput('MAX_RESULT', {required: true}));
15
const DATE_RANGE = core.getInput('DATE_RANGE', {required: false});
16
const PRINT_SUMMARY = core.getBooleanInput('PRINT_SUMMARY', {required: true});
17
const USER_AGENT = 'WakaTime-Gist/1.3 +https://github.com/marketplace/actions/wakatime-gist';
18
const ACTION_URL = 'https://github.com/marketplace/actions/wakatime-gist';
19
20
const updateDate = new Date().toLocaleDateString('en-us', {day: 'numeric', year: 'numeric', month: 'short'});
21
const summaryTable: any[] = [[{data: 'Action', header: true}, {data: 'Result', header: true}]];
22
23
let range: string = DATE_RANGE;
24
if (!['last_7_days', 'last_30_days', 'last_6_months', 'last_year'].includes(range)) range = 'last_7_days';
25
26
let title: string = 'Latest';
27
if (range === 'last_7_days') title = 'Weekly';
28
if (range === 'last_30_days') title = 'Monthly';
29
title = title + ' statistics [update ' + updateDate + ']';
30
31
(async () => {
32
  /**
33
   * Get statistics
34
   */
35
  const httpClient = new HttpClient(USER_AGENT);
36
  const response = await httpClient.getJson('https://wakatime.com/api/v1/users/current/stats/' + range,
37
    {Authorization: `Basic ${Buffer.from(WAKA_API_KEY).toString('base64')}`})
38
    .catch(error => actionFail(error.message));
39
40
  // @ts-ignore
41
  const languages: any[] = response.result.data.languages;
42
  if (languages) {
43
    summaryTable.push(['Statistics received', '✔']);
44
  } else {
45
    return actionFail('Empty response from wakatime.com');
46
  }
47
48
  /**
49
   * Formatting
50
   */
51
  let otherTotalSeconds = 0;
52
  let otherPercent = 0;
53
  const lines = languages.reduce((prev: any[], cur: any) => {
54
    const {name, percent, total_seconds} = cur;
55
    const line = formatLine(name, total_seconds, percent);
56
57
    if (name == 'Other' || prev.length >= MAX_RESULT - 1) {
58
      otherTotalSeconds += total_seconds;
59
      otherPercent += percent;
60
      return prev;
61
    }
62
63
    return [...prev, line];
64
  }, []);
65
66
  lines.push(formatLine('Other lang', otherTotalSeconds, otherPercent));
67
  if (lines.length === 0) return actionInfo('No statistics for the last time period. Gist not updated');
68
69
  /**
70
   * Get gist filename
71
   */
72
  const octokit = new Octokit({auth: `token ${GH_TOKEN}`});
73
  const gist = await octokit.gists.get({gist_id: GIST_ID})
74
    .catch(error => actionFail('Gist ' + error.message));
75
  if (!gist) return;
76
77
  const filename = Object.keys(gist.data.files || {})[0];
78
79
  /**
80
   * Update gist
81
   */
82
  await octokit.gists.update({
83
    gist_id: GIST_ID,
84
    files: {
85
      [filename]: {
86
        filename: title,
87
        content: lines.join('\n'),
88
      },
89
    },
90
  }).catch(error => actionFail('Gist ' + error.message));
91
92
  summaryTable.push(['Gist updated', '✔']);
93
94
  /**
95
   * Print summary
96
   */
97
  await actionSuccess();
98
})();
99
100
async function actionSuccess() {
101
  const summary = core.summary
102
    .addHeading('Results')
103
    .addTable(summaryTable)
104
    .addBreak()
105
    .addLink('wakatime-gist', ACTION_URL);
106
107
  await printSummary(summary);
108
}
109
110
async function actionInfo(mess: string) {
111
  const summary = core.summary
112
    .addHeading('Results')
113
    .addRaw(mess)
114
    .addBreak()
115
    .addLink('wakatime-gist', ACTION_URL);
116
117
  await printSummary(summary);
118
  core.notice(mess);
119
}
120
121
async function actionFail(mess: string) {
122
  mess = 'Action failed with error: ' + mess;
123
124
  const summary = core.summary
125
    .addHeading('Results')
126
    .addRaw(mess)
127
    .addBreak()
128
    .addLink('Check README', ACTION_URL);
129
130
  await printSummary(summary);
131
  core.setFailed(mess);
132
}
133
134
async function printSummary(summary: typeof core.summary) {
135
  if (PRINT_SUMMARY) {
136
    await summary.write();
137
  } else {
138
    console.log(summary.stringify());
139
  }
140
}