Skip to content

Commit 492e2c9

Browse files
committed
feat(jsbattle): list recent league battles
1 parent ffdfa7a commit 492e2c9

28 files changed

+583
-91
lines changed
0 Bytes
Loading
Loading
Loading
Loading
Loading
Loading
0 Bytes
Loading
0 Bytes
Loading

packages/jsbattle-mockserver/app/init_db.json

+131-32
Original file line numberDiff line numberDiff line change
@@ -291,12 +291,9 @@
291291
"scriptName": "nihnae",
292292
"joinedAt": "2020-02-23T08:27:42.940Z",
293293
"rank": 1,
294-
"fights": {
295-
"total": 343,
296-
"won": 128,
297-
"lose": 223,
298-
"error": 43
299-
},
294+
"fights_total": 343,
295+
"fights_win": 128,
296+
"fights_lose": 43,
300297
"score": 1092
301298
},
302299
"user,league": {
@@ -308,12 +305,9 @@
308305
"scriptName": "nihnae",
309306
"joinedAt": "2020-02-23T08:27:42.940Z",
310307
"rank": 1,
311-
"fights": {
312-
"total": 343,
313-
"won": 128,
314-
"lose": 223,
315-
"error": 43
316-
},
308+
"fights_total": 343,
309+
"fights_win": 128,
310+
"fights_lose": 43,
317311
"score": 1092
318312
},
319313
"ranktable": [
@@ -325,13 +319,10 @@
325319
"scriptName": "killa-8",
326320
"joinedAt": "2020-01-28T10:27:42.940Z",
327321
"rank": 1,
328-
"fights": {
329-
"total": 642,
330-
"won": 561,
331-
"lose": 213,
332-
"error": 1
333-
},
334-
"score": 1872
322+
"fights_total": 343,
323+
"fights_win": 128,
324+
"fights_lose": 43,
325+
"score": 1092
335326
},
336327
{
337328
"id": "U7aO66layk0yEqwg",
@@ -341,12 +332,9 @@
341332
"scriptName": "nihnae",
342333
"joinedAt": "2020-02-23T08:27:42.940Z",
343334
"rank": 2,
344-
"fights": {
345-
"total": 343,
346-
"won": 128,
347-
"lose": 223,
348-
"error": 43
349-
},
335+
"fights_total": 342,
336+
"fights_win": 50,
337+
"fights_lose": 122,
350338
"score": 1092
351339
},
352340
{
@@ -357,14 +345,125 @@
357345
"scriptName": "3ll3a",
358346
"joinedAt": "2020-04-01T12:34:42.940Z",
359347
"rank": 3,
360-
"fights": {
361-
"total": 123,
362-
"won": 120,
363-
"lose": 2,
364-
"error": 1
365-
},
366-
"score": 993
348+
"fights_total": 354,
349+
"fights_win": 128,
350+
"fights_lose": 43,
351+
"score": 1092
367352
}
353+
],
354+
"history": [
355+
{
356+
"id": "p0lYXgSL6l8QcRLc",
357+
"createdAt": "2020-04-01T12:34:49.940Z",
358+
"players": [
359+
{
360+
"id": "DmYdtErQJnZGpp9y",
361+
"name": "jsbattle/crawler",
362+
"winner": true
363+
},
364+
{
365+
"id": "wEnX0XSEfAIPmyOi",
366+
"name": "jsbattle/chicken",
367+
"winner": false
368+
}
369+
]
370+
},
371+
{
372+
"id": "ORhzc8LFEoUhZg2N",
373+
"createdAt": "2020-04-01T12:34:48.940Z",
374+
"players": [
375+
{
376+
"id": "pMaaEfDjmw65gQKR",
377+
"name": "jsbattle/dodge",
378+
"winner": true
379+
},
380+
{
381+
"id": "DmYdtErQJnZGpp9y",
382+
"name": "jsbattle/crawler",
383+
"winner": false
384+
}
385+
]
386+
},
387+
{
388+
"id": "QokqNqarUwI1lxpo",
389+
"createdAt": "2020-04-01T12:34:47.940Z",
390+
"players": [
391+
{
392+
"id": "iVl94fUAOiXXGm3H",
393+
"name": "jsbattle/sniper",
394+
"winner": false
395+
},
396+
{
397+
"id": "ME1DpnV8uHet6tjl",
398+
"name": "jsbattle/kamikaze",
399+
"winner": true
400+
}
401+
]
402+
},
403+
{
404+
"id": "misNbE35uRlw43kM",
405+
"createdAt": "2020-04-01T12:34:46.940Z",
406+
"players": [
407+
{
408+
"id": "pMaaEfDjmw65gQKR",
409+
"name": "jsbattle/dodge",
410+
"winner": true
411+
},
412+
{
413+
"id": "wEnX0XSEfAIPmyOi",
414+
"name": "jsbattle/chicken",
415+
"winner": false
416+
}
417+
]
418+
},
419+
{
420+
"id": "op6qpAicpDB88qq5",
421+
"createdAt": "2020-04-01T12:34:45.940Z",
422+
"players": [
423+
{
424+
"id": "13zCqjrThAGrw2vf",
425+
"name": "jsbattle/jamro",
426+
"winner": false
427+
},
428+
{
429+
"id": "pMaaEfDjmw65gQKR",
430+
"name": "jsbattle/dodge",
431+
"winner": false
432+
}
433+
]
434+
},
435+
{
436+
"id": "sVFjmG406YnTSUa5",
437+
"createdAt": "2020-04-01T12:34:44.940Z",
438+
"players": [
439+
{
440+
"id": "iVl94fUAOiXXGm3H",
441+
"name": "jsbattle/sniper",
442+
"winner": true
443+
},
444+
{
445+
"id": "DmYdtErQJnZGpp9y",
446+
"name": "jsbattle/crawler",
447+
"winner": false
448+
}
449+
]
450+
},
451+
{
452+
"id": "RTS41R2bY2XBaRb5",
453+
"createdAt": "2020-04-01T12:34:43.940Z",
454+
"players": [
455+
{
456+
"id": "DmYdtErQJnZGpp9y",
457+
"name": "jsbattle/crawler",
458+
"winner": true
459+
},
460+
{
461+
"id": "Q4W23fZ49j84nRQa",
462+
"name": "jsbattle/crazy",
463+
"winner": false
464+
}
465+
]
466+
}
368467
]
369468
},
370469
"authMethods": {

packages/jsbattle-server/.eslintrc.js

+5-1
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,11 @@ module.exports = {
9999
"max-classes-per-file": "error",
100100
"max-depth": "error",
101101
"max-len": "off",
102-
"max-lines": "error",
102+
"max-lines": ["error", {
103+
"max": 300,
104+
"skipBlankLines": true,
105+
"skipComments": true
106+
}],
103107
"max-lines-per-function": "off",
104108
"max-nested-callbacks": "error",
105109
"max-params": "off",

packages/jsbattle-server/app/services/BattleStore.service.js

+6-3
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,17 @@ class BattleStoreService extends Service {
2121
"createdAt",
2222
"expiresAt",
2323
"ubd",
24-
"description"
24+
"description",
25+
"meta"
2526
]
2627
},
2728
entityValidator: {
2829
ubd: { type: "string", min: 2 },
2930
description: { type: "string", max: 128 },
3031
createdAt: "date",
3132
expiresAt: "date",
32-
expiresIn: "number"
33+
expiresIn: "number",
34+
meta: "object",
3335
},
3436
dependencies: ['ubdValidator'],
3537
actions: {
@@ -53,6 +55,7 @@ class BattleStoreService extends Service {
5355
}
5456
ctx.params.createdAt = new Date();
5557
ctx.params.expiresAt = ctx.params.expiresAt || defaultExpires;
58+
ctx.params.meta = ctx.params.meta || {};
5659
ctx.params = _.omit(ctx.params, ['id']);
5760
return ctx;
5861
}
@@ -114,7 +117,7 @@ class BattleStoreService extends Service {
114117
this.logger.info(`Publishing UBD`);
115118
let response = await this._create(ctx, ctx.params);
116119

117-
return response
120+
return response;
118121
}
119122

120123
}

packages/jsbattle-server/app/services/League.service.js

+31-3
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ const _ = require('lodash');
55
const getDbAdapterConfig = require("../lib/getDbAdapterConfig.js");
66
const fs = require('fs');
77
const path = require('path');
8-
const RankTable = require('./league/RankTable.js');
8+
const RankTable = require('./league/lib/RankTable.js');
99

1010
class LeagueService extends Service {
1111

@@ -48,11 +48,15 @@ class LeagueService extends Service {
4848
score: "number",
4949
code: { type: "string", min: 0, max: 65536 },
5050
},
51-
dependencies: ['scriptStore'],
51+
dependencies: [
52+
'scriptStore',
53+
'battleStore'
54+
],
5255
actions: {
5356
pickRandomOpponents: this.pickRandomOpponents,
5457
seedLeague: this.seedLeague,
5558
getUserSubmission: this.getUserSubmission,
59+
getHistory: this.getHistory,
5660
joinLeague: this.joinLeague,
5761
leaveLeague: this.leaveLeague,
5862
getLeagueSummary: this.getLeagueSummary,
@@ -102,6 +106,29 @@ class LeagueService extends Service {
102106
});
103107
}
104108

109+
async getHistory(ctx) {
110+
let items = await ctx.call('battleStore.find', {
111+
sort: '-createdAt',
112+
limit: 7,
113+
fields: [
114+
"id",
115+
"description",
116+
"meta",
117+
"createdAt"
118+
]
119+
});
120+
items = items.map((item) => ({
121+
id: item.id,
122+
createdAt: item.createdAt,
123+
players: item.meta.map((player) => ({
124+
id: player.id,
125+
name: player.name,
126+
winner: player.winner
127+
}))
128+
}))
129+
return items;
130+
}
131+
105132
async updateRank(ctx) {
106133
if(!ctx || !ctx.params || ctx.params.id === undefined) {
107134
throw new ValidationError('id parameter is required!');
@@ -287,7 +314,8 @@ class LeagueService extends Service {
287314

288315
return {
289316
submission,
290-
ranktable: this.ranktable.slice(submission.id, 7)
317+
ranktable: this.ranktable.slice(submission.id, 7),
318+
history: await ctx.call('league.getHistory', {})
291319
}
292320
}
293321
}

packages/jsbattle-server/app/services/LeagueScheduler.service.js

+25-12
Original file line numberDiff line numberDiff line change
@@ -61,14 +61,34 @@ class LeagueScheduler extends Service {
6161
if(!teamList || teamList.length != 2) {
6262
throw new Error('teamList must have exactly 2 elements');
6363
}
64+
65+
let winner = teamList.reduce((best, current) => {
66+
if(current.score > best.score) {
67+
return current;
68+
} else {
69+
return best;
70+
}
71+
}, teamList[0]);
72+
let loser = teamList.reduce((worst, current) => {
73+
if(current.score < worst.score) {
74+
return current;
75+
} else {
76+
return worst;
77+
}
78+
}, teamList[0]);
79+
if(winner == loser) {
80+
winner = null;
81+
}
82+
6483
teamList = teamList.map((team) => {
6584
if(!refData || !refData[team.name]) {
6685
throw new Error('no team mapping in refData for: ' + team.name);
6786
}
6887
return {
6988
id: refData[team.name],
7089
name: team.name,
71-
battleScore: team.score
90+
battleScore: team.score,
91+
winner: team == winner
7292
}
7393
});
7494

@@ -78,24 +98,17 @@ class LeagueScheduler extends Service {
7898
await ctx.call('battleStore.create', {
7999
ubd: ubd,
80100
expiresIn: this.config.historyDuration,
81-
description: description
82-
})
83-
84-
let winner = teamList.reduce((best, current) => {
85-
if(current.battleScore > best.battleScore) {
86-
return current;
87-
} else {
88-
return best;
89-
}
90-
}, teamList[0]);
101+
description: description,
102+
meta: teamList
103+
});
91104

92105
let updateCalls = teamList.map((team) => new Promise(async (resolve) => {
93106
try {
94107
await ctx.call('league.updateRank', {
95108
id: team.id,
96109
name: team.name,
97110
battleScore: team.battleScore,
98-
winner: team == winner
111+
winner: team.winner
99112
});
100113
} catch (err) {
101114
this.logger.warn('Unable to store battle results of ' + team.name + ': ' + err.message);

packages/jsbattle-server/app/services/UbdPlayer.service.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ class UbdPlayer extends Service {
8181
const element = await page.$("#output");
8282
const text = await page.evaluate((element) => element.innerHTML, element);
8383
await page.close();
84-
const jsonResult = JSON.parse(text)
84+
const jsonResult = JSON.parse(text);
8585
jsonResult.ubd = ubd;
8686
if(task.refData) {
8787
jsonResult.refData = task.refData;

0 commit comments

Comments
 (0)