feat: add secure troop management

This commit is contained in:
2026-07-25 08:44:44 +00:00
parent 790f4915ab
commit ae4cc31a16
25 changed files with 2232 additions and 48 deletions
@@ -50,11 +50,31 @@ const zTroopJoin = z.object({
troopId: zFiniteNumber,
});
const zTroopCreate = z.object({
type: z.literal('troopCreate'),
generalId: zFiniteNumber,
troopName: z.string(),
});
const zTroopExit = z.object({
type: z.literal('troopExit'),
generalId: zFiniteNumber,
});
const zTroopKick = z.object({
type: z.literal('troopKick'),
generalId: zFiniteNumber,
troopId: zFiniteNumber,
targetGeneralId: zFiniteNumber,
});
const zTroopRename = z.object({
type: z.literal('troopRename'),
generalId: zFiniteNumber,
troopId: zFiniteNumber,
troopName: z.string(),
});
const zDieOnPrestart = z.object({
type: z.literal('dieOnPrestart'),
generalId: zFiniteNumber,
@@ -262,6 +282,14 @@ const normalizeTroopJoin: CommandNormalizer<'troopJoin'> = (envelope) => {
return { ...command, requestId: envelope.requestId };
};
const normalizeTroopCreate: CommandNormalizer<'troopCreate'> = (envelope) => {
const command = parseWith(zTroopCreate, envelope.command);
if (!command) {
return null;
}
return { ...command, requestId: envelope.requestId };
};
const normalizeTroopExit: CommandNormalizer<'troopExit'> = (envelope) => {
const command = parseWith(zTroopExit, envelope.command);
if (!command) {
@@ -270,6 +298,22 @@ const normalizeTroopExit: CommandNormalizer<'troopExit'> = (envelope) => {
return { ...command, requestId: envelope.requestId };
};
const normalizeTroopKick: CommandNormalizer<'troopKick'> = (envelope) => {
const command = parseWith(zTroopKick, envelope.command);
if (!command) {
return null;
}
return { ...command, requestId: envelope.requestId };
};
const normalizeTroopRename: CommandNormalizer<'troopRename'> = (envelope) => {
const command = parseWith(zTroopRename, envelope.command);
if (!command) {
return null;
}
return { ...command, requestId: envelope.requestId };
};
const normalizeDieOnPrestart: CommandNormalizer<'dieOnPrestart'> = (envelope) => {
const command = parseWith(zDieOnPrestart, envelope.command);
if (!command) {
@@ -445,8 +489,11 @@ const normalizeShutdown: CommandNormalizer<'shutdown'> = (envelope) => {
const normalizers: CommandNormalizerMap = {
auctionFinalize: normalizeAuctionFinalize,
auctionBid: normalizeAuctionBid,
troopCreate: normalizeTroopCreate,
troopJoin: normalizeTroopJoin,
troopExit: normalizeTroopExit,
troopKick: normalizeTroopKick,
troopRename: normalizeTroopRename,
dieOnPrestart: normalizeDieOnPrestart,
buildNationCandidate: normalizeBuildNationCandidate,
instantRetreat: normalizeInstantRetreat,