gamelet-cli 0.6.2 → 0.6.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/LICENSE +0 -0
  2. package/README.md +0 -0
  3. package/assets/common.d.ts +4 -4
  4. package/assets/gitignore.txt +65 -65
  5. package/assets/launch.json +21 -21
  6. package/assets/package.json.twig +22 -22
  7. package/assets/server/greenlock.d/config.json +25 -25
  8. package/assets/server/static/css/style.css +0 -0
  9. package/assets/server/static/js/monitor.js +0 -0
  10. package/assets/server/static/js/test.js +0 -0
  11. package/assets/server/views/error.twig +0 -0
  12. package/assets/server/views/index.twig +0 -0
  13. package/assets/server/views/monitor.twig +0 -0
  14. package/assets/server/views/test.twig +0 -0
  15. package/assets/tsconfig.json.twig +42 -42
  16. package/build/package.json +67 -67
  17. package/build/src/gamelet/download.js +736 -736
  18. package/build/src/gamelet/merges.js +143 -143
  19. package/build/src/gamelet/prepare.js +274 -274
  20. package/build/src/gamelet/upload.js +278 -278
  21. package/build/src/index.js +85 -85
  22. package/build/src/server/Constant.js +9 -9
  23. package/build/src/server/entities/Client.js +77 -77
  24. package/build/src/server/entities/ClientOwner.js +66 -66
  25. package/build/src/server/entities/ClientProject.js +83 -83
  26. package/build/src/server/entities/Gameroom.js +88 -88
  27. package/build/src/server/entities/GameroomBase.js +275 -275
  28. package/build/src/server/entities/Gamezone.js +72 -72
  29. package/build/src/server/entities/ListFilter.js +192 -192
  30. package/build/src/server/entities/Monitor.js +80 -80
  31. package/build/src/server/entities/Player.js +131 -131
  32. package/build/src/server/managers/ApiManager.js +74 -74
  33. package/build/src/server/managers/ClientManager.js +63 -63
  34. package/build/src/server/managers/Database.js +664 -594
  35. package/build/src/server/managers/GameroomManager.js +391 -391
  36. package/build/src/server/managers/ManagerBase.js +16 -16
  37. package/build/src/server/managers/MonitorManager.js +72 -72
  38. package/build/src/server/managers/PlayerManager.js +103 -103
  39. package/build/src/server/managers/SocketManager.js +55 -55
  40. package/build/src/server/managers/UserManager.js +57 -57
  41. package/build/src/server/messages/Message.js +141 -141
  42. package/build/src/server/server.js +109 -109
  43. package/build/src/server/services/ServiceBase.js +24 -24
  44. package/build/src/server/services/clientService.js +23 -23
  45. package/build/src/server/services/gameroomService.js +121 -121
  46. package/build/src/server/services/gltserver.service.js +23 -23
  47. package/build/src/server/services/playerService.js +29 -29
  48. package/build/src/server/startServer.js +32 -32
  49. package/build/src/server/types/BadgeStatus.js +24 -24
  50. package/build/src/server/types/OrderType.js +37 -37
  51. package/build/src/server/types/SubmitType.js +23 -23
  52. package/build/src/server/types/TimeRange.js +25 -25
  53. package/build/src/server/utils/ArrayUtil.js +125 -125
  54. package/build/src/server/utils/IntUtil.js +9 -9
  55. package/build/src/server/utils/ObjectUtil.js +190 -190
  56. package/build/src/server/utils/StringUtil.js +36 -36
  57. package/build/src/server/vo/Database.js +0 -0
  58. package/build/src/server/vo/Gameroom.js +0 -0
  59. package/build/src/server/vo/Gamezone.js +0 -0
  60. package/build/src/server/vo/Player.js +0 -0
  61. package/build/src/server/vo/Response.js +0 -0
  62. package/build/src/server/vo/System.js +0 -0
  63. package/build/src/utils/cli.js +48 -48
  64. package/build/src/utils/file.js +326 -326
  65. package/build/src/utils/init.js +41 -41
  66. package/build/src/utils/log.js +16 -16
  67. package/build/src/utils/net.js +38 -38
  68. package/package.json +2 -2
@@ -1,594 +1,664 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.database = exports.Database = void 0;
4
- const TimeRange_1 = require("./../types/TimeRange");
5
- const SubmitType_1 = require("./../types/SubmitType");
6
- const file_1 = require("../../utils/file");
7
- const Constant_1 = require("../Constant");
8
- const UserManager_1 = require("./UserManager");
9
- function getServerTimestamp(add = 0) {
10
- return Math.floor((Date.now() + add) / 1000);
11
- }
12
- class Database {
13
- constructor() {
14
- this._userItems = {};
15
- this._userBadges = {};
16
- // key = username|scoreKey
17
- this._userScores = {};
18
- // username / category / key
19
- this._userStates = {};
20
- this._login = {};
21
- this._gltPoints = 100;
22
- }
23
- _initialize(folder) {
24
- this.importBadges(folder + '/static/json/badges.json');
25
- this.importItems(folder + '/static/json/items.json');
26
- this.importScoreModes(folder + '/static/json/score_modes.json');
27
- this._dbFolder = folder + '/.cg/db';
28
- }
29
- importBadges(file) {
30
- file_1.getFileJson(file)
31
- .then(json => {
32
- this._badges = json.list;
33
- });
34
- }
35
- importItems(file) {
36
- file_1.getFileJson(file)
37
- .then(json => {
38
- this._items = json.list;
39
- });
40
- }
41
- importScoreModes(file) {
42
- file_1.getFileJson(file)
43
- .then(json => {
44
- this._scoreModes = json.list;
45
- });
46
- }
47
- requireLogin(user) {
48
- return user;
49
- }
50
- getUserState(username, category, key) {
51
- let uState = this._userStates[username] = this._userStates[username] || {};
52
- let cState = uState[category] = uState[category] || {};
53
- let kState = cState[key] = cState[key] || {
54
- username: username,
55
- category: category,
56
- key: key,
57
- time: getServerTimestamp(),
58
- value: '',
59
- };
60
- return kState;
61
- }
62
- listScoreModes() {
63
- return Promise.resolve(this._scoreModes);
64
- }
65
- listGameBadges() {
66
- return Promise.resolve(this._badges);
67
- }
68
- getGameBadge(badgeCode) {
69
- return this.listGameBadges().then(list => list.find(b => b.code == badgeCode));
70
- }
71
- getUserBadge(username, badgeCode) {
72
- let list = this._userBadges[username];
73
- return list && list.find(ub => ub.gameBadge.code == badgeCode);
74
- }
75
- addUserBadge(userBadge) {
76
- let list = this._userBadges[userBadge.user.username];
77
- if (!list) {
78
- list = this._userBadges[userBadge.user.username] = [];
79
- }
80
- list.push(userBadge);
81
- }
82
- listGameItems() {
83
- return Promise.resolve(this._items);
84
- }
85
- getGameItem(itemCode) {
86
- return this.listGameItems().then(list => list.find(i => i.code == itemCode));
87
- }
88
- getUserItem(username, itemCode) {
89
- let list = this._userItems[username];
90
- return list && list.find(ui => ui.itemCode == itemCode);
91
- }
92
- addUserItem(userItem) {
93
- let list = this._userItems[userItem.user.username];
94
- if (!list) {
95
- list = this._userItems[userItem.user.username] = [];
96
- }
97
- list.push(userItem);
98
- }
99
- getUserScoreMap(username, scoreKey) {
100
- let key = `${username}|${scoreKey}`;
101
- let userScoreMap = this._userScores[key];
102
- if (!userScoreMap) {
103
- userScoreMap = this._userScores[key] = {
104
- scoreKey: scoreKey,
105
- };
106
- }
107
- return userScoreMap;
108
- }
109
- getUserScore(username, scoreKey, timeRange) {
110
- let userScoreMap = this.getUserScoreMap(username, scoreKey);
111
- return userScoreMap[timeRange.value];
112
- }
113
- submitUserScore(user, scoreKey, timeRange, submitType, score) {
114
- let userScoreMap = this.getUserScoreMap(user.username, scoreKey);
115
- let userScore = userScoreMap[timeRange.value];
116
- if (!userScore) {
117
- userScore = {
118
- user: user,
119
- score: score,
120
- time: getServerTimestamp(),
121
- };
122
- userScoreMap[timeRange.value] = userScore;
123
- }
124
- else {
125
- let currentScore = userScore.score;
126
- let newScore = currentScore;
127
- let time = getServerTimestamp();
128
- if (submitType == SubmitType_1.SubmitType.KEEP_HIGHEST) {
129
- if (score > currentScore) {
130
- newScore = score;
131
- }
132
- }
133
- else if (submitType == SubmitType_1.SubmitType.KEEP_LOWEST) {
134
- if (score < currentScore) {
135
- newScore = score;
136
- }
137
- }
138
- else if (submitType == SubmitType_1.SubmitType.OVERWRITE) {
139
- newScore = score;
140
- }
141
- else if (submitType == SubmitType_1.SubmitType.ADD) {
142
- newScore = currentScore + score;
143
- }
144
- else if (submitType == SubmitType_1.SubmitType.ADD_SINCE) {
145
- newScore = currentScore + score;
146
- time = userScore.time;
147
- }
148
- if (newScore != currentScore) {
149
- userScore.time = time;
150
- userScore.score = newScore;
151
- }
152
- }
153
- return userScore;
154
- }
155
- executeCommand(user, command) {
156
- let key = [command.service, command.method].join('__');
157
- let func = this[key];
158
- if (func) {
159
- return Promise.resolve()
160
- .then(() => {
161
- return func.apply(this, [user].concat(JSON.parse(command.params)));
162
- })
163
- .then(result => {
164
- if (result && result._result_) {
165
- return result._result_;
166
- }
167
- else {
168
- return [result];
169
- }
170
- });
171
- }
172
- else {
173
- return Promise.reject(`${key} is not implemneted in offline database.`);
174
- }
175
- }
176
- // system service----------------
177
- system__echo(user, message) {
178
- return [message];
179
- }
180
- system__debugReport(user, subject, content) {
181
- return [1];
182
- }
183
- // badge service ----------------
184
- badge__listGameBadgesByStatus(user, pcode, statusList) {
185
- return this.listGameBadges()
186
- .then(list => list.filter(badge => statusList.find(status => status.value == badge.status)));
187
- }
188
- badge__listGameBadgesByCodes(user, pcode, badgeCodes) {
189
- return this.listGameBadges()
190
- .then(list => list.filter(badge => badgeCodes.includes(badge.code)));
191
- }
192
- badge__getUserBadge(user, pcode, username, badgeCode) {
193
- let list = this._userBadges[username];
194
- let badge = list && list.find(ub => ub.gameBadge.code == badgeCode);
195
- return this.getUserBadge(username, badgeCode);
196
- }
197
- badge__awardBadge(user, pcode, badgeCode) {
198
- return this.getGameBadge(badgeCode)
199
- .then(badge => {
200
- if (!badge) {
201
- return Promise.reject('Badge not found');
202
- }
203
- let me = this.requireLogin(user);
204
- let userBadge = this.getUserBadge(me.username, badgeCode);
205
- if (userBadge && userBadge.count && !badge.repeatable) {
206
- return Promise.reject('The user already has the badge');
207
- }
208
- if (!userBadge) {
209
- userBadge = {
210
- user: me,
211
- gameBadge: badge,
212
- count: 0,
213
- createTime: getServerTimestamp(),
214
- modifyTime: 0,
215
- };
216
- this.addUserBadge(userBadge);
217
- }
218
- badge.aquired++;
219
- userBadge.count++;
220
- userBadge.modifyTime = getServerTimestamp();
221
- return userBadge;
222
- });
223
- }
224
- badge__removeUserBadge(user, pcode, badgeCode) {
225
- return this.getGameBadge(badgeCode)
226
- .then(badge => {
227
- if (!badge) {
228
- return Promise.reject('Badge not found');
229
- }
230
- let me = this.requireLogin(user);
231
- let userBadge = this.getUserBadge(me.username, badgeCode);
232
- if (!userBadge || !userBadge.count) {
233
- throw new Error('The user does not have the badge');
234
- }
235
- badge.aquired -= userBadge.count;
236
- userBadge.count = 0;
237
- return Promise.resolve();
238
- });
239
- }
240
- badge__listUserBadgesByUser(user, pcode, username) {
241
- return (this._userBadges[username] || []);
242
- }
243
- badge__listUserBadgesByBadge(user, pcode, badgeCode, start, length) {
244
- let list = [];
245
- for (let uname in this._userBadges) {
246
- let ubadges = this._userBadges[uname];
247
- let ubadge = ubadges.find(ub => ub.gameBadge.code == badgeCode);
248
- if (ubadge) {
249
- list.push(ubadge);
250
- }
251
- }
252
- if (start < list.length) {
253
- return list.slice(start, length);
254
- }
255
- return [];
256
- }
257
- // client service ----------------------
258
- client__getMsgServerUrl(user, pcode) {
259
- return 'http://localhost:' + Constant_1.Constant.ServerPort;
260
- }
261
- client__isAllowGltDollar(user, pcode) {
262
- return true;
263
- }
264
- // item service ------------------------
265
- item__awardItem(user, pcode, itemCode, count) {
266
- return this.getGameItem(itemCode)
267
- .then(item => {
268
- if (!item) {
269
- return Promise.reject('Item not found');
270
- }
271
- if (count <= 0) {
272
- return Promise.reject('count is 0 or less');
273
- }
274
- let me = this.requireLogin(user);
275
- let userItem = this.getUserItem(me.username, itemCode);
276
- if (userItem) {
277
- if (item.validDays) {
278
- if (userItem.count >= 1) {
279
- return Promise.reject('A user can have only one of this item.');
280
- }
281
- }
282
- else if (userItem.count >= item.limitPerUser) {
283
- return Promise.reject('The amount of the item exceeded its limit');
284
- }
285
- }
286
- else {
287
- userItem = {
288
- user: me,
289
- itemCode: itemCode,
290
- count: 0,
291
- expireTime: 0,
292
- };
293
- this.addUserItem(userItem);
294
- }
295
- userItem.count++;
296
- let validDays = item.validDays ? item.validDays : 3650;
297
- userItem.expireTime = getServerTimestamp(validDays * Constant_1.Constant.ONE_DAY);
298
- return userItem;
299
- });
300
- }
301
- item__consumeItem(user, pcode, itemCode, count) {
302
- return this.getGameItem(itemCode)
303
- .then(item => {
304
- if (!item) {
305
- return Promise.reject('Item not found');
306
- }
307
- if (count < 0) {
308
- return Promise.reject('count is a negative number');
309
- }
310
- let me = this.requireLogin(user);
311
- let userItem = this.getUserItem(me.username, itemCode);
312
- if (!userItem || !userItem.count) {
313
- return Promise.reject('The user does not have the item');
314
- }
315
- let newCount = userItem.count - count;
316
- if (newCount < 0) {
317
- return Promise.reject('The user does not have enough of the item to consume');
318
- }
319
- userItem.count = newCount;
320
- return userItem;
321
- });
322
- }
323
- item__listGameItems(user, pcode) {
324
- return this.listGameItems();
325
- }
326
- item__listGameItemsByStatus(user, pcode, statusCodes) {
327
- return this.listGameItems()
328
- .then(list => list.filter(item => statusCodes.includes(item.status)));
329
- }
330
- item__listGameItemsByCodes(user, pcode, itemCodes) {
331
- return this.listGameItems()
332
- .then(list => list.filter(item => itemCodes.includes(item.code)));
333
- }
334
- item__getUserItem(user, pcode, itemCode) {
335
- let me = this.requireLogin(user);
336
- let userItem = this.getUserItem(me.username, itemCode);
337
- if (userItem && userItem.count > 0) {
338
- return userItem;
339
- }
340
- else {
341
- return null;
342
- }
343
- }
344
- item__requireUserItem(user, pcode, itemCode, count) {
345
- let me = this.requireLogin(user);
346
- let userItem = this.getUserItem(me.username, itemCode);
347
- if (count > 0) {
348
- if (!userItem || userItem.count < count) {
349
- throw new Error('Insufficient amount of the item');
350
- }
351
- }
352
- return userItem;
353
- }
354
- item__requireOneOfUserItems(user, pcode, itemCodes, counts) {
355
- let me = this.requireLogin(user);
356
- return itemCodes.map((itemCode, index) => {
357
- let userItem = this.getUserItem(me.username, itemCode);
358
- let count = counts[index];
359
- if (count > 0) {
360
- if (!userItem || userItem.count < counts[index]) {
361
- throw new Error('Insufficient amount of an item');
362
- }
363
- }
364
- return userItem;
365
- });
366
- }
367
- item__listUserItemsByCodesAndClient(user, pcode, clientCode, itemCodes) {
368
- if (clientCode == pcode) {
369
- return this.item__listUserItems(user, pcode, 0, 1000).filter(ui => itemCodes.includes(ui.itemCode));
370
- }
371
- return [];
372
- }
373
- item__listUserItems(user, pcode, start, length) {
374
- let me = this.requireLogin(user);
375
- let list = this._userItems[me.username] || [];
376
- return list;
377
- }
378
- // score service
379
- score__listPublicScoreModes() {
380
- return this.listScoreModes().then(list => list.filter(mode => !mode.disabled && mode.length));
381
- }
382
- score__submitScore(user, pcode, scoreKey, score, submitTypeValue) {
383
- let me = this.requireLogin(user);
384
- let submitType = SubmitType_1.SubmitType.getByValue(submitTypeValue);
385
- TimeRange_1.TimeRange.listAll().forEach(timeRange => {
386
- this.submitUserScore(me, scoreKey, timeRange, submitType, score);
387
- });
388
- return this.getUserScoreMap(me.username, scoreKey);
389
- }
390
- score__submitScores(user, pcode, submits) {
391
- let list = submits.map(submit => {
392
- return this.score__submitScore(user, pcode, submit[0], submit[1], submit[2]);
393
- });
394
- return list;
395
- }
396
- score__getScore(user, pcode, scoreKey, timeRange) {
397
- let me = this.requireLogin(user);
398
- return this.getUserScore(me.username, scoreKey, TimeRange_1.TimeRange.getByValue(timeRange)) || {
399
- user: me,
400
- score: 0,
401
- time: 0,
402
- };
403
- }
404
- score__getScoreAndRank(user, pcode, scoreKey, timeRange, orderType, timestamp) {
405
- let me = user;
406
- let userScore = me && this.getUserScore(me.username, scoreKey, TimeRange_1.TimeRange.getByValue(timeRange));
407
- if (!userScore) {
408
- return {
409
- _result_: [null, 0, getServerTimestamp()]
410
- };
411
- }
412
- return [userScore, 1, getServerTimestamp()];
413
- }
414
- score__listScores(user, pcode, scoreKey, timeRange, orderType, timestamp, start, length) {
415
- let me = user;
416
- let userScore = me && this.getUserScore(me.username, scoreKey, TimeRange_1.TimeRange.getByValue(timeRange));
417
- return {
418
- scores: userScore ? [userScore] : [],
419
- rankStart: 1,
420
- periodStart: getServerTimestamp(),
421
- };
422
- }
423
- score__listScoresAndRankAroundUser(user, pcode, scoreKey, timeRange, orderType, timestamp, start, length) {
424
- return this.score__listScores(user, pcode, scoreKey, timeRange, orderType, timestamp, start, length);
425
- }
426
- score__getScoresTotal(user, pcode, scoreKey, timeRange) {
427
- let me = user;
428
- let userScore = me && this.getUserScore(me.username, scoreKey, TimeRange_1.TimeRange.getByValue(timeRange));
429
- return userScore ? 1 : 0;
430
- }
431
- score__listScoresByUsernames(user, pcode, scoreKey, usernames, timeRange, timestamp) {
432
- let me = user;
433
- let userScore = me && this.getUserScore(me.username, scoreKey, TimeRange_1.TimeRange.getByValue(timeRange));
434
- if (userScore && usernames.includes(userScore.user.username)) {
435
- let scoreMap = {};
436
- scoreMap[userScore.user.username] = userScore;
437
- return {
438
- _result_: [[userScore], scoreMap]
439
- };
440
- }
441
- else {
442
- return {
443
- _result_: [[], {}]
444
- };
445
- }
446
- }
447
- score__listScoresHistory(user, pcode, scoreKey, timeRange, startTime, endTime) {
448
- let me = user;
449
- let userScore = me && this.getUserScore(me.username, scoreKey, TimeRange_1.TimeRange.getByValue(timeRange));
450
- return userScore ? [userScore] : [];
451
- }
452
- score__listCurrencyScores(user, pcode) {
453
- let me = this.requireLogin(user);
454
- return this.listScoreModes()
455
- .then(modes => modes.filter(mode => mode.toDollarRate))
456
- .then(modes => {
457
- let list = [];
458
- modes.forEach(mode => {
459
- let userScore = this.getUserScore(me.username, mode.key, TimeRange_1.TimeRange.HISTORY);
460
- if (userScore) {
461
- let scoreWithMode = Object.assign({
462
- scoreMode: mode,
463
- }, userScore);
464
- list.push(scoreWithMode);
465
- }
466
- });
467
- return list;
468
- });
469
- }
470
- score__submitGameDollar(user, pcode, scoreKey, score, meta) {
471
- let me = this.requireLogin(user);
472
- return this.listScoreModes()
473
- .then(modes => modes.find(m => m.key == scoreKey))
474
- .then(mode => {
475
- if (!mode || !mode.toDollarRate) {
476
- return Promise.reject('score key is not a currency key');
477
- }
478
- TimeRange_1.TimeRange.listAll().forEach(timeRange => this.submitUserScore(me, scoreKey, timeRange, SubmitType_1.SubmitType.ADD_SINCE, score));
479
- return this.getUserScoreMap(me.username, scoreKey);
480
- });
481
- }
482
- score__submitGameDollars(user, pcode, submits, meta) {
483
- return Promise.all(submits.map(submit => this.score__submitGameDollar(user, pcode, submit[0], submit[1], meta)));
484
- }
485
- // state service
486
- state__getState(user, pcode, username, category, key) {
487
- let userState = this.getUserState(username, category, key);
488
- return userState.time ? userState : null;
489
- }
490
- state__getMyState(user, pcode, category, key) {
491
- let me = this.requireLogin(user);
492
- return this.state__getState(user, pcode, me.username, category, key);
493
- }
494
- state__getMyStateByClient(user, pcode, clientCode, category, key) {
495
- return pcode == clientCode && this.state__getMyState(user, pcode, category, key);
496
- }
497
- state__setState(user, pcode, username, cateogry, key, value) {
498
- let userState = this.getUserState(username, cateogry, key);
499
- userState.value = value;
500
- userState.time = getServerTimestamp();
501
- file_1.saveData(getUserStateFile(this._dbFolder, userState), JSON.stringify(userState));
502
- return userState;
503
- }
504
- state__setMyState(user, pcode, cateogry, key, value) {
505
- let me = this.requireLogin(user);
506
- return this.state__setState(user, pcode, me.username, cateogry, key, value);
507
- }
508
- state__removeState(user, pcode, username, cateogry, key) {
509
- let userState = this.getUserState(username, cateogry, key);
510
- if (userState.time) {
511
- delete userState.value;
512
- delete userState.time;
513
- return 1;
514
- }
515
- else {
516
- return 0;
517
- }
518
- }
519
- state__removeMyState(user, pcode, category, key) {
520
- let me = this.requireLogin(user);
521
- return this.state__removeState(user, pcode, me.username, category, key);
522
- }
523
- state__getStates(user, pcode, usernames, categories, keys) {
524
- let list = [];
525
- for (let uname of usernames) {
526
- for (let cat of categories) {
527
- for (let key of keys) {
528
- let userState = this.getUserState(uname, cat, key);
529
- if (userState.time) {
530
- list.push(userState);
531
- }
532
- }
533
- }
534
- }
535
- return list;
536
- }
537
- state__getMyStates(user, pcode, categories, keys) {
538
- let me = this.requireLogin(user);
539
- return this.state__getStates(user, pcode, [me.username], categories, keys);
540
- }
541
- state__getMyStatesByClient(user, pcode, clientCode, categories, keys) {
542
- return pcode == clientCode ? this.state__getMyStates(user, pcode, categories, keys) : [];
543
- }
544
- state__removeStates(user, pcode, usernames, categories, keys) {
545
- let removed = 0;
546
- for (let uname of usernames) {
547
- for (let cat of categories) {
548
- for (let key of keys) {
549
- let userState = this.getUserState(uname, cat, key);
550
- if (userState.time) {
551
- delete userState.value;
552
- delete userState.time;
553
- ++removed;
554
- }
555
- }
556
- }
557
- }
558
- return removed;
559
- }
560
- // user service
561
- user__getByUsername(user, pcode, username) {
562
- return UserManager_1.userManager.getByUsername(username);
563
- }
564
- user__listByUsernames(user, pcode, usernames) {
565
- return UserManager_1.userManager.listByUsernames(usernames);
566
- }
567
- user__getWallet(user, pcode) {
568
- let me = this.requireLogin(user);
569
- return this.score__listCurrencyScores(user, pcode)
570
- .then(userScores => {
571
- let dollars = 0;
572
- userScores.forEach(uscore => {
573
- dollars += uscore.score * uscore.scoreMode.toDollarRate;
574
- });
575
- return {
576
- _result_: [
577
- userScores,
578
- me,
579
- dollars,
580
- this._gltPoints,
581
- ]
582
- };
583
- });
584
- }
585
- user__getReview(user, pcode) {
586
- return null;
587
- }
588
- }
589
- exports.Database = Database;
590
- function getUserStateFile(dbFolder, userState) {
591
- return `${dbFolder}/user/${userState.username}/state/${userState.category}/${userState.key}.json`;
592
- }
593
- exports.database = new Database();
594
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGF0YWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VydmVyL21hbmFnZXJzL0RhdGFiYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLG9EQUFpRDtBQUNqRCxzREFBbUQ7QUFDbkQsMkNBQXlEO0FBQ3pELDBDQUF1QztBQUN2QywrQ0FBNEM7QUFHNUMsU0FBUyxrQkFBa0IsQ0FBQyxNQUFjLENBQUM7SUFDdkMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO0FBQ2pELENBQUM7QUFFRCxNQUFhLFFBQVE7SUFBckI7UUFNWSxlQUFVLEdBQXFDLEVBQUUsQ0FBQztRQUNsRCxnQkFBVyxHQUFzQyxFQUFFLENBQUM7UUFDNUQsMEJBQTBCO1FBQ2xCLGdCQUFXLEdBQXVDLEVBQUUsQ0FBQztRQUM3RCw0QkFBNEI7UUFDcEIsZ0JBQVcsR0FBMEUsRUFBRSxDQUFDO1FBRXhGLFdBQU0sR0FBb0QsRUFBRSxDQUFDO1FBRTdELGVBQVUsR0FBVyxHQUFHLENBQUM7SUE4akJyQyxDQUFDO0lBMWpCRyxXQUFXLENBQUMsTUFBYztRQUN0QixJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRywwQkFBMEIsQ0FBQyxDQUFBO1FBQ3RELElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLHlCQUF5QixDQUFDLENBQUE7UUFDcEQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sR0FBRywrQkFBK0IsQ0FBQyxDQUFBO1FBQy9ELElBQUksQ0FBQyxTQUFTLEdBQUcsTUFBTSxHQUFHLFNBQVMsQ0FBQztJQUN4QyxDQUFDO0lBQ08sWUFBWSxDQUFDLElBQVk7UUFDN0Isa0JBQVcsQ0FBQyxJQUFJLENBQUM7YUFDWixJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDVCxJQUFJLENBQUMsT0FBTyxHQUFHLElB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
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.database = exports.Database = void 0;
4
+ const TimeRange_1 = require("./../types/TimeRange");
5
+ const SubmitType_1 = require("./../types/SubmitType");
6
+ const file_1 = require("../../utils/file");
7
+ const Constant_1 = require("../Constant");
8
+ const UserManager_1 = require("./UserManager");
9
+ function getServerTimestamp(add = 0) {
10
+ return Math.floor((Date.now() + add) / 1000);
11
+ }
12
+ class Database {
13
+ constructor() {
14
+ this._userItems = {};
15
+ this._userBadges = {};
16
+ this._userTeamships = [];
17
+ // key = username|scoreKey
18
+ this._userScores = {};
19
+ // username / category / key
20
+ this._userStates = {};
21
+ this._login = {};
22
+ this._gltPoints = 100;
23
+ }
24
+ _initialize(folder) {
25
+ this.importBadges(folder + '/static/json/badges.json');
26
+ this.importItems(folder + '/static/json/items.json');
27
+ this.importScoreModes(folder + '/static/json/score_modes.json');
28
+ this._dbFolder = folder + '/.cg/db';
29
+ }
30
+ importBadges(file) {
31
+ file_1.getFileJson(file)
32
+ .then(json => {
33
+ this._badges = json.list;
34
+ });
35
+ }
36
+ importItems(file) {
37
+ file_1.getFileJson(file)
38
+ .then(json => {
39
+ this._items = json.list;
40
+ });
41
+ }
42
+ importScoreModes(file) {
43
+ file_1.getFileJson(file)
44
+ .then(json => {
45
+ this._scoreModes = json.list;
46
+ });
47
+ }
48
+ requireLogin(user) {
49
+ return user;
50
+ }
51
+ getUserState(username, category, key) {
52
+ let uState = this._userStates[username] = this._userStates[username] || {};
53
+ let cState = uState[category] = uState[category] || {};
54
+ let kState = cState[key] = cState[key] || {
55
+ username: username,
56
+ category: category,
57
+ key: key,
58
+ time: getServerTimestamp(),
59
+ value: '',
60
+ };
61
+ return kState;
62
+ }
63
+ listScoreModes() {
64
+ return Promise.resolve(this._scoreModes);
65
+ }
66
+ listGameBadges() {
67
+ return Promise.resolve(this._badges);
68
+ }
69
+ getGameBadge(badgeCode) {
70
+ return this.listGameBadges().then(list => list.find(b => b.code == badgeCode));
71
+ }
72
+ getUserBadge(username, badgeCode) {
73
+ let list = this._userBadges[username];
74
+ return list && list.find(ub => ub.gameBadge.code == badgeCode);
75
+ }
76
+ addUserBadge(userBadge) {
77
+ let list = this._userBadges[userBadge.user.username];
78
+ if (!list) {
79
+ list = this._userBadges[userBadge.user.username] = [];
80
+ }
81
+ list.push(userBadge);
82
+ }
83
+ listGameItems() {
84
+ return Promise.resolve(this._items);
85
+ }
86
+ getGameItem(itemCode) {
87
+ return this.listGameItems().then(list => list.find(i => i.code == itemCode));
88
+ }
89
+ getUserItem(username, itemCode) {
90
+ let list = this._userItems[username];
91
+ return list && list.find(ui => ui.itemCode == itemCode);
92
+ }
93
+ addUserItem(userItem) {
94
+ let list = this._userItems[userItem.user.username];
95
+ if (!list) {
96
+ list = this._userItems[userItem.user.username] = [];
97
+ }
98
+ list.push(userItem);
99
+ }
100
+ getUserScoreMap(username, scoreKey) {
101
+ let key = `${username}|${scoreKey}`;
102
+ let userScoreMap = this._userScores[key];
103
+ if (!userScoreMap) {
104
+ userScoreMap = this._userScores[key] = {
105
+ scoreKey: scoreKey,
106
+ };
107
+ }
108
+ return userScoreMap;
109
+ }
110
+ getUserScore(username, scoreKey, timeRange) {
111
+ let userScoreMap = this.getUserScoreMap(username, scoreKey);
112
+ return userScoreMap[timeRange.value];
113
+ }
114
+ submitUserScore(user, scoreKey, timeRange, submitType, score) {
115
+ let userScoreMap = this.getUserScoreMap(user.username, scoreKey);
116
+ let userScore = userScoreMap[timeRange.value];
117
+ if (!userScore) {
118
+ userScore = {
119
+ user: user,
120
+ score: score,
121
+ time: getServerTimestamp(),
122
+ };
123
+ userScoreMap[timeRange.value] = userScore;
124
+ }
125
+ else {
126
+ let currentScore = userScore.score;
127
+ let newScore = currentScore;
128
+ let time = getServerTimestamp();
129
+ if (submitType == SubmitType_1.SubmitType.KEEP_HIGHEST) {
130
+ if (score > currentScore) {
131
+ newScore = score;
132
+ }
133
+ }
134
+ else if (submitType == SubmitType_1.SubmitType.KEEP_LOWEST) {
135
+ if (score < currentScore) {
136
+ newScore = score;
137
+ }
138
+ }
139
+ else if (submitType == SubmitType_1.SubmitType.OVERWRITE) {
140
+ newScore = score;
141
+ }
142
+ else if (submitType == SubmitType_1.SubmitType.ADD) {
143
+ newScore = currentScore + score;
144
+ }
145
+ else if (submitType == SubmitType_1.SubmitType.ADD_SINCE) {
146
+ newScore = currentScore + score;
147
+ time = userScore.time;
148
+ }
149
+ if (newScore != currentScore) {
150
+ userScore.time = time;
151
+ userScore.score = newScore;
152
+ }
153
+ }
154
+ return userScore;
155
+ }
156
+ executeCommand(user, command) {
157
+ let key = [command.service, command.method].join('__');
158
+ let func = this[key];
159
+ this.team_;
160
+ if (func) {
161
+ return Promise.resolve()
162
+ .then(() => {
163
+ return func.apply(this, [user].concat(JSON.parse(command.params)));
164
+ })
165
+ .then(result => {
166
+ if (result && result._result_) {
167
+ return result._result_;
168
+ }
169
+ else {
170
+ return [result];
171
+ }
172
+ });
173
+ }
174
+ else {
175
+ return Promise.reject(`${key} is not implemneted in dev database.`);
176
+ }
177
+ }
178
+ // system service----------------
179
+ system__echo(user, message) {
180
+ return [message];
181
+ }
182
+ system__debugReport(user, subject, content) {
183
+ return [1];
184
+ }
185
+ // badge service ----------------
186
+ badge__listGameBadgesByStatus(user, pcode, statusList) {
187
+ return this.listGameBadges()
188
+ .then(list => list.filter(badge => statusList.find(status => status.value == badge.status)));
189
+ }
190
+ badge__listGameBadgesByCodes(user, pcode, badgeCodes) {
191
+ return this.listGameBadges()
192
+ .then(list => list.filter(badge => badgeCodes.includes(badge.code)));
193
+ }
194
+ badge__getUserBadge(user, pcode, username, badgeCode) {
195
+ let list = this._userBadges[username];
196
+ let badge = list && list.find(ub => ub.gameBadge.code == badgeCode);
197
+ return this.getUserBadge(username, badgeCode);
198
+ }
199
+ badge__awardBadge(user, pcode, badgeCode) {
200
+ return this.getGameBadge(badgeCode)
201
+ .then(badge => {
202
+ if (!badge) {
203
+ return Promise.reject('Badge not found');
204
+ }
205
+ let me = this.requireLogin(user);
206
+ let userBadge = this.getUserBadge(me.username, badgeCode);
207
+ if (userBadge && userBadge.count && !badge.repeatable) {
208
+ return Promise.reject('The user already has the badge');
209
+ }
210
+ if (!userBadge) {
211
+ userBadge = {
212
+ user: me,
213
+ gameBadge: badge,
214
+ count: 0,
215
+ createTime: getServerTimestamp(),
216
+ modifyTime: 0,
217
+ };
218
+ this.addUserBadge(userBadge);
219
+ }
220
+ badge.aquired++;
221
+ userBadge.count++;
222
+ userBadge.modifyTime = getServerTimestamp();
223
+ return userBadge;
224
+ });
225
+ }
226
+ badge__removeUserBadge(user, pcode, badgeCode) {
227
+ return this.getGameBadge(badgeCode)
228
+ .then(badge => {
229
+ if (!badge) {
230
+ return Promise.reject('Badge not found');
231
+ }
232
+ let me = this.requireLogin(user);
233
+ let userBadge = this.getUserBadge(me.username, badgeCode);
234
+ if (!userBadge || !userBadge.count) {
235
+ throw new Error('The user does not have the badge');
236
+ }
237
+ badge.aquired -= userBadge.count;
238
+ userBadge.count = 0;
239
+ return Promise.resolve();
240
+ });
241
+ }
242
+ badge__listUserBadgesByUser(user, pcode, username) {
243
+ return (this._userBadges[username] || []);
244
+ }
245
+ badge__listUserBadgesByBadge(user, pcode, badgeCode, start, length) {
246
+ let list = [];
247
+ for (let uname in this._userBadges) {
248
+ let ubadges = this._userBadges[uname];
249
+ let ubadge = ubadges.find(ub => ub.gameBadge.code == badgeCode);
250
+ if (ubadge) {
251
+ list.push(ubadge);
252
+ }
253
+ }
254
+ if (start < list.length) {
255
+ return list.slice(start, length);
256
+ }
257
+ return [];
258
+ }
259
+ // client service ----------------------
260
+ client__getMsgServerUrl(user, pcode) {
261
+ return 'http://localhost:' + Constant_1.Constant.ServerPort;
262
+ }
263
+ client__isAllowGltDollar(user, pcode) {
264
+ return true;
265
+ }
266
+ // item service ------------------------
267
+ item__awardItem(user, pcode, itemCode, count) {
268
+ return this.getGameItem(itemCode)
269
+ .then(item => {
270
+ if (!item) {
271
+ return Promise.reject('Item not found');
272
+ }
273
+ if (count <= 0) {
274
+ return Promise.reject('count is 0 or less');
275
+ }
276
+ let me = this.requireLogin(user);
277
+ let userItem = this.getUserItem(me.username, itemCode);
278
+ if (userItem) {
279
+ if (item.validDays) {
280
+ if (userItem.count >= 1) {
281
+ return Promise.reject('A user can have only one of this item.');
282
+ }
283
+ }
284
+ else if (userItem.count >= item.limitPerUser) {
285
+ return Promise.reject('The amount of the item exceeded its limit');
286
+ }
287
+ }
288
+ else {
289
+ userItem = {
290
+ user: me,
291
+ itemCode: itemCode,
292
+ count: 0,
293
+ expireTime: 0,
294
+ };
295
+ this.addUserItem(userItem);
296
+ }
297
+ userItem.count++;
298
+ let validDays = item.validDays ? item.validDays : 3650;
299
+ userItem.expireTime = getServerTimestamp(validDays * Constant_1.Constant.ONE_DAY);
300
+ return userItem;
301
+ });
302
+ }
303
+ item__consumeItem(user, pcode, itemCode, count) {
304
+ return this.getGameItem(itemCode)
305
+ .then(item => {
306
+ if (!item) {
307
+ return Promise.reject('Item not found');
308
+ }
309
+ if (count < 0) {
310
+ return Promise.reject('count is a negative number');
311
+ }
312
+ let me = this.requireLogin(user);
313
+ let userItem = this.getUserItem(me.username, itemCode);
314
+ if (!userItem || !userItem.count) {
315
+ return Promise.reject('The user does not have the item');
316
+ }
317
+ let newCount = userItem.count - count;
318
+ if (newCount < 0) {
319
+ return Promise.reject('The user does not have enough of the item to consume');
320
+ }
321
+ userItem.count = newCount;
322
+ return userItem;
323
+ });
324
+ }
325
+ item__listGameItems(user, pcode) {
326
+ return this.listGameItems();
327
+ }
328
+ item__listGameItemsByStatus(user, pcode, statusCodes) {
329
+ return this.listGameItems()
330
+ .then(list => list.filter(item => statusCodes.includes(item.status)));
331
+ }
332
+ item__listGameItemsByCodes(user, pcode, itemCodes) {
333
+ return this.listGameItems()
334
+ .then(list => list.filter(item => itemCodes.includes(item.code)));
335
+ }
336
+ item__getUserItem(user, pcode, itemCode) {
337
+ let me = this.requireLogin(user);
338
+ let userItem = this.getUserItem(me.username, itemCode);
339
+ if (userItem && userItem.count > 0) {
340
+ return userItem;
341
+ }
342
+ else {
343
+ return null;
344
+ }
345
+ }
346
+ item__requireUserItem(user, pcode, itemCode, count) {
347
+ let me = this.requireLogin(user);
348
+ let userItem = this.getUserItem(me.username, itemCode);
349
+ if (count > 0) {
350
+ if (!userItem || userItem.count < count) {
351
+ throw new Error('Insufficient amount of the item');
352
+ }
353
+ }
354
+ return userItem;
355
+ }
356
+ item__requireOneOfUserItems(user, pcode, itemCodes, counts) {
357
+ let me = this.requireLogin(user);
358
+ return itemCodes.map((itemCode, index) => {
359
+ let userItem = this.getUserItem(me.username, itemCode);
360
+ let count = counts[index];
361
+ if (count > 0) {
362
+ if (!userItem || userItem.count < counts[index]) {
363
+ throw new Error('Insufficient amount of an item');
364
+ }
365
+ }
366
+ return userItem;
367
+ });
368
+ }
369
+ item__listUserItemsByCodesAndClient(user, pcode, clientCode, itemCodes) {
370
+ if (clientCode == pcode) {
371
+ return this.item__listUserItems(user, pcode, 0, 1000).filter(ui => itemCodes.includes(ui.itemCode));
372
+ }
373
+ return [];
374
+ }
375
+ item__listUserItems(user, pcode, start, length) {
376
+ let me = this.requireLogin(user);
377
+ let list = this._userItems[me.username] || [];
378
+ return list;
379
+ }
380
+ // score service
381
+ score__listPublicScoreModes() {
382
+ return this.listScoreModes().then(list => list.filter(mode => !mode.disabled && mode.length));
383
+ }
384
+ score__submitScore(user, pcode, scoreKey, score, submitTypeValue) {
385
+ let me = this.requireLogin(user);
386
+ let submitType = SubmitType_1.SubmitType.getByValue(submitTypeValue);
387
+ TimeRange_1.TimeRange.listAll().forEach(timeRange => {
388
+ this.submitUserScore(me, scoreKey, timeRange, submitType, score);
389
+ });
390
+ return this.getUserScoreMap(me.username, scoreKey);
391
+ }
392
+ score__submitScores(user, pcode, submits) {
393
+ let list = submits.map(submit => {
394
+ return this.score__submitScore(user, pcode, submit[0], submit[1], submit[2]);
395
+ });
396
+ return list;
397
+ }
398
+ score__getScore(user, pcode, scoreKey, timeRange) {
399
+ let me = this.requireLogin(user);
400
+ return this.getUserScore(me.username, scoreKey, TimeRange_1.TimeRange.getByValue(timeRange)) || {
401
+ user: me,
402
+ score: 0,
403
+ time: 0,
404
+ };
405
+ }
406
+ score__getScoreAndRank(user, pcode, scoreKey, timeRange, orderType, timestamp) {
407
+ let me = user;
408
+ let userScore = me && this.getUserScore(me.username, scoreKey, TimeRange_1.TimeRange.getByValue(timeRange));
409
+ if (!userScore) {
410
+ return {
411
+ _result_: [null, 0, getServerTimestamp()]
412
+ };
413
+ }
414
+ return [userScore, 1, getServerTimestamp()];
415
+ }
416
+ score__listScores(user, pcode, scoreKey, timeRange, orderType, timestamp, start, length) {
417
+ let me = user;
418
+ let userScore = me && this.getUserScore(me.username, scoreKey, TimeRange_1.TimeRange.getByValue(timeRange));
419
+ return {
420
+ scores: userScore ? [userScore] : [],
421
+ rankStart: 1,
422
+ periodStart: getServerTimestamp(),
423
+ };
424
+ }
425
+ score__listScoresAndRankAroundUser(user, pcode, scoreKey, timeRange, orderType, timestamp, start, length) {
426
+ return this.score__listScores(user, pcode, scoreKey, timeRange, orderType, timestamp, start, length);
427
+ }
428
+ score__getScoresTotal(user, pcode, scoreKey, timeRange) {
429
+ let me = user;
430
+ let userScore = me && this.getUserScore(me.username, scoreKey, TimeRange_1.TimeRange.getByValue(timeRange));
431
+ return userScore ? 1 : 0;
432
+ }
433
+ score__listScoresByUsernames(user, pcode, scoreKey, usernames, timeRange, timestamp) {
434
+ let me = user;
435
+ let userScore = me && this.getUserScore(me.username, scoreKey, TimeRange_1.TimeRange.getByValue(timeRange));
436
+ if (userScore && usernames.includes(userScore.user.username)) {
437
+ let scoreMap = {};
438
+ scoreMap[userScore.user.username] = userScore;
439
+ return {
440
+ _result_: [[userScore], scoreMap]
441
+ };
442
+ }
443
+ else {
444
+ return {
445
+ _result_: [[], {}]
446
+ };
447
+ }
448
+ }
449
+ score__listScoresHistory(user, pcode, scoreKey, timeRange, startTime, endTime) {
450
+ let me = user;
451
+ let userScore = me && this.getUserScore(me.username, scoreKey, TimeRange_1.TimeRange.getByValue(timeRange));
452
+ return userScore ? [userScore] : [];
453
+ }
454
+ score__listCurrencyScores(user, pcode) {
455
+ let me = this.requireLogin(user);
456
+ return this.listScoreModes()
457
+ .then(modes => modes.filter(mode => mode.toDollarRate))
458
+ .then(modes => {
459
+ let list = [];
460
+ modes.forEach(mode => {
461
+ let userScore = this.getUserScore(me.username, mode.key, TimeRange_1.TimeRange.HISTORY);
462
+ if (userScore) {
463
+ let scoreWithMode = Object.assign({
464
+ scoreMode: mode,
465
+ }, userScore);
466
+ list.push(scoreWithMode);
467
+ }
468
+ });
469
+ return list;
470
+ });
471
+ }
472
+ score__submitGameDollar(user, pcode, scoreKey, score, meta) {
473
+ let me = this.requireLogin(user);
474
+ return this.listScoreModes()
475
+ .then(modes => modes.find(m => m.key == scoreKey))
476
+ .then(mode => {
477
+ if (!mode || !mode.toDollarRate) {
478
+ return Promise.reject('score key is not a currency key');
479
+ }
480
+ TimeRange_1.TimeRange.listAll().forEach(timeRange => this.submitUserScore(me, scoreKey, timeRange, SubmitType_1.SubmitType.ADD_SINCE, score));
481
+ return this.getUserScoreMap(me.username, scoreKey);
482
+ });
483
+ }
484
+ score__submitGameDollars(user, pcode, submits, meta) {
485
+ return Promise.all(submits.map(submit => this.score__submitGameDollar(user, pcode, submit[0], submit[1], meta)));
486
+ }
487
+ // state service
488
+ state__getState(user, pcode, username, category, key) {
489
+ let userState = this.getUserState(username, category, key);
490
+ return userState.time ? userState : null;
491
+ }
492
+ state__getMyState(user, pcode, category, key) {
493
+ let me = this.requireLogin(user);
494
+ return this.state__getState(user, pcode, me.username, category, key);
495
+ }
496
+ state__getMyStateByClient(user, pcode, clientCode, category, key) {
497
+ return pcode == clientCode && this.state__getMyState(user, pcode, category, key);
498
+ }
499
+ state__setState(user, pcode, username, cateogry, key, value) {
500
+ let userState = this.getUserState(username, cateogry, key);
501
+ userState.value = value;
502
+ userState.time = getServerTimestamp();
503
+ file_1.saveData(getUserStateFile(this._dbFolder, userState), JSON.stringify(userState));
504
+ return userState;
505
+ }
506
+ state__setMyState(user, pcode, cateogry, key, value) {
507
+ let me = this.requireLogin(user);
508
+ return this.state__setState(user, pcode, me.username, cateogry, key, value);
509
+ }
510
+ state__removeState(user, pcode, username, cateogry, key) {
511
+ let userState = this.getUserState(username, cateogry, key);
512
+ if (userState.time) {
513
+ delete userState.value;
514
+ delete userState.time;
515
+ return 1;
516
+ }
517
+ else {
518
+ return 0;
519
+ }
520
+ }
521
+ state__removeMyState(user, pcode, category, key) {
522
+ let me = this.requireLogin(user);
523
+ return this.state__removeState(user, pcode, me.username, category, key);
524
+ }
525
+ state__getStates(user, pcode, usernames, categories, keys) {
526
+ let list = [];
527
+ for (let uname of usernames) {
528
+ for (let cat of categories) {
529
+ for (let key of keys) {
530
+ let userState = this.getUserState(uname, cat, key);
531
+ if (userState.time) {
532
+ list.push(userState);
533
+ }
534
+ }
535
+ }
536
+ }
537
+ return list;
538
+ }
539
+ state__getMyStates(user, pcode, categories, keys) {
540
+ let me = this.requireLogin(user);
541
+ return this.state__getStates(user, pcode, [me.username], categories, keys);
542
+ }
543
+ state__getMyStatesByClient(user, pcode, clientCode, categories, keys) {
544
+ return pcode == clientCode ? this.state__getMyStates(user, pcode, categories, keys) : [];
545
+ }
546
+ state__removeStates(user, pcode, usernames, categories, keys) {
547
+ let removed = 0;
548
+ for (let uname of usernames) {
549
+ for (let cat of categories) {
550
+ for (let key of keys) {
551
+ let userState = this.getUserState(uname, cat, key);
552
+ if (userState.time) {
553
+ delete userState.value;
554
+ delete userState.time;
555
+ ++removed;
556
+ }
557
+ }
558
+ }
559
+ }
560
+ return removed;
561
+ }
562
+ // user service
563
+ user__getByUsername(user, pcode, username) {
564
+ return UserManager_1.userManager.getByUsername(username);
565
+ }
566
+ user__listByUsernames(user, pcode, usernames) {
567
+ return UserManager_1.userManager.listByUsernames(usernames);
568
+ }
569
+ user__getWallet(user, pcode) {
570
+ let me = this.requireLogin(user);
571
+ return this.score__listCurrencyScores(user, pcode)
572
+ .then(userScores => {
573
+ let dollars = 0;
574
+ userScores.forEach(uscore => {
575
+ dollars += uscore.score * uscore.scoreMode.toDollarRate;
576
+ });
577
+ return {
578
+ _result_: [
579
+ userScores,
580
+ me,
581
+ dollars,
582
+ this._gltPoints,
583
+ ]
584
+ };
585
+ });
586
+ }
587
+ user__getReview(user, pcode) {
588
+ return null;
589
+ }
590
+ // team service
591
+ team__getTeamship(pcode, username) {
592
+ let teamship = this._userTeamships.find(t => t.user.username == username);
593
+ if (!teamship) {
594
+ let team;
595
+ let user = this.me;
596
+ if (user) {
597
+ team = new Team({
598
+ username: 'localteam_' + user.username,
599
+ nickname: `Team ${user.nickname}`,
600
+ iconUrl: CG.Base.getAppResourceFileUrl('GLT.guestIcon'),
601
+ teamname: 'teamname-' + user.username,
602
+ members: 1,
603
+ size: 100,
604
+ });
605
+ }
606
+ else if (this._userTeamships.length < 2) {
607
+ user = new User({
608
+ username: username,
609
+ nickname: username,
610
+ iconUrl: CG.Base.getAppResourceFileUrl('GLT.guestIcon'),
611
+ });
612
+ team = new Team({
613
+ username: 'localteam_' + username,
614
+ nickname: `Team ${this._userTeamships.length}`,
615
+ iconUrl: CG.Base.getAppResourceFileUrl('GLT.guestIcon'),
616
+ teamname: 'teamname-' + username,
617
+ members: 1,
618
+ size: 100,
619
+ });
620
+ }
621
+ if (team) {
622
+ teamship = new Teamship({
623
+ ship: {
624
+ requester: user.valueObject,
625
+ acceptor: team.valueObject,
626
+ status: FriendshipStatus.ACCEPTED.code,
627
+ createTime: Math.floor(Date.now() / 1000),
628
+ confirmTime: Math.floor(Date.now() / 1000),
629
+ settings: 0xFFFFFF,
630
+ }
631
+ });
632
+ this._userTeamships.push(teamship);
633
+ }
634
+ }
635
+ return teamship ? teamship.valueObject : null;
636
+ }
637
+ team__listTeamships(pcode, teamname) {
638
+ if (this.me) {
639
+ this.team__getTeamship(pcode, this.me.username);
640
+ }
641
+ return this._userTeamships.filter(t => t.team.teamname == teamname).map(t => t.valueObject);
642
+ }
643
+ team__listTeamshipsByUsernames(pcode, usernames) {
644
+ return this._userTeamships.filter(t => usernames.includes(t.user.username)).map(t => t.valueObject);
645
+ }
646
+ team__searchTeams(pcode, searchTerm, start, length) {
647
+ let list = [];
648
+ this._userTeamships.forEach(t => {
649
+ let team = t.team;
650
+ if (!list.find(ts => ts.teamname == t.team.teamname)) {
651
+ if (!searchTerm || team.teamname.includes(searchTerm) || team.nickname.includes(searchTerm)) {
652
+ list.push(team);
653
+ }
654
+ }
655
+ });
656
+ return list.map(t => t.valueObject);
657
+ }
658
+ }
659
+ exports.Database = Database;
660
+ function getUserStateFile(dbFolder, userState) {
661
+ return `${dbFolder}/user/${userState.username}/state/${userState.category}/${userState.key}.json`;
662
+ }
663
+ exports.database = new Database();
664
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGF0YWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VydmVyL21hbmFnZXJzL0RhdGFiYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLG9EQUFpRDtBQUNqRCxzREFBbUQ7QUFDbkQsMkNBQXlEO0FBQ3pELDBDQUF1QztBQUN2QywrQ0FBNEM7QUFHNUMsU0FBUyxrQkFBa0IsQ0FBQyxNQUFjLENBQUM7SUFDdkMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO0FBQ2pELENBQUM7QUFFRCxNQUFhLFFBQVE7SUFBckI7UUFNWSxlQUFVLEdBQXFDLEVBQUUsQ0FBQztRQUNsRCxnQkFBVyxHQUFzQyxFQUFFLENBQUM7UUFDcEQsbUJBQWMsR0FBZSxFQUFFLENBQUM7UUFDeEMsMEJBQTBCO1FBQ2xCLGdCQUFXLEdBQXVDLEVBQUUsQ0FBQztRQUM3RCw0QkFBNEI7UUFDcEIsZ0JBQVcsR0FBMEUsRUFBRSxDQUFDO1FBRXhGLFdBQU0sR0FBb0QsRUFBRSxDQUFDO1FBRTdELGVBQVUsR0FBVyxHQUFHLENBQUM7SUFtb0JyQyxDQUFDO0lBL25CRyxXQUFXLENBQUMsTUFBYztRQUN0QixJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRywwQkFBMEIsQ0FBQyxDQUFBO1FBQ3RELElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLHlCQUF5QixDQUFDLENBQUE7UUFDcEQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sR0FBRywrQkFBK0IsQ0FBQyxDQUFBO1FBQy9ELElBQUksQ0FBQyxTQUFTLEdBQUcsTUFBTSxHQUFHLFNBQVMsQ0FBQztJQUN4QyxDQUFDO0lBQ08sWUFBWSxDQUFDLElBQVk7UUFDN0Isa0JBQVcsQ0FBQyxJQUFJLENBQUM7YUFDWixJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7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