fix: 등용장을 발송 국가 멸망 시 함께 만료
This commit is contained in:
@@ -192,6 +192,13 @@ const respondToScout = async (options: {
|
||||
return { ok: false, action: 'scout', reason: '유효하지 않은 등용장입니다.' };
|
||||
}
|
||||
|
||||
// 등용장은 발신 장수의 현재 소속이 아니라 발송 당시 국가에 귀속된다.
|
||||
// 멸망 처리 도입 전에 남은 편지도 수락/거절 전에 영구 만료한다.
|
||||
if (!world.getNationById(payload.src.nationId)) {
|
||||
await invalidateMessageIds(db, world, [row.id], now);
|
||||
return { ok: false, action: 'scout', reason: '등용장을 보낸 국가가 멸망했습니다.' };
|
||||
}
|
||||
|
||||
const sourceNationName = payload.src.nationName;
|
||||
const sourceNationJosaRo = JosaUtil.pick(sourceNationName, '로');
|
||||
if (response) {
|
||||
|
||||
@@ -464,6 +464,11 @@ export const createReadModelChangeJournal = (
|
||||
if (commandResult?.type === 'voteReward' && commandResult.ok) {
|
||||
journal.mark('front.general', commandResult.generalId);
|
||||
}
|
||||
// 과거 멸망국 등용장의 거부 응답도 action을 만료시킬 수 있다.
|
||||
// 개인 메시지 응답 뒤에는 성공 여부와 관계없이 해당 수신함을 다시 읽는다.
|
||||
if (commandResult?.type === 'messageRespond' && commandResult.action === 'scout') {
|
||||
journal.mark('messages.mailbox', commandResult.generalId);
|
||||
}
|
||||
markIds(journal, 'general.content', changes.generalIds);
|
||||
markIds(journal, 'city.content', changes.cityIds);
|
||||
markIds(journal, 'nation.content', changes.nationIds);
|
||||
@@ -1910,6 +1915,37 @@ export const createDatabaseTurnHooks = async (
|
||||
{ sendDestOnly: message.sendDestOnly }
|
||||
);
|
||||
}
|
||||
if (deletedNations.length > 0) {
|
||||
// 발신자 하야/이적은 등용장을 바꾸지 않는다. 발송 당시 국가가
|
||||
// 멸망할 때만 같은 transaction에서 action과 구버전 만료 투영을 닫는다.
|
||||
// 이번 flush에 생성된 편지도 포함하도록 message 저장 뒤에 처리한다.
|
||||
const letters = await prisma.message.findMany({
|
||||
where: {
|
||||
type: 'private',
|
||||
action: { actionType: 'scout', status: 'PENDING' },
|
||||
OR: deletedNations.map((nationId) => ({
|
||||
message: { path: ['src', 'nationId'], equals: nationId },
|
||||
})),
|
||||
},
|
||||
select: { id: true, mailbox: true },
|
||||
});
|
||||
if (letters.length > 0) {
|
||||
const ids = letters.map(({ id }) => id);
|
||||
const resolvedGameTick = BigInt(state.clockTick ?? state.lastTurnTick ?? 0);
|
||||
await prisma.messageAction.updateMany({
|
||||
where: { messageId: { in: ids }, status: 'PENDING' },
|
||||
data: { status: 'RESOLVED', resolvedGameTick },
|
||||
});
|
||||
await prisma.message.updateMany({
|
||||
where: { id: { in: ids } },
|
||||
data: {
|
||||
validUntil: world.gameTickToDate(Number(resolvedGameTick)),
|
||||
validUntilTick: resolvedGameTick,
|
||||
},
|
||||
});
|
||||
persistedMessageMailboxes.push(...letters.map(({ mailbox }) => mailbox));
|
||||
}
|
||||
}
|
||||
if (options?.reservedTurns && persistedReservedTurnChanges) {
|
||||
await options.reservedTurns.persistChanges(prisma, persistedReservedTurnChanges);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user