XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFEServerManager

【Java】我的世界XFE服务器管理器

公开
关注 0 Fork 0 Star 0
UTF-8
export type Locale = 'zh-CN' | 'en-US';

export type ConnectionState = 'connecting' | 'online' | 'offline' | 'degraded';

export type Role = 'observer' | 'helper' | 'moderator' | 'administrator' | 'owner';

export interface SessionActor {
  id: string;
  displayName: string;
  roles: Role[];
  permissions: string[];
  totpVerified: boolean;
  totpEnabled?: boolean;
  reauthenticationRequired?: boolean;
}

export interface SessionInfo {
  authenticated: boolean;
  actor?: SessionActor;
  csrfToken?: string;
  bootstrapRequired?: boolean;
  expiresAt?: string;
}

export interface ApiMeta {
  name: string;
  apiVersion: string;
  setupRequired: boolean;
  serverReady: boolean;
}

export interface TotpEnrollment {
  secret: string;
  provisioningUri: string;
  expiresAt: string;
}

export interface TotpConfirmation {
  recoveryCodes: string[];
}

export interface AccountView {
  id: string;
  username: string;
  role: Role;
  totpEnabled: boolean;
  disabled: boolean;
  createdAt: string;
  updatedAt: string;
  lastLoginAt: string | null;
}

export interface MetricSeriesPoint {
  at: string;
  tps?: number;
  mspt?: number;
}

export interface DimensionStatus {
  id: string;
  loadedChunks: number;
  entities: number;
}

export interface ServerStatus {
  sampledAt: string;
  serverName?: string;
  minecraftVersion?: string;
  forgeVersion?: string;
  onlineMode?: boolean;
  uptimeSeconds: number;
  tps?: number;
  mspt?: {
    average?: number;
    p95?: number;
    p99?: number;
    jitter?: number;
  };
  cpuLoad?: number;
  heapUsedBytes?: number;
  heapMaxBytes?: number;
  gcPauseMs?: number;
  diskFreeBytes?: number;
  playersOnline: number;
  playersMax?: number;
  averagePingMs?: number;
  dimensions?: DimensionStatus[];
  samples?: MetricSeriesPoint[];
}

export interface PlayerLocation {
  dimension: string;
  x: number;
  y: number;
  z: number;
}

export interface PlayerSummary {
  uuid: string;
  name: string;
  online: boolean;
  pingMs?: number;
  opLevel?: number;
  roles?: Role[];
  gameMode?: string;
  health?: number;
  foodLevel?: number;
  location?: PlayerLocation;
  connectedAt?: string;
}

export type PlayerContainer = 'inventory' | 'ender-chest';

export interface InventorySlot {
  slot: number;
  itemId: string;
  count: number;
  structuredData: Record<string, string>;
  opaqueDataPresent: boolean;
  opaqueDataFingerprint: string;
}

export interface InventorySnapshot {
  playerUuid: string;
  container: 'inventory' | 'ender_chest';
  revision: number;
  online: boolean;
  slots: InventorySlot[];
}

export interface InventorySlotDiff {
  slot: number;
  before: InventorySlot;
  after: InventorySlot;
}

export interface InventoryUpdateResult extends OperationStatus {
  revision: number;
  diffs: InventorySlotDiff[];
}

export type PolicyEffect = 'PASS_THROUGH' | 'DENY' | 'GRANT' | 'CONSTRAIN';
export type PolicyState = 'DRAFT' | 'ACTIVE' | 'ARCHIVED';

export interface CommandPolicySummary {
  id: string;
  version: number;
  name: string;
  description?: string;
  state: PolicyState;
  effect?: PolicyEffect;
  ruleCount: number;
  groupCount?: number;
  updatedAt: string;
  updatedBy?: string;
}

export interface PolicyValidation {
  valid: boolean;
  errors: Array<string | { ruleId?: string; code?: string; message: string }>;
  warnings: Array<string | { ruleId?: string; code?: string; message: string }>;
}

export type PolicyCommandSource = 'server' | 'trigger';

/** A command that can be selected by a command-policy rule. */
export interface PolicyCommandCatalogEntry {
  /** Canonical policy identifier, for example `minecraft:kill` or a trigger command id. */
  id: string;
  /** Root literal as registered in Brigadier, without a leading slash. */
  root: string;
  usages: string[];
  aliases?: string[];
  source: PolicyCommandSource;
  triggerId?: string;
  triggerName?: string;
  arguments?: string[];
}

export interface PolicyCommandCatalog {
  commands: PolicyCommandCatalogEntry[];
}

export type PolicyRuleTier = 'DEFAULT' | 'OP_LEVEL' | 'ROLE' | 'UUID' | 'HARD_SAFETY';
export type PolicySourceKind = 'PLAYER' | 'CONSOLE' | 'COMMAND_BLOCK' | 'FUNCTION' | 'SCHEDULED_FUNCTION' | 'WEB_CONSOLE' | 'SYSTEM' | 'UNKNOWN';
export type PolicySelectorType = 'SELF' | 'NEAREST_PLAYER' | 'RANDOM_PLAYER' | 'ALL_PLAYERS' | 'ALL_ENTITIES' | 'DIRECT' | 'UNKNOWN';
export type PolicySelectorSort = 'NEAREST' | 'FURTHEST' | 'RANDOM' | 'ARBITRARY' | 'UNSPECIFIED';

export interface CommandPolicyRule {
  id: string;
  enabled: boolean;
  groupId: string;
  groupName: string;
  groupEnabled: boolean;
  tier: PolicyRuleTier;
  subject: {
    actorIds: string[];
    roles: string[];
    minimumOpLevel: number | null;
    maximumOpLevel: number | null;
    sources: PolicySourceKind[];
    onlineMode: boolean | null;
  };
  command: { commandIds: string[]; pathPrefix: string[] };
  effect: PolicyEffect;
  constraints: {
    selector: {
      deniedSelectorTypes: PolicySelectorType[];
      deniedSorts: PolicySelectorSort[];
      allowBroadSelectorWithExplicitType: boolean;
      maximumTargets: number | null;
      maximumDistance: number | null;
      allowedEntityTypes: string[];
      deniedEntityTypes: string[];
      allowTagFilters: boolean;
      allowNbtFilters: boolean;
      allowPredicateFilters: boolean;
    };
    item: {
      allowedItemIds: string[];
      deniedItemIds: string[];
      allowedItemTags: string[];
      deniedItemTags: string[];
      maximumCount: number | null;
      allowedDataKeys: string[];
      deniedDataKeys: string[];
    };
    allowedFunctionIds: string[];
    denyUnlistedFunctions: boolean;
  };
  reason: string;
}

export interface CommandPolicyDetail extends CommandPolicySummary {
  checksum: string;
  rules: CommandPolicyRule[];
  validation: PolicyValidation;
}

export interface PolicySimulation {
  decision: PolicyEffect;
  explanation: string[];
  matchedRuleIds?: string[];
  normalizedCommand?: string;
}

export interface AuditEvent {
  id: string;
  at: string;
  actor: string;
  source: string;
  action: string;
  target?: string;
  reason?: string;
  result: 'SUCCESS' | 'DENIED' | 'FAILED' | 'PARTIAL' | string;
  durationMs?: number;
  requestId?: string;
}

export interface ModerationCase {
  id: string;
  playerUuid: string;
  playerName?: string;
  type: 'WARN' | 'MUTE' | 'KICK' | 'TEMPBAN' | 'BAN' | string;
  state: 'ACTIVE' | 'EXPIRED' | 'REVOKED' | string;
  reason: string;
  message?: string;
  remainingSeconds?: number;
  createdAt: string;
  expiresAt?: string;
  actor: string;
  history?: Array<{
    id: string;
    type: string;
    reason: string;
    message?: string;
    issuedBy: string;
    issuedAt: string;
    expiresAt?: string;
    revokedBy?: string;
    revokedAt?: string;
  }>;
}

export interface MaintenanceSchedule {
  id: string;
  kind: string;
  executeAt: string;
  status: string;
  attempts: number;
  lastError?: string;
  createdBy: string;
}

export interface MaintenanceState {
  enabled: boolean;
  message: string;
  defaultMessageSender: string;
  allowedPlayers: string[];
  revision: number;
  schedules: MaintenanceSchedule[];
}

export interface ClaimSummary {
  id: string;
  name?: string;
  dimension: string;
  ownerUuid: string;
  ownerName?: string;
  chunks: Array<{ x: number; z: number }>;
  members: Record<string, 'manager' | 'member' | 'trusted'>;
  flags: Record<string, boolean>;
  revision: number;
  updatedAt?: string;
}

export interface WorldChangeSummary {
  id: string;
  at: string;
  actor?: string;
  action: string;
  resourceId?: string;
  dimension: string;
  x: number;
  y: number;
  z: number;
  transactionId?: string;
}

export interface RollbackPreview {
  id: string;
  watermark: number;
  confirmationToken: string;
  expiresAt?: string;
  matched: number;
  applicable: number;
  conflicts: number;
  unloadedChunks: number;
  gaps: number;
  incompatible: number;
}

export interface OperationStatus {
  id: string;
  kind: string;
  state: 'QUEUED' | 'RUNNING' | 'SUCCEEDED' | 'FAILED' | 'CANCELLED' | string;
  progress?: number;
  message?: string;
  createdAt?: string;
  completedAt?: string;
  expiresAt?: string;
  previewToken?: string;
  targets?: Array<{ uuid: string; name?: string }>;
  policy?: CommandPolicySummary;
  restartRequired?: boolean;
}

export interface FeatureFlags {
  consoleEnabled: boolean;
  moderationEnabled: boolean;
  claimsEnabled: boolean;
  worldTrackingEnabled: boolean;
  rollbackEnabled: boolean;
  joinExperienceEnabled?: boolean;
  metricsEnabled?: boolean;
}

export interface ServerSettings {
  bindAddress: string;
  port: number;
  publicBaseUrl: string;
  trustedProxyCidrs: string[];
  idleSessionSeconds: number;
  absoluteSessionSeconds: number;
  recentAuthenticationSeconds: number;
  httpThreads: number;
  maximumSseClients: number;
  webConsoleEnabled: boolean;
  rawItemEditingEnabled: boolean;
  metricsEnabled: boolean;
  moderationEnabled: boolean;
  claimsEnabled: boolean;
  worldTrackingEnabled: boolean;
  rollbackEnabled: boolean;
  joinExperienceEnabled: boolean;
  defaultMessageSender: string;
  joinWelcomeEnabled: boolean;
  joinWelcomeMessage: string;
  firstJoinMessageEnabled: boolean;
  firstJoinMessage: string;
  dailyAnnouncementsEnabled: boolean;
  dailyAnnouncements: string[];
  announcementTimeZone: string;
  rulesReminderEnabled: boolean;
  rulesMessage: string;
  maintenanceJoinReminderEnabled: boolean;
  crashProtection: CrashProtectionSettings;
  restartRequired?: boolean;
  features: FeatureFlags;
  serverLocale?: Locale;
  metricsRequireToken?: boolean;
  blueMapDetected?: boolean;
  sparkDetected?: boolean;
  offlineMode?: boolean;
}

export interface CrashProtectionSettings {
  enabled: boolean;
  scanIntervalTicks: number;
  itemEntitiesPerDimension: number;
  itemEntitiesPerChunk: number;
  livingEntitiesPerDimension: number;
  livingEntitiesPerChunk: number;
  totalEntitiesPerDimension: number;
  totalEntitiesPerChunk: number;
  entitiesPerNamespacePerDimension: number;
  loadedChunksPerDimension: number;
  spawnBurstLimit: number;
  spawnBurstWindowTicks: number;
  commandBlockCommandsPerSecond: number;
  slowTickMillis: number;
  consecutiveSlowTicks: number;
  heapUsagePercent: number;
  blockExcessSpawns: boolean;
  removeExcessItems: boolean;
  stopRunawayCommandBlocks: boolean;
}

export type TriggerMode = 'visual' | 'code';
export type TriggerConditionMode = 'all' | 'any';

export interface TriggerEventSpec {
  type: string;
  configuration: Record<string, string>;
  /** Typed Brigadier alternatives. Legacy servers may omit this and use configuration.arguments. */
  arguments?: TriggerCommandArgument[];
  /** Trigger-owned strongly typed state, exposed as var.<name>. */
  variables?: TriggerStateVariableDefinition[];
}

export interface TriggerCommandArgument {
  name: string;
  type: string;
  literal: string;
  optional: boolean;
  errorMessage: string;
  minimum: string;
  maximum: string;
  suggestions: string[];
  children: TriggerCommandArgument[];
}

export interface TriggerStateVariableDefinition {
  name: string;
  type: string;
  initialValue: string;
  /** Omitted by legacy definitions and therefore treated as trigger-local. */
  visibility?: 'trigger' | 'global';
  /** Omitted by legacy definitions and therefore stored against the declaring trigger. */
  storage?: 'server' | 'player' | 'dimension' | 'trigger';
}

export interface TriggerVariableValues {
  triggerId: string;
  values: Record<string, unknown>;
  observedAt: string;
}

export interface TriggerCondition {
  field: string;
  operator: string;
  value: string;
}

export interface TriggerAction {
  type: string;
  parameters: Record<string, string>;
  /** Only structural condition actions contain children; omitted by legacy persisted actions. */
  children?: TriggerAction[];
}

export interface TriggerProgram {
  event: TriggerEventSpec;
  conditionMode: TriggerConditionMode;
  conditions: TriggerCondition[];
  actions: TriggerAction[];
}

export interface TriggerValidation extends TriggerProgram {
  valid: boolean;
}

export interface TriggerDefinition {
  id: string;
  groupId: string;
  name: string;
  description: string;
  enabled: boolean;
  mode: TriggerMode;
  event: TriggerEventSpec;
  conditionMode: TriggerConditionMode;
  conditions: TriggerCondition[];
  actions: TriggerAction[];
  script: string;
  revision: number;
  createdBy: string;
  createdAt: string;
  updatedAt: string;
  migrated: boolean;
}

export interface TriggerGroup {
  id: string;
  name: string;
  description: string;
  enabled: boolean;
  revision: number;
  createdBy: string;
  createdAt: string;
  updatedAt: string;
  migrated: boolean;
  triggers: TriggerDefinition[];
}

export interface TriggerWorkspace {
  groups: TriggerGroup[];
  totalTriggers: number;
}

export interface TriggerVariableDefinition {
  /** Variable expression without the surrounding braces. */
  key: string;
  nameZh: string;
  nameEn: string;
  descriptionZh: string;
  descriptionEn: string;
  category: string;
  /** Availability scopes such as global, player-event, schedule, or an exact event type. */
  scopes: string[];
  example?: string;
  sampleValue?: string;
  formatHint?: string;
  /** Optional value metadata supplied by newer servers. */
  type?: string;
  events?: string[];
  templateAllowed?: boolean;
  conditionAllowed?: boolean;
  sensitive?: boolean;
}

export interface TriggerCatalog {
  defaultMessageSender: string;
  events: string[];
  operators: string[];
  actions: string[];
  actionParameters: Record<string, string[]>;
  commandArgumentTypes?: string[];
  triggerVariableTypes?: string[];
  /** Omitted by older servers; clients retain the legacy four-variable fallback. */
  variables?: TriggerVariableDefinition[];
}

export interface MenuControlEvent {
  event: 'click' | 'double_click' | 'change' | 'submit' | 'toggle' | 'hover' | 'focus' | 'blur';
  triggerId: string;
  submenuId: string;
  closeMenu: boolean;
}

export interface MenuControl {
  id: string;
  type: 'text' | 'rich_text' | 'button' | 'icon_button' | 'image' | 'panel' | 'border'
    | 'progress' | 'input' | 'checkbox' | 'slider' | 'item_slot' | 'separator' | 'spacer';
  x: number;
  y: number;
  width: number;
  height: number;
  zIndex: number;
  visibleWhen: string;
  properties: Record<string, string>;
  events: MenuControlEvent[];
}

export interface MenuDefinition {
  id: string;
  name: string;
  description: string;
  width: number;
  height: number;
  popupPosition: 'center' | 'top' | 'bottom' | 'left' | 'right' | 'top_left' | 'top_right'
    | 'bottom_left' | 'bottom_right' | 'custom';
  offsetX: number;
  offsetY: number;
  pauseGame: boolean;
  backgroundColor: string;
  controls: MenuControl[];
  revision: number;
  createdBy: string;
  createdAt: string;
  updatedAt: string;
}

export interface MenuWorkspace {
  menus: MenuDefinition[];
  totalMenus: number;
}

export interface MenuCatalogTrigger {
  id: string;
  name: string;
  enabled: boolean;
}

export interface MenuCatalog {
  controlTypes: MenuControl['type'][];
  popupPositions: MenuDefinition['popupPosition'][];
  controlEvents: MenuControlEvent['event'][];
  triggers: MenuCatalogTrigger[];
}

export interface MenuImageCatalogItem {
  id?: string;
  reference: string;
  name: string;
  type: 'uploaded' | 'texture' | 'item' | 'block';
  source: string;
  mimeType?: string;
  width?: number;
  height?: number;
  sha256?: string;
  dataUrl?: string;
}

export interface CurrencyDefinition {
  id: string;
  code: string;
  name: string;
  symbol: string;
  icon: string;
  fractionDigits: number;
  initialBalance: string;
  minimumBalance: string;
  maximumBalance: string;
  playerTransferAllowed: boolean;
  enabled: boolean;
  primary: boolean;
  revision: number;
  createdBy: string;
  createdAt: string;
  updatedAt: string;
}

export interface EconomyBalance {
  currencyId: string;
  currencyCode: string;
  currencyName: string;
  symbol: string;
  icon: string;
  fractionDigits: number;
  amount: string;
  revision: number;
  currencyEnabled: boolean;
  updatedAt: string;
}

export interface EconomyAccount {
  playerId: string;
  playerName: string;
  balances: EconomyBalance[];
  updatedAt: string;
}

export interface EconomyTransaction {
  id: string;
  currencyId: string;
  currencyCode: string;
  kind: 'initial' | 'deposit' | 'withdraw' | 'set' | 'transfer';
  sourcePlayerId?: string;
  sourcePlayerName: string;
  targetPlayerId?: string;
  targetPlayerName: string;
  amount: string;
  sourceBalanceBefore: string;
  sourceBalanceAfter: string;
  targetBalanceBefore: string;
  targetBalanceAfter: string;
  reason: string;
  actor: string;
  origin: string;
  correlationId: string;
  createdAt: string;
}

export interface EconomyCurrencySummary {
  currencyId: string;
  code: string;
  name: string;
  symbol: string;
  icon: string;
  fractionDigits: number;
  enabled: boolean;
  primary: boolean;
  accountCount: number;
  totalSupply: string;
  minimumBalance: string;
  maximumBalance: string;
  transactionCount: number;
  transferVolume24h: string;
}

export interface EconomyOverview {
  currencies: EconomyCurrencySummary[];
  observedAt: string;
}

export interface EconomyWorkspace {
  currencies: CurrencyDefinition[];
  overview: EconomyOverview;
}

export interface EconomyChange {
  currency: CurrencyDefinition;
  transaction: EconomyTransaction;
  sourceBalance?: EconomyBalance;
  targetBalance?: EconomyBalance;
}

export interface PageResult<T> {
  items: T[];
  nextCursor?: string;
  total?: number;
}

export interface ApiProblem {
  type?: string;
  title: string;
  status: number;
  detail?: string;
  instance?: string;
  requestId?: string;
  errors?: Record<string, string[]>;
}

export interface StreamEvent<T = unknown> {
  type: string;
  id?: string;
  at?: string;
  data: T;
}