Connection status monitoring

This commit is contained in:
aqw42
2025-05-29 23:10:30 +02:00
parent 62cff7a2c4
commit 5eed7db4e3
13 changed files with 343 additions and 328 deletions
+9 -7
View File
@@ -34,7 +34,7 @@ export type Intent =
| EmbargoIntent
| QuickChatIntent
| MoveWarshipIntent
| MarkIdleIntent;
| MarkDisconnectedIntent;
export type AttackIntent = z.infer<typeof AttackIntentSchema>;
export type CancelAttackIntent = z.infer<typeof CancelAttackIntentSchema>;
@@ -57,7 +57,9 @@ export type TargetTroopRatioIntent = z.infer<
export type BuildUnitIntent = z.infer<typeof BuildUnitIntentSchema>;
export type MoveWarshipIntent = z.infer<typeof MoveWarshipIntentSchema>;
export type QuickChatIntent = z.infer<typeof QuickChatIntentSchema>;
export type MarkIdleIntent = z.infer<typeof MarkIdleIntentSchema>;
export type MarkDisconnectedIntent = z.infer<
typeof MarkDisconnectedIntentSchema
>;
export type Turn = z.infer<typeof TurnSchema>;
export type GameConfig = z.infer<typeof GameConfigSchema>;
@@ -168,7 +170,7 @@ const BaseIntentSchema = z.object({
"attack",
"cancel_attack",
"spawn",
"mark_idle",
"mark_disconnected",
"boat",
"cancel_boat",
"name",
@@ -293,16 +295,16 @@ export const QuickChatIntentSchema = BaseIntentSchema.extend({
variables: z.record(SafeString).optional(),
});
export const MarkIdleIntentSchema = BaseIntentSchema.extend({
type: z.literal("mark_idle"),
isIdle: z.boolean(),
export const MarkDisconnectedIntentSchema = BaseIntentSchema.extend({
type: z.literal("mark_disconnected"),
isDisconnected: z.boolean(),
});
const IntentSchema = z.union([
AttackIntentSchema,
CancelAttackIntentSchema,
SpawnIntentSchema,
MarkIdleIntentSchema,
MarkDisconnectedIntentSchema,
BoatAttackIntentSchema,
CancelBoatIntentSchema,
AllianceRequestIntentSchema,
+3 -3
View File
@@ -15,7 +15,7 @@ import { DonateTroopsExecution } from "./DonateTroopExecution";
import { EmbargoExecution } from "./EmbargoExecution";
import { EmojiExecution } from "./EmojiExecution";
import { FakeHumanExecution } from "./FakeHumanExecution";
import { MarkIdleExecution } from "./MarkIdleExecution";
import { MarkDisconnectedExecution } from "./MarkDisconnectedExecution";
import { MoveWarshipExecution } from "./MoveWarshipExecution";
import { NoOpExecution } from "./NoOpExecution";
import { QuickChatExecution } from "./QuickChatExecution";
@@ -121,8 +121,8 @@ export class Executor {
intent.quickChatKey,
intent.variables ?? {},
);
case "mark_idle":
return new MarkIdleExecution(playerID, intent.isIdle);
case "mark_disconnected":
return new MarkDisconnectedExecution(playerID, intent.isDisconnected);
default:
throw new Error(`intent type ${intent} not found`);
}
@@ -1,18 +1,18 @@
import { Execution, Game, Player, PlayerID } from "../game/Game";
export class MarkIdleExecution implements Execution {
export class MarkDisconnectedExecution implements Execution {
private player: Player;
private active: boolean = true;
constructor(
private playerID: PlayerID,
private isIdle: boolean,
private isDisconnected: boolean,
) {}
init(mg: Game, ticks: number): void {
if (!mg.hasPlayer(this.playerID)) {
console.warn(
`MarkIdleExecution: player ${this.playerID} not found in game`,
`MarkDisconnectedExecution: player ${this.playerID} not found in game`,
);
this.active = false;
return;
@@ -21,7 +21,7 @@ export class MarkIdleExecution implements Execution {
this.player = mg.player(this.playerID);
if (!this.player) {
console.warn(
`MarkIdleExecution: failed to retrieve player ${this.playerID}`,
`MarkDisconnectedExecution: failed to retrieve player ${this.playerID}`,
);
this.active = false;
return;
@@ -29,7 +29,7 @@ export class MarkIdleExecution implements Execution {
}
tick(ticks: number): void {
this.player.markIdle(this.isIdle);
this.player.markDisconnected(this.isDisconnected);
this.active = false;
}
+2 -2
View File
@@ -433,8 +433,8 @@ export interface Player {
largestClusterBoundingBox: { min: Cell; max: Cell } | null;
lastTileChange(): Tick;
isIdle(): boolean;
markIdle(isIdle: boolean): void;
isDisconnected(): boolean;
markDisconnected(isDisconnected: boolean): void;
hasSpawned(): boolean;
setHasSpawned(hasSpawned: boolean): void;
+1 -1
View File
@@ -102,7 +102,7 @@ export interface PlayerUpdate {
smallID: number;
playerType: PlayerType;
isAlive: boolean;
isIdle: boolean;
isDisconnected: boolean;
tilesOwned: number;
gold: number;
population: number;
+2 -2
View File
@@ -292,8 +292,8 @@ export class PlayerView {
hasSpawned(): boolean {
return this.data.hasSpawned;
}
isIdle(): boolean {
return this.data.isIdle;
isDisconnected(): boolean {
return this.data.isDisconnected;
}
}
+6 -6
View File
@@ -99,7 +99,7 @@ export class PlayerImpl implements Player {
public _outgoingLandAttacks: Attack[] = [];
private _hasSpawned = false;
private _isIdle = false;
private _isDisconnected = false;
constructor(
private mg: GameImpl,
@@ -137,7 +137,7 @@ export class PlayerImpl implements Player {
smallID: this.smallID(),
playerType: this.type(),
isAlive: this.isAlive(),
isIdle: this.isIdle(),
isDisconnected: this.isDisconnected(),
tilesOwned: this.numTilesOwned(),
gold: Number(this._gold),
population: this.population(),
@@ -927,12 +927,12 @@ export class PlayerImpl implements Player {
return this._lastTileChange;
}
isIdle(): boolean {
return this._isIdle;
isDisconnected(): boolean {
return this._isDisconnected;
}
markIdle(isIdle: boolean): void {
this._isIdle = isIdle;
markDisconnected(isDisconnected: boolean): void {
this._isDisconnected = isDisconnected;
}
hash(): number {