From 347cbdf9568334d7c288bf10eec353d03a72a6d6 Mon Sep 17 00:00:00 2001 From: Z8MB1E Date: Sun, 23 Aug 2026 18:51:24 -0400 Subject: [PATCH] feat(server): add game-server sync collections Add GameServers, ArmaSyncEvents and ArmaCommands collections plus registration in payload config and regenerated types. Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus --- src/collections/server/ArmaCommands.ts | 18 +++ src/collections/server/ArmaSyncEvents.ts | 14 +++ src/collections/server/GameServers.ts | 14 +++ src/payload-types.ts | 140 +++++++++++++++++++++++ src/payload.config.ts | 6 + 5 files changed, 192 insertions(+) create mode 100644 src/collections/server/ArmaCommands.ts create mode 100644 src/collections/server/ArmaSyncEvents.ts create mode 100644 src/collections/server/GameServers.ts diff --git a/src/collections/server/ArmaCommands.ts b/src/collections/server/ArmaCommands.ts new file mode 100644 index 0000000..3e14745 --- /dev/null +++ b/src/collections/server/ArmaCommands.ts @@ -0,0 +1,18 @@ +import { CollectionConfig } from "payload"; + +export const ArmaCommands: CollectionConfig = { + slug: "arma-commands", + admin: { group: "Server", useAsTitle: "commandId", defaultColumns: ["commandId", "type", "status", "server"] }, + access: { read: ({ req }) => !!req.user, create: () => false, update: () => false, delete: () => false }, + fields: [ + { name: "commandId", type: "text", required: true, unique: true, index: true }, + { name: "server", type: "relationship", relationTo: "game-servers", required: true, index: true }, + { name: "type", type: "text", required: true }, + { name: "payload", type: "json", required: true }, + { name: "status", type: "select", required: true, defaultValue: "queued", options: ["queued", "delivered", "succeeded", "failed"] }, + { name: "result", type: "json" }, + { name: "error", type: "text" }, + { name: "deliveredAt", type: "date" }, + { name: "completedAt", type: "date" }, + ], +}; diff --git a/src/collections/server/ArmaSyncEvents.ts b/src/collections/server/ArmaSyncEvents.ts new file mode 100644 index 0000000..019c8d2 --- /dev/null +++ b/src/collections/server/ArmaSyncEvents.ts @@ -0,0 +1,14 @@ +import { CollectionConfig } from "payload"; + +export const ArmaSyncEvents: CollectionConfig = { + slug: "arma-sync-events", + admin: { group: "Server", useAsTitle: "eventId", defaultColumns: ["eventId", "type", "server", "occurredAt"] }, + access: { read: ({ req }) => !!req.user, create: () => false, update: () => false, delete: () => false }, + fields: [ + { name: "eventId", type: "text", required: true, unique: true, index: true }, + { name: "server", type: "relationship", relationTo: "game-servers", required: true, index: true }, + { name: "type", type: "text", required: true, index: true }, + { name: "occurredAt", type: "date", required: true }, + { name: "payload", type: "json", required: true }, + ], +}; diff --git a/src/collections/server/GameServers.ts b/src/collections/server/GameServers.ts new file mode 100644 index 0000000..b2cbde9 --- /dev/null +++ b/src/collections/server/GameServers.ts @@ -0,0 +1,14 @@ +import { CollectionConfig } from "payload"; + +export const GameServers: CollectionConfig = { + slug: "game-servers", + admin: { group: "Server", useAsTitle: "name", defaultColumns: ["name", "serverId", "status", "lastSeenAt"] }, + access: { read: ({ req }) => !!req.user, create: () => false, update: () => false, delete: () => false }, + fields: [ + { name: "serverId", type: "text", required: true, unique: true, index: true }, + { name: "name", type: "text", required: true }, + { name: "status", type: "select", required: true, defaultValue: "offline", options: ["online", "offline"] }, + { name: "lastSeenAt", type: "date" }, + { name: "metadata", type: "json" }, + ], +}; diff --git a/src/payload-types.ts b/src/payload-types.ts index ca73a51..36a856c 100644 --- a/src/payload-types.ts +++ b/src/payload-types.ts @@ -108,6 +108,9 @@ export interface Config { 'narrative-events': NarrativeEvent; 'mission-files': MissionFile; 'mod-lists': ModList; + 'game-servers': GameServer; + 'arma-sync-events': ArmaSyncEvent; + 'arma-commands': ArmaCommand; 'plugin-ai-instructions': PluginAiInstruction; 'payload-kv': PayloadKv; 'payload-locked-documents': PayloadLockedDocument; @@ -164,6 +167,9 @@ export interface Config { 'narrative-events': NarrativeEventsSelect | NarrativeEventsSelect; 'mission-files': MissionFilesSelect | MissionFilesSelect; 'mod-lists': ModListsSelect | ModListsSelect; + 'game-servers': GameServersSelect | GameServersSelect; + 'arma-sync-events': ArmaSyncEventsSelect | ArmaSyncEventsSelect; + 'arma-commands': ArmaCommandsSelect | ArmaCommandsSelect; 'plugin-ai-instructions': PluginAiInstructionsSelect | PluginAiInstructionsSelect; 'payload-kv': PayloadKvSelect | PayloadKvSelect; 'payload-locked-documents': PayloadLockedDocumentsSelect | PayloadLockedDocumentsSelect; @@ -2746,6 +2752,84 @@ export interface NarrativeEvent { updatedAt: string; createdAt: string; } +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "game-servers". + */ +export interface GameServer { + id: number; + serverId: string; + name: string; + status: 'online' | 'offline'; + lastSeenAt?: string | null; + metadata?: + | { + [k: string]: unknown; + } + | unknown[] + | string + | number + | boolean + | null; + updatedAt: string; + createdAt: string; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "arma-sync-events". + */ +export interface ArmaSyncEvent { + id: number; + eventId: string; + server: number | GameServer; + type: string; + occurredAt: string; + payload: + | { + [k: string]: unknown; + } + | unknown[] + | string + | number + | boolean + | null; + updatedAt: string; + createdAt: string; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "arma-commands". + */ +export interface ArmaCommand { + id: number; + commandId: string; + server: number | GameServer; + type: string; + payload: + | { + [k: string]: unknown; + } + | unknown[] + | string + | number + | boolean + | null; + status: 'queued' | 'delivered' | 'succeeded' | 'failed'; + result?: + | { + [k: string]: unknown; + } + | unknown[] + | string + | number + | boolean + | null; + error?: string | null; + deliveredAt?: string | null; + completedAt?: string | null; + updatedAt: string; + createdAt: string; +} /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "plugin-ai-instructions". @@ -2975,6 +3059,18 @@ export interface PayloadLockedDocument { relationTo: 'mod-lists'; value: number | ModList; } | null) + | ({ + relationTo: 'game-servers'; + value: number | GameServer; + } | null) + | ({ + relationTo: 'arma-sync-events'; + value: number | ArmaSyncEvent; + } | null) + | ({ + relationTo: 'arma-commands'; + value: number | ArmaCommand; + } | null) | ({ relationTo: 'plugin-ai-instructions'; value: number | PluginAiInstruction; @@ -3183,6 +3279,7 @@ export interface UsersSelect { showCallsign?: T; leadOrActual?: T; showVersionOverlay?: T; + xpDisplayMini?: T; }; discord?: | T @@ -4196,6 +4293,49 @@ export interface ModListsSelect { focalX?: T; focalY?: T; } +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "game-servers_select". + */ +export interface GameServersSelect { + serverId?: T; + name?: T; + status?: T; + lastSeenAt?: T; + metadata?: T; + updatedAt?: T; + createdAt?: T; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "arma-sync-events_select". + */ +export interface ArmaSyncEventsSelect { + eventId?: T; + server?: T; + type?: T; + occurredAt?: T; + payload?: T; + updatedAt?: T; + createdAt?: T; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "arma-commands_select". + */ +export interface ArmaCommandsSelect { + commandId?: T; + server?: T; + type?: T; + payload?: T; + status?: T; + result?: T; + error?: T; + deliveredAt?: T; + completedAt?: T; + updatedAt?: T; + createdAt?: T; +} /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "plugin-ai-instructions_select". diff --git a/src/payload.config.ts b/src/payload.config.ts index 47e3a45..8761e72 100644 --- a/src/payload.config.ts +++ b/src/payload.config.ts @@ -19,6 +19,9 @@ import { Campaigns } from "@/collections/intelligence/Campaigns"; import { Qualifications } from "@/collections/users/Qualifications"; import { MissionFiles } from "@/collections/server/MissionFiles"; import { ModLists } from "@/collections/server/ModLists"; +import { GameServers } from "@/collections/server/GameServers"; +import { ArmaSyncEvents } from "@/collections/server/ArmaSyncEvents"; +import { ArmaCommands } from "@/collections/server/ArmaCommands"; import { Factions } from "@/collections/intelligence/Factions"; import { Assets } from "@/collections/logistics/Assets"; import { NarrativeEvents } from "@/collections/world/NarrativeEvents"; @@ -247,6 +250,9 @@ export default buildConfig({ // Server MissionFiles, ModLists, + GameServers, + ArmaSyncEvents, + ArmaCommands, ], editor: lexicalEditor({ features: ({ rootFeatures }) => {