From eb817c48ed22a4bab973b238b418d3637a91a033 Mon Sep 17 00:00:00 2001 From: Evgeny Kirpichyov <47474371+kyvg@users.noreply.github.com> Date: Sat, 9 Sep 2023 14:57:51 +0300 Subject: [PATCH] #276 Fix clan caching (#279) --- src/arena/CharacterService.js | 5 +++++ src/arena/ClanService/ClanService.ts | 5 ++--- .../PlayersService/PlayersService.test.ts | 5 ++++- src/scenes/clan.ts | 21 ++++++++++++------- 4 files changed, 24 insertions(+), 12 deletions(-) diff --git a/src/arena/CharacterService.js b/src/arena/CharacterService.js index 9330a25..b0cda7b 100644 --- a/src/arena/CharacterService.js +++ b/src/arena/CharacterService.js @@ -581,6 +581,11 @@ class CharacterService { * @return {Promise} */ static async getCharacterById(id) { + const cachedChar = arena.characters[id]; + if (cachedChar) { + return cachedChar; + } + const charFromDb = await findCharacter({ _id: id }); if (!charFromDb) { return null; diff --git a/src/arena/ClanService/ClanService.ts b/src/arena/ClanService/ClanService.ts index cf1c66b..16ac9da 100644 --- a/src/arena/ClanService/ClanService.ts +++ b/src/arena/ClanService/ClanService.ts @@ -193,15 +193,14 @@ export class ClanService { if (!clan.hasEmptySlot) { throw new Error('Клан уже сформирован'); } - const char: CharacterService = arena.characters[charId]; + const char = await CharacterService.getCharacterById(charId); await this.updateClan(clan.id, { $push: { players: charId }, $pull: { requests: { $in: [charId] } }, }); - /** @todo не сохраняется клан у игрока */ - arena.characters[char.id] = await char.joinClan(clan); + await char.joinClan(clan); } /** diff --git a/src/arena/PlayersService/PlayersService.test.ts b/src/arena/PlayersService/PlayersService.test.ts index 378b0e3..8991917 100644 --- a/src/arena/PlayersService/PlayersService.test.ts +++ b/src/arena/PlayersService/PlayersService.test.ts @@ -1,4 +1,5 @@ import { times } from 'lodash'; +import arena from '@/arena'; import type { Clan } from '@/models/clan'; import TestUtils from '@/utils/testUtils'; import CharacterService from '../CharacterService'; @@ -18,13 +19,15 @@ describe('PlayerService', () => { const chars = await Promise.all(times(9, () => TestUtils.createCharacter())); const charIds = chars.map(({ id }) => id); + arena.characters = {}; + clans = await Promise.all([ await TestUtils.createClan(charIds[0], { players: [charIds[1], charIds[2]] }), await TestUtils.createClan(charIds[3], { players: [charIds[4]] }), await TestUtils.createClan(charIds[5]), ]); - characters = await Promise.all(charIds.map((CharacterService.getCharacterById))); + characters = await Promise.all(charIds.map((id) => CharacterService.getCharacterById(id))); players = new PlayersService(characters.map(({ id }) => id)); }); diff --git a/src/scenes/clan.ts b/src/scenes/clan.ts index 080925d..a7051eb 100644 --- a/src/scenes/clan.ts +++ b/src/scenes/clan.ts @@ -1,6 +1,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-nocheck import { Scenes, Markup } from 'telegraf'; +import CharacterService from '@/arena/CharacterService'; import { broadcast } from '@/helpers/channelHelper'; import arena from '../arena'; import { ClanService } from '../arena/ClanService'; @@ -65,7 +66,7 @@ clanScene.action(/^(lvlup|back|remove|leave)$/, async (ctx) => { await ctx.answerCbQuery('Клан был удалён'); } if (ctx.match.input === 'leave') { - await ClanService.leaveClan(char.clan.id, char.tgId); + await ClanService.leaveClan(char.clan.id, char.id); } } catch (e) { await ctx.answerCbQuery(e.message); @@ -160,27 +161,31 @@ ${list.join('\n')}`, clanScene.action(/requests_list|(accept|reject)(?=_)/, async (ctx) => { const [action, charId] = ctx.match.input.split('_') as [string, string]; - const clan = await ClanService.getClanById(ctx.session.character.clan.id); try { if (action === 'accept') { - await ClanService.acceptRequest(clan.id, charId); + const requester = await CharacterService.getCharacterById(charId); + await ClanService.acceptRequest(ctx.session.character.clan.id, charId); + await broadcast( - `Твоя заявка на вступление в клан *${clan.name}* была одобрена`, - ctx.session.character.tgId, + `Твоя заявка на вступление в клан *${ctx.session.character.clan.name}* была одобрена`, + requester.tgId, ); } if (action === 'reject') { - await ClanService.rejectRequest(clan.id, charId); + const requester = await CharacterService.getCharacterById(charId); + await ClanService.rejectRequest(ctx.session.character.clan.id, charId); await broadcast( - `Твоя заявка на вступление в клан *${clan.name}* была отклонена`, - ctx.session.character.tgId, + `Твоя заявка на вступление в клан *${ctx.session.character.clan.name}* была отклонена`, + requester.tgId, ); } + await ctx.answerCbQuery(); } catch (e) { await ctx.answerCbQuery(e.message); } + const clan = await ClanService.getClanById(ctx.session.character.clan.id); const isAdmin = clan.owner.tgId === ctx.session.character.tgId; const list = clan.requests.map((player) => {