feat: 플레이 감사 월별 수집과 원자적 배치 저장 연결
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
import { persistAuditMonth } from '../playAudit/persistence.js';
|
||||
import { persistGeneralAccessScores, persistGeneralUpdates } from './generalBatchPersistence.js';
|
||||
import { areSeasonRecordsFinalized } from './seasonRecords.js';
|
||||
import {
|
||||
@@ -1138,6 +1139,7 @@ export const createDatabaseTurnHooks = async (
|
||||
pendingNationBettingOpens,
|
||||
pendingNationBettingFinishes,
|
||||
pendingYearbookSnapshots,
|
||||
pendingAuditMonths,
|
||||
pendingUnificationFinalizations,
|
||||
} = changes;
|
||||
const reservedTurnChanges = options?.reservedTurns?.peekDirtyState();
|
||||
@@ -1867,6 +1869,9 @@ export const createDatabaseTurnHooks = async (
|
||||
data: pendingLogRows,
|
||||
});
|
||||
}
|
||||
for (const snapshot of pendingAuditMonths) {
|
||||
await persistAuditMonth(prisma, snapshot);
|
||||
}
|
||||
for (const snapshot of pendingYearbookSnapshots) {
|
||||
await persistYearbookSnapshot(prisma, snapshot);
|
||||
}
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import type { PendingAuditMonth } from '../playAudit/persistence.js';
|
||||
import type {
|
||||
City,
|
||||
LogEntryDraft,
|
||||
@@ -199,6 +200,7 @@ export interface TurnWorldChanges {
|
||||
pendingNationBettingOpens: PendingNationBettingOpen[];
|
||||
pendingNationBettingFinishes: PendingNationBettingFinish[];
|
||||
pendingYearbookSnapshots: PendingYearbookSnapshot[];
|
||||
pendingAuditMonths: PendingAuditMonth[];
|
||||
pendingUnificationFinalizations: PendingUnificationFinalization[];
|
||||
}
|
||||
|
||||
@@ -239,6 +241,7 @@ export interface InMemoryTurnWorldStateSnapshot {
|
||||
pendingNationBettingOpens: PendingNationBettingOpen[];
|
||||
pendingNationBettingFinishes: PendingNationBettingFinish[];
|
||||
pendingYearbookSnapshots: PendingYearbookSnapshot[];
|
||||
pendingAuditMonths: PendingAuditMonth[];
|
||||
pendingUnificationFinalizations: PendingUnificationFinalization[];
|
||||
pendingRealtimeBacklogShiftTicks: number;
|
||||
}
|
||||
@@ -543,6 +546,7 @@ export class InMemoryTurnWorld {
|
||||
private readonly pendingNationBettingOpens: PendingNationBettingOpen[] = [];
|
||||
private readonly pendingNationBettingFinishes: PendingNationBettingFinish[] = [];
|
||||
private readonly pendingYearbookSnapshots: PendingYearbookSnapshot[] = [];
|
||||
private readonly pendingAuditMonths: PendingAuditMonth[] = [];
|
||||
private readonly pendingUnificationFinalizations: PendingUnificationFinalization[] = [];
|
||||
private pendingRealtimeBacklogShiftTicks = 0;
|
||||
private readonly scenarioConfig: ScenarioConfig;
|
||||
@@ -1091,6 +1095,7 @@ export class InMemoryTurnWorld {
|
||||
pendingNationBettingOpens: this.pendingNationBettingOpens,
|
||||
pendingNationBettingFinishes: this.pendingNationBettingFinishes,
|
||||
pendingYearbookSnapshots: this.pendingYearbookSnapshots,
|
||||
pendingAuditMonths: this.pendingAuditMonths,
|
||||
pendingUnificationFinalizations: this.pendingUnificationFinalizations,
|
||||
pendingRealtimeBacklogShiftTicks: this.pendingRealtimeBacklogShiftTicks,
|
||||
} satisfies InMemoryTurnWorldStateSnapshot);
|
||||
@@ -1137,6 +1142,7 @@ export class InMemoryTurnWorld {
|
||||
this.replaceArray(this.pendingNationBettingOpens, restored.pendingNationBettingOpens);
|
||||
this.replaceArray(this.pendingNationBettingFinishes, restored.pendingNationBettingFinishes);
|
||||
this.replaceArray(this.pendingYearbookSnapshots, restored.pendingYearbookSnapshots);
|
||||
this.replaceArray(this.pendingAuditMonths, restored.pendingAuditMonths);
|
||||
this.replaceArray(this.pendingUnificationFinalizations, restored.pendingUnificationFinalizations);
|
||||
this.pendingRealtimeBacklogShiftTicks = restored.pendingRealtimeBacklogShiftTicks ?? 0;
|
||||
}
|
||||
@@ -1352,6 +1358,10 @@ export class InMemoryTurnWorld {
|
||||
});
|
||||
}
|
||||
|
||||
queueAuditMonth(snapshot: PendingAuditMonth): void {
|
||||
this.pendingAuditMonths.push(structuredClone(snapshot));
|
||||
}
|
||||
|
||||
queueYearbookSnapshot(snapshot: PendingYearbookSnapshot): void {
|
||||
this.pendingYearbookSnapshots.push(structuredClone(snapshot));
|
||||
}
|
||||
@@ -2194,6 +2204,7 @@ export class InMemoryTurnWorld {
|
||||
turnTime: new Date(entry.turnTime.getTime()),
|
||||
}));
|
||||
const pendingYearbookSnapshots = structuredClone(this.pendingYearbookSnapshots);
|
||||
const pendingAuditMonths = structuredClone(this.pendingAuditMonths);
|
||||
const pendingUnificationFinalizations = structuredClone(this.pendingUnificationFinalizations);
|
||||
const accessScoreResetGeneralIds = Array.from(this.accessScoreResetGeneralIds).sort(
|
||||
(left, right) => left - right
|
||||
@@ -2226,6 +2237,7 @@ export class InMemoryTurnWorld {
|
||||
pendingNationBettingOpens,
|
||||
pendingNationBettingFinishes,
|
||||
pendingYearbookSnapshots,
|
||||
pendingAuditMonths,
|
||||
pendingUnificationFinalizations,
|
||||
};
|
||||
}
|
||||
@@ -2264,6 +2276,7 @@ export class InMemoryTurnWorld {
|
||||
this.pendingNationBettingOpens.splice(0, changes.pendingNationBettingOpens.length);
|
||||
this.pendingNationBettingFinishes.splice(0, changes.pendingNationBettingFinishes.length);
|
||||
this.pendingYearbookSnapshots.splice(0, changes.pendingYearbookSnapshots.length);
|
||||
this.pendingAuditMonths.splice(0, changes.pendingAuditMonths.length);
|
||||
this.pendingUnificationFinalizations.splice(0, changes.pendingUnificationFinalizations.length);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import { recordAuditSettlement } from '../playAudit/collection.js';
|
||||
import { asNumber, asRecord } from '@sammo-ts/common';
|
||||
import {
|
||||
ActionLogger,
|
||||
@@ -175,8 +176,10 @@ const processIncomeForNation = (
|
||||
const incomeText = Math.round(incomeValue).toLocaleString('en-US');
|
||||
const incomeLog =
|
||||
type === 'gold' ? `이번 수입은 금 <C>${incomeText}</>입니다.` : `이번 수입은 쌀 <C>${incomeText}</>입니다.`;
|
||||
let paid = 0;
|
||||
for (const general of nationGenerals) {
|
||||
const pay = Math.round(getBill(general.dedication) * ratio);
|
||||
paid += pay;
|
||||
if (
|
||||
process.env.SEED_PARITY_MONTHLY_RESOURCE_TRACE === '1' &&
|
||||
(process.env.AI_TRACE_GENERAL_IDS ?? '').split(',').includes(String(general.id))
|
||||
@@ -203,6 +206,7 @@ const processIncomeForNation = (
|
||||
logger.pushGeneralActionLog(payLog, LogFormat.PLAIN);
|
||||
pushLogs(world, logger.flush());
|
||||
}
|
||||
recordAuditSettlement(world, { nationId: nation.id, resource: type, income: incomeValue, paid });
|
||||
};
|
||||
|
||||
export interface IncomeHandler extends TurnCalendarHandler {
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import { createPlayAuditHandler } from '../playAudit/collection.js';
|
||||
import { randomUUID } from 'node:crypto';
|
||||
import { createRuntimePauseGate } from './runtimePauseGate.js';
|
||||
|
||||
@@ -480,6 +481,7 @@ const createMonthlyCalendarRuntime = async (options: {
|
||||
options.monthlyEventHandler,
|
||||
options.hasEventAction('ProcessIncome') ? null : options.incomeHandler,
|
||||
createYearbookHandler({ profileName: options.profileName, getWorld: options.getWorld }).handler,
|
||||
createPlayAuditHandler(options.getWorld),
|
||||
monthlyBoundaryPreHandler,
|
||||
createNationTurnMonthlyHandler({ getWorld: options.getWorld }),
|
||||
monthlyNationStatsHandler,
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import { queueAuditMonth } from '../playAudit/collection.js';
|
||||
import { resolveMessageTargetIcon } from '@sammo-ts/logic';
|
||||
import { createHash } from 'node:crypto';
|
||||
|
||||
@@ -177,6 +178,7 @@ export const createUnificationHandler = (options: {
|
||||
}
|
||||
|
||||
queueYearbookSnapshot(world, options.profileName, context.currentYear, context.currentMonth);
|
||||
queueAuditMonth(world, 'FINAL');
|
||||
world.queueUnificationFinalization({
|
||||
generationKey: `unification:${serverId}`,
|
||||
serverId,
|
||||
|
||||
Reference in New Issue
Block a user