@notidotbot/noti-api-client 1.4.16 → 1.4.18

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.
@@ -40,13 +40,13 @@ export declare class APIClient {
40
40
  content: string;
41
41
  thumbnail: string | null;
42
42
  authorIcon: string;
43
+ tags: string[];
43
44
  clientId: string;
44
45
  identifier: string;
45
46
  isPinned: boolean;
46
47
  views: number | null;
47
48
  reactions: string[];
48
49
  reactionsCount: number | null;
49
- tags: string[];
50
50
  authorName: string;
51
51
  createdAt: Date;
52
52
  lastEdited: Date;
@@ -31,6 +31,14 @@ export type DropsGamesReturnTypes = {
31
31
  };
32
32
  export type DropsGameData = {
33
33
  id: string;
34
+ /**
35
+ * Every platform-specific DropGame dbId backing this merged entry. The same game can
36
+ * exist on multiple platforms (e.g. Kick "rust" and Twitch "263490") as separate rows,
37
+ * each with its own id. A guild stores only ONE of these on its filter, so consumers
38
+ * must check a configured id against ALL `ids` — checking only `id` makes a configured
39
+ * game appear disabled when the merge surfaces a different platform's id.
40
+ */
41
+ ids?: string[];
34
42
  gameId: string;
35
43
  platform?: string;
36
44
  platforms?: string[];
@@ -0,0 +1,363 @@
1
+ import { WebDataManager } from '../core/manager';
2
+ import { CancelOutWebResponses, WebResponse } from '../types';
3
+ export type GameStore = 'steam' | 'epic' | 'gog' | 'prime';
4
+ export type GameKind = 'free_game' | 'free_dlc_or_loot' | 'discount' | 'upcoming_free';
5
+ export type GameDiscountTier = '100' | '90_plus' | '75_plus' | '50_plus' | '33_plus' | 'under_33';
6
+ export type GameDelivery = 'instant' | 'daily' | 'weekly';
7
+ export type GameFlag = 'freeWeekend' | 'allTimeLow' | 'featured' | 'aaa' | 'earlyAccess';
8
+ export type GameSourceId = 'epic_free' | 'cheapshark' | 'steam_featured' | 'gamerpower' | 'watchlist' | 'steam_weekend';
9
+ export interface DealPrice {
10
+ currency: 'USD';
11
+ originalCents: number | null;
12
+ finalCents: number | null;
13
+ discountPercent: number;
14
+ }
15
+ export interface DealArtwork {
16
+ wide: string | null;
17
+ tall: string | null;
18
+ thumb: string | null;
19
+ header: string | null;
20
+ }
21
+ export interface DealRatings {
22
+ steamRatingPercent: number | null;
23
+ steamRatingCount: number | null;
24
+ steamRatingText: string | null;
25
+ metacritic: number | null;
26
+ dealRating: number | null;
27
+ }
28
+ export interface DealFlags {
29
+ aaa: boolean;
30
+ featured: boolean;
31
+ earlyAccess: boolean;
32
+ freeWeekend: boolean;
33
+ allTimeLow: boolean;
34
+ }
35
+ /** One catalog item — the single shape every catalog endpoint + WS event speaks. */
36
+ export interface DealItem {
37
+ id: string;
38
+ kind: GameKind;
39
+ store: GameStore;
40
+ title: string;
41
+ description: string | null;
42
+ isDlcOrAddon: boolean;
43
+ price: DealPrice;
44
+ discountTier: GameDiscountTier;
45
+ worth: string | null;
46
+ /** canonical store/claim URL — what the user should click */
47
+ url: string;
48
+ /** CheapShark redirect URL — use this for deal links when present (terms requirement) */
49
+ dealUrl: string | null;
50
+ artwork: DealArtwork;
51
+ startsAt: string | null;
52
+ /** claim deadline for free-to-keep items; price-revert for discounts */
53
+ endsAt: string | null;
54
+ /** end of a Steam play-for-free window — independent of endsAt */
55
+ freeWeekendEndsAt: string | null;
56
+ flags: DealFlags;
57
+ ratings: DealRatings | null;
58
+ steamAppId: number | null;
59
+ cheapsharkGameId: string | null;
60
+ allTimeLowCents: number | null;
61
+ /** enrichment — null until metadata lands (show a skeleton, not broken UI) */
62
+ developers: string[] | null;
63
+ publishers: string[] | null;
64
+ genres: string[] | null;
65
+ tags: string[] | null;
66
+ enrichedAt: string | null;
67
+ watched: boolean;
68
+ sources: GameSourceId[];
69
+ sourceIds: Partial<Record<GameSourceId, string>>;
70
+ firstSeenAt: string;
71
+ updatedAt: string;
72
+ lastSeenAt: string;
73
+ }
74
+ export interface ChangelogEntry {
75
+ id: string;
76
+ appid: number;
77
+ title: string;
78
+ gameTitle: string | null;
79
+ kind: 'patch' | 'announcement';
80
+ url: string;
81
+ author: string | null;
82
+ /** Discord-ready markdown, ≤1500 chars */
83
+ contentsPreview: string;
84
+ publishedAt: string;
85
+ feedLabel: string;
86
+ }
87
+ export interface DealsCatalogResponse {
88
+ items: DealItem[];
89
+ nextCursor: string | null;
90
+ total: number;
91
+ asOf: string;
92
+ }
93
+ export interface FreeCatalogResponse {
94
+ items: DealItem[];
95
+ total: number;
96
+ asOf: string;
97
+ }
98
+ export interface ChangelogsResponse {
99
+ items: ChangelogEntry[];
100
+ total: number;
101
+ asOf: string;
102
+ }
103
+ export interface ProviderCapabilities {
104
+ giveaways: boolean;
105
+ discounts: boolean;
106
+ upcomingFree: boolean;
107
+ freeWeekends: boolean;
108
+ allTimeLows: boolean;
109
+ }
110
+ export interface ProviderCounts {
111
+ items: number;
112
+ freeNow: number;
113
+ discounts: number;
114
+ upcomingFree: number;
115
+ freeWeekends: number;
116
+ allTimeLows: number;
117
+ }
118
+ export interface Provider {
119
+ id: GameStore;
120
+ label: string;
121
+ capabilities: ProviderCapabilities;
122
+ counts: ProviderCounts;
123
+ }
124
+ export interface ProvidersResponse {
125
+ providers: Provider[];
126
+ asOf: string;
127
+ }
128
+ export interface TaxonomyTerm {
129
+ name: string;
130
+ count: number;
131
+ }
132
+ export interface TaxonomyResponse {
133
+ genres: TaxonomyTerm[];
134
+ tags: TaxonomyTerm[];
135
+ developers: TaxonomyTerm[];
136
+ publishers: TaxonomyTerm[];
137
+ }
138
+ export interface GameCategoryRoute {
139
+ dbId?: string;
140
+ kinds: GameKind[];
141
+ stores: GameStore[];
142
+ flags: GameFlag[];
143
+ genres: string[];
144
+ tags: string[];
145
+ minDiscountPercent: number | null;
146
+ channelId: string | null;
147
+ pingRoleId: string | null;
148
+ webhookEnabled?: boolean | null;
149
+ webhookUsername?: string | null;
150
+ webhookAvatarUrl?: string | null;
151
+ priority: number;
152
+ }
153
+ export interface TrackedGame {
154
+ dbId?: string;
155
+ steamAppId: number | null;
156
+ title: string | null;
157
+ itemId?: string | null;
158
+ channelId?: string | null;
159
+ pingRoleId?: string | null;
160
+ minDiscountPercent?: number | null;
161
+ atlOnly?: boolean;
162
+ }
163
+ export interface ChangelogGame {
164
+ dbId?: string;
165
+ steamAppId: number;
166
+ title: string | null;
167
+ }
168
+ export interface GameConfig {
169
+ guildId?: string;
170
+ enabled: boolean;
171
+ notificationChannelId: string | null;
172
+ pingRoleId: string | null;
173
+ deliveryMode: GameDelivery;
174
+ digestHourUTC: number | null;
175
+ digestWeekday: number | null;
176
+ freeGamesEnabled: boolean;
177
+ freeDlcEnabled: boolean;
178
+ freeGameStores: GameStore[];
179
+ upcomingFreeEnabled: boolean;
180
+ freeWeekendEnabled: boolean;
181
+ discountsEnabled: boolean;
182
+ discountStores: GameStore[];
183
+ minDiscountPercent: number | null;
184
+ maxPriceCents: number | null;
185
+ genres: string[];
186
+ tags: string[];
187
+ studios: string[];
188
+ allTimeLowEnabled: boolean;
189
+ allTimeLowMaxPriceCents: number | null;
190
+ changelogChannelId: string | null;
191
+ changelogPingRoleId: string | null;
192
+ categoryRoutes: GameCategoryRoute[];
193
+ trackedGames: TrackedGame[];
194
+ changelogGames: ChangelogGame[];
195
+ }
196
+ /** Resolved premium entitlements + limits for the guild (gating is visual, never hidden). */
197
+ export interface GameEntitlements {
198
+ premium: boolean;
199
+ categoryRouting: boolean;
200
+ allTimeLow: boolean;
201
+ customWebhooks: boolean;
202
+ changelogs: boolean;
203
+ trackedGameLimit: number;
204
+ }
205
+ export interface GameConfigResponse {
206
+ config: GameConfig;
207
+ entitlements: GameEntitlements;
208
+ }
209
+ export interface GameSourceHealth {
210
+ lastSuccessAt: string | null;
211
+ lastError: string | null;
212
+ consecutiveFailures: number;
213
+ state: string;
214
+ }
215
+ export interface GameHealthBundle {
216
+ bot: {
217
+ enabled: boolean;
218
+ wsConnected: boolean;
219
+ dashboards: number;
220
+ trackedGuilds: number;
221
+ };
222
+ gameApi: {
223
+ status: 'ok' | 'degraded';
224
+ uptimeSec: number;
225
+ itemCount: number;
226
+ seq: number;
227
+ enrichmentQueue: number;
228
+ sources: Record<string, GameSourceHealth>;
229
+ } | null;
230
+ }
231
+ export type GamesWsEvent = {
232
+ op: 'hello';
233
+ connected: boolean;
234
+ wsReady: boolean;
235
+ serverTime: string;
236
+ } | {
237
+ op: 'pong';
238
+ t: number;
239
+ } | {
240
+ op: 'event';
241
+ type: GameDealEventType;
242
+ at: string;
243
+ item: DealItem;
244
+ } | {
245
+ op: 'event';
246
+ type: 'changelog.new';
247
+ at: string;
248
+ changelog: ChangelogEntry;
249
+ };
250
+ export type GameDealEventType = 'deal.new' | 'deal.updated' | 'deal.expired' | 'deal.enriched' | 'free.new' | 'free.upcoming' | 'free.expired' | 'free.weekend' | 'deal.lowest';
251
+ export declare class APIGames {
252
+ private web;
253
+ constructor(web: WebDataManager);
254
+ getConfig({ auth, guildId }: GamesFunctionsInput['getConfig']): Promise<WebResponse<GameConfigResponse>>;
255
+ updateConfig({ auth, guildId, ...body }: GamesFunctionsInput['updateConfig']): Promise<WebResponse<GameConfig>>;
256
+ updateTrackedGames({ auth, guildId, games }: GamesFunctionsInput['updateTrackedGames']): Promise<WebResponse<{
257
+ games: TrackedGame[];
258
+ }>>;
259
+ updateChangelogGames({ auth, guildId, games }: GamesFunctionsInput['updateChangelogGames']): Promise<WebResponse<{
260
+ games: ChangelogGame[];
261
+ }>>;
262
+ updateCategoryRoutes({ auth, guildId, routes }: GamesFunctionsInput['updateCategoryRoutes']): Promise<WebResponse<{
263
+ routes: GameCategoryRoute[];
264
+ }>>;
265
+ getProviders({ auth, guildId }: GamesFunctionsInput['getProviders']): Promise<WebResponse<ProvidersResponse>>;
266
+ getTaxonomy({ auth, guildId, store }: GamesFunctionsInput['getTaxonomy']): Promise<WebResponse<TaxonomyResponse>>;
267
+ getFree({ auth, guildId, store, dlc, playFree }: GamesFunctionsInput['getFree']): Promise<WebResponse<FreeCatalogResponse>>;
268
+ getUpcoming({ auth, guildId, store }: GamesFunctionsInput['getUpcoming']): Promise<WebResponse<FreeCatalogResponse>>;
269
+ getDeals({ auth, guildId, ...query }: GamesFunctionsInput['getDeals']): Promise<WebResponse<DealsCatalogResponse>>;
270
+ getChangelogs({ auth, guildId, appid, kind, limit }: GamesFunctionsInput['getChangelogs']): Promise<WebResponse<ChangelogsResponse>>;
271
+ getHealth({ auth, guildId }: GamesFunctionsInput['getHealth']): Promise<WebResponse<GameHealthBundle>>;
272
+ }
273
+ export type GameDealsQuery = {
274
+ kind?: string;
275
+ store?: string;
276
+ tier?: string;
277
+ minDiscount?: number;
278
+ maxPriceCents?: number;
279
+ aaa?: boolean;
280
+ featured?: boolean;
281
+ freeWeekend?: boolean;
282
+ atLow?: boolean;
283
+ genre?: string;
284
+ tag?: string;
285
+ developer?: string;
286
+ publisher?: string;
287
+ q?: string;
288
+ endingWithinHours?: number;
289
+ minRating?: number;
290
+ sort?: 'updated' | 'discount' | 'ending';
291
+ limit?: number;
292
+ cursor?: string;
293
+ };
294
+ export type GamesFunctionsInput = {
295
+ getConfig: {
296
+ auth: string;
297
+ guildId: string;
298
+ };
299
+ updateConfig: {
300
+ auth: string;
301
+ guildId: string;
302
+ } & Partial<Omit<GameConfig, 'guildId' | 'categoryRoutes' | 'trackedGames' | 'changelogGames'>>;
303
+ updateTrackedGames: {
304
+ auth: string;
305
+ guildId: string;
306
+ games: TrackedGame[];
307
+ };
308
+ updateChangelogGames: {
309
+ auth: string;
310
+ guildId: string;
311
+ games: ChangelogGame[];
312
+ };
313
+ updateCategoryRoutes: {
314
+ auth: string;
315
+ guildId: string;
316
+ routes: GameCategoryRoute[];
317
+ };
318
+ getProviders: {
319
+ auth: string;
320
+ guildId: string;
321
+ };
322
+ getTaxonomy: {
323
+ auth: string;
324
+ guildId: string;
325
+ store?: string;
326
+ };
327
+ getFree: {
328
+ auth: string;
329
+ guildId: string;
330
+ store?: string;
331
+ dlc?: '0' | '1';
332
+ playFree?: '1';
333
+ };
334
+ getUpcoming: {
335
+ auth: string;
336
+ guildId: string;
337
+ store?: string;
338
+ };
339
+ getDeals: {
340
+ auth: string;
341
+ guildId: string;
342
+ } & GameDealsQuery;
343
+ getChangelogs: {
344
+ auth: string;
345
+ guildId: string;
346
+ appid?: number;
347
+ kind?: 'patch' | 'announcement';
348
+ limit?: number;
349
+ };
350
+ getHealth: {
351
+ auth: string;
352
+ guildId: string;
353
+ };
354
+ };
355
+ export type GamesReturnTypes = {
356
+ getConfigRaw: Awaited<ReturnType<APIGames['getConfig']>>;
357
+ getConfigSuccess: CancelOutWebResponses<Awaited<ReturnType<APIGames['getConfig']>>>;
358
+ getDealsSuccess: CancelOutWebResponses<Awaited<ReturnType<APIGames['getDeals']>>>;
359
+ getFreeSuccess: CancelOutWebResponses<Awaited<ReturnType<APIGames['getFree']>>>;
360
+ getProvidersSuccess: CancelOutWebResponses<Awaited<ReturnType<APIGames['getProviders']>>>;
361
+ getTaxonomySuccess: CancelOutWebResponses<Awaited<ReturnType<APIGames['getTaxonomy']>>>;
362
+ getHealthSuccess: CancelOutWebResponses<Awaited<ReturnType<APIGames['getHealth']>>>;
363
+ };
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.APIGames = void 0;
4
+ // ─────────────────────────────────────────────────────────────────────────────
5
+ class APIGames {
6
+ web;
7
+ constructor(web) {
8
+ this.web = web;
9
+ }
10
+ // ── Config ──────────────────────────────────────────────────────────────
11
+ async getConfig({ auth, guildId }) {
12
+ return this.web.request({ method: 'GET', auth, endpoint: this.web.qp(`/data/guild/${guildId}/games`) });
13
+ }
14
+ async updateConfig({ auth, guildId, ...body }) {
15
+ return this.web.request({ method: 'PUT', auth, endpoint: this.web.qp(`/data/guild/${guildId}/games`), body });
16
+ }
17
+ async updateTrackedGames({ auth, guildId, games }) {
18
+ return this.web.request({ method: 'PUT', auth, endpoint: this.web.qp(`/data/guild/${guildId}/games/tracked`), body: { games } });
19
+ }
20
+ async updateChangelogGames({ auth, guildId, games }) {
21
+ return this.web.request({ method: 'PUT', auth, endpoint: this.web.qp(`/data/guild/${guildId}/games/changelogs`), body: { games } });
22
+ }
23
+ async updateCategoryRoutes({ auth, guildId, routes }) {
24
+ return this.web.request({ method: 'PUT', auth, endpoint: this.web.qp(`/data/guild/${guildId}/games/routes`), body: { routes } });
25
+ }
26
+ // ── Catalog (proxied/cached from gameApi by the bot) ──────────────────────
27
+ async getProviders({ auth, guildId }) {
28
+ return this.web.request({ method: 'GET', auth, endpoint: this.web.qp(`/data/guild/${guildId}/games/providers`) });
29
+ }
30
+ async getTaxonomy({ auth, guildId, store }) {
31
+ return this.web.request({ method: 'GET', auth, endpoint: this.web.qp(`/data/guild/${guildId}/games/taxonomy`, { store }) });
32
+ }
33
+ async getFree({ auth, guildId, store, dlc, playFree }) {
34
+ return this.web.request({ method: 'GET', auth, endpoint: this.web.qp(`/data/guild/${guildId}/games/catalog/free`, { store, dlc, playFree }) });
35
+ }
36
+ async getUpcoming({ auth, guildId, store }) {
37
+ return this.web.request({ method: 'GET', auth, endpoint: this.web.qp(`/data/guild/${guildId}/games/catalog/upcoming`, { store }) });
38
+ }
39
+ async getDeals({ auth, guildId, ...query }) {
40
+ return this.web.request({ method: 'GET', auth, endpoint: this.web.qp(`/data/guild/${guildId}/games/catalog/deals`, query) });
41
+ }
42
+ async getChangelogs({ auth, guildId, appid, kind, limit }) {
43
+ return this.web.request({ method: 'GET', auth, endpoint: this.web.qp(`/data/guild/${guildId}/games/catalog/changelogs`, { appid, kind, limit }) });
44
+ }
45
+ async getHealth({ auth, guildId }) {
46
+ return this.web.request({ method: 'GET', auth, endpoint: this.web.qp(`/data/guild/${guildId}/games/health`) });
47
+ }
48
+ }
49
+ exports.APIGames = APIGames;
@@ -4,6 +4,7 @@ import { APIGuildPlatform } from '../classes/guildPlatform';
4
4
  import { APIGuildGiveaway } from '../classes/guildGiveaway';
5
5
  import { APIGuildDrops } from '../classes/guildDrops';
6
6
  import { APIDropsGames } from '../classes/dropsGames';
7
+ import { APIGames } from '../classes/games';
7
8
  import { AxiosResponse } from 'axios';
8
9
  import { RequestMethod, WebResponse } from '../types';
9
10
  import { APITelemetry } from '../classes/telemetry';
@@ -47,6 +48,7 @@ export declare class WebDataManager {
47
48
  readonly guildGiveaway: APIGuildGiveaway;
48
49
  readonly guildStarboard: APIGuildStarboard;
49
50
  readonly guildPlatformAction: APIPlatformAction;
51
+ readonly games: APIGames;
50
52
  constructor(url: string, options?: {
51
53
  log?: boolean;
52
54
  } | undefined);
@@ -10,6 +10,7 @@ const guildPlatform_1 = require("../classes/guildPlatform");
10
10
  const guildGiveaway_1 = require("../classes/guildGiveaway");
11
11
  const guildDrops_1 = require("../classes/guildDrops");
12
12
  const dropsGames_1 = require("../classes/dropsGames");
13
+ const games_1 = require("../classes/games");
13
14
  const axios_1 = __importDefault(require("axios"));
14
15
  const telemetry_1 = require("../classes/telemetry");
15
16
  const sessions_1 = require("../classes/sessions");
@@ -51,6 +52,7 @@ class WebDataManager {
51
52
  guildGiveaway = new guildGiveaway_1.APIGuildGiveaway(this);
52
53
  guildStarboard = new guildStarboard_1.APIGuildStarboard(this);
53
54
  guildPlatformAction = new guildPlatformAction_1.APIPlatformAction(this);
55
+ games = new games_1.APIGames(this);
54
56
  constructor(url, options) {
55
57
  this.url = url;
56
58
  this.options = options;
package/dist/index.d.ts CHANGED
@@ -21,6 +21,7 @@ export * from './classes/guildPlatform';
21
21
  export * from './classes/guildGiveaway';
22
22
  export * from './classes/guildStarboard';
23
23
  export * from './classes/guildPlatformAction';
24
+ export * from './classes/games';
24
25
  export { GuildMessageTypeEnum, StreamerMessageTypeEnum, PlatformEnum, $Enums } from './other/enums';
25
26
  export type { Prisma, TSPrisma } from '@prisma/client';
26
27
  export type { ClientChangelog, Guild, User, Team, Member, KickStreamer, TwitchStreamer, YoutubeStreamer, TiktokStreamer, RumbleStreamer, GuildGiveaway } from '@prisma/client';
package/dist/index.js CHANGED
@@ -38,6 +38,7 @@ __exportStar(require("./classes/guildPlatform"), exports);
38
38
  __exportStar(require("./classes/guildGiveaway"), exports);
39
39
  __exportStar(require("./classes/guildStarboard"), exports);
40
40
  __exportStar(require("./classes/guildPlatformAction"), exports);
41
+ __exportStar(require("./classes/games"), exports);
41
42
  // Re-export Prisma generated enums (browser-safe)
42
43
  var enums_1 = require("./other/enums");
43
44
  Object.defineProperty(exports, "GuildMessageTypeEnum", { enumerable: true, get: function () { return enums_1.GuildMessageTypeEnum; } });
@@ -12,6 +12,7 @@ import { R2StorageZod } from './zod/r2Storage.zod';
12
12
  import { MemberZod } from './zod/member.zod';
13
13
  import { ClientZod } from './zod/client.zod';
14
14
  import { GuildZod } from './zod/guild.zod';
15
+ import { GameConfigZod } from './zod/gameConfig.zod';
15
16
  import { DropsZod } from './zod/drops.zod';
16
17
  import { UserZod } from './zod/user.zod';
17
18
  import { TeamZod } from './zod/team.zod';
@@ -59,6 +60,10 @@ export type GuildDropsWebhookZod = z.infer<typeof DropsZod.GuildDropsWebhookSche
59
60
  export type GuildDropsGameZod = z.infer<typeof DropsZod.GuildDropsGameSchema>;
60
61
  export type GuildDropsGameWebhookZod = z.infer<typeof DropsZod.GuildDropsGameWebhookSchema>;
61
62
  export type SentDropZod = z.infer<typeof DropsZod.SentDropSchema>;
63
+ export type GameConfigZod = z.infer<typeof GameConfigZod.GuildGameConfigSchema>;
64
+ export type GuildGameCategoryRouteZod = z.infer<typeof GameConfigZod.GuildGameCategoryRouteSchema>;
65
+ export type GuildTrackedGameZod = z.infer<typeof GameConfigZod.GuildTrackedGameSchema>;
66
+ export type GuildGameChangelogZod = z.infer<typeof GameConfigZod.GuildGameChangelogSchema>;
62
67
  export type AllPlatforms = (typeof PlatformEnum)[keyof typeof PlatformEnum];
63
68
  export type AllPlatformsWithVideos = Enums['PlatformsWithVideosEnum'];
64
69
  export type PlatformsToLinkType = typeof PlatformsToLink[number];
@@ -0,0 +1,134 @@
1
+ import { PartialZodObject } from './schema.zod';
2
+ import { RemoveProperties } from '../prisma';
3
+ import { TSPrisma } from '@prisma/client';
4
+ import { z } from 'zod';
5
+ export type RT<T extends TSPrisma.AllModelNames> = z.ZodType<RemoveProperties<TSPrisma.TSPrismaModelsFull[T], GameConfigRelations>>;
6
+ export type GameConfigRelations = 'db' | 'gameConfig';
7
+ export declare const GameConfigZod: {
8
+ readonly GuildGameConfigSchema: z.ZodObject<{
9
+ guildId: z.ZodString;
10
+ enabled: z.ZodBoolean;
11
+ notificationChannelId: z.ZodNullable<z.ZodString>;
12
+ pingRoleId: z.ZodNullable<z.ZodUnion<readonly [z.ZodString, z.ZodLiteral<"everyone">, z.ZodLiteral<"here">]>>;
13
+ deliveryMode: z.ZodEnum<{
14
+ weekly: "weekly";
15
+ instant: "instant";
16
+ daily: "daily";
17
+ }>;
18
+ digestHourUTC: z.ZodNullable<z.ZodNumber>;
19
+ digestWeekday: z.ZodNullable<z.ZodNumber>;
20
+ freeGamesEnabled: z.ZodBoolean;
21
+ freeDlcEnabled: z.ZodBoolean;
22
+ freeGameStores: z.ZodArray<z.ZodEnum<{
23
+ steam: "steam";
24
+ epic: "epic";
25
+ gog: "gog";
26
+ prime: "prime";
27
+ }>>;
28
+ upcomingFreeEnabled: z.ZodBoolean;
29
+ freeWeekendEnabled: z.ZodBoolean;
30
+ discountsEnabled: z.ZodBoolean;
31
+ discountStores: z.ZodArray<z.ZodEnum<{
32
+ steam: "steam";
33
+ epic: "epic";
34
+ gog: "gog";
35
+ prime: "prime";
36
+ }>>;
37
+ minDiscountPercent: z.ZodNullable<z.ZodNumber>;
38
+ maxPriceCents: z.ZodNullable<z.ZodNumber>;
39
+ genres: z.ZodArray<z.ZodString>;
40
+ tags: z.ZodArray<z.ZodString>;
41
+ studios: z.ZodArray<z.ZodString>;
42
+ allTimeLowEnabled: z.ZodBoolean;
43
+ allTimeLowMaxPriceCents: z.ZodNullable<z.ZodNumber>;
44
+ changelogChannelId: z.ZodNullable<z.ZodString>;
45
+ changelogPingRoleId: z.ZodNullable<z.ZodUnion<readonly [z.ZodString, z.ZodLiteral<"everyone">, z.ZodLiteral<"here">]>>;
46
+ categoryRoutes: z.ZodArray<z.ZodLazy<z.ZodObject<{
47
+ kinds: z.ZodArray<z.ZodEnum<{
48
+ free_game: "free_game";
49
+ free_dlc_or_loot: "free_dlc_or_loot";
50
+ discount: "discount";
51
+ upcoming_free: "upcoming_free";
52
+ }>>;
53
+ stores: z.ZodArray<z.ZodEnum<{
54
+ steam: "steam";
55
+ epic: "epic";
56
+ gog: "gog";
57
+ prime: "prime";
58
+ }>>;
59
+ flags: z.ZodArray<z.ZodEnum<{
60
+ freeWeekend: "freeWeekend";
61
+ allTimeLow: "allTimeLow";
62
+ featured: "featured";
63
+ aaa: "aaa";
64
+ earlyAccess: "earlyAccess";
65
+ }>>;
66
+ genres: z.ZodArray<z.ZodString>;
67
+ tags: z.ZodArray<z.ZodString>;
68
+ minDiscountPercent: z.ZodNullable<z.ZodNumber>;
69
+ channelId: z.ZodNullable<z.ZodString>;
70
+ pingRoleId: z.ZodNullable<z.ZodUnion<readonly [z.ZodString, z.ZodLiteral<"everyone">, z.ZodLiteral<"here">]>>;
71
+ webhookEnabled: z.ZodNullable<z.ZodBoolean>;
72
+ webhookUsername: z.ZodNullable<z.ZodString>;
73
+ webhookAvatarUrl: z.ZodNullable<z.ZodString>;
74
+ priority: z.ZodNumber;
75
+ }, z.core.$strip>>>;
76
+ trackedGames: z.ZodArray<z.ZodLazy<z.ZodObject<{
77
+ steamAppId: z.ZodNullable<z.ZodNumber>;
78
+ title: z.ZodNullable<z.ZodString>;
79
+ itemId: z.ZodNullable<z.ZodString>;
80
+ channelId: z.ZodNullable<z.ZodString>;
81
+ pingRoleId: z.ZodNullable<z.ZodUnion<readonly [z.ZodString, z.ZodLiteral<"everyone">, z.ZodLiteral<"here">]>>;
82
+ minDiscountPercent: z.ZodNullable<z.ZodNumber>;
83
+ atlOnly: z.ZodBoolean;
84
+ }, z.core.$strip>>>;
85
+ changelogGames: z.ZodArray<z.ZodLazy<z.ZodObject<{
86
+ steamAppId: z.ZodNumber;
87
+ title: z.ZodNullable<z.ZodString>;
88
+ }, z.core.$strip>>>;
89
+ }, z.core.$strip>;
90
+ readonly GuildGameCategoryRouteSchema: z.ZodObject<{
91
+ kinds: z.ZodArray<z.ZodEnum<{
92
+ free_game: "free_game";
93
+ free_dlc_or_loot: "free_dlc_or_loot";
94
+ discount: "discount";
95
+ upcoming_free: "upcoming_free";
96
+ }>>;
97
+ stores: z.ZodArray<z.ZodEnum<{
98
+ steam: "steam";
99
+ epic: "epic";
100
+ gog: "gog";
101
+ prime: "prime";
102
+ }>>;
103
+ flags: z.ZodArray<z.ZodEnum<{
104
+ freeWeekend: "freeWeekend";
105
+ allTimeLow: "allTimeLow";
106
+ featured: "featured";
107
+ aaa: "aaa";
108
+ earlyAccess: "earlyAccess";
109
+ }>>;
110
+ genres: z.ZodArray<z.ZodString>;
111
+ tags: z.ZodArray<z.ZodString>;
112
+ minDiscountPercent: z.ZodNullable<z.ZodNumber>;
113
+ channelId: z.ZodNullable<z.ZodString>;
114
+ pingRoleId: z.ZodNullable<z.ZodUnion<readonly [z.ZodString, z.ZodLiteral<"everyone">, z.ZodLiteral<"here">]>>;
115
+ webhookEnabled: z.ZodNullable<z.ZodBoolean>;
116
+ webhookUsername: z.ZodNullable<z.ZodString>;
117
+ webhookAvatarUrl: z.ZodNullable<z.ZodString>;
118
+ priority: z.ZodNumber;
119
+ }, z.core.$strip>;
120
+ readonly GuildTrackedGameSchema: z.ZodObject<{
121
+ steamAppId: z.ZodNullable<z.ZodNumber>;
122
+ title: z.ZodNullable<z.ZodString>;
123
+ itemId: z.ZodNullable<z.ZodString>;
124
+ channelId: z.ZodNullable<z.ZodString>;
125
+ pingRoleId: z.ZodNullable<z.ZodUnion<readonly [z.ZodString, z.ZodLiteral<"everyone">, z.ZodLiteral<"here">]>>;
126
+ minDiscountPercent: z.ZodNullable<z.ZodNumber>;
127
+ atlOnly: z.ZodBoolean;
128
+ }, z.core.$strip>;
129
+ readonly GuildGameChangelogSchema: z.ZodObject<{
130
+ steamAppId: z.ZodNumber;
131
+ title: z.ZodNullable<z.ZodString>;
132
+ }, z.core.$strip>;
133
+ };
134
+ export declare const GameConfigZodPartial: PartialZodObject<typeof GameConfigZod>;