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.
Files changed (177) hide show
  1. package/README.md +159 -0
  2. package/dist/cli/commands.d.ts +15 -0
  3. package/dist/cli/commands.d.ts.map +1 -0
  4. package/dist/cli/pages.d.ts +5 -0
  5. package/dist/cli/pages.d.ts.map +1 -0
  6. package/dist/cli/scaffold.d.ts +23 -0
  7. package/dist/cli/scaffold.d.ts.map +1 -0
  8. package/dist/cli.d.ts +3 -0
  9. package/dist/cli.d.ts.map +1 -0
  10. package/dist/cli.js +1710 -0
  11. package/dist/client.d.ts +40 -0
  12. package/dist/client.d.ts.map +1 -0
  13. package/dist/define/command.d.ts +47 -0
  14. package/dist/define/command.d.ts.map +1 -0
  15. package/dist/define/event.d.ts +52 -0
  16. package/dist/define/event.d.ts.map +1 -0
  17. package/dist/define/snap.d.ts +55 -0
  18. package/dist/define/snap.d.ts.map +1 -0
  19. package/dist/define/task.d.ts +64 -0
  20. package/dist/define/task.d.ts.map +1 -0
  21. package/dist/handler/cache.d.ts +6 -0
  22. package/dist/handler/cache.d.ts.map +1 -0
  23. package/dist/handler/context.d.ts +3 -0
  24. package/dist/handler/context.d.ts.map +1 -0
  25. package/dist/handler/index.d.ts +8 -0
  26. package/dist/handler/index.d.ts.map +1 -0
  27. package/dist/handler/interaction.d.ts +4 -0
  28. package/dist/handler/interaction.d.ts.map +1 -0
  29. package/dist/handler/lock.d.ts +2 -0
  30. package/dist/handler/lock.d.ts.map +1 -0
  31. package/dist/handler/logger.d.ts +4 -0
  32. package/dist/handler/logger.d.ts.map +1 -0
  33. package/dist/handler/message.d.ts +4 -0
  34. package/dist/handler/message.d.ts.map +1 -0
  35. package/dist/handler/middleware.d.ts +5 -0
  36. package/dist/handler/middleware.d.ts.map +1 -0
  37. package/dist/index.d.ts +31 -0
  38. package/dist/index.d.ts.map +1 -0
  39. package/dist/index.js +10464 -0
  40. package/dist/loader/fizz.d.ts +2 -0
  41. package/dist/loader/fizz.d.ts.map +1 -0
  42. package/dist/loader/index.d.ts +3 -0
  43. package/dist/loader/index.d.ts.map +1 -0
  44. package/dist/loader/locales.d.ts +2 -0
  45. package/dist/loader/locales.d.ts.map +1 -0
  46. package/dist/loader/middleware.d.ts +54 -0
  47. package/dist/loader/middleware.d.ts.map +1 -0
  48. package/dist/loader/snaps.d.ts +3 -0
  49. package/dist/loader/snaps.d.ts.map +1 -0
  50. package/dist/loader/tasks.d.ts +3 -0
  51. package/dist/loader/tasks.d.ts.map +1 -0
  52. package/dist/plugins/activity.d.ts +15 -0
  53. package/dist/plugins/activity.d.ts.map +1 -0
  54. package/dist/plugins/ai.d.ts +35 -0
  55. package/dist/plugins/ai.d.ts.map +1 -0
  56. package/dist/plugins/automod.d.ts +12 -0
  57. package/dist/plugins/automod.d.ts.map +1 -0
  58. package/dist/plugins/canvas.d.ts +75 -0
  59. package/dist/plugins/canvas.d.ts.map +1 -0
  60. package/dist/plugins/captcha.d.ts +20 -0
  61. package/dist/plugins/captcha.d.ts.map +1 -0
  62. package/dist/plugins/commandAnalytic.d.ts +8 -0
  63. package/dist/plugins/commandAnalytic.d.ts.map +1 -0
  64. package/dist/plugins/commandLogger.d.ts +13 -0
  65. package/dist/plugins/commandLogger.d.ts.map +1 -0
  66. package/dist/plugins/desk.d.ts +23 -0
  67. package/dist/plugins/desk.d.ts.map +1 -0
  68. package/dist/plugins/economy.d.ts +41 -0
  69. package/dist/plugins/economy.d.ts.map +1 -0
  70. package/dist/plugins/errorHandler.d.ts +8 -0
  71. package/dist/plugins/errorHandler.d.ts.map +1 -0
  72. package/dist/plugins/giveaway.d.ts +21 -0
  73. package/dist/plugins/giveaway.d.ts.map +1 -0
  74. package/dist/plugins/lastfm.d.ts +24 -0
  75. package/dist/plugins/lastfm.d.ts.map +1 -0
  76. package/dist/plugins/mongoose.d.ts +23 -0
  77. package/dist/plugins/mongoose.d.ts.map +1 -0
  78. package/dist/plugins/pay.d.ts +24 -0
  79. package/dist/plugins/pay.d.ts.map +1 -0
  80. package/dist/plugins/permissionGuard.d.ts +8 -0
  81. package/dist/plugins/permissionGuard.d.ts.map +1 -0
  82. package/dist/plugins/reload.d.ts +8 -0
  83. package/dist/plugins/reload.d.ts.map +1 -0
  84. package/dist/plugins/sqlite.d.ts +20 -0
  85. package/dist/plugins/sqlite.d.ts.map +1 -0
  86. package/dist/plugins/telemetry.d.ts +11 -0
  87. package/dist/plugins/telemetry.d.ts.map +1 -0
  88. package/dist/plugins/ui.d.ts +60 -0
  89. package/dist/plugins/ui.d.ts.map +1 -0
  90. package/dist/plugins/voice/player.d.ts +9 -0
  91. package/dist/plugins/voice/player.d.ts.map +1 -0
  92. package/dist/plugins/voice/resolver.d.ts +16 -0
  93. package/dist/plugins/voice/resolver.d.ts.map +1 -0
  94. package/dist/plugins/voice/setup.d.ts +11 -0
  95. package/dist/plugins/voice/setup.d.ts.map +1 -0
  96. package/dist/plugins/voice/sponsorblock.d.ts +17 -0
  97. package/dist/plugins/voice/sponsorblock.d.ts.map +1 -0
  98. package/dist/plugins/voice/state.d.ts +35 -0
  99. package/dist/plugins/voice/state.d.ts.map +1 -0
  100. package/dist/plugins/voice/types.d.ts +14 -0
  101. package/dist/plugins/voice/types.d.ts.map +1 -0
  102. package/dist/plugins/voice/utils.d.ts +14 -0
  103. package/dist/plugins/voice/utils.d.ts.map +1 -0
  104. package/dist/plugins/voice.d.ts +72 -0
  105. package/dist/plugins/voice.d.ts.map +1 -0
  106. package/dist/plugins/web/helpers.d.ts +17 -0
  107. package/dist/plugins/web/helpers.d.ts.map +1 -0
  108. package/dist/plugins/web/index.d.ts +16 -0
  109. package/dist/plugins/web/index.d.ts.map +1 -0
  110. package/dist/plugins/web/routes/auth.d.ts +3 -0
  111. package/dist/plugins/web/routes/auth.d.ts.map +1 -0
  112. package/dist/plugins/web/routes/dashboard.d.ts +3 -0
  113. package/dist/plugins/web/routes/dashboard.d.ts.map +1 -0
  114. package/dist/plugins/web/routes/database.d.ts +3 -0
  115. package/dist/plugins/web/routes/database.d.ts.map +1 -0
  116. package/dist/plugins/web/routes/locales.d.ts +3 -0
  117. package/dist/plugins/web/routes/locales.d.ts.map +1 -0
  118. package/dist/plugins/web/routes/members.d.ts +3 -0
  119. package/dist/plugins/web/routes/members.d.ts.map +1 -0
  120. package/dist/plugins/web/routes/metrics.d.ts +7 -0
  121. package/dist/plugins/web/routes/metrics.d.ts.map +1 -0
  122. package/dist/plugins/web/routes/music.d.ts +3 -0
  123. package/dist/plugins/web/routes/music.d.ts.map +1 -0
  124. package/dist/plugins/web/routes/servers.d.ts +3 -0
  125. package/dist/plugins/web/routes/servers.d.ts.map +1 -0
  126. package/dist/plugins/web/routes/tasks.d.ts +3 -0
  127. package/dist/plugins/web/routes/tasks.d.ts.map +1 -0
  128. package/dist/plugins/web/routes/ui-editor.d.ts +3 -0
  129. package/dist/plugins/web/routes/ui-editor.d.ts.map +1 -0
  130. package/dist/plugins/web/setup.d.ts +7 -0
  131. package/dist/plugins/web/setup.d.ts.map +1 -0
  132. package/dist/plugins/web/types.d.ts +60 -0
  133. package/dist/plugins/web/types.d.ts.map +1 -0
  134. package/dist/plugins/web/views/admin.d.ts +5 -0
  135. package/dist/plugins/web/views/admin.d.ts.map +1 -0
  136. package/dist/plugins/web/views/base.d.ts +13 -0
  137. package/dist/plugins/web/views/base.d.ts.map +1 -0
  138. package/dist/plugins/web/views/commands.d.ts +2 -0
  139. package/dist/plugins/web/views/commands.d.ts.map +1 -0
  140. package/dist/plugins/web/views/dashboard.d.ts +32 -0
  141. package/dist/plugins/web/views/dashboard.d.ts.map +1 -0
  142. package/dist/plugins/web/views/database.d.ts +2 -0
  143. package/dist/plugins/web/views/database.d.ts.map +1 -0
  144. package/dist/plugins/web/views/home.d.ts +2 -0
  145. package/dist/plugins/web/views/home.d.ts.map +1 -0
  146. package/dist/plugins/web/views/index.d.ts +16 -0
  147. package/dist/plugins/web/views/index.d.ts.map +1 -0
  148. package/dist/plugins/web/views/invite.d.ts +2 -0
  149. package/dist/plugins/web/views/invite.d.ts.map +1 -0
  150. package/dist/plugins/web/views/lastfm.d.ts +2 -0
  151. package/dist/plugins/web/views/lastfm.d.ts.map +1 -0
  152. package/dist/plugins/web/views/locales.d.ts +2 -0
  153. package/dist/plugins/web/views/locales.d.ts.map +1 -0
  154. package/dist/plugins/web/views/members.d.ts +6 -0
  155. package/dist/plugins/web/views/members.d.ts.map +1 -0
  156. package/dist/plugins/web/views/music.d.ts +5 -0
  157. package/dist/plugins/web/views/music.d.ts.map +1 -0
  158. package/dist/plugins/web/views/servers.d.ts +3 -0
  159. package/dist/plugins/web/views/servers.d.ts.map +1 -0
  160. package/dist/plugins/web/views/terminal.d.ts +2 -0
  161. package/dist/plugins/web/views/terminal.d.ts.map +1 -0
  162. package/dist/plugins/web/views/ui-editor.d.ts +2 -0
  163. package/dist/plugins/web/views/ui-editor.d.ts.map +1 -0
  164. package/dist/types.d.ts +671 -0
  165. package/dist/types.d.ts.map +1 -0
  166. package/dist/utils/error.d.ts +62 -0
  167. package/dist/utils/error.d.ts.map +1 -0
  168. package/dist/utils/help.d.ts +3 -0
  169. package/dist/utils/help.d.ts.map +1 -0
  170. package/dist/utils/logger.d.ts +1 -0
  171. package/dist/utils/logger.d.ts.map +1 -0
  172. package/dist/utils/sharding.d.ts +17 -0
  173. package/dist/utils/sharding.d.ts.map +1 -0
  174. package/dist/utils/testing.d.ts +42 -0
  175. package/dist/utils/testing.d.ts.map +1 -0
  176. package/dist/utils/testing.js +192 -0
  177. 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":"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"}
@@ -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,3 @@
1
+ import type { WebRequestContext } from "../types";
2
+ export declare function handleAuthRoutes(ctx: WebRequestContext): Promise<Response | null>;
3
+ //# sourceMappingURL=auth.d.ts.map
@@ -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,3 @@
1
+ import type { WebRequestContext } from "../types";
2
+ export declare function handleDashboardRoutes(ctx: WebRequestContext): Promise<Response | null>;
3
+ //# sourceMappingURL=dashboard.d.ts.map
@@ -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,3 @@
1
+ import type { WebRequestContext } from "../types";
2
+ export declare function handleDatabaseRoutes(ctx: WebRequestContext): Promise<Response | null>;
3
+ //# sourceMappingURL=database.d.ts.map
@@ -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,3 @@
1
+ import type { WebRequestContext } from "../types";
2
+ export declare function handleLocalesRoutes(ctx: WebRequestContext): Promise<Response | null>;
3
+ //# sourceMappingURL=locales.d.ts.map
@@ -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,3 @@
1
+ import type { WebRequestContext } from "../types";
2
+ export declare function handleMembersRoutes(ctx: WebRequestContext): Promise<Response | null>;
3
+ //# sourceMappingURL=members.d.ts.map
@@ -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,3 @@
1
+ import type { WebRequestContext } from "../types";
2
+ export declare function handleMusicRoutes(ctx: WebRequestContext): Promise<Response | null>;
3
+ //# sourceMappingURL=music.d.ts.map
@@ -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,3 @@
1
+ import type { WebRequestContext } from "../types";
2
+ export declare function handleServersRoutes(ctx: WebRequestContext): Promise<Response | null>;
3
+ //# sourceMappingURL=servers.d.ts.map
@@ -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,3 @@
1
+ import type { WebRequestContext } from "../types";
2
+ export declare function handleTasksRoutes(ctx: WebRequestContext): Promise<Response | null>;
3
+ //# sourceMappingURL=tasks.d.ts.map
@@ -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,3 @@
1
+ import type { WebRequestContext } from "../types";
2
+ export declare function handleUiEditorRoutes(ctx: WebRequestContext): Promise<Response | null>;
3
+ //# sourceMappingURL=ui-editor.d.ts.map
@@ -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"}