popii-framework 0.6.1-beta.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.
- package/README.md +159 -0
- package/dist/cli/commands.d.ts +15 -0
- package/dist/cli/commands.d.ts.map +1 -0
- package/dist/cli/pages.d.ts +5 -0
- package/dist/cli/pages.d.ts.map +1 -0
- package/dist/cli/scaffold.d.ts +23 -0
- package/dist/cli/scaffold.d.ts.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +1710 -0
- package/dist/client.d.ts +40 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/define/command.d.ts +47 -0
- package/dist/define/command.d.ts.map +1 -0
- package/dist/define/event.d.ts +52 -0
- package/dist/define/event.d.ts.map +1 -0
- package/dist/define/snap.d.ts +55 -0
- package/dist/define/snap.d.ts.map +1 -0
- package/dist/define/task.d.ts +64 -0
- package/dist/define/task.d.ts.map +1 -0
- package/dist/handler/cache.d.ts +6 -0
- package/dist/handler/cache.d.ts.map +1 -0
- package/dist/handler/context.d.ts +3 -0
- package/dist/handler/context.d.ts.map +1 -0
- package/dist/handler/index.d.ts +8 -0
- package/dist/handler/index.d.ts.map +1 -0
- package/dist/handler/interaction.d.ts +4 -0
- package/dist/handler/interaction.d.ts.map +1 -0
- package/dist/handler/lock.d.ts +2 -0
- package/dist/handler/lock.d.ts.map +1 -0
- package/dist/handler/logger.d.ts +4 -0
- package/dist/handler/logger.d.ts.map +1 -0
- package/dist/handler/message.d.ts +4 -0
- package/dist/handler/message.d.ts.map +1 -0
- package/dist/handler/middleware.d.ts +5 -0
- package/dist/handler/middleware.d.ts.map +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10464 -0
- package/dist/loader/fizz.d.ts +2 -0
- package/dist/loader/fizz.d.ts.map +1 -0
- package/dist/loader/index.d.ts +3 -0
- package/dist/loader/index.d.ts.map +1 -0
- package/dist/loader/locales.d.ts +2 -0
- package/dist/loader/locales.d.ts.map +1 -0
- package/dist/loader/middleware.d.ts +54 -0
- package/dist/loader/middleware.d.ts.map +1 -0
- package/dist/loader/snaps.d.ts +3 -0
- package/dist/loader/snaps.d.ts.map +1 -0
- package/dist/loader/tasks.d.ts +3 -0
- package/dist/loader/tasks.d.ts.map +1 -0
- package/dist/plugins/activity.d.ts +15 -0
- package/dist/plugins/activity.d.ts.map +1 -0
- package/dist/plugins/ai.d.ts +35 -0
- package/dist/plugins/ai.d.ts.map +1 -0
- package/dist/plugins/automod.d.ts +12 -0
- package/dist/plugins/automod.d.ts.map +1 -0
- package/dist/plugins/canvas.d.ts +75 -0
- package/dist/plugins/canvas.d.ts.map +1 -0
- package/dist/plugins/captcha.d.ts +20 -0
- package/dist/plugins/captcha.d.ts.map +1 -0
- package/dist/plugins/commandAnalytic.d.ts +8 -0
- package/dist/plugins/commandAnalytic.d.ts.map +1 -0
- package/dist/plugins/commandLogger.d.ts +13 -0
- package/dist/plugins/commandLogger.d.ts.map +1 -0
- package/dist/plugins/desk.d.ts +23 -0
- package/dist/plugins/desk.d.ts.map +1 -0
- package/dist/plugins/economy.d.ts +41 -0
- package/dist/plugins/economy.d.ts.map +1 -0
- package/dist/plugins/errorHandler.d.ts +8 -0
- package/dist/plugins/errorHandler.d.ts.map +1 -0
- package/dist/plugins/giveaway.d.ts +21 -0
- package/dist/plugins/giveaway.d.ts.map +1 -0
- package/dist/plugins/lastfm.d.ts +24 -0
- package/dist/plugins/lastfm.d.ts.map +1 -0
- package/dist/plugins/mongoose.d.ts +23 -0
- package/dist/plugins/mongoose.d.ts.map +1 -0
- package/dist/plugins/pay.d.ts +24 -0
- package/dist/plugins/pay.d.ts.map +1 -0
- package/dist/plugins/permissionGuard.d.ts +8 -0
- package/dist/plugins/permissionGuard.d.ts.map +1 -0
- package/dist/plugins/reload.d.ts +8 -0
- package/dist/plugins/reload.d.ts.map +1 -0
- package/dist/plugins/sqlite.d.ts +20 -0
- package/dist/plugins/sqlite.d.ts.map +1 -0
- package/dist/plugins/telemetry.d.ts +11 -0
- package/dist/plugins/telemetry.d.ts.map +1 -0
- package/dist/plugins/ui.d.ts +60 -0
- package/dist/plugins/ui.d.ts.map +1 -0
- package/dist/plugins/voice/player.d.ts +9 -0
- package/dist/plugins/voice/player.d.ts.map +1 -0
- package/dist/plugins/voice/resolver.d.ts +16 -0
- package/dist/plugins/voice/resolver.d.ts.map +1 -0
- package/dist/plugins/voice/setup.d.ts +11 -0
- package/dist/plugins/voice/setup.d.ts.map +1 -0
- package/dist/plugins/voice/sponsorblock.d.ts +17 -0
- package/dist/plugins/voice/sponsorblock.d.ts.map +1 -0
- package/dist/plugins/voice/state.d.ts +35 -0
- package/dist/plugins/voice/state.d.ts.map +1 -0
- package/dist/plugins/voice/types.d.ts +14 -0
- package/dist/plugins/voice/types.d.ts.map +1 -0
- package/dist/plugins/voice/utils.d.ts +14 -0
- package/dist/plugins/voice/utils.d.ts.map +1 -0
- package/dist/plugins/voice.d.ts +72 -0
- package/dist/plugins/voice.d.ts.map +1 -0
- package/dist/plugins/web/helpers.d.ts +17 -0
- package/dist/plugins/web/helpers.d.ts.map +1 -0
- package/dist/plugins/web/index.d.ts +16 -0
- package/dist/plugins/web/index.d.ts.map +1 -0
- package/dist/plugins/web/routes/auth.d.ts +3 -0
- package/dist/plugins/web/routes/auth.d.ts.map +1 -0
- package/dist/plugins/web/routes/dashboard.d.ts +3 -0
- package/dist/plugins/web/routes/dashboard.d.ts.map +1 -0
- package/dist/plugins/web/routes/database.d.ts +3 -0
- package/dist/plugins/web/routes/database.d.ts.map +1 -0
- package/dist/plugins/web/routes/locales.d.ts +3 -0
- package/dist/plugins/web/routes/locales.d.ts.map +1 -0
- package/dist/plugins/web/routes/members.d.ts +3 -0
- package/dist/plugins/web/routes/members.d.ts.map +1 -0
- package/dist/plugins/web/routes/metrics.d.ts +7 -0
- package/dist/plugins/web/routes/metrics.d.ts.map +1 -0
- package/dist/plugins/web/routes/music.d.ts +3 -0
- package/dist/plugins/web/routes/music.d.ts.map +1 -0
- package/dist/plugins/web/routes/servers.d.ts +3 -0
- package/dist/plugins/web/routes/servers.d.ts.map +1 -0
- package/dist/plugins/web/routes/tasks.d.ts +3 -0
- package/dist/plugins/web/routes/tasks.d.ts.map +1 -0
- package/dist/plugins/web/routes/ui-editor.d.ts +3 -0
- package/dist/plugins/web/routes/ui-editor.d.ts.map +1 -0
- package/dist/plugins/web/setup.d.ts +7 -0
- package/dist/plugins/web/setup.d.ts.map +1 -0
- package/dist/plugins/web/types.d.ts +60 -0
- package/dist/plugins/web/types.d.ts.map +1 -0
- package/dist/plugins/web/views/admin.d.ts +5 -0
- package/dist/plugins/web/views/admin.d.ts.map +1 -0
- package/dist/plugins/web/views/base.d.ts +13 -0
- package/dist/plugins/web/views/base.d.ts.map +1 -0
- package/dist/plugins/web/views/commands.d.ts +2 -0
- package/dist/plugins/web/views/commands.d.ts.map +1 -0
- package/dist/plugins/web/views/dashboard.d.ts +32 -0
- package/dist/plugins/web/views/dashboard.d.ts.map +1 -0
- package/dist/plugins/web/views/database.d.ts +2 -0
- package/dist/plugins/web/views/database.d.ts.map +1 -0
- package/dist/plugins/web/views/home.d.ts +2 -0
- package/dist/plugins/web/views/home.d.ts.map +1 -0
- package/dist/plugins/web/views/index.d.ts +16 -0
- package/dist/plugins/web/views/index.d.ts.map +1 -0
- package/dist/plugins/web/views/invite.d.ts +2 -0
- package/dist/plugins/web/views/invite.d.ts.map +1 -0
- package/dist/plugins/web/views/lastfm.d.ts +2 -0
- package/dist/plugins/web/views/lastfm.d.ts.map +1 -0
- package/dist/plugins/web/views/locales.d.ts +2 -0
- package/dist/plugins/web/views/locales.d.ts.map +1 -0
- package/dist/plugins/web/views/members.d.ts +6 -0
- package/dist/plugins/web/views/members.d.ts.map +1 -0
- package/dist/plugins/web/views/music.d.ts +5 -0
- package/dist/plugins/web/views/music.d.ts.map +1 -0
- package/dist/plugins/web/views/servers.d.ts +3 -0
- package/dist/plugins/web/views/servers.d.ts.map +1 -0
- package/dist/plugins/web/views/terminal.d.ts +2 -0
- package/dist/plugins/web/views/terminal.d.ts.map +1 -0
- package/dist/plugins/web/views/ui-editor.d.ts +2 -0
- package/dist/plugins/web/views/ui-editor.d.ts.map +1 -0
- package/dist/types.d.ts +671 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/utils/error.d.ts +62 -0
- package/dist/utils/error.d.ts.map +1 -0
- package/dist/utils/help.d.ts +3 -0
- package/dist/utils/help.d.ts.map +1 -0
- package/dist/utils/logger.d.ts +1 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/sharding.d.ts +17 -0
- package/dist/utils/sharding.d.ts.map +1 -0
- package/dist/utils/testing.d.ts +42 -0
- package/dist/utils/testing.d.ts.map +1 -0
- package/dist/utils/testing.js +192 -0
- package/package.json +77 -0
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { EmbedBuilder } from "discord.js";
|
|
2
|
+
import type { PopiiPlugin } from "../types";
|
|
3
|
+
export interface FormField {
|
|
4
|
+
name: string;
|
|
5
|
+
label: string;
|
|
6
|
+
paragraph?: boolean;
|
|
7
|
+
required?: boolean;
|
|
8
|
+
value?: string;
|
|
9
|
+
placeholder?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface WizardStep {
|
|
12
|
+
id: string;
|
|
13
|
+
prompt: string | EmbedBuilder;
|
|
14
|
+
type: "text" | "buttons" | "select";
|
|
15
|
+
options?: string[] | {
|
|
16
|
+
label: string;
|
|
17
|
+
value: string;
|
|
18
|
+
}[];
|
|
19
|
+
}
|
|
20
|
+
declare module "../types" {
|
|
21
|
+
interface Pop {
|
|
22
|
+
success(message: string): Promise<void>;
|
|
23
|
+
error(message: string): Promise<void>;
|
|
24
|
+
info(message: string): Promise<void>;
|
|
25
|
+
paginate(source: EmbedBuilder[] | {
|
|
26
|
+
fetch: (page: number) => Promise<EmbedBuilder | null>;
|
|
27
|
+
totalPages?: number;
|
|
28
|
+
}, timeoutMs?: number): Promise<void>;
|
|
29
|
+
prompt(embed: EmbedBuilder, buttons: string[], timeoutMs?: number): Promise<string | null>;
|
|
30
|
+
form(title: string, fields: FormField[], timeoutMs?: number): Promise<Record<string, string> | null>;
|
|
31
|
+
awaitMessage(timeoutMs?: number, promptMessageId?: string): Promise<any | null>;
|
|
32
|
+
wizard(steps: WizardStep[], timeoutMs?: number): Promise<Record<string, string> | null>;
|
|
33
|
+
}
|
|
34
|
+
interface EventPop {
|
|
35
|
+
success(message: string): Promise<void>;
|
|
36
|
+
error(message: string): Promise<void>;
|
|
37
|
+
info(message: string): Promise<void>;
|
|
38
|
+
paginate(source: EmbedBuilder[] | {
|
|
39
|
+
fetch: (page: number) => Promise<EmbedBuilder | null>;
|
|
40
|
+
totalPages?: number;
|
|
41
|
+
}, timeoutMs?: number): Promise<void>;
|
|
42
|
+
prompt(embed: EmbedBuilder, buttons: string[], timeoutMs?: number): Promise<string | null>;
|
|
43
|
+
form(title: string, fields: FormField[], timeoutMs?: number): Promise<Record<string, string> | null>;
|
|
44
|
+
awaitMessage(timeoutMs?: number, promptMessageId?: string): Promise<any | null>;
|
|
45
|
+
wizard(steps: WizardStep[], timeoutMs?: number): Promise<Record<string, string> | null>;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
export interface UIPluginOptions {
|
|
49
|
+
successColor?: number;
|
|
50
|
+
errorColor?: number;
|
|
51
|
+
infoColor?: number;
|
|
52
|
+
useSnapsForPagination?: boolean;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Injects powerful interactive UI methods into the Pop context like `.paginate()`, `.prompt()`, and `.form()`.
|
|
56
|
+
*
|
|
57
|
+
* @category Plugins
|
|
58
|
+
*/
|
|
59
|
+
export declare function uiPlugin(options?: UIPluginOptions): PopiiPlugin;
|
|
60
|
+
//# sourceMappingURL=ui.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../src/plugins/ui.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAA8K,MAAM,YAAY,CAAC;AACtN,OAAO,KAAK,EAAE,WAAW,EAAe,MAAM,UAAU,CAAC;AAEzD,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,GAAG,YAAY,CAAC;IAC9B,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC;IACpC,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACzD;AAED,OAAO,QAAQ,UAAU,CAAC;IACxB,UAAU,GAAG;QACX,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QACxC,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QACrC,QAAQ,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG;YAAE,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;YAAC,UAAU,CAAC,EAAE,MAAM,CAAA;SAAE,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QACrJ,MAAM,CAAC,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;QAC3F,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;QACrG,YAAY,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;QAChF,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;KACzF;IACD,UAAU,QAAQ;QAChB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QACxC,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QACrC,QAAQ,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG;YAAE,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;YAAC,UAAU,CAAC,EAAE,MAAM,CAAA;SAAE,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QACrJ,MAAM,CAAC,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;QAC3F,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;QACrG,YAAY,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;QAChF,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;KACzF;CACF;AAED,MAAM,WAAW,eAAe;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,OAAO,GAAE,eAAoB,GAAG,WAAW,CAsZnE"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { VoicePluginOptions } from "./types";
|
|
2
|
+
import type { VoiceState } from "./state";
|
|
3
|
+
import type { ResolverModule } from "./resolver";
|
|
4
|
+
import type { SponsorBlockModule } from "./sponsorblock";
|
|
5
|
+
export interface PlayerModule {
|
|
6
|
+
attachVoice(pop: any): void;
|
|
7
|
+
}
|
|
8
|
+
export declare function createPlayer(options: VoicePluginOptions, state: VoiceState, resolver: ResolverModule, sb: SponsorBlockModule): PlayerModule;
|
|
9
|
+
//# sourceMappingURL=player.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"player.d.ts","sourceRoot":"","sources":["../../../src/plugins/voice/player.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAa,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEzD,MAAM,WAAW,YAAY;IAC3B,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,CAAC;CAC7B;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,kBAAkB,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,cAAc,EAAE,EAAE,EAAE,kBAAkB,GAAG,YAAY,CA2U3I"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { SbSegment, VoicePluginOptions } from "./types";
|
|
2
|
+
import type { VoiceState } from "./state";
|
|
3
|
+
import type { YtdlpUtils } from "./utils";
|
|
4
|
+
import type { SponsorBlockModule } from "./sponsorblock";
|
|
5
|
+
export interface ResolverModule {
|
|
6
|
+
resolveAudioSource(pop: any, input: string, seekMs?: number): Promise<{
|
|
7
|
+
resourceInput: any;
|
|
8
|
+
resourceOptions: any;
|
|
9
|
+
metadata: any;
|
|
10
|
+
extraTracks?: any[];
|
|
11
|
+
url?: string;
|
|
12
|
+
sbSegments?: SbSegment[];
|
|
13
|
+
}>;
|
|
14
|
+
}
|
|
15
|
+
export declare function createResolver(options: VoicePluginOptions, state: VoiceState, utils: YtdlpUtils, sb: SponsorBlockModule): ResolverModule;
|
|
16
|
+
//# sourceMappingURL=resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../../src/plugins/voice/resolver.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEzD,MAAM,WAAW,cAAc;IAC7B,kBAAkB,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QACpE,aAAa,EAAE,GAAG,CAAC;QACnB,eAAe,EAAE,GAAG,CAAC;QACrB,QAAQ,EAAE,GAAG,CAAC;QACd,WAAW,CAAC,EAAE,GAAG,EAAE,CAAC;QACpB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;KAC1B,CAAC,CAAC;CACJ;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,kBAAkB,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,kBAAkB,GAAG,cAAc,CAmMxI"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { VoicePluginOptions } from "./types";
|
|
2
|
+
import type { VoiceState } from "./state";
|
|
3
|
+
import type { PlayerModule } from "./player";
|
|
4
|
+
import type { SponsorBlockModule } from "./sponsorblock";
|
|
5
|
+
import type { PopiiClient } from "../../types";
|
|
6
|
+
export declare function createSetup(options: VoicePluginOptions, state: VoiceState, player: PlayerModule, sb: SponsorBlockModule): {
|
|
7
|
+
setup: (client: PopiiClient) => void;
|
|
8
|
+
ready: (client: PopiiClient) => Promise<void>;
|
|
9
|
+
cleanup: () => Promise<void>;
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=setup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../../src/plugins/voice/setup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,wBAAgB,WAAW,CAAC,OAAO,EAAE,kBAAkB,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,EAAE,EAAE,kBAAkB;oBAI/F,WAAW;oBA6RL,WAAW;;EA0DzC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { SbSegment, VoicePluginOptions } from "./types";
|
|
2
|
+
import type { VoiceState } from "./state";
|
|
3
|
+
export interface SponsorBlockModule {
|
|
4
|
+
getSbEnabled(gid: string): boolean;
|
|
5
|
+
getSbCategories(gid: string): string[];
|
|
6
|
+
clearSbTimers(gid: string): void;
|
|
7
|
+
fetchSbSegments(videoId: string, cats: string[]): Promise<SbSegment[]>;
|
|
8
|
+
seekWithFfmpeg(rawUrl: string, seekMs: number): Promise<{
|
|
9
|
+
resourceInput: any;
|
|
10
|
+
resourceOptions: any;
|
|
11
|
+
}>;
|
|
12
|
+
sbFmt(s: number): string;
|
|
13
|
+
scheduleSbSkips(guildId: string, player: any, segments: SbSegment[], rawUrl: string, metadata: any, seekOffsetMs?: number): void;
|
|
14
|
+
makeSponsorblockApi(pop: any): any;
|
|
15
|
+
}
|
|
16
|
+
export declare function createSponsorBlock(options: VoicePluginOptions, state: VoiceState): SponsorBlockModule;
|
|
17
|
+
//# sourceMappingURL=sponsorblock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sponsorblock.d.ts","sourceRoot":"","sources":["../../../src/plugins/voice/sponsorblock.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C,MAAM,WAAW,kBAAkB;IACjC,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACnC,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACvC,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IACvE,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,aAAa,EAAE,GAAG,CAAC;QAAC,eAAe,EAAE,GAAG,CAAA;KAAE,CAAC,CAAC;IACtG,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjI,mBAAmB,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,CAAC;CACpC;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,kBAAkB,EAAE,KAAK,EAAE,UAAU,GAAG,kBAAkB,CAiIrG"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { spawn as nodeSpawn } from "node:child_process";
|
|
2
|
+
import type { SbSegment } from "./types";
|
|
3
|
+
export declare class Semaphore {
|
|
4
|
+
max: number;
|
|
5
|
+
current: number;
|
|
6
|
+
private queue;
|
|
7
|
+
constructor(max: number, current?: number);
|
|
8
|
+
acquire(): Promise<void>;
|
|
9
|
+
release(): void;
|
|
10
|
+
}
|
|
11
|
+
export interface VoiceState {
|
|
12
|
+
activeProcesses: Set<ReturnType<typeof nodeSpawn>>;
|
|
13
|
+
extractionSemaphore: Semaphore;
|
|
14
|
+
currentProxyIndex: number;
|
|
15
|
+
queues: Map<string, any[]>;
|
|
16
|
+
idleTimers: Map<string, any>;
|
|
17
|
+
emptyTimers: Map<string, any>;
|
|
18
|
+
voiceLocks: Map<string, Promise<void>>;
|
|
19
|
+
skipVotes: Map<string, Set<string>>;
|
|
20
|
+
notifyChannels: Map<string, {
|
|
21
|
+
channel: any;
|
|
22
|
+
canvas: any;
|
|
23
|
+
}>;
|
|
24
|
+
sbGuildEnabled: Map<string, boolean>;
|
|
25
|
+
sbGuildCategories: Map<string, string[]>;
|
|
26
|
+
sbTrackData: Map<string, {
|
|
27
|
+
segments: SbSegment[];
|
|
28
|
+
rawUrl: string;
|
|
29
|
+
}>;
|
|
30
|
+
sbSkipTimers: Map<string, ReturnType<typeof setTimeout>[]>;
|
|
31
|
+
_voiceLib: any;
|
|
32
|
+
clientRef: any;
|
|
33
|
+
}
|
|
34
|
+
export declare function createVoiceState(): VoiceState;
|
|
35
|
+
//# sourceMappingURL=state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/plugins/voice/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEzC,qBAAa,SAAS;IAED,GAAG,EAAE,MAAM;IAAS,OAAO;IAD9C,OAAO,CAAC,KAAK,CAAsB;gBAChB,GAAG,EAAE,MAAM,EAAS,OAAO,SAAI;IAC5C,OAAO;IAIb,OAAO;CAMR;AAED,MAAM,WAAW,UAAU;IACzB,eAAe,EAAE,GAAG,CAAC,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC,CAAC;IACnD,mBAAmB,EAAE,SAAS,CAAC;IAC/B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IAC3B,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7B,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC9B,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACvC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IACpC,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,GAAG,CAAC;QAAC,MAAM,EAAE,GAAG,CAAA;KAAE,CAAC,CAAC;IAC3D,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACzC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpE,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,EAAE,CAAC,CAAC;IAC3D,SAAS,EAAE,GAAG,CAAC;IACf,SAAS,EAAE,GAAG,CAAC;CAChB;AAED,wBAAgB,gBAAgB,IAAI,UAAU,CAkB7C"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export type SbSegment = {
|
|
2
|
+
start: number;
|
|
3
|
+
end: number;
|
|
4
|
+
category: string;
|
|
5
|
+
};
|
|
6
|
+
export interface VoicePluginOptions {
|
|
7
|
+
debug?: boolean;
|
|
8
|
+
forceIpv4?: boolean;
|
|
9
|
+
forceIpv6?: boolean;
|
|
10
|
+
proxy?: string | string[];
|
|
11
|
+
sponsorblock?: boolean | string[];
|
|
12
|
+
crossfade?: boolean;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/plugins/voice/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzE,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC1B,YAAY,CAAC,EAAE,OAAO,GAAG,MAAM,EAAE,CAAC;IAClC,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { spawn as nodeSpawn } from "node:child_process";
|
|
2
|
+
import type { VoicePluginOptions } from "./types";
|
|
3
|
+
import type { VoiceState } from "./state";
|
|
4
|
+
export interface YtdlpUtils {
|
|
5
|
+
buildYtdlpArgs(baseArgs: string[]): string[];
|
|
6
|
+
killProc(proc: ReturnType<typeof nodeSpawn>): void;
|
|
7
|
+
spawnYtdlp(args: string[], timeoutMs: number): Promise<string>;
|
|
8
|
+
parseJsonLines(stdout: string): any[];
|
|
9
|
+
entryToUrl(e: any): string | null;
|
|
10
|
+
findBestYouTubeUrl(pop: any, query: string): Promise<string>;
|
|
11
|
+
formatDuration(sec: number | string | undefined): string;
|
|
12
|
+
}
|
|
13
|
+
export declare function createYtdlpUtils(options: VoicePluginOptions, state: VoiceState): YtdlpUtils;
|
|
14
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/plugins/voice/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C,MAAM,WAAW,UAAU;IACzB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC;IAC7C,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,OAAO,SAAS,CAAC,GAAG,IAAI,CAAC;IACnD,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/D,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,EAAE,CAAC;IACtC,UAAU,CAAC,CAAC,EAAE,GAAG,GAAG,MAAM,GAAG,IAAI,CAAC;IAClC,kBAAkB,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7D,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC;CAC1D;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,kBAAkB,EAAE,KAAK,EAAE,UAAU,GAAG,UAAU,CA+E3F"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import type { PopiiPlugin } from "../types";
|
|
2
|
+
import type { SbSegment, VoicePluginOptions } from "./voice/types";
|
|
3
|
+
export type { SbSegment, VoicePluginOptions };
|
|
4
|
+
declare module "../types" {
|
|
5
|
+
interface Pop {
|
|
6
|
+
joinVoice(): Promise<any>;
|
|
7
|
+
playAudio(urlOrStream: string | any): Promise<{
|
|
8
|
+
player: any;
|
|
9
|
+
title: string;
|
|
10
|
+
metadata?: any;
|
|
11
|
+
}>;
|
|
12
|
+
leaveVoice(): Promise<void>;
|
|
13
|
+
getQueue(): any[];
|
|
14
|
+
getNowPlaying(): {
|
|
15
|
+
title: string;
|
|
16
|
+
artist: string;
|
|
17
|
+
duration: string;
|
|
18
|
+
thumbnail?: string;
|
|
19
|
+
requestedBy?: string;
|
|
20
|
+
elapsedMs: number;
|
|
21
|
+
elapsed: string;
|
|
22
|
+
progress: number;
|
|
23
|
+
} | null;
|
|
24
|
+
getNowPlayingCard(opts?: {
|
|
25
|
+
accentColor?: string;
|
|
26
|
+
}): Promise<import("discord.js").AttachmentBuilder | null>;
|
|
27
|
+
sponsorblock: {
|
|
28
|
+
isEnabled(): boolean;
|
|
29
|
+
setEnabled(enabled: boolean): void;
|
|
30
|
+
getCategories(): string[];
|
|
31
|
+
setCategories(cats: string[]): void;
|
|
32
|
+
forceSkip(): Promise<boolean>;
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
interface EventPop {
|
|
36
|
+
joinVoice(): Promise<any>;
|
|
37
|
+
playAudio(urlOrStream: string | any): Promise<{
|
|
38
|
+
player: any;
|
|
39
|
+
title: string;
|
|
40
|
+
metadata?: any;
|
|
41
|
+
}>;
|
|
42
|
+
leaveVoice(): Promise<void>;
|
|
43
|
+
getQueue(): any[];
|
|
44
|
+
getNowPlaying(): {
|
|
45
|
+
title: string;
|
|
46
|
+
artist: string;
|
|
47
|
+
duration: string;
|
|
48
|
+
thumbnail?: string;
|
|
49
|
+
requestedBy?: string;
|
|
50
|
+
elapsedMs: number;
|
|
51
|
+
elapsed: string;
|
|
52
|
+
progress: number;
|
|
53
|
+
} | null;
|
|
54
|
+
getNowPlayingCard(opts?: {
|
|
55
|
+
accentColor?: string;
|
|
56
|
+
}): Promise<import("discord.js").AttachmentBuilder | null>;
|
|
57
|
+
sponsorblock: {
|
|
58
|
+
isEnabled(): boolean;
|
|
59
|
+
setEnabled(enabled: boolean): void;
|
|
60
|
+
getCategories(): string[];
|
|
61
|
+
setCategories(cats: string[]): void;
|
|
62
|
+
forceSkip(): Promise<boolean>;
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Automatically manages @discordjs/voice connections for commands.
|
|
68
|
+
*
|
|
69
|
+
* @category Plugins
|
|
70
|
+
*/
|
|
71
|
+
export declare function voicePlugin(options?: VoicePluginOptions): PopiiPlugin;
|
|
72
|
+
//# sourceMappingURL=voice.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"voice.d.ts","sourceRoot":"","sources":["../../src/plugins/voice.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,KAAK,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEnE,YAAY,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAAC;AAE9C,OAAO,QAAQ,UAAU,CAAC;IACxB,UAAU,GAAG;QACX,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC;QAC1B,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,GAAG,GAAG,OAAO,CAAC;YAAE,MAAM,EAAE,GAAG,CAAC;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,EAAE,GAAG,CAAA;SAAE,CAAC,CAAC;QAC9F,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;QAC5B,QAAQ,IAAI,GAAG,EAAE,CAAC;QAClB,aAAa,IAAI;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAC;YAAC,SAAS,CAAC,EAAE,MAAM,CAAC;YAAC,WAAW,CAAC,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAA;SAAE,GAAG,IAAI,CAAC;QAC5K,iBAAiB,CAAC,IAAI,CAAC,EAAE;YAAE,WAAW,CAAC,EAAE,MAAM,CAAA;SAAE,GAAG,OAAO,CAAC,OAAO,YAAY,EAAE,iBAAiB,GAAG,IAAI,CAAC,CAAC;QAC3G,YAAY,EAAE;YACZ,SAAS,IAAI,OAAO,CAAC;YACrB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;YACnC,aAAa,IAAI,MAAM,EAAE,CAAC;YAC1B,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;YACpC,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;SAC/B,CAAC;KACH;IACD,UAAU,QAAQ;QAChB,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC;QAC1B,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,GAAG,GAAG,OAAO,CAAC;YAAE,MAAM,EAAE,GAAG,CAAC;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,EAAE,GAAG,CAAA;SAAE,CAAC,CAAC;QAC9F,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;QAC5B,QAAQ,IAAI,GAAG,EAAE,CAAC;QAClB,aAAa,IAAI;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAC;YAAC,SAAS,CAAC,EAAE,MAAM,CAAC;YAAC,WAAW,CAAC,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAA;SAAE,GAAG,IAAI,CAAC;QAC5K,iBAAiB,CAAC,IAAI,CAAC,EAAE;YAAE,WAAW,CAAC,EAAE,MAAM,CAAA;SAAE,GAAG,OAAO,CAAC,OAAO,YAAY,EAAE,iBAAiB,GAAG,IAAI,CAAC,CAAC;QAC3G,YAAY,EAAE;YACZ,SAAS,IAAI,OAAO,CAAC;YACrB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;YACnC,aAAa,IAAI,MAAM,EAAE,CAAC;YAC1B,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;YACpC,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;SAC/B,CAAC;KACH;CACF;AASD;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,OAAO,GAAE,kBAAuB,GAAG,WAAW,CAezE"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { PopiiClient } from "../../types";
|
|
2
|
+
export declare function createGetAggregatedStats(client: PopiiClient): () => Promise<{
|
|
3
|
+
ping: number;
|
|
4
|
+
guilds: number;
|
|
5
|
+
users: number;
|
|
6
|
+
uptime: number | null;
|
|
7
|
+
memoryUsed: number;
|
|
8
|
+
heapUsed: number;
|
|
9
|
+
commandsExecuted: [string, number][];
|
|
10
|
+
}>;
|
|
11
|
+
export declare function createGetActiveGuilds(client: PopiiClient): (guildIds: string[]) => Promise<Set<string>>;
|
|
12
|
+
export declare function createGetGuildInfo(client: PopiiClient): (guildId: string, userId?: string) => Promise<{
|
|
13
|
+
has: boolean;
|
|
14
|
+
perms: string;
|
|
15
|
+
memberRoles?: string[];
|
|
16
|
+
}>;
|
|
17
|
+
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/plugins/web/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,WAAW;;;;;;;;GA6C3D;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,WAAW,IACzC,UAAU,MAAM,EAAE,0BAYjC;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,WAAW,IACtC,SAAS,MAAM,EAAE,SAAS,MAAM,KAAG,OAAO,CAAC;IAAE,GAAG,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAsBlH"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { PopiiPlugin } from "../../types";
|
|
2
|
+
export type { WebPluginOptions } from "./types";
|
|
3
|
+
import type { WebPluginOptions } from "./types";
|
|
4
|
+
declare module "../../types" {
|
|
5
|
+
interface PopiiClient {
|
|
6
|
+
getGuildConfig?(guildId: string): Promise<any>;
|
|
7
|
+
setGuildConfig?(guildId: string, config: any): Promise<void>;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Spins up a lightweight HTTP server for health checks and metrics using Bun.serve().
|
|
12
|
+
*
|
|
13
|
+
* @category Plugins
|
|
14
|
+
*/
|
|
15
|
+
export declare function webPlugin(options?: WebPluginOptions): PopiiPlugin;
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/plugins/web/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAe,MAAM,aAAa,CAAC;AAC5D,YAAY,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAehD,OAAO,QAAQ,aAAa,CAAC;IAC3B,UAAU,WAAW;QACnB,cAAc,CAAC,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC/C,cAAc,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;KAC9D;CACF;AAID;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,OAAO,GAAE,gBAAqB,GAAG,WAAW,CAsbrE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../../src/plugins/web/routes/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAElD,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAwGvF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../../../src/plugins/web/routes/dashboard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAGlD,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CA4V5F"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../../../src/plugins/web/routes/database.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAGlD,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAoC3F"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"locales.d.ts","sourceRoot":"","sources":["../../../../src/plugins/web/routes/locales.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAGlD,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAkC1F"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"members.d.ts","sourceRoot":"","sources":["../../../../src/plugins/web/routes/members.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAGlD,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CA2E1F"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { PopiiClient } from "../../../types";
|
|
2
|
+
export declare function handleMetricsRoutes(url: URL, client: PopiiClient, options: {
|
|
3
|
+
healthPath: string;
|
|
4
|
+
metricsPath: string;
|
|
5
|
+
prometheusPath: string;
|
|
6
|
+
}, getAggregatedStats: () => Promise<any>, activeScopes: string[]): Promise<Response | null>;
|
|
7
|
+
//# sourceMappingURL=metrics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../../../src/plugins/web/routes/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,GAAG,EACR,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,EAC5E,kBAAkB,EAAE,MAAM,OAAO,CAAC,GAAG,CAAC,EACtC,YAAY,EAAE,MAAM,EAAE,GACrB,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAuE1B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"music.d.ts","sourceRoot":"","sources":["../../../../src/plugins/web/routes/music.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAIlD,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAyKxF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"servers.d.ts","sourceRoot":"","sources":["../../../../src/plugins/web/routes/servers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAGlD,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAsG1F"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../../../src/plugins/web/routes/tasks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAGlD,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CA2BxF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui-editor.d.ts","sourceRoot":"","sources":["../../../../src/plugins/web/routes/ui-editor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAGlD,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAiC3F"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { PopiiClient } from "../../types";
|
|
2
|
+
import type { WebPluginOptions } from "./types";
|
|
3
|
+
export declare function initWebPlugin(client: PopiiClient, options: WebPluginOptions, guildConfigs: Map<string, any>, rateLimits: Map<string, {
|
|
4
|
+
count: number;
|
|
5
|
+
resetTime: number;
|
|
6
|
+
}>): () => Promise<any>;
|
|
7
|
+
//# sourceMappingURL=setup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../../src/plugins/web/setup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAGhD,wBAAgB,aAAa,CAC3B,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE,gBAAgB,EACzB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,EAC9B,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,GAC5D,MAAM,OAAO,CAAC,GAAG,CAAC,CA4IpB"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { PopiiClient } from "../../types";
|
|
2
|
+
export interface WebPluginOptions {
|
|
3
|
+
port?: number;
|
|
4
|
+
publicUrl?: string;
|
|
5
|
+
healthPath?: string;
|
|
6
|
+
metricsPath?: string;
|
|
7
|
+
prometheusPath?: string;
|
|
8
|
+
dashboard?: boolean;
|
|
9
|
+
dashboardPath?: string;
|
|
10
|
+
dashboardPassword?: string;
|
|
11
|
+
templatePath?: string;
|
|
12
|
+
viewsDir?: string;
|
|
13
|
+
widgets?: ((client: PopiiClient) => string | Promise<string>)[];
|
|
14
|
+
theme?: {
|
|
15
|
+
primary?: string;
|
|
16
|
+
backgroundDark?: string;
|
|
17
|
+
backgroundLight?: string;
|
|
18
|
+
};
|
|
19
|
+
oauth2?: {
|
|
20
|
+
clientId: string;
|
|
21
|
+
clientSecret: string;
|
|
22
|
+
redirectUri: string;
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
export interface WebRequestContext {
|
|
26
|
+
req: Request;
|
|
27
|
+
url: URL;
|
|
28
|
+
client: PopiiClient;
|
|
29
|
+
db: any;
|
|
30
|
+
session: any;
|
|
31
|
+
sessionId: string | null;
|
|
32
|
+
isOwner: boolean;
|
|
33
|
+
authErrorResponse: Response | null;
|
|
34
|
+
activeScopes: string[];
|
|
35
|
+
t: (key: string, fallback: string) => string;
|
|
36
|
+
availableLocales: string[];
|
|
37
|
+
webLang: string;
|
|
38
|
+
options: WebPluginOptions;
|
|
39
|
+
guildConfigs: Map<string, any>;
|
|
40
|
+
rateLimits: Map<string, {
|
|
41
|
+
count: number;
|
|
42
|
+
resetTime: number;
|
|
43
|
+
}>;
|
|
44
|
+
theme: {
|
|
45
|
+
primary?: string;
|
|
46
|
+
backgroundDark?: string;
|
|
47
|
+
backgroundLight?: string;
|
|
48
|
+
} | undefined;
|
|
49
|
+
getAggregatedStats: () => Promise<any>;
|
|
50
|
+
getActiveGuilds: (guildIds: string[]) => Promise<Set<string>>;
|
|
51
|
+
getGuildInfo: (guildId: string, userId?: string) => Promise<{
|
|
52
|
+
has: boolean;
|
|
53
|
+
perms: string;
|
|
54
|
+
memberRoles?: string[];
|
|
55
|
+
}>;
|
|
56
|
+
renderView: (viewName: string, data: any, fallbackTemplate: (data: any) => string) => Promise<string>;
|
|
57
|
+
getCookie: (name: string) => string | null;
|
|
58
|
+
rotateCsrf: (sid: string, sessionObj: any) => Promise<void>;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/plugins/web/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare const apiKeyRequestTemplate: (csrfToken: string, user: any, existingKey: any, host: string, theme?: any, t?: any, locales?: any[], cl?: any) => string;
|
|
2
|
+
export declare const updatesTemplate: (changelogHtml: string, csrfToken: string, user: any, theme?: any, t?: any, locales?: any[], cl?: any) => string;
|
|
3
|
+
export declare const transcriptsTemplate: (guild: any, transcripts: any[], csrfToken: string, user: any, theme?: any, t?: any, locales?: any[], cl?: any) => string;
|
|
4
|
+
export declare const tasksTemplate: (csrfToken: string, user: any, tasks: any[], theme?: any, t?: any, locales?: any[], cl?: any) => string;
|
|
5
|
+
//# sourceMappingURL=admin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../../../../src/plugins/web/views/admin.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,qBAAqB,GAAI,WAAW,MAAM,EAAE,MAAM,GAAG,EAAE,aAAa,GAAG,EAAE,MAAM,MAAM,EAAE,QAAQ,GAAG,EAAE,IAAI,GAAG,EAAE,UAAU,GAAG,EAAE,EAAE,KAAK,GAAG,WAmDlJ,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,eAAe,MAAM,EAAE,WAAW,MAAM,EAAE,MAAM,GAAG,EAAE,QAAQ,GAAG,EAAE,IAAI,GAAG,EAAE,UAAU,GAAG,EAAE,EAAE,KAAK,GAAG,WAQnI,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAI,OAAO,GAAG,EAAE,aAAa,GAAG,EAAE,EAAE,WAAW,MAAM,EAAE,MAAM,GAAG,EAAE,QAAQ,GAAG,EAAE,IAAI,GAAG,EAAE,UAAU,GAAG,EAAE,EAAE,KAAK,GAAG,WAIhJ,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,WAAW,MAAM,EAAE,MAAM,GAAG,EAAE,OAAO,GAAG,EAAE,EAAE,QAAQ,GAAG,EAAE,IAAI,GAAG,EAAE,UAAU,GAAG,EAAE,EAAE,KAAK,GAAG,WAoBxH,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare const icons: {
|
|
2
|
+
play: string;
|
|
3
|
+
pause: string;
|
|
4
|
+
skip: string;
|
|
5
|
+
stop: string;
|
|
6
|
+
search: string;
|
|
7
|
+
clear: string;
|
|
8
|
+
music: string;
|
|
9
|
+
};
|
|
10
|
+
export declare const baseCss = "\n :root {\n color-scheme: dark;\n --accent: #F04F96;\n --accent-glow: rgba(240, 79, 150, 0.45);\n --accent-light: #FF80BA;\n --bg-dark: #0D0610;\n --bg-mid: #1a0920;\n --bg-light: #2a1030;\n --card-bg: rgba(220, 80, 140, 0.055);\n --card-border: rgba(240, 79, 150, 0.12);\n --card-highlight: rgba(255, 160, 200, 0.08);\n --text-main: #fdf0f6;\n --text-muted: rgba(255, 195, 220, 0.6);\n --sidebar-bg: #090510;\n --sidebar-border: rgba(240, 79, 150, 0.1);\n }\n body::before { content: ''; position: fixed; inset: 0; z-index: 0; pointer-events: none; opacity: 0.028; background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='300' height='300'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.75' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='300' height='300' filter='url(%23n)'/%3E%3C/svg%3E\"); background-repeat: repeat; background-size: 300px 300px; }\n body { position: relative; background: radial-gradient(ellipse 80% 60% at 15% 10%, var(--bg-light), transparent), radial-gradient(ellipse 55% 45% at 85% 90%, #200d2e, transparent), radial-gradient(ellipse 40% 35% at 50% 50%, var(--bg-mid), transparent), var(--bg-dark); background-attachment: fixed; color: var(--text-main); font-family: 'Inter', system-ui, -apple-system, sans-serif; margin: 0; min-height: 100vh; }\n nav { position: fixed; top: 0; left: 0; right: 0; height: 56px; z-index: 200; display: flex; align-items: center; justify-content: space-between; gap: 1rem; padding: 0 1.5rem; background: var(--card-bg); backdrop-filter: blur(16px); -webkit-backdrop-filter: blur(16px); border-bottom: 1px solid var(--card-border); box-shadow: 0 4px 32px rgba(0,0,0,0.35), inset 0 -1px 0 rgba(240, 79, 150, 0.08); box-sizing: border-box; }\n .nav-links { display: flex; flex-wrap: wrap; justify-content: center; gap: 0.5rem; flex: 1; }\n .nav-brand, .nav-controls { display: flex; align-items: center; gap: 1rem; flex-shrink: 0; }\n .nav-links > a { color: var(--text-main); text-decoration: none; font-weight: 600; opacity: 0.7; transition: all 0.2s; white-space: nowrap; padding: 0.5rem 1rem; border-radius: 12px; }\n .nav-links > a:hover, .nav-links > a.active { opacity: 1; color: var(--accent); background: rgba(240, 79, 150, 0.1); box-shadow: inset 0 0 0 1px rgba(240, 79, 150, 0.2); }\n .header { width: 100%; padding: 3rem 1rem 2rem; text-align: center; }\n .header h1 { margin: 0; font-size: 2.5rem; font-weight: 800; letter-spacing: -0.05em; text-shadow: 0 0 24px var(--accent-glow); }\n .container { width: 100%; max-width: 1000px; padding: 0 2rem 4rem; display: grid; grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)); gap: 1.5rem; box-sizing: border-box; }\n .card { background: linear-gradient(135deg, var(--card-highlight) 0%, transparent 60%), var(--card-bg); border: 1px solid var(--card-border); border-radius: 24px; padding: 2rem; backdrop-filter: blur(14px) saturate(1.4); -webkit-backdrop-filter: blur(14px) saturate(1.4); box-shadow: 0 8px 32px rgba(0,0,0,0.28), inset 0 1px 0 rgba(255, 180, 210, 0.12); transition: transform 0.2s ease, box-shadow 0.2s ease, border-color 0.2s ease; }\n .card:hover { transform: translateY(-4px); box-shadow: 0 16px 48px rgba(240,79,150,0.18), 0 4px 16px rgba(0,0,0,0.2), inset 0 1px 0 rgba(255,180,210,0.2); border-color: rgba(240,79,150,0.35); }\n .card h2 { margin: 0 0 1.5rem 0; color: var(--text-main); font-size: 1.25rem; display: flex; align-items: center; gap: 0.6rem; }\n .card h2::before { content: ''; display: inline-block; width: 10px; height: 10px; background: var(--accent); border-radius: 50%; box-shadow: 0 0 10px var(--accent-glow); }\n ul { list-style: none; padding: 0; margin: 0; }\n li { padding: 0.8rem 0; border-bottom: 1px solid var(--card-border); display: flex; justify-content: space-between; align-items: center; font-weight: 500; transition: background 0.2s; }\n li:last-child { border-bottom: none; }\n .badge { background: rgba(240, 79, 150, 0.15); color: var(--accent); padding: 0.35rem 0.85rem; border-radius: 999px; font-weight: 700; font-size: 0.85rem; border: 1px solid rgba(240, 79, 150, 0.3); box-shadow: inset 0 0 8px rgba(240, 79, 150, 0.1); }\n .empty-state { color: var(--text-muted); font-style: italic; text-align: center; padding: 2rem 0; }\n .btn { display: block; width: 100%; background: rgba(240, 79, 150, 0.15); color: var(--accent); border: 1px solid rgba(240, 79, 150, 0.3); padding: 0.8rem; border-radius: 12px; font-weight: 600; cursor: pointer; transition: all 0.2s; margin-bottom: 0.75rem; text-align: center; text-decoration: none; font-size: 1rem; box-sizing: border-box; }\n .btn:hover { background: rgba(240, 79, 150, 0.3); transform: translateY(-2px); }\n .btn-danger { color: #ED4245; border-color: rgba(237, 66, 69, 0.3); background: rgba(237, 66, 69, 0.1); }\n .btn-danger:hover { background: rgba(237, 66, 69, 0.2); }\n .btn-primary { background: linear-gradient(135deg, var(--accent) 0%, var(--accent-light) 100%); color: #fff; border-color: transparent; box-shadow: 0 6px 18px rgba(240, 79, 150, 0.35); }\n .btn-primary:hover { background: linear-gradient(135deg, #d93e85 0%, var(--accent) 100%); box-shadow: 0 8px 24px rgba(240, 79, 150, 0.5); }\n ul::-webkit-scrollbar { width: 6px; }\n ul::-webkit-scrollbar-track { background: transparent; }\n ul::-webkit-scrollbar-thumb { background: var(--card-border); border-radius: 4px; }\n .lyric-line { padding: 0.5rem 0; color: var(--text-muted); font-size: 1.1rem; transition: all 0.3s ease; cursor: default; opacity: 0.5; font-weight: 600; line-height: 1.4; }\n .lyric-line.active { color: var(--accent); font-size: 1.3rem; opacity: 1; text-shadow: 0 0 15px rgba(240,79,150,0.4); transform: scale(1.05); }\n .lyric-line:hover { opacity: 0.8; color: var(--text-main); }\n .lyrics-scroll-box { flex: 1; overflow-y: auto; text-align: center; position: relative; scroll-behavior: smooth; padding: 40% 1rem; mask-image: linear-gradient(to bottom, transparent, black 15%, black 85%, transparent); -webkit-mask-image: linear-gradient(to bottom, transparent, black 15%, black 85%, transparent); }\n .lyrics-scroll-box::-webkit-scrollbar { display: none; }\n .progress-container { width: 100%; height: 8px; background: rgba(255,255,255,0.05); border-radius: 4px; margin: 1.5rem 0 0.5rem; overflow: visible; cursor: pointer; position: relative; }\n .progress-fill { height: 100%; background: linear-gradient(90deg, var(--accent), var(--accent-light)); width: 0%; transition: width 1s linear; border-radius: 4px; box-shadow: 0 0 10px var(--accent-glow); position: relative; }\n .progress-fill::after { content: ''; position: absolute; right: -4px; top: 50%; transform: translateY(-50%); width: 10px; height: 10px; background: #fff; border-radius: 50%; box-shadow: 0 0 5px rgba(0,0,0,0.5); }\n .time-info { display: flex; justify-content: space-between; font-size: 0.85rem; color: var(--text-muted); font-family: monospace; font-weight: 600; }\n .search-bar { position: relative; display: flex; align-items: center; background: rgba(255,255,255,0.03); border: 1px solid var(--card-border); border-radius: 999px; padding: 0.25rem 0.25rem 0.25rem 1.25rem; margin-top: 1.5rem; transition: all 0.3s ease; }\n .search-bar:focus-within { background: rgba(255,255,255,0.08); border-color: var(--accent); box-shadow: 0 0 0 3px rgba(240, 79, 150, 0.2); }\n .search-bar input { flex: 1; background: transparent; border: none; color: var(--text-main); font-family: inherit; font-size: 0.95rem; outline: none; }\n .search-bar input::placeholder { color: var(--text-muted); }\n .search-bar button { background: linear-gradient(135deg, var(--accent) 0%, var(--accent-light) 100%); color: white; border: none; border-radius: 999px; padding: 0.6rem 1.2rem; font-weight: 600; cursor: pointer; display: flex; align-items: center; gap: 6px; transition: all 0.2s; box-shadow: 0 4px 14px rgba(240,79,150,0.35); }\n .search-bar button:hover { background: var(--accent-dark, #E04887); transform: scale(1.05); box-shadow: 0 6px 16px rgba(240,79,150,0.5); }\n #search-results-container { position: relative; }\n #search-results { position: absolute; top: 100%; left: 0; right: 0; z-index: 50; text-align: left; background: var(--bg-dark); padding: 1rem; border-radius: 16px; margin-top: 0.5rem; border: 1px solid var(--card-border); box-shadow: 0 12px 40px rgba(0,0,0,0.5); max-height: 350px; overflow-y: auto; }\n .hero-player { grid-column: 1 / -1; position: relative; overflow: hidden; border-radius: 28px; padding: 2.5rem; background: var(--card-bg); border: 1px solid var(--card-border); box-shadow: 0 12px 40px rgba(0,0,0,0.3); }\n .hero-bg { position: absolute; inset: 0; background-size: cover; background-position: center; filter: blur(40px) saturate(1.5) brightness(0.3); transform: scale(1.1); z-index: 0; }\n .hero-content { position: relative; z-index: 1; display: flex; gap: 2.5rem; align-items: center; width: 100%; }\n .hero-art { width: 220px; height: 220px; border-radius: 20px; object-fit: cover; flex-shrink: 0; box-shadow: 0 12px 40px rgba(0,0,0,0.6); transition: transform 0.4s ease; }\n .hero-art:hover { transform: scale(1.03) rotate(-1deg); }\n .hero-art.playing { animation: artPulse 3s ease-in-out infinite; }\n @keyframes artPulse { 0%,100% { box-shadow: 0 0 24px 4px var(--accent-glow); } 50% { box-shadow: 0 0 44px 14px var(--accent-glow); } }\n .hero-art-placeholder { width: 220px; height: 220px; border-radius: 20px; background: rgba(255,255,255,0.04); display: flex; align-items: center; justify-content: center; color: var(--text-muted); flex-shrink: 0; border: 1px solid var(--card-border); font-size: 3rem; }\n .hero-info { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 0.3rem; transition: opacity 0.3s ease, transform 0.3s ease; }\n .hero-info.changing { opacity: 0; transform: translateY(8px); }\n .hero-label { font-size: 0.78rem; font-weight: 700; letter-spacing: 0.15em; color: var(--accent); text-transform: uppercase; }\n .hero-title { font-size: clamp(1.3rem, 3vw, 1.9rem); font-weight: 800; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; line-height: 1.15; margin: 0; text-shadow: 0 2px 12px rgba(0,0,0,0.6); }\n .hero-artist { font-size: 0.95rem; color: var(--text-muted); font-weight: 500; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n .hero-progress-wrap { margin: 1rem 0 0.3rem; }\n .hero-progress-bar { width: 100%; height: 5px; background: rgba(255,255,255,0.12); border-radius: 3px; cursor: pointer; position: relative; transition: height 0.15s ease; }\n .hero-progress-bar:hover { height: 8px; }\n .hero-progress-fill { height: 100%; border-radius: 3px; background: linear-gradient(90deg, var(--accent), var(--accent-light)); box-shadow: 0 0 8px var(--accent-glow); width: 0%; transition: width 1s linear; position: relative; }\n .hero-progress-fill::after { content:''; position:absolute; right:-5px; top:50%; transform:translateY(-50%); width:12px; height:12px; background:#fff; border-radius:50%; box-shadow:0 0 6px rgba(0,0,0,0.4); opacity:0; transition:opacity 0.15s; }\n .hero-progress-bar:hover .hero-progress-fill::after { opacity: 1; }\n .hero-controls { display: flex; align-items: center; gap: 1.25rem; margin-top: 1.2rem; }\n .ctrl-btn { width: 3.2rem; height: 3.2rem; border-radius: 50%; display: flex; align-items: center; justify-content: center; border: 1px solid rgba(240,79,150,0.2); background: rgba(255,255,255,0.05); color: var(--accent); cursor: pointer; transition: all 0.25s cubic-bezier(0.25,0.8,0.25,1); outline: none; backdrop-filter: blur(4px); -webkit-backdrop-filter: blur(4px); }\n .ctrl-btn:hover { background: rgba(240,79,150,0.15); transform: scale(1.1); box-shadow: 0 6px 16px rgba(240,79,150,0.25); }\n .ctrl-btn.primary { width: 4rem; height: 4rem; background: linear-gradient(135deg, var(--accent), var(--accent-light)); color: white; border: none; box-shadow: 0 8px 24px var(--accent-glow); }\n .ctrl-btn.primary:hover { transform: scale(1.08); box-shadow: 0 12px 32px var(--accent-glow); }\n .ctrl-btn.danger { border-color: rgba(237,66,69,0.25); background: rgba(237,66,69,0.06); color: #ED4245; }\n .ctrl-btn.danger:hover { background: rgba(237,66,69,0.15); box-shadow: 0 6px 16px rgba(237,66,69,0.2); }\n .eq-bars { display: flex; align-items: flex-end; gap: 3px; height: 26px; }\n .eq-bar { width: 4px; border-radius: 2px; background: var(--accent); box-shadow: 0 0 5px var(--accent-glow); animation: eqBounce 0.8s ease-in-out infinite alternate; animation-play-state: paused; min-height: 4px; }\n .eq-bars.playing .eq-bar { animation-play-state: running; }\n .eq-bar:nth-child(1) { height: 14px; animation-delay: 0s; }\n .eq-bar:nth-child(2) { height: 26px; animation-delay: 0.15s; }\n .eq-bar:nth-child(3) { height: 10px; animation-delay: 0.05s; }\n .eq-bar:nth-child(4) { height: 20px; animation-delay: 0.2s; }\n .eq-bar:nth-child(5) { height: 16px; animation-delay: 0.1s; }\n @keyframes eqBounce { from { transform: scaleY(0.25); } to { transform: scaleY(1); } }\n .music-lower { grid-column: 1 / -1; display: grid; grid-template-columns: 1fr 1.4fr; gap: 1.5rem; }\n .music-bottom { grid-column: 1 / -1; display: grid; grid-template-columns: 1fr 1fr; gap: 1.5rem; }\n @media (max-width: 860px) { .music-lower, .music-bottom { grid-template-columns: 1fr; } .hero-art, .hero-art-placeholder { width: 160px; height: 160px; } }\n @media (max-width: 600px) { .hero-art, .hero-art-placeholder { display: none !important; } }\n .queue-item { display: flex; align-items: center; gap: 0.85rem; padding: 0.6rem 0; border-bottom: 1px solid var(--card-border); }\n .queue-item:last-child { border-bottom: none; }\n .queue-thumb { width: 44px; height: 44px; border-radius: 8px; object-fit: cover; flex-shrink: 0; }\n .queue-thumb-placeholder { width: 44px; height: 44px; border-radius: 8px; background: rgba(255,255,255,0.04); border: 1px solid var(--card-border); flex-shrink: 0; display: flex; align-items: center; justify-content: center; color: var(--text-muted); font-size: 1.1rem; }\n .queue-meta { flex: 1; min-width: 0; }\n .queue-track-title { font-weight: 600; font-size: 0.88rem; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n .queue-track-sub { font-size: 0.76rem; color: var(--text-muted); margin-top: 2px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n :root[data-theme=\"light\"] { color-scheme: light; --bg-dark: #fce8f2; --bg-mid: #fef0f8; --bg-light: #fff5fb; --sidebar-bg: #f5d8ea; --sidebar-border: rgba(200, 80, 130, 0.2); --card-bg: rgba(255, 255, 255, 0.72); --card-border: rgba(220, 80, 140, 0.2); --card-highlight: rgba(255, 200, 220, 0.3); --text-main: #2a0d1e; --text-muted: rgba(100, 40, 70, 0.7); --accent-glow: rgba(240, 79, 150, 0.25); }\n :root[data-theme=\"light\"] body { background: radial-gradient(ellipse 80% 60% at 15% 10%, var(--bg-light), transparent), radial-gradient(ellipse 55% 45% at 85% 90%, #f0c5dc, transparent), var(--bg-dark); }\n .theme-toggle { background: rgba(240,79,150,0.15); border: 1px solid rgba(240,79,150,0.3); color: var(--accent); padding: 0.45rem 0.65rem; border-radius: 12px; cursor: pointer; transition: all 0.2s; font-size: 1.1rem; line-height: 1; }\n .theme-toggle:hover { background: rgba(240,79,150,0.3); transform: translateY(-2px); box-shadow: 0 4px 12px rgba(240,79,150,0.2); }\n .lang-select { background: transparent; border: 1px solid transparent; color: var(--text-muted); font-weight: 600; outline: none; cursor: pointer; padding: 0.5rem; border-radius: 12px; transition: all 0.2s; font-size: 0.85rem; font-family: inherit; appearance: none; -webkit-appearance: none; -moz-appearance: none; text-align: center; }\n .lang-select:hover, .lang-select:focus { color: var(--text-main); background: rgba(255,255,255,0.05); border-color: var(--card-border); }\n .user-profile { display: flex; align-items: center; gap: 10px; font-size: 0.9rem; font-weight: 600; background: rgba(255,255,255,0.05); padding: 0.3rem 1rem 0.3rem 0.3rem; border-radius: 999px; border: 1px solid var(--card-border); transition: all 0.2s; }\n .user-profile:hover { border-color: var(--accent); background: rgba(240,79,150,0.05); }\n .user-profile img { width: 28px; height: 28px; border-radius: 50%; box-shadow: 0 2px 8px rgba(0,0,0,0.3); }\n .user-profile a { opacity: 0.8; transition: 0.2s; }\n .user-profile a:hover { opacity: 1; text-shadow: 0 0 8px currentColor; }\n @keyframes navDropdownFade { from { opacity: 0; transform: translate(-50%, 10px); } to { opacity: 1; transform: translate(-50%, 0); } }\n .nav-dropdown { position: relative; display: inline-block; margin: 0; padding: 0; }\n .nav-dropdown-content { display: none; position: absolute; background-color: var(--bg-dark); min-width: 160px; box-shadow: 0px 12px 40px rgba(0,0,0,0.5); z-index: 100; border-radius: 16px; border: 1px solid var(--card-border); top: 100%; left: 50%; transform: translateX(-50%); padding: 0.5rem 0; margin-top: 10px; overflow: hidden; }\n .nav-dropdown-content a { color: var(--text-main); padding: 12px 20px; text-decoration: none; display: block; opacity: 0.7; transition: 0.2s; font-weight: 500; border-bottom: 1px solid rgba(255,255,255,0.02); }\n .nav-dropdown-content a:last-child { border-bottom: none; }\n .nav-dropdown-content a:hover { background-color: rgba(240,79,150,0.1); opacity: 1; color: var(--accent); padding-left: 24px; }\n .nav-dropdown:hover .nav-dropdown-content, .nav-dropdown:focus-within .nav-dropdown-content { display: block; animation: navDropdownFade 0.2s ease forwards; }\n .nav-dropdown-btn { color: var(--text-main); text-decoration: none; font-weight: 600; opacity: 0.7; transition: all 0.2s; cursor: pointer; display: flex; align-items: center; gap: 4px; padding: 0.5rem 1rem; border-radius: 12px; background: none; border: none; font-size: 1rem; font-family: inherit; }\n .nav-dropdown:hover .nav-dropdown-btn, .nav-dropdown:focus-within .nav-dropdown-btn { opacity: 1; color: var(--accent); background: rgba(240, 79, 150, 0.1); box-shadow: inset 0 0 0 1px rgba(240, 79, 150, 0.2); }\n .nav-dropdown-content::before { content: ''; position: absolute; top: -6px; left: 50%; transform: translateX(-50%); border-width: 0 6px 6px 6px; border-style: solid; border-color: transparent transparent var(--card-border) transparent; }\n @media (max-width: 900px) { .nav-brand, .nav-controls { flex-wrap: wrap; } }\n @media (max-width: 600px) { .container { padding: 0 1rem 2rem; } .header h1 { font-size: 2.2rem; } .user-avatar-btn span.uname { display: none; } }\n .brand-logo { color: var(--accent); font-size: 1.2rem; font-weight: 800; text-decoration: none; letter-spacing: -0.03em; text-shadow: 0 0 16px var(--accent-glow); flex-shrink: 0; }\n .user-avatar-btn { display: flex; align-items: center; gap: 7px; font-size: 0.9rem; font-weight: 600; background: rgba(255,255,255,0.05); padding: 0.3rem 0.75rem 0.3rem 0.3rem; border-radius: 999px; border: 1px solid var(--card-border); cursor: pointer; transition: all 0.2s; white-space: nowrap; }\n .user-avatar-btn img { width: 28px; height: 28px; border-radius: 50%; box-shadow: 0 2px 8px rgba(0,0,0,0.3); flex-shrink: 0; }\n .nav-dropdown:hover .user-avatar-btn, .nav-dropdown:focus-within .user-avatar-btn { border-color: var(--accent); background: rgba(240,79,150,0.08); }\n #page-root { display:flex;flex-direction:column;align-items:center;padding-top:80px;min-height:100vh;box-sizing:border-box; }\n .nav-hub-btn { display:flex;align-items:center;gap:6px;background:rgba(240,79,150,0.1);border:1px solid rgba(240,79,150,0.2);color:var(--text-main);font-size:.88rem;font-weight:600;padding:.4rem .85rem;border-radius:12px;cursor:pointer;transition:all .15s;font-family:inherit; }\n .nav-hub-btn:hover { background:rgba(240,79,150,0.2);border-color:var(--accent); }\n #sv-picker { position:relative; }\n .sv-pill { display:flex;align-items:center;gap:7px;background:rgba(255,255,255,0.04);border:1px solid var(--card-border);color:var(--text-muted);font-size:.85rem;font-weight:600;padding:.3rem .8rem .3rem .35rem;border-radius:999px;cursor:pointer;transition:all .15s;font-family:inherit;max-width:180px; }\n .sv-pill img { width:22px;height:22px;border-radius:6px;object-fit:cover;flex-shrink:0; }\n .sv-pill-ph { width:22px;height:22px;border-radius:6px;background:rgba(240,79,150,0.1);border:1px solid var(--card-border);flex-shrink:0;display:flex;align-items:center;justify-content:center;font-size:.6rem;color:var(--text-muted); }\n .sv-pill-name { overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0; }\n .sv-pill-arr { font-size:.6rem;opacity:0.6;transition:transform .15s;flex-shrink:0; }\n .sv-pill:hover { border-color:var(--accent);color:var(--text-main);background:rgba(240,79,150,0.06); }\n .sv-pill.open { border-color:var(--accent);color:var(--text-main); }\n .sv-pill.open .sv-pill-arr { transform:rotate(180deg); }\n .sv-dropdown { position:absolute;top:calc(100% + 6px);left:0;min-width:210px;background:var(--bg-dark);border:1px solid var(--card-border);border-radius:14px;box-shadow:0 12px 40px rgba(0,0,0,0.5);z-index:600;overflow:hidden;max-height:260px;overflow-y:auto;padding:.4rem; }\n .sv-dd-item { display:flex;align-items:center;gap:9px;padding:.4rem .55rem;border-radius:9px;cursor:pointer;font-size:.82rem;font-weight:600;color:var(--text-muted);transition:all .1s;overflow:hidden; }\n .sv-dd-item:hover { background:rgba(240,79,150,0.08);color:var(--text-main); }\n .sv-dd-item.selected { background:rgba(240,79,150,0.12);color:var(--accent); }\n .sv-dd-item img { width:22px;height:22px;border-radius:6px;object-fit:cover;flex-shrink:0; }\n .sv-dd-ph { width:22px;height:22px;border-radius:6px;background:rgba(240,79,150,0.1);border:1px solid var(--card-border);flex-shrink:0; }\n .sv-dd-name { overflow:hidden;text-overflow:ellipsis;white-space:nowrap; }\n #sh{position:fixed;inset:0;z-index:1000;display:none;align-items:center;justify-content:center;}\n #sh.open{display:flex;}\n .sh-bd{position:absolute;inset:0;background:rgba(0,0,0,0.55);backdrop-filter:blur(6px);}\n .sh-panel{position:relative;background:var(--bg-mid);border:1px solid var(--card-border);border-radius:24px;width:min(820px,96vw);max-height:90vh;display:flex;flex-direction:column;box-shadow:0 32px 80px rgba(0,0,0,0.55),inset 0 1px 0 rgba(255,180,210,0.08);overflow:hidden;animation:sh-in .18s ease;}\n @keyframes sh-in{from{opacity:0;transform:scale(.96) translateY(8px)}to{opacity:1;transform:none}}\n .sh-top{display:flex;align-items:center;gap:12px;padding:1.1rem 1.4rem;border-bottom:1px solid var(--card-border);flex-shrink:0;}\n .sh-top-ico{width:34px;height:34px;border-radius:10px;object-fit:cover;flex-shrink:0;}\n .sh-top-ph{width:34px;height:34px;border-radius:10px;background:rgba(240,79,150,0.12);border:1px solid var(--card-border);display:flex;align-items:center;justify-content:center;font-size:.9rem;flex-shrink:0;}\n .sh-top h2{font-size:.95rem;font-weight:700;margin:0;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}\n .sh-x{background:none;border:none;color:var(--text-muted);cursor:pointer;font-size:1rem;width:28px;height:28px;border-radius:8px;display:flex;align-items:center;justify-content:center;transition:all .12s;flex-shrink:0;}\n .sh-x:hover{color:var(--text-main);background:rgba(255,255,255,0.07);}\n .sh-body{display:flex;flex:1;overflow:hidden;min-height:0;}\n .sh-sv{width:190px;flex-shrink:0;border-right:1px solid var(--card-border);overflow-y:auto;padding:.4rem;display:none;}\n .sh-sv-item{display:flex;align-items:center;gap:9px;padding:.42rem .6rem;border-radius:9px;cursor:pointer;font-size:.81rem;font-weight:600;color:var(--text-muted);transition:all .1s;overflow:hidden;}\n .sh-sv-item:hover{background:rgba(240,79,150,0.07);color:var(--text-main);}\n .sh-sv-item.active{background:rgba(240,79,150,0.12);color:var(--accent);}\n .sh-sv-item img{width:22px;height:22px;border-radius:6px;flex-shrink:0;object-fit:cover;}\n .sh-sv-ph{width:22px;height:22px;border-radius:6px;background:rgba(240,79,150,0.1);border:1px solid var(--card-border);flex-shrink:0;}\n .sh-sv-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}\n .sh-main{flex:1;overflow-y:auto;padding:1.1rem 1.25rem;}\n .sh-sec-label{font-size:.7rem;font-weight:700;letter-spacing:.11em;color:rgba(240,79,150,0.55);text-transform:uppercase;margin-bottom:.8rem;}\n .sh-cards{display:grid;grid-template-columns:repeat(auto-fill,minmax(148px,1fr));gap:.65rem;}\n .sh-card{display:flex;flex-direction:column;gap:.3rem;padding:1rem 1rem .9rem;background:var(--card-bg);border:1px solid var(--card-border);border-radius:16px;text-decoration:none;color:var(--text-main);transition:all .15s;}\n .sh-card:hover{border-color:rgba(240,79,150,0.38);background:rgba(240,79,150,0.05);transform:translateY(-2px);box-shadow:0 8px 24px rgba(0,0,0,0.2);}\n .sh-card-ico{font-size:1.5rem;line-height:1;margin-bottom:.1rem;}\n .sh-card-t{font-weight:700;font-size:.88rem;}\n .sh-card-d{font-size:.74rem;color:var(--text-muted);line-height:1.35;}\n .sh-empty{color:var(--text-muted);font-size:.85rem;padding:.5rem 0;}\n";
|
|
11
|
+
export declare const escapeHtml: (str: any) => any;
|
|
12
|
+
export declare const baseLayout: (title: string, path: string, user: any, body: string, theme?: any, t?: any, locales?: string[], currentLang?: string) => string;
|
|
13
|
+
//# sourceMappingURL=base.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../../src/plugins/web/views/base.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,KAAK;;;;;;;;CAQjB,CAAC;AAEF,eAAO,MAAM,OAAO,2sxBAsLnB,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,KAAK,GAAG,QAGlC,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,OAAO,MAAM,EAAE,MAAM,MAAM,EAAE,MAAM,GAAG,EAAE,MAAM,MAAM,EAAE,QAAQ,GAAG,EAAE,IAAG,GAAsB,EAAE,UAAS,MAAM,EAAc,EAAE,cAAa,MAAgB,WA4GpL,CAAC"}
|