Skip to content

Commit 265c72e

Browse files
committed
refactor(grabber): rewrite to typescript
1 parent 9b3a50b commit 265c72e

File tree

14 files changed

+609
-134
lines changed

14 files changed

+609
-134
lines changed

.eslintrc.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,14 @@ module.exports = {
77
node: true,
88
},
99
parserOptions: {
10-
parser: 'babel-eslint',
10+
parser: '@typescript-eslint/parser',
1111
},
12+
plugins: [
13+
'@typescript-eslint',
14+
],
1215
extends: [
1316
'eslint:recommended',
17+
'plugin:@typescript-eslint/recommended',
1418
],
1519
rules: {
1620
'no-var': 'error',
Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,20 @@
1-
const fs = require('fs-extra')
2-
const axios = require('axios')
3-
const inquirer = require('inquirer')
1+
import fs from 'fs-extra'
2+
import axios from 'axios'
3+
import inquirer from 'inquirer'
44

5-
const logger = require('./logger')
5+
import * as logger from './logger'
66

7-
exports.download = async function download (apiPath, dest) {
7+
export async function download (apiPath: string, dest: string): Promise<void> {
88
logger.Assets.info('DOWNLOAD', apiPath)
9-
const {data} = await axios.get(apiPath, {responseType: 'stream'})
10-
.catch(err => logger.Assets.error('DOWNLOAD', apiPath, err.toJSON()))
11-
data.pipe(fs.createWriteStream(dest))
9+
const {data} = await axios.get<fs.ReadStream>(apiPath, {responseType: 'stream'})
10+
.catch(err => {
11+
logger.Assets.error('DOWNLOAD', apiPath, err.toJSON())
12+
return {data: null}
13+
})
14+
data?.pipe(fs.createWriteStream(dest))
1215
}
1316

14-
exports.writeJSON = function writeJSON (dest, data) {
17+
export function writeJSON (dest: string, data: never): void {
1518
fs.writeFile(dest, JSON.stringify(data), (err) => {
1619
if (err) {
1720
logger.WriteJSON.error('CREATE', dest, err)
@@ -21,11 +24,11 @@ exports.writeJSON = function writeJSON (dest, data) {
2124
})
2225
}
2326

24-
exports.mergeStats = function mergeStats (data) {
25-
let merged = {}
27+
export function mergeStats (data: McPlayerStatsJson): McPlayerStatsJson {
28+
const merged: McPlayerStatsJson = {}
2629
if (Object.prototype.hasOwnProperty.call(data, 'stats')) {
27-
for (let key in data.stats) {
28-
for (let s in data.stats[key]) {
30+
for (const key in data.stats) {
31+
for (const s in data.stats[key]) {
2932
merged[key + '/' + s] = data.stats[key][s]
3033
}
3134
}
@@ -34,18 +37,18 @@ exports.mergeStats = function mergeStats (data) {
3437
return data
3538
}
3639

37-
exports.defaultSkin = function defaultSkin (uuid) {
40+
export function defaultSkin (uuid: LongUuid): string {
3841
// great thanks to Minecrell for research into Minecraft and Java's UUID hashing!
3942
// https://git.io/xJpV
4043
// MC uses `uuid.hashCode() & 1` for alex
4144
// that can be compacted to counting the LSBs of every 4th byte in the UUID
4245
// an odd sum means alex, an even sum means steve
4346
// XOR-ing all the LSBs gives us 1 for alex and 0 for steve
44-
const isEven = (c) => {
47+
const isEven = (c: string) => {
4548
if (c >= '0' && c <= '9') {
46-
return (c & 1) === 0
49+
return (Number(c) & 1) === 0
4750
} else if (c >= 'a' && c <= 'f') {
48-
return (c & 1) === 1
51+
return (Number(c) & 1) === 1
4952
}
5053
console.log('Invalid digit', c)
5154
return null
@@ -55,10 +58,10 @@ exports.defaultSkin = function defaultSkin (uuid) {
5558
return lsbsEven ? 'Alex' : 'Steve'
5659
}
5760

58-
exports.confirm = async function confirm (message, _default = true) {
61+
export async function confirm (message: string, _default = true): Promise<boolean> {
5962
const prompt = inquirer.createPromptModule()
6063
try {
61-
const res = await prompt({
64+
const res = await prompt<{confirm: boolean}>({
6265
type: 'confirm',
6366
name: 'confirm',
6467
default: _default,
@@ -71,6 +74,6 @@ exports.confirm = async function confirm (message, _default = true) {
7174
}
7275
}
7376

74-
exports.delay = function delay (ms) {
77+
export function delay (ms: number): Promise<void> {
7578
return new Promise(resolve => setTimeout(resolve, ms))
7679
}

index.js renamed to index.ts

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
const fs = require('fs-extra')
2-
const path = require('path')
1+
import fs from 'fs-extra'
2+
import path from 'path'
33

4-
const Utils = require('./utils')
5-
const {writeJSON, confirm} = require('./helper')
6-
const logger = require('./logger')
7-
const ProgressBar = require('./progressbar')
4+
import Utils from './utils'
5+
import {confirm, writeJSON} from './helper'
6+
import * as logger from './logger'
7+
import ProgressBar from './progressbar'
88

99
process.on('SIGINT', () => {
1010
process.exit()
@@ -16,10 +16,8 @@ const utils = new Utils()
1616
const config = utils.getConfig()
1717

1818
void async function main () {
19-
/** @type {string[]} */
2019
const bannedUuidList = config.render['banned-players'] ? utils.getBannedPlayers() : []
2120

22-
/** @type {string[]} */
2321
const uuidList = (() => {
2422
let list = config.render.whitelist ? utils.getWhitelistedPlayers() : utils.getAllPlayers()
2523
if (!config.render['render-banned'] && bannedUuidList.length) {
@@ -33,11 +31,11 @@ void async function main () {
3331
logger.Default.info('Advancements is set: Render mode set to 1.12+')
3432
} else {
3533
logger.Default.info('Advancements not set: Render mode set to 1.11')
36-
3734
}
38-
const outputDir = path.join(config.BASEPATH, config.render.output)
3935

36+
const outputDir = path.join(config.BASEPATH, config.render.output)
4037
logger.Default.info('CREATE OUTPUT DIR', outputDir)
38+
4139
if (config.render['confirm-clear-data'] !== false) {
4240
const prompt = await confirm('Do you want to clean the output folder?')
4341
if (prompt) {
@@ -49,7 +47,6 @@ void async function main () {
4947
}
5048
}
5149

52-
/** @type {object[]} */
5350
const players = []
5451

5552
const progress = new ProgressBar(uuidList.length)
@@ -78,14 +75,14 @@ void async function main () {
7875

7976
progress.stop()
8077

81-
players.sort((a, b) => b.seen - a.seen)
82-
writeJSON(path.join(outputDir, 'players.json'), players)
78+
players.sort((a, b) => (b.seen ?? 0) - (a.seen ?? 0))
79+
writeJSON(path.join(outputDir, 'players.json'), players as never)
8380

84-
let worldTime = await utils.getWorldTime()
81+
const worldTime = await utils.getWorldTime()
8582
writeJSON(path.join(outputDir, 'info.json'), {
8683
worldTime,
8784
timeFormat: config.render['time-format'],
8885
lastUpdate: Date.now(),
8986
...config.web,
90-
})
87+
} as never)
9188
}()

logger.js

Lines changed: 0 additions & 26 deletions
This file was deleted.

logger.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import log4js from 'log4js'
2+
3+
log4js.configure({
4+
appenders: {
5+
Default: {type: 'stdout'},
6+
Config: {type: 'stdout'},
7+
PlayerData: {type: 'stdout'},
8+
MojangAPI: {type: 'stdout'},
9+
Assets: {type: 'stdout'},
10+
WriteJSON: {type: 'stdout'},
11+
},
12+
categories: {
13+
default: {
14+
appenders: ['Default'],
15+
level: 'info',
16+
},
17+
},
18+
})
19+
20+
export const Default = log4js.getLogger('Default')
21+
export const Config = log4js.getLogger('Config')
22+
export const PlayerData = log4js.getLogger('PlayerData')
23+
export const MojangAPI = log4js.getLogger('MojangAPI')
24+
export const Assets = log4js.getLogger('Assets')
25+
export const WriteJSON = log4js.getLogger('WriteJSON')

0 commit comments

Comments
 (0)