From 43a4d732cfaf78c59dc91cf7fbad535dafbdd239 Mon Sep 17 00:00:00 2001 From: Yannis Petitot <46972108+yadPe@users.noreply.github.com> Date: Tue, 29 Mar 2022 23:04:26 +0200 Subject: [PATCH] chore(bot): use logger instead of console log (#478) --- package.json | 4 +-- src/Bot/BeatconnectApi.js | 48 ++++++++++++++++------------------ src/Bot/Bot.js | 46 ++++++++++++++++++-------------- src/Bot/OsuApi.js | 5 +--- src/Bot/OsuIrc.js | 43 +++++++++++++++++++----------- src/Bot/index.js | 11 +++++--- src/Bot/msg/mpSettings.js | 21 ++++++++++----- src/Bot/multiplayer/mpMatch.js | 17 +++++++++--- src/electron/index.js | 1 + 9 files changed, 116 insertions(+), 80 deletions(-) diff --git a/package.json b/package.json index ab9141b2..7051230d 100644 --- a/package.json +++ b/package.json @@ -109,7 +109,7 @@ "dependencies": { "discord-rpc": "^3.2.0", "electron-is-dev": "^1.1.0", - "electron-log": "^4.3.4", + "electron-log": "^4.4.6", "electron-updater": "^4.3.8", "electron-window-state": "^5.0.3", "fs-extra": "^9.1.0", @@ -239,4 +239,4 @@ "react-app" ] } -} +} \ No newline at end of file diff --git a/src/Bot/BeatconnectApi.js b/src/Bot/BeatconnectApi.js index c2a716ff..96ab6f1a 100644 --- a/src/Bot/BeatconnectApi.js +++ b/src/Bot/BeatconnectApi.js @@ -1,30 +1,35 @@ +import ElectronLog from 'electron-log'; import config from '../shared/config'; +const logger = ElectronLog.scope('bot-beatconnect-api'); + +const BeatmapStatus = Object.freeze({ + '4': 'Loved', + '3': 'Qualified', + '2': 'Approved', + '1': 'Ranked', + '0': 'Pending', + '-1': 'WIP', + '-2': 'Graveyard', +}); + class BeatconnectApi { constructor(key) { this.key = key; this.url = 'https://beatconnect.io/api'; - this.status = { - '4': 'Loved', - '3': 'Qualified', - '2': 'Approved', - '1': 'Ranked', - '0': 'Pending', - '-1': 'WIP', - '-2': 'Graveyard', - }; + this.status = BeatmapStatus; } getBeatmapById(beatmapId) { - console.log(beatmapId); + logger.log('getBeatmapById', beatmapId); return fetch(config.api.getBeatmapById(beatmapId), { mode: 'cors' }) .then(res => res.json()) - .catch(err => console.error(err)); + .catch(logger.error); } - searchBeatmap(query, page) { - query = query.join('%20'); - console.log('searching ' + query); + searchBeatmap(rawQuery, page) { + logger.log('searching ' + query); + const query = encodeURI(rawQuery); return fetch(config.api.searchBeatmaps(query, page)) .then(res => res.json()) .then(results => { @@ -45,26 +50,17 @@ class BeatconnectApi { }` ); }) - .catch(err => console.error(err)); + .catch(ElectronLog.error); } } const getDlLink = (beatmapInfos, pretty, extra) => { - console.log('getdlLimk', beatmapInfos); if (beatmapInfos.error) throw new Error(beatmapInfos.error); // Need Test const { id, artist, title, unique_id } = beatmapInfos; - const status = { - '4': 'Loved', - '3': 'Qualified', - '2': 'Approved', - '1': 'Ranked', - '0': 'Pending', - '-1': 'WIP', - '-2': 'Graveyard', - }; + if (extra) { const { creator, approved, version, creator_id, bpm, max_combo, diff_approach } = extra; - return `[${status[approved] || ''}] [https://beatconnect.io/b/${id}/${unique_id} ${artist || ''} - ${title || + return `[${BeatmapStatus[approved] || ''}] [https://beatconnect.io/b/${id}/${unique_id} ${artist || ''} - ${title || ''} [${version || ''}]] by [https://osu.ppy.sh/u/${creator_id} ${creator || 'peppy'}] | BPM ${bpm || 0} | AR ${diff_approach || 0} ${max_combo ? '| Max combo: ' + max_combo : ''}`; } diff --git a/src/Bot/Bot.js b/src/Bot/Bot.js index 979d0512..2465eaa3 100644 --- a/src/Bot/Bot.js +++ b/src/Bot/Bot.js @@ -1,10 +1,12 @@ +import ElectronLog from 'electron-log'; import OsuIrc from './OsuIrc'; import OsuApi from './OsuApi'; import MpMatch from './multiplayer/mpMatch'; import store from '../shared/store'; import { updateMatchsList } from './actions'; +import { BeatconnectApi, getDlLink } from './BeatconnectApi'; -const { BeatconnectApi, getDlLink } = require('./BeatconnectApi'); +const botLogger = ElectronLog.scope('Bot'); class Bot { constructor(configFile) { @@ -47,18 +49,18 @@ class Bot { .then(response => getDlLink(response, true, extra)) .then(link => this.irc.pm(to, link)) .catch(err => { - console.error(err); + botLogger.error('sendMapById failed ', err); this.irc.pm(to, 'oops ! Cannot get beatmap'); }); } newMatch(id, matchName, ircRoom, creator, playerList) { - console.log(`New match created : ${id} ${matchName} ${ircRoom} ${creator}`); + botLogger.info(`Creating new match : ${id} ${matchName} ${ircRoom} ${creator}`); let alreadyExist = false; this.matchs.forEach(match => { if (match.id === id) alreadyExist = true; }); - if (alreadyExist) return; + if (alreadyExist) return botLogger.info(`Match with id ${id} already exist! Doing nothing..`); const newMatch = new MpMatch( id, matchName, @@ -73,41 +75,45 @@ class Bot { newMatch.players = playerList; } this.matchs.push(newMatch); - //this.web.matchs = this.matchs; updateMatchsList(this.matchs); - console.log(this.matchs); + botLogger.info('New match created, current matchs : ', this.matchs); } endMatch(matchId) { this.matchs = this.matchs.filter(match => match.id !== matchId); updateMatchsList(this); - console.log(`Current matchs : ${this.matchs}`); + botLogger.info(`Match ${matchId} ended`); + botLogger.debug('Current matchs :', this.matchs); } newBeatmap(beatmapId, matchId) { + botLogger.info(`Beatmap changed ${beatmapId} for match ${matchId}!`); this.osuApi .getSetId(beatmapId) .then(beatmap => this.matchs.forEach(match => { if (match.id === matchId) { - this.beatconnect.getBeatmapById(beatmap.beatmapset_id).then(response => { - console.log('Beatconnect', response); - beatmap = { ...beatmap, ...response }; - match.updateBeatmap(beatmap).then(() => updateMatchsList(this.matchs)); - console.log('osu', beatmap, this.matchs); - return; - }); + this.beatconnect + .getBeatmapById(beatmap.beatmapset_id) + .then(response => { + botLogger.log('Beatconnect', response); + beatmap = { ...beatmap, ...response }; + match.updateBeatmap(beatmap).then(() => updateMatchsList(this.matchs)); + botLogger.log('osu', beatmap, this.matchs); + return; + }) + .catch(botLogger.error); } }), ) - .catch(err => console.error(err)); + .catch(botLogger.error); } np(beatmapId, from) { this.osuApi .getSetId(beatmapId) .then(res => this.sendMapById(res.beatmapset_id, from)) - .catch(err => console.error(err)); + .catch(botLogger.error); } joinMatch(reqMatchId, from) { @@ -115,7 +121,7 @@ class Bot { .joinMatch(reqMatchId) .then(({ matchId, playerList }) => this.newMatch(matchId, null, `#mp_${matchId}`, null, playerList)) .catch(err => { - console.error(err); + botLogger.error(err); if (from) this.irc.pm(from, 'Cannot find this room'); store.dispatch({ type: 'ERROR', payload: reqMatchId }); }); @@ -146,7 +152,7 @@ class Bot { const player = args[1].split(' ').shift(); match.host = player; updateMatchsList(this.matchs); - console.log(`Host for ${match.matchName} is now ${player}`); + botLogger.info(`Host for ${match.matchName} is now ${player}`); } else if ( args[1].includes('Room name: ') || args[1].includes('Room name: ') || @@ -195,7 +201,7 @@ class Bot { .makeMatch(params[0], from) .then(({ matchId, name, matchRoom, creator }) => this.newMatch(matchId, name, matchRoom, creator)) .catch(err => { - console.error(err); + botLogger.error(err); this.irc.pm(from, 'Unable to create the match, maybe you already have too many matchs currently open'); }); break; @@ -203,7 +209,7 @@ class Bot { this.beatconnect .searchBeatmap(params) .then(result => this.irc.pm(fromMp || from, result)) - .catch(err => console.error(err)); + .catch(err => botLogger.error(err)); break; case this.commandsList[4]: // beat if (!fromMp) { diff --git a/src/Bot/OsuApi.js b/src/Bot/OsuApi.js index acf693df..441fd2f7 100644 --- a/src/Bot/OsuApi.js +++ b/src/Bot/OsuApi.js @@ -16,10 +16,7 @@ class OsuApi { } getSetId(beatmapId) { - return this.request('get_beatmaps', [{ param: 'b', value: beatmapId }]).then(res => { - console.log(res[0].beatmapset_id); - return res[0]; - }); + return this.request('get_beatmaps', [{ param: 'b', value: beatmapId }]).then(res => res[0]); } } diff --git a/src/Bot/OsuIrc.js b/src/Bot/OsuIrc.js index e7e9667b..0770635c 100644 --- a/src/Bot/OsuIrc.js +++ b/src/Bot/OsuIrc.js @@ -1,8 +1,11 @@ +import ElectronLog from 'electron-log'; +import { EventEmitter } from 'events'; import { remote } from 'electron'; +import irc from 'irc'; import store from '../shared/store'; -const irc = require('irc'); -const EventEmitter = require('events').EventEmitter; +const logger = ElectronLog.scope('bot-irc-client'); + class OsuIrc { constructor(onMessage, onMpMessage, np, endMatch, config) { this.onMpMessage = onMpMessage; @@ -40,11 +43,20 @@ class OsuIrc { }); this.onError = err => { // this.eventEmitter.emit('ircError', err); // wtf - console.error(`IRC Client error: ${err}`); + logger.error('IRC Client error', err); + switch (err.command) { + case 'err_nosuchchannel': { + remote.dialog.showErrorBox('Invalid match Id', `Details:\n${err.args.join('\n')}`); + break; + } + default: + break; + } + logger.error(err); }; this.client.on('error', this.onError); this.client.addListener('message', (from, channel, text, rawMsg) => { - console.log(rawMsg); + logger.log(`new message: \n${text}`, rawMsg); onMessage(from, channel, text, rawMsg); this.previousMessage = rawMsg; }); @@ -59,7 +71,7 @@ class OsuIrc { this.client.disconnect(); store.dispatch({ type: 'DISCONNECT' }); } - console.error('RECEIVED ERROR FROM IRC SERVER: ', msg.args); + logger.error('RECEIVED ERROR FROM IRC SERVER: ', msg.args); } if (msg.command === 'rpl_welcome') { store.dispatch({ type: 'CONNECTED' }); @@ -75,7 +87,7 @@ class OsuIrc { .split(' ') .filter(player => !(player.startsWith('@') || player.startsWith('+') || player === '')); const matchId = args[2].split('_').pop(); - console.log(playerList, matchId, 'ICI'); + logger.log(playerList, matchId, 'ICI'); this.eventEmitter.emit('namreply', { matchId, playerList }); } if (msg.command === 'PART') { @@ -85,10 +97,10 @@ class OsuIrc { } } if (msg.args[1]) { - console.log(msg.args[1]); + logger.log(msg.args[1]); if (msg.args[1].includes('ACTION is listening to')) { const beatmapId = /.*?(\d+)/i.exec(msg.args[1])[1]; - console.log(beatmapId); + logger.log(beatmapId); this.np(beatmapId, msg.args[0].includes('mp') ? msg.args[0] : msg.nick); } } @@ -102,10 +114,10 @@ class OsuIrc { if (rawCommand === 'MODE' && args[1] === '+v' && args[0].includes('mp')) this.eventEmitter.emit('newMatchCreated', rawMsg); if (rawCommand === 'PRIVMSG' && args[1].includes('Created the tournament match')) { - const matchId = this.regExps[0].exec(args[1])[1]; - const matchName = args[1].split(' ').pop(); - const matchRoom = `#mp_${matchId}`; - //this.eventEmitter.emit('newMatchCreated', { matchId, matchName, matchRoom }); + // const matchId = this.regExps[0].exec(args[1])[1]; + // const matchName = args[1].split(' ').pop(); + // const matchRoom = `#mp_${matchId}`; + // this.eventEmitter.emit('newMatchCreated', { matchId, matchName, matchRoom }); } else if (rawCommand === 'PRIVMSG' && args[0].includes('mp')) { const matchId = args[0].split('_').pop(); this.onMpMessage(matchId, { rawMsg, from, channel, text }); @@ -119,7 +131,7 @@ class OsuIrc { joinMatch(match_Id) { return new Promise((resolve, reject) => { const onError = err => { - console.log(err.command); + logger.error(err.command); if (err.command === 'err_nosuchchannel') { reject('No such channel'); } @@ -140,6 +152,7 @@ class OsuIrc { // TODO Don't work when called again before previous call is resolved - Need Fix // makeMatch(name, creator) { return new Promise((resolve, reject) => { + let timeout = 0; const onNewMatch = msg => { const { args } = msg; clearTimeout(timeout); @@ -148,9 +161,9 @@ class OsuIrc { const matchId = args[0].split('_').pop(); resolve({ matchId, name, matchRoom, creator }); }; - const timeout = setTimeout(() => { + timeout = setTimeout(() => { this.eventEmitter.removeListener('newMatchCreated', onNewMatch); - reject('Timed out'); + reject(new Error('Timed out')); }, 5000); this.client.say('banchobot', `!mp make ${name}`); this.eventEmitter.on('newMatchCreated', onNewMatch); diff --git a/src/Bot/index.js b/src/Bot/index.js index 0d325d73..55d0673b 100644 --- a/src/Bot/index.js +++ b/src/Bot/index.js @@ -1,7 +1,10 @@ +import ElectronLog from 'electron-log'; import Bot from './Bot'; import store from '../shared/store'; import { getOsuApiKey } from '../App/modules/Settings/reducer/selectors'; +const logger = ElectronLog.scope('bot'); + export default () => { const state = store.getState(); const { bot } = state; @@ -14,15 +17,15 @@ export default () => { }; const { connected, instance } = bot; - + if (!instance.connect) { - console.log('connecting using new Bot'); + logger.log('connecting using new Bot'); store.dispatch({ type: 'CONNECT', payload: { status: 'connecting', instance: new Bot(botSettings) } }); } else if (connected) { - console.log('disconnecting'); + logger.log('disconnecting'); instance.disconnect(); } else { - console.log('connecting using existing Bot'); + logger.log('connecting using existing Bot'); store.dispatch({ type: 'CONNECT', payload: { status: 'connecting' } }); instance.connect(); } diff --git a/src/Bot/msg/mpSettings.js b/src/Bot/msg/mpSettings.js index b1a8d017..df9e9145 100644 --- a/src/Bot/msg/mpSettings.js +++ b/src/Bot/msg/mpSettings.js @@ -1,18 +1,27 @@ /* eslint-disable array-callback-return */ +import ElectronLog from 'electron-log'; import store from '../../shared/store'; import { updateSingleMatch } from '../actions'; +const logger = ElectronLog.scope('bot-mp-settings'); + export default function(msg) { const osuApi = store.getState().bot.instance.osuApi; let msgDatas = msg.split(',').map(data => data.split(/:(?!\/)/g)); //msgDatas = msgDatas - console.log(msgDatas); + logger.log(msgDatas); const mpData = {}; // Players infos if (msgDatas[0].length === 1) { const player = {}; - const indexes = [[7, 'slot'], [17, 'readyState'], [46, 'userProfileUrl'], [62, 'userName'], [69, 'isHost']]; + const indexes = [ + [7, 'slot'], + [17, 'readyState'], + [46, 'userProfileUrl'], + [62, 'userName'], + [69, 'isHost'], + ]; indexes.map((index, i) => { player[index[1]] = msgDatas[0][0].slice(i > 0 ? indexes[i - 1][0] : 0, index[0]).replace(/\s/g, ''); }); @@ -20,7 +29,7 @@ export default function(msg) { mpData.player = []; } mpData.player.push(player); - console.log(player); + logger.log(player); if (player.isHost === '[Host]') { this.host = player.userName; updateSingleMatch(this); @@ -37,14 +46,14 @@ export default function(msg) { d.includes('https://osu.ppy.sh/b/') ? /.*?(\d+)/i.exec(d.split(' ')[1])[1] : d.replace(/\s/g, ''), ); mpData[data[0]] = data[1]; - console.log(mpData); + logger.log(mpData); if (data[0] === 'Beatmap') { - console.log('osuApi', data[1]); + logger.log('osuApi', data[1]); osuApi.getSetId(data[1]).then(beatmap => { this.beatmapset_id = beatmap.beatmapset_id; this.fullBeatmapData = beatmap; updateSingleMatch(this); - console.log('osuapi', beatmap); + logger.log('osuapi', beatmap); }); } return mpData; diff --git a/src/Bot/multiplayer/mpMatch.js b/src/Bot/multiplayer/mpMatch.js index 0a8b55de..0991168f 100644 --- a/src/Bot/multiplayer/mpMatch.js +++ b/src/Bot/multiplayer/mpMatch.js @@ -1,3 +1,4 @@ +import ElectronLog from 'electron-log'; import { getDlLink } from '../BeatconnectApi'; import mpSettingsMessage from '../msg/mpSettings'; import { updateSingleMatch } from '../actions'; @@ -24,6 +25,8 @@ class MpMatch { this.creatorJoined = false; this.startTime = Date.now(); this.mpSettingsMessage = mpSettingsMessage.bind(this); + this.logger = ElectronLog.scope(`Bot-mp-match-${id}`); + this.logger.log('Init'); if (this.creator) { this.invitePlayer(this.creator); this.matchType = 'tournament'; @@ -31,6 +34,7 @@ class MpMatch { this.welcome('existingMatch'); this.matchType = 'standard'; } + this.logger.log('match type = ', this.matchType); } updateBeatmap(beatmap) { @@ -79,24 +83,31 @@ class MpMatch { this.welcome('newMatch'); } else if (this.players.length === 0) this.makeHost(player); this.players.push(player); - console.log(this.matchName + ' players: ' + this.players); + this.logger.info(`new player (${player}) joined!`); + this.logger.debug(`playerlist = `, this.players); } playerLeave(player) { + this.logger.info(`player (${player}) left!`); this.players = this.players.filter(p => p !== player); if (this.players.length > 0 && this.host === player) { + this.logger.info(`host left, transfering host to `, this.players[0]); this.makeHost(this.players[0]); - } else { + } else if (this.players.length === 0) { + this.logger.info('no player left'); if (this.matchType === 'tournament' && !this.timeout) { + this.logger.info('match will be close'); + this.timeout = setTimeout(() => { this.ircClient.pm(this.ircRoom, '!mp close'); this.destroy(this.id); }, 60000 * 0.3); } else { + this.logger.info('disconnecting from match'); this.destroy(this.id); } } - console.log(this.matchName + ' players: ' + this.players); + this.logger.debug(`playerlist = `, this.players); } start() { diff --git a/src/electron/index.js b/src/electron/index.js index 540ec55f..9a7a3e2c 100644 --- a/src/electron/index.js +++ b/src/electron/index.js @@ -14,6 +14,7 @@ require('./ipcMessages'); log.transports.file.level = 'debug'; autoUpdater.logger = log; +log.catchErrors(); const installExtensions = async extensions => { return Promise.all(