glitch-javascript-sdk 3.2.31 → 3.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -482,6 +482,276 @@ export interface MultiplayerVoicePollRequest {
482
482
  exclude_self?: boolean;
483
483
  }
484
484
 
485
+ // ---------------------------------------------------------------------------
486
+ // MMO world layer: realms (shards), zones, instances, presence, matchmaking,
487
+ // trust/moderation bans, and real-time negotiate.
488
+ // ---------------------------------------------------------------------------
489
+
490
+ export type MultiplayerRealmStatus = 'active' | 'locked' | 'maintenance' | 'full' | 'offline';
491
+ export type MultiplayerZoneType = 'overworld' | 'city' | 'dungeon' | 'raid' | 'arena' | 'instanced';
492
+ export type MultiplayerInstanceKind = 'persistent' | 'dynamic' | 'dungeon' | 'raid' | 'arena';
493
+ export type MultiplayerInstanceState = 'provisioning' | 'active' | 'draining' | 'closed';
494
+ export type MultiplayerPresenceStatus = 'online' | 'in_queue' | 'in_world' | 'away' | 'offline';
495
+ export type MultiplayerMatchmakingStatus = 'queued' | 'matched' | 'canceled' | 'expired' | 'timed_out';
496
+ export type MultiplayerBanScope = 'title' | 'realm' | 'lobby' | 'server' | 'voice';
497
+ export type MultiplayerBanSource = 'manual' | 'report' | 'anticheat' | 'automated';
498
+ export type MultiplayerRealtimeScopeType = 'lobby' | 'voice' | 'zone' | 'instance';
499
+
500
+ /** A persistent world copy (shard). */
501
+ export interface MultiplayerRealm {
502
+ id: string;
503
+ title_id: string;
504
+ name: string;
505
+ slug?: string | null;
506
+ region?: string | null;
507
+ status: MultiplayerRealmStatus;
508
+ population_cap: number;
509
+ current_population: number;
510
+ recommended: boolean;
511
+ ruleset: MultiplayerMetadata;
512
+ metadata: MultiplayerMetadata;
513
+ last_activity_at?: string | null;
514
+ created_at?: string | null;
515
+ updated_at?: string | null;
516
+ }
517
+
518
+ /** A named area within a realm (map/continent/dungeon template). */
519
+ export interface MultiplayerZone {
520
+ id: string;
521
+ title_id: string;
522
+ realm_id: string;
523
+ zone_key: string;
524
+ display_name: string;
525
+ zone_type: MultiplayerZoneType;
526
+ is_instanced: boolean;
527
+ max_players_per_instance: number;
528
+ min_instances: number;
529
+ grid_cell_size: number;
530
+ coordinates_bounds: MultiplayerMetadata;
531
+ metadata: MultiplayerMetadata;
532
+ created_at?: string | null;
533
+ updated_at?: string | null;
534
+ }
535
+
536
+ /** A runtime copy of a zone, optionally bound to a game server. */
537
+ export interface MultiplayerInstance {
538
+ id: string;
539
+ title_id: string;
540
+ realm_id: string;
541
+ zone_id: string;
542
+ server_id?: string | null;
543
+ instance_kind: MultiplayerInstanceKind;
544
+ state: MultiplayerInstanceState;
545
+ layer: number;
546
+ difficulty?: string | null;
547
+ max_players: number;
548
+ current_players: number;
549
+ metadata: MultiplayerMetadata;
550
+ last_heartbeat_at?: string | null;
551
+ expires_at?: string | null;
552
+ created_at?: string | null;
553
+ updated_at?: string | null;
554
+ server?: MultiplayerServer | null;
555
+ }
556
+
557
+ /** Authoritative location of a player. */
558
+ export interface MultiplayerPresence {
559
+ id: string;
560
+ title_id: string;
561
+ player_id: string;
562
+ user_id?: string | null;
563
+ realm_id?: string | null;
564
+ zone_id?: string | null;
565
+ instance_id?: string | null;
566
+ party_id?: string | null;
567
+ display_name?: string | null;
568
+ status: MultiplayerPresenceStatus;
569
+ rich_status?: string | null;
570
+ pos_x?: number | null;
571
+ pos_y?: number | null;
572
+ pos_z?: number | null;
573
+ heading?: number | null;
574
+ grid_cell?: string | null;
575
+ metadata: MultiplayerMetadata;
576
+ last_heartbeat_at?: string | null;
577
+ expires_at?: string | null;
578
+ }
579
+
580
+ export interface MultiplayerMatchmakingTicket {
581
+ id: string;
582
+ title_id: string;
583
+ queue: string;
584
+ player_id: string;
585
+ user_id?: string | null;
586
+ party: string[];
587
+ attributes: MultiplayerMetadata;
588
+ skill?: number | null;
589
+ region?: string | null;
590
+ status: MultiplayerMatchmakingStatus;
591
+ match_id?: string | null;
592
+ assignment?: MultiplayerMetadata | null;
593
+ queued_at?: string | null;
594
+ matched_at?: string | null;
595
+ expires_at?: string | null;
596
+ }
597
+
598
+ export interface MultiplayerBan {
599
+ id: string;
600
+ title_id: string;
601
+ scope: MultiplayerBanScope;
602
+ scope_id?: string | null;
603
+ player_id: string;
604
+ user_id?: string | null;
605
+ issued_by?: string | null;
606
+ source: MultiplayerBanSource;
607
+ reason?: string | null;
608
+ metadata: MultiplayerMetadata;
609
+ expires_at?: string | null;
610
+ }
611
+
612
+ export interface MultiplayerRealmListParams {
613
+ region?: string;
614
+ status?: MultiplayerRealmStatus;
615
+ recommended?: boolean;
616
+ limit?: number;
617
+ }
618
+
619
+ export interface MultiplayerCreateRealmRequest {
620
+ name: string;
621
+ slug?: string;
622
+ region?: string;
623
+ status?: MultiplayerRealmStatus;
624
+ population_cap?: number;
625
+ recommended?: boolean;
626
+ ruleset?: MultiplayerMetadata;
627
+ metadata?: MultiplayerMetadata;
628
+ }
629
+
630
+ export interface MultiplayerUpdateRealmRequest extends Partial<MultiplayerCreateRealmRequest> {}
631
+
632
+ export interface MultiplayerZoneListParams {
633
+ zone_type?: MultiplayerZoneType;
634
+ limit?: number;
635
+ }
636
+
637
+ export interface MultiplayerCreateZoneRequest {
638
+ zone_key: string;
639
+ display_name: string;
640
+ zone_type?: MultiplayerZoneType;
641
+ is_instanced?: boolean;
642
+ max_players_per_instance?: number;
643
+ min_instances?: number;
644
+ grid_cell_size?: number;
645
+ coordinates_bounds?: MultiplayerMetadata;
646
+ metadata?: MultiplayerMetadata;
647
+ }
648
+
649
+ export interface MultiplayerInstanceListParams {
650
+ state?: MultiplayerInstanceState;
651
+ limit?: number;
652
+ }
653
+
654
+ export interface MultiplayerEnterZoneRequest {
655
+ player_id?: string;
656
+ realm_id: string;
657
+ zone_id: string;
658
+ server_id?: string;
659
+ party_id?: string;
660
+ instance_kind?: MultiplayerInstanceKind;
661
+ difficulty?: string;
662
+ display_name?: string;
663
+ rich_status?: string;
664
+ pos_x?: number;
665
+ pos_y?: number;
666
+ pos_z?: number;
667
+ heading?: number;
668
+ metadata?: MultiplayerMetadata;
669
+ instance_metadata?: MultiplayerMetadata;
670
+ ttl_minutes?: number;
671
+ }
672
+
673
+ export interface MultiplayerEnterZoneResponse {
674
+ instance: MultiplayerInstance;
675
+ presence: MultiplayerPresence;
676
+ }
677
+
678
+ export interface MultiplayerUpdatePresenceRequest {
679
+ player_id?: string;
680
+ status?: MultiplayerPresenceStatus;
681
+ rich_status?: string;
682
+ pos_x?: number;
683
+ pos_y?: number;
684
+ pos_z?: number;
685
+ heading?: number;
686
+ ttl_minutes?: number;
687
+ }
688
+
689
+ export interface MultiplayerLeaveWorldRequest {
690
+ player_id?: string;
691
+ }
692
+
693
+ export interface MultiplayerInstancePresenceParams {
694
+ grid_cell?: string;
695
+ radius?: number;
696
+ limit?: number;
697
+ }
698
+
699
+ export interface MultiplayerEnqueueTicketRequest {
700
+ player_id?: string;
701
+ queue: string;
702
+ party?: string[];
703
+ attributes?: MultiplayerMetadata;
704
+ skill?: number;
705
+ region?: string;
706
+ ttl_seconds?: number;
707
+ }
708
+
709
+ export interface MultiplayerCancelTicketParams {
710
+ player_id?: string;
711
+ }
712
+
713
+ export interface MultiplayerBanListParams {
714
+ scope?: MultiplayerBanScope;
715
+ player_id?: string;
716
+ source?: MultiplayerBanSource;
717
+ active_only?: boolean;
718
+ limit?: number;
719
+ }
720
+
721
+ export interface MultiplayerCreateBanRequest {
722
+ player_id: string;
723
+ scope?: MultiplayerBanScope;
724
+ scope_id?: string;
725
+ user_id?: string;
726
+ source?: MultiplayerBanSource;
727
+ reason?: string;
728
+ metadata?: MultiplayerMetadata;
729
+ expires_at?: string;
730
+ }
731
+
732
+ export interface MultiplayerDeleteBanResponse {
733
+ deleted: boolean;
734
+ }
735
+
736
+ export interface MultiplayerRealtimeScope {
737
+ type: MultiplayerRealtimeScopeType;
738
+ id: string;
739
+ }
740
+
741
+ export interface MultiplayerRealtimeNegotiateRequest {
742
+ player_id?: string;
743
+ scopes?: MultiplayerRealtimeScope[];
744
+ }
745
+
746
+ export interface MultiplayerRealtimeNegotiateResponse {
747
+ protocol: string;
748
+ url: string | null;
749
+ configured: boolean;
750
+ groups: string[];
751
+ access_token: string | null;
752
+ expires_at: string | null;
753
+ }
754
+
485
755
  /**
486
756
  * Steam-style multiplayer APIs for Glitch titles.
487
757
  *
@@ -1007,6 +1277,253 @@ class Multiplayer {
1007
1277
  return Requests.processRoute(MultiplayerRoute.routes.deleteFavorite, undefined, { title_id, favorite_id }, params);
1008
1278
  }
1009
1279
 
1280
+ // -----------------------------------------------------------------------
1281
+ // MMO world layer
1282
+ // -----------------------------------------------------------------------
1283
+
1284
+ /**
1285
+ * List realms (persistent world shards) so a player can choose where to log in.
1286
+ *
1287
+ * @param title_id Title UUID.
1288
+ * @param params Optional region/status filters; recommended realms sort first.
1289
+ * @example
1290
+ * Multiplayer.listRealms('title-uuid', { region: 'us-central', status: 'active' });
1291
+ */
1292
+ public static listRealms<T = MultiplayerRealm[]>(title_id: string, params?: MultiplayerRealmListParams): AxiosPromise<Response<T>> {
1293
+ return Requests.processRoute(MultiplayerRoute.routes.listRealms, undefined, { title_id }, params);
1294
+ }
1295
+
1296
+ /**
1297
+ * Create a realm. Requires a title administrator JWT.
1298
+ *
1299
+ * @param title_id Title UUID.
1300
+ * @param data Realm configuration.
1301
+ * @example
1302
+ * Multiplayer.createRealm('title-uuid', { name: 'Aurora', region: 'us-central', population_cap: 5000, recommended: true });
1303
+ */
1304
+ public static createRealm<T = MultiplayerRealm>(title_id: string, data: MultiplayerCreateRealmRequest): AxiosPromise<Response<T>> {
1305
+ return Requests.processRoute(MultiplayerRoute.routes.createRealm, data, { title_id });
1306
+ }
1307
+
1308
+ /**
1309
+ * Retrieve a single realm.
1310
+ *
1311
+ * @param title_id Title UUID.
1312
+ * @param realm_id Realm UUID.
1313
+ */
1314
+ public static showRealm<T = MultiplayerRealm>(title_id: string, realm_id: string): AxiosPromise<Response<T>> {
1315
+ return Requests.processRoute(MultiplayerRoute.routes.showRealm, undefined, { title_id, realm_id });
1316
+ }
1317
+
1318
+ /**
1319
+ * Update a realm (status, population cap, ruleset). Requires a title admin JWT.
1320
+ *
1321
+ * @param title_id Title UUID.
1322
+ * @param realm_id Realm UUID.
1323
+ * @param data Fields to update.
1324
+ */
1325
+ public static updateRealm<T = MultiplayerRealm>(title_id: string, realm_id: string, data: MultiplayerUpdateRealmRequest): AxiosPromise<Response<T>> {
1326
+ return Requests.processRoute(MultiplayerRoute.routes.updateRealm, data, { title_id, realm_id });
1327
+ }
1328
+
1329
+ /**
1330
+ * List the zones defined for a realm.
1331
+ *
1332
+ * @param title_id Title UUID.
1333
+ * @param realm_id Realm UUID.
1334
+ * @param params Optional zone_type filter.
1335
+ */
1336
+ public static listZones<T = MultiplayerZone[]>(title_id: string, realm_id: string, params?: MultiplayerZoneListParams): AxiosPromise<Response<T>> {
1337
+ return Requests.processRoute(MultiplayerRoute.routes.listZones, undefined, { title_id, realm_id }, params);
1338
+ }
1339
+
1340
+ /**
1341
+ * Create a zone in a realm. Requires a title administrator JWT.
1342
+ *
1343
+ * @param title_id Title UUID.
1344
+ * @param realm_id Realm UUID.
1345
+ * @param data Zone configuration, including interest-management grid cell size.
1346
+ * @example
1347
+ * Multiplayer.createZone('title-uuid', 'realm-uuid', {
1348
+ * zone_key: 'ashfall_valley',
1349
+ * display_name: 'Ashfall Valley',
1350
+ * zone_type: 'overworld',
1351
+ * max_players_per_instance: 100,
1352
+ * grid_cell_size: 64
1353
+ * });
1354
+ */
1355
+ public static createZone<T = MultiplayerZone>(title_id: string, realm_id: string, data: MultiplayerCreateZoneRequest): AxiosPromise<Response<T>> {
1356
+ return Requests.processRoute(MultiplayerRoute.routes.createZone, data, { title_id, realm_id });
1357
+ }
1358
+
1359
+ /**
1360
+ * List the active/other instances (runtime copies) of a zone.
1361
+ *
1362
+ * @param title_id Title UUID.
1363
+ * @param zone_id Zone UUID.
1364
+ * @param params Optional state filter.
1365
+ */
1366
+ public static listInstances<T = MultiplayerInstance[]>(title_id: string, zone_id: string, params?: MultiplayerInstanceListParams): AxiosPromise<Response<T>> {
1367
+ return Requests.processRoute(MultiplayerRoute.routes.listInstances, undefined, { title_id, zone_id }, params);
1368
+ }
1369
+
1370
+ /**
1371
+ * Retrieve a single instance.
1372
+ *
1373
+ * @param title_id Title UUID.
1374
+ * @param instance_id Instance UUID.
1375
+ */
1376
+ public static showInstance<T = MultiplayerInstance>(title_id: string, instance_id: string): AxiosPromise<Response<T>> {
1377
+ return Requests.processRoute(MultiplayerRoute.routes.showInstance, undefined, { title_id, instance_id });
1378
+ }
1379
+
1380
+ /**
1381
+ * List players present in an instance. Pass grid_cell (and optional radius) to
1382
+ * receive only players in the caller's area of interest — the key to keeping
1383
+ * per-player fan-out bounded regardless of how populated the zone is.
1384
+ *
1385
+ * @param title_id Title UUID.
1386
+ * @param instance_id Instance UUID.
1387
+ * @param params grid_cell "cx:cy" and radius (0-4) to scope the query.
1388
+ * @example
1389
+ * Multiplayer.listInstancePresence('title-uuid', 'instance-uuid', { grid_cell: '12:8', radius: 1 });
1390
+ */
1391
+ public static listInstancePresence<T = MultiplayerPresence[]>(title_id: string, instance_id: string, params?: MultiplayerInstancePresenceParams): AxiosPromise<Response<T>> {
1392
+ return Requests.processRoute(MultiplayerRoute.routes.listInstancePresence, undefined, { title_id, instance_id }, params);
1393
+ }
1394
+
1395
+ /**
1396
+ * Enter a zone. The backend places the player into an active instance with
1397
+ * capacity (creating a new layer if all are full), enforces bans and realm
1398
+ * capacity, and upserts presence. Returns the instance and presence so the
1399
+ * client can connect and subscribe to the instance's real-time group.
1400
+ *
1401
+ * @param title_id Title UUID.
1402
+ * @param data Realm/zone target plus optional spawn position and metadata.
1403
+ * @example
1404
+ * Multiplayer.enterZone('title-uuid', {
1405
+ * player_id: 'steam:765...',
1406
+ * realm_id: 'realm-uuid',
1407
+ * zone_id: 'zone-uuid',
1408
+ * pos_x: 128.0, pos_z: 64.0
1409
+ * });
1410
+ */
1411
+ public static enterZone<T = MultiplayerEnterZoneResponse>(title_id: string, data: MultiplayerEnterZoneRequest): AxiosPromise<Response<T>> {
1412
+ return Requests.processRoute(MultiplayerRoute.routes.enterZone, data, { title_id });
1413
+ }
1414
+
1415
+ /**
1416
+ * Update presence (position, heading, rich status) and refresh the TTL. Call
1417
+ * on a movement interval and on notable state changes.
1418
+ *
1419
+ * @param title_id Title UUID.
1420
+ * @param data New position/status for the player.
1421
+ */
1422
+ public static updatePresence<T = MultiplayerPresence>(title_id: string, data: MultiplayerUpdatePresenceRequest): AxiosPromise<Response<T>> {
1423
+ return Requests.processRoute(MultiplayerRoute.routes.updatePresence, data, { title_id });
1424
+ }
1425
+
1426
+ /**
1427
+ * Leave the world. Frees the player's instance slot and realm population.
1428
+ *
1429
+ * @param title_id Title UUID.
1430
+ * @param data Optional player_id for title-token clients.
1431
+ */
1432
+ public static leaveWorld<T = MultiplayerPresence>(title_id: string, data?: MultiplayerLeaveWorldRequest): AxiosPromise<Response<T>> {
1433
+ return Requests.processRoute(MultiplayerRoute.routes.leaveWorld, data, { title_id });
1434
+ }
1435
+
1436
+ // -----------------------------------------------------------------------
1437
+ // Matchmaking
1438
+ // -----------------------------------------------------------------------
1439
+
1440
+ /**
1441
+ * Enqueue a matchmaking ticket. Idempotent per (queue, player): an existing
1442
+ * open ticket is returned rather than duplicated, so retries are safe. Poll
1443
+ * the ticket or subscribe to `matchmaking.matched` for the assignment.
1444
+ *
1445
+ * @param title_id Title UUID.
1446
+ * @param data Queue name plus optional party, skill, region, and attributes.
1447
+ * @example
1448
+ * Multiplayer.enqueueTicket('title-uuid', { player_id: 'steam:765...', queue: 'ranked_2v2', skill: 1840, region: 'us-central' });
1449
+ */
1450
+ public static enqueueTicket<T = MultiplayerMatchmakingTicket>(title_id: string, data: MultiplayerEnqueueTicketRequest): AxiosPromise<Response<T>> {
1451
+ return Requests.processRoute(MultiplayerRoute.routes.enqueueTicket, data, { title_id });
1452
+ }
1453
+
1454
+ /**
1455
+ * Poll a matchmaking ticket. A queued ticket past its TTL is reported as
1456
+ * `timed_out`; a matched ticket carries the connection `assignment`.
1457
+ *
1458
+ * @param title_id Title UUID.
1459
+ * @param ticket_id Ticket UUID.
1460
+ */
1461
+ public static showTicket<T = MultiplayerMatchmakingTicket>(title_id: string, ticket_id: string): AxiosPromise<Response<T>> {
1462
+ return Requests.processRoute(MultiplayerRoute.routes.showTicket, undefined, { title_id, ticket_id });
1463
+ }
1464
+
1465
+ /**
1466
+ * Cancel a queued matchmaking ticket.
1467
+ *
1468
+ * @param title_id Title UUID.
1469
+ * @param ticket_id Ticket UUID.
1470
+ */
1471
+ public static cancelTicket<T = MultiplayerMatchmakingTicket>(title_id: string, ticket_id: string): AxiosPromise<Response<T>> {
1472
+ return Requests.processRoute(MultiplayerRoute.routes.cancelTicket, undefined, { title_id, ticket_id });
1473
+ }
1474
+
1475
+ // -----------------------------------------------------------------------
1476
+ // Real-time negotiate + trust/moderation
1477
+ // -----------------------------------------------------------------------
1478
+
1479
+ /**
1480
+ * Negotiate a real-time push connection. Returns the authorized group names
1481
+ * and the push endpoint. When SignalR/Web PubSub is configured, an
1482
+ * access_token scoped to those groups is included; otherwise `configured` is
1483
+ * false and the client should fall back to the polling endpoints.
1484
+ *
1485
+ * @param title_id Title UUID.
1486
+ * @param data Optional player_id and the scopes (lobby/voice/zone/instance) to subscribe to.
1487
+ * @example
1488
+ * Multiplayer.negotiateRealtime('title-uuid', { player_id: 'steam:765...', scopes: [{ type: 'instance', id: 'instance-uuid' }] });
1489
+ */
1490
+ public static negotiateRealtime<T = MultiplayerRealtimeNegotiateResponse>(title_id: string, data?: MultiplayerRealtimeNegotiateRequest): AxiosPromise<Response<T>> {
1491
+ return Requests.processRoute(MultiplayerRoute.routes.negotiateRealtime, data, { title_id });
1492
+ }
1493
+
1494
+ /**
1495
+ * List bans for a title. Requires a title administrator JWT.
1496
+ *
1497
+ * @param title_id Title UUID.
1498
+ * @param params Optional scope/player/source filters and active_only.
1499
+ */
1500
+ public static listBans<T = MultiplayerBan[]>(title_id: string, params?: MultiplayerBanListParams): AxiosPromise<Response<T>> {
1501
+ return Requests.processRoute(MultiplayerRoute.routes.listBans, undefined, { title_id }, params);
1502
+ }
1503
+
1504
+ /**
1505
+ * Ban a player at a scope (title/realm/lobby/server/voice). Requires a title
1506
+ * administrator JWT. Omit expires_at for a permanent ban.
1507
+ *
1508
+ * @param title_id Title UUID.
1509
+ * @param data Ban target and scope.
1510
+ * @example
1511
+ * Multiplayer.createBan('title-uuid', { player_id: 'steam:765...', scope: 'title', reason: 'Cheating: aimbot' });
1512
+ */
1513
+ public static createBan<T = MultiplayerBan>(title_id: string, data: MultiplayerCreateBanRequest): AxiosPromise<Response<T>> {
1514
+ return Requests.processRoute(MultiplayerRoute.routes.createBan, data, { title_id });
1515
+ }
1516
+
1517
+ /**
1518
+ * Lift a ban. Requires a title administrator JWT.
1519
+ *
1520
+ * @param title_id Title UUID.
1521
+ * @param ban_id Ban UUID.
1522
+ */
1523
+ public static deleteBan<T = MultiplayerDeleteBanResponse>(title_id: string, ban_id: string): AxiosPromise<Response<T>> {
1524
+ return Requests.processRoute(MultiplayerRoute.routes.deleteBan, undefined, { title_id, ban_id });
1525
+ }
1526
+
1010
1527
  }
1011
1528
 
1012
1529
  export default Multiplayer;
package/src/api/index.ts CHANGED
@@ -49,6 +49,7 @@ import Agents from "./Agents";
49
49
  import Mcp from "./Mcp";
50
50
  import PrDirectory from "./PrDirectory";
51
51
  import AdminReports from "./AdminReports";
52
+ import AdminUsers from "./AdminUsers";
52
53
  import MarketResearch from "./MarketResearch";
53
54
 
54
55
  export {Ads};
@@ -102,4 +103,5 @@ export {Agents};
102
103
  export {Mcp};
103
104
  export {PrDirectory};
104
105
  export {AdminReports};
106
+ export {AdminUsers};
105
107
  export {MarketResearch};
package/src/index.ts CHANGED
@@ -53,6 +53,7 @@ import {Agents} from './api';
53
53
  import {Mcp} from './api';
54
54
  import {PrDirectory} from './api';
55
55
  import {AdminReports} from './api';
56
+ import {AdminUsers} from './api';
56
57
  import {MarketResearch} from './api';
57
58
 
58
59
  import Requests from "./util/Requests";
@@ -136,6 +137,7 @@ class Glitch {
136
137
  Mcp : Mcp,
137
138
  PrDirectory : PrDirectory,
138
139
  AdminReports : AdminReports,
140
+ AdminUsers : AdminUsers,
139
141
  MarketResearch : MarketResearch,
140
142
  }
141
143
 
@@ -0,0 +1,24 @@
1
+ import Route from "./interface";
2
+ import HTTP_METHODS from "../constants/HttpMethods";
3
+
4
+ class AdminUsersRoute {
5
+ public static routes: { [key: string]: Route } = {
6
+ // List and search every user in the system (site admin only).
7
+ list: {
8
+ url: '/admin/users',
9
+ method: HTTP_METHODS.GET
10
+ },
11
+ // Full profile for a single user (site admin only).
12
+ view: {
13
+ url: '/admin/users/{user_id}',
14
+ method: HTTP_METHODS.GET
15
+ },
16
+ // Securely impersonate a user (super admin only, audited).
17
+ impersonate: {
18
+ url: '/admin/users/impersonate',
19
+ method: HTTP_METHODS.POST
20
+ },
21
+ };
22
+ }
23
+
24
+ export default AdminUsersRoute;
@@ -39,6 +39,31 @@ class MultiplayerRoute {
39
39
  listFavorites: { url: '/titles/{title_id}/multiplayer/favorites', method: HTTP_METHODS.GET },
40
40
  addFavorite: { url: '/titles/{title_id}/multiplayer/favorites', method: HTTP_METHODS.POST },
41
41
  deleteFavorite: { url: '/titles/{title_id}/multiplayer/favorites/{favorite_id}', method: HTTP_METHODS.DELETE },
42
+
43
+ // MMO world layer: realms, zones, instances, presence.
44
+ listRealms: { url: '/titles/{title_id}/multiplayer/realms', method: HTTP_METHODS.GET },
45
+ createRealm: { url: '/titles/{title_id}/multiplayer/realms', method: HTTP_METHODS.POST },
46
+ showRealm: { url: '/titles/{title_id}/multiplayer/realms/{realm_id}', method: HTTP_METHODS.GET },
47
+ updateRealm: { url: '/titles/{title_id}/multiplayer/realms/{realm_id}', method: HTTP_METHODS.PUT },
48
+ listZones: { url: '/titles/{title_id}/multiplayer/realms/{realm_id}/zones', method: HTTP_METHODS.GET },
49
+ createZone: { url: '/titles/{title_id}/multiplayer/realms/{realm_id}/zones', method: HTTP_METHODS.POST },
50
+ listInstances: { url: '/titles/{title_id}/multiplayer/zones/{zone_id}/instances', method: HTTP_METHODS.GET },
51
+ showInstance: { url: '/titles/{title_id}/multiplayer/instances/{instance_id}', method: HTTP_METHODS.GET },
52
+ listInstancePresence: { url: '/titles/{title_id}/multiplayer/instances/{instance_id}/presence', method: HTTP_METHODS.GET },
53
+ enterZone: { url: '/titles/{title_id}/multiplayer/world/enter', method: HTTP_METHODS.POST },
54
+ updatePresence: { url: '/titles/{title_id}/multiplayer/world/presence', method: HTTP_METHODS.POST },
55
+ leaveWorld: { url: '/titles/{title_id}/multiplayer/world/leave', method: HTTP_METHODS.POST },
56
+
57
+ // Ticketed matchmaking.
58
+ enqueueTicket: { url: '/titles/{title_id}/multiplayer/matchmaking/tickets', method: HTTP_METHODS.POST },
59
+ showTicket: { url: '/titles/{title_id}/multiplayer/matchmaking/tickets/{ticket_id}', method: HTTP_METHODS.GET },
60
+ cancelTicket: { url: '/titles/{title_id}/multiplayer/matchmaking/tickets/{ticket_id}', method: HTTP_METHODS.DELETE },
61
+
62
+ // Real-time negotiate + trust/moderation.
63
+ negotiateRealtime: { url: '/titles/{title_id}/multiplayer/realtime/negotiate', method: HTTP_METHODS.POST },
64
+ listBans: { url: '/titles/{title_id}/multiplayer/bans', method: HTTP_METHODS.GET },
65
+ createBan: { url: '/titles/{title_id}/multiplayer/bans', method: HTTP_METHODS.POST },
66
+ deleteBan: { url: '/titles/{title_id}/multiplayer/bans/{ban_id}', method: HTTP_METHODS.DELETE },
42
67
  };
43
68
 
44
69
  }