apexify.js 4.8.3 → 4.8.5

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 (229) hide show
  1. package/dist/cjs/ai/ApexAI.d.ts +145 -0
  2. package/dist/cjs/ai/ApexAI.d.ts.map +1 -0
  3. package/dist/cjs/ai/ApexAI.js +494 -0
  4. package/dist/cjs/ai/ApexAI.js.map +1 -0
  5. package/dist/cjs/ai/ApexModules.d.ts +53 -0
  6. package/dist/cjs/ai/ApexModules.d.ts.map +1 -0
  7. package/dist/cjs/ai/ApexModules.js +819 -0
  8. package/dist/cjs/ai/ApexModules.js.map +1 -0
  9. package/dist/cjs/ai/functions/readFiles.d.ts +2 -0
  10. package/dist/cjs/ai/functions/readFiles.d.ts.map +1 -0
  11. package/dist/cjs/ai/functions/readFiles.js +96 -0
  12. package/dist/cjs/ai/functions/readFiles.js.map +1 -0
  13. package/dist/cjs/ai/functions/tokenizer.d.ts +10 -0
  14. package/dist/cjs/ai/functions/tokenizer.d.ts.map +1 -0
  15. package/dist/cjs/ai/functions/tokenizer.js +64 -0
  16. package/dist/cjs/ai/functions/tokenizer.js.map +1 -0
  17. package/dist/cjs/ai/functions/validOptions.d.ts +22 -0
  18. package/dist/cjs/ai/functions/validOptions.d.ts.map +1 -0
  19. package/dist/cjs/ai/functions/validOptions.js +103 -0
  20. package/dist/cjs/ai/functions/validOptions.js.map +1 -0
  21. package/dist/cjs/ai/modals/electronHub/chatmodels.d.ts +7 -0
  22. package/dist/cjs/ai/modals/electronHub/chatmodels.d.ts.map +1 -0
  23. package/dist/cjs/ai/modals/electronHub/chatmodels.js +51 -0
  24. package/dist/cjs/ai/modals/electronHub/chatmodels.js.map +1 -0
  25. package/dist/cjs/ai/modals/electronHub/imageModels.d.ts +12 -0
  26. package/dist/cjs/ai/modals/electronHub/imageModels.d.ts.map +1 -0
  27. package/dist/cjs/ai/modals/electronHub/imageModels.js +92 -0
  28. package/dist/cjs/ai/modals/electronHub/imageModels.js.map +1 -0
  29. package/dist/cjs/ai/modals/electronHub/speechModels.d.ts +7 -0
  30. package/dist/cjs/ai/modals/electronHub/speechModels.d.ts.map +1 -0
  31. package/dist/cjs/ai/modals/electronHub/speechModels.js +63 -0
  32. package/dist/cjs/ai/modals/electronHub/speechModels.js.map +1 -0
  33. package/dist/cjs/ai/modals/electronHub/videoModels.d.ts +6 -0
  34. package/dist/cjs/ai/modals/electronHub/videoModels.d.ts.map +1 -0
  35. package/dist/cjs/ai/modals/electronHub/videoModels.js +63 -0
  36. package/dist/cjs/ai/modals/electronHub/videoModels.js.map +1 -0
  37. package/dist/cjs/ai/modals/groq/chatgroq.d.ts +9 -0
  38. package/dist/cjs/ai/modals/groq/chatgroq.d.ts.map +1 -0
  39. package/dist/cjs/ai/modals/groq/chatgroq.js +64 -0
  40. package/dist/cjs/ai/modals/groq/chatgroq.js.map +1 -0
  41. package/dist/cjs/ai/modals/groq/imageAnalyzer.d.ts +8 -0
  42. package/dist/cjs/ai/modals/groq/imageAnalyzer.d.ts.map +1 -0
  43. package/dist/cjs/ai/modals/groq/imageAnalyzer.js +82 -0
  44. package/dist/cjs/ai/modals/groq/imageAnalyzer.js.map +1 -0
  45. package/dist/cjs/ai/modals/groq/whisper.d.ts +5 -0
  46. package/dist/cjs/ai/modals/groq/whisper.d.ts.map +1 -0
  47. package/dist/cjs/ai/modals/groq/whisper.js +108 -0
  48. package/dist/cjs/ai/modals/groq/whisper.js.map +1 -0
  49. package/dist/cjs/ai/modals/hercai/chatModels.d.ts +7 -0
  50. package/dist/cjs/ai/modals/hercai/chatModels.d.ts.map +1 -0
  51. package/dist/cjs/ai/modals/hercai/chatModels.js +23 -0
  52. package/dist/cjs/ai/modals/hercai/chatModels.js.map +1 -0
  53. package/dist/cjs/ai/utils.d.ts +5 -0
  54. package/dist/cjs/ai/utils.d.ts.map +1 -0
  55. package/dist/cjs/ai/utils.js +15 -0
  56. package/dist/cjs/ai/utils.js.map +1 -0
  57. package/dist/cjs/canvas/ApexPainter.d.ts +145 -0
  58. package/dist/cjs/canvas/ApexPainter.d.ts.map +1 -0
  59. package/dist/cjs/canvas/ApexPainter.js +908 -0
  60. package/dist/cjs/canvas/ApexPainter.js.map +1 -0
  61. package/dist/cjs/canvas/utils/Background/bg.d.ts +31 -0
  62. package/dist/cjs/canvas/utils/Background/bg.d.ts.map +1 -0
  63. package/dist/cjs/canvas/utils/Background/bg.js +161 -0
  64. package/dist/cjs/canvas/utils/Background/bg.js.map +1 -0
  65. package/dist/cjs/canvas/utils/Charts/charts.d.ts +8 -0
  66. package/dist/cjs/canvas/utils/Charts/charts.d.ts.map +1 -0
  67. package/dist/cjs/canvas/utils/Charts/charts.js +464 -0
  68. package/dist/cjs/canvas/utils/Charts/charts.js.map +1 -0
  69. package/dist/cjs/canvas/utils/Custom/customLines.d.ts +3 -0
  70. package/dist/cjs/canvas/utils/Custom/customLines.d.ts.map +1 -0
  71. package/dist/cjs/canvas/utils/Custom/customLines.js +109 -0
  72. package/dist/cjs/canvas/utils/Custom/customLines.js.map +1 -0
  73. package/dist/cjs/canvas/utils/General/conversion.d.ts +6 -0
  74. package/dist/cjs/canvas/utils/General/conversion.d.ts.map +1 -0
  75. package/dist/cjs/canvas/utils/General/conversion.js +34 -0
  76. package/dist/cjs/canvas/utils/General/conversion.js.map +1 -0
  77. package/dist/cjs/canvas/utils/General/general functions.d.ts +39 -0
  78. package/dist/cjs/canvas/utils/General/general functions.d.ts.map +1 -0
  79. package/dist/cjs/canvas/utils/General/general functions.js +606 -0
  80. package/dist/cjs/canvas/utils/General/general functions.js.map +1 -0
  81. package/dist/cjs/canvas/utils/Image/imageProperties.d.ts +115 -0
  82. package/dist/cjs/canvas/utils/Image/imageProperties.d.ts.map +1 -0
  83. package/dist/cjs/canvas/utils/Image/imageProperties.js +602 -0
  84. package/dist/cjs/canvas/utils/Image/imageProperties.js.map +1 -0
  85. package/dist/cjs/canvas/utils/Texts/textProperties.d.ts +17 -0
  86. package/dist/cjs/canvas/utils/Texts/textProperties.d.ts.map +1 -0
  87. package/dist/cjs/canvas/utils/Texts/textProperties.js +160 -0
  88. package/dist/cjs/canvas/utils/Texts/textProperties.js.map +1 -0
  89. package/dist/cjs/canvas/utils/types.d.ts +622 -0
  90. package/dist/cjs/canvas/utils/types.d.ts.map +1 -0
  91. package/dist/cjs/canvas/utils/types.js +7 -0
  92. package/dist/cjs/canvas/utils/types.js.map +1 -0
  93. package/dist/cjs/canvas/utils/utils.d.ts +19 -0
  94. package/dist/cjs/canvas/utils/utils.d.ts.map +1 -0
  95. package/dist/cjs/canvas/utils/utils.js +53 -0
  96. package/dist/cjs/canvas/utils/utils.js.map +1 -0
  97. package/dist/cjs/index.d.ts +29 -0
  98. package/dist/cjs/index.d.ts.map +1 -0
  99. package/dist/cjs/index.js +117 -0
  100. package/dist/cjs/index.js.map +1 -0
  101. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -0
  102. package/dist/cjs/utils.d.ts +5 -0
  103. package/dist/cjs/utils.d.ts.map +1 -0
  104. package/dist/cjs/utils.js +16 -0
  105. package/dist/cjs/utils.js.map +1 -0
  106. package/dist/esm/ai/ApexAI.d.ts +145 -0
  107. package/dist/esm/ai/ApexAI.d.ts.map +1 -0
  108. package/dist/esm/ai/ApexAI.js +494 -0
  109. package/dist/esm/ai/ApexAI.js.map +1 -0
  110. package/dist/esm/ai/ApexModules.d.ts +53 -0
  111. package/dist/esm/ai/ApexModules.d.ts.map +1 -0
  112. package/dist/esm/ai/ApexModules.js +819 -0
  113. package/dist/esm/ai/ApexModules.js.map +1 -0
  114. package/dist/esm/ai/functions/readFiles.d.ts +2 -0
  115. package/dist/esm/ai/functions/readFiles.d.ts.map +1 -0
  116. package/dist/esm/ai/functions/readFiles.js +96 -0
  117. package/dist/esm/ai/functions/readFiles.js.map +1 -0
  118. package/dist/esm/ai/functions/tokenizer.d.ts +10 -0
  119. package/dist/esm/ai/functions/tokenizer.d.ts.map +1 -0
  120. package/dist/esm/ai/functions/tokenizer.js +64 -0
  121. package/dist/esm/ai/functions/tokenizer.js.map +1 -0
  122. package/dist/esm/ai/functions/validOptions.d.ts +22 -0
  123. package/dist/esm/ai/functions/validOptions.d.ts.map +1 -0
  124. package/dist/esm/ai/functions/validOptions.js +103 -0
  125. package/dist/esm/ai/functions/validOptions.js.map +1 -0
  126. package/dist/esm/ai/modals/electronHub/chatmodels.d.ts +7 -0
  127. package/dist/esm/ai/modals/electronHub/chatmodels.d.ts.map +1 -0
  128. package/dist/esm/ai/modals/electronHub/chatmodels.js +51 -0
  129. package/dist/esm/ai/modals/electronHub/chatmodels.js.map +1 -0
  130. package/dist/esm/ai/modals/electronHub/imageModels.d.ts +12 -0
  131. package/dist/esm/ai/modals/electronHub/imageModels.d.ts.map +1 -0
  132. package/dist/esm/ai/modals/electronHub/imageModels.js +92 -0
  133. package/dist/esm/ai/modals/electronHub/imageModels.js.map +1 -0
  134. package/dist/esm/ai/modals/electronHub/speechModels.d.ts +7 -0
  135. package/dist/esm/ai/modals/electronHub/speechModels.d.ts.map +1 -0
  136. package/dist/esm/ai/modals/electronHub/speechModels.js +63 -0
  137. package/dist/esm/ai/modals/electronHub/speechModels.js.map +1 -0
  138. package/dist/esm/ai/modals/electronHub/videoModels.d.ts +6 -0
  139. package/dist/esm/ai/modals/electronHub/videoModels.d.ts.map +1 -0
  140. package/dist/esm/ai/modals/electronHub/videoModels.js +63 -0
  141. package/dist/esm/ai/modals/electronHub/videoModels.js.map +1 -0
  142. package/dist/esm/ai/modals/groq/chatgroq.d.ts +9 -0
  143. package/dist/esm/ai/modals/groq/chatgroq.d.ts.map +1 -0
  144. package/dist/esm/ai/modals/groq/chatgroq.js +64 -0
  145. package/dist/esm/ai/modals/groq/chatgroq.js.map +1 -0
  146. package/dist/esm/ai/modals/groq/imageAnalyzer.d.ts +8 -0
  147. package/dist/esm/ai/modals/groq/imageAnalyzer.d.ts.map +1 -0
  148. package/dist/esm/ai/modals/groq/imageAnalyzer.js +82 -0
  149. package/dist/esm/ai/modals/groq/imageAnalyzer.js.map +1 -0
  150. package/dist/esm/ai/modals/groq/whisper.d.ts +5 -0
  151. package/dist/esm/ai/modals/groq/whisper.d.ts.map +1 -0
  152. package/dist/esm/ai/modals/groq/whisper.js +108 -0
  153. package/dist/esm/ai/modals/groq/whisper.js.map +1 -0
  154. package/dist/esm/ai/modals/hercai/chatModels.d.ts +7 -0
  155. package/dist/esm/ai/modals/hercai/chatModels.d.ts.map +1 -0
  156. package/dist/esm/ai/modals/hercai/chatModels.js +23 -0
  157. package/dist/esm/ai/modals/hercai/chatModels.js.map +1 -0
  158. package/dist/esm/ai/utils.d.ts +5 -0
  159. package/dist/esm/ai/utils.d.ts.map +1 -0
  160. package/dist/esm/ai/utils.js +15 -0
  161. package/dist/esm/ai/utils.js.map +1 -0
  162. package/dist/esm/canvas/ApexPainter.d.ts +145 -0
  163. package/dist/esm/canvas/ApexPainter.d.ts.map +1 -0
  164. package/dist/esm/canvas/ApexPainter.js +908 -0
  165. package/dist/esm/canvas/ApexPainter.js.map +1 -0
  166. package/dist/esm/canvas/utils/Background/bg.d.ts +31 -0
  167. package/dist/esm/canvas/utils/Background/bg.d.ts.map +1 -0
  168. package/dist/esm/canvas/utils/Background/bg.js +161 -0
  169. package/dist/esm/canvas/utils/Background/bg.js.map +1 -0
  170. package/dist/esm/canvas/utils/Charts/charts.d.ts +8 -0
  171. package/dist/esm/canvas/utils/Charts/charts.d.ts.map +1 -0
  172. package/dist/esm/canvas/utils/Charts/charts.js +464 -0
  173. package/dist/esm/canvas/utils/Charts/charts.js.map +1 -0
  174. package/dist/esm/canvas/utils/Custom/customLines.d.ts +3 -0
  175. package/dist/esm/canvas/utils/Custom/customLines.d.ts.map +1 -0
  176. package/dist/esm/canvas/utils/Custom/customLines.js +109 -0
  177. package/dist/esm/canvas/utils/Custom/customLines.js.map +1 -0
  178. package/dist/esm/canvas/utils/General/conversion.d.ts +6 -0
  179. package/dist/esm/canvas/utils/General/conversion.d.ts.map +1 -0
  180. package/dist/esm/canvas/utils/General/conversion.js +34 -0
  181. package/dist/esm/canvas/utils/General/conversion.js.map +1 -0
  182. package/dist/esm/canvas/utils/General/general functions.d.ts +39 -0
  183. package/dist/esm/canvas/utils/General/general functions.d.ts.map +1 -0
  184. package/dist/esm/canvas/utils/General/general functions.js +606 -0
  185. package/dist/esm/canvas/utils/General/general functions.js.map +1 -0
  186. package/dist/esm/canvas/utils/Image/imageProperties.d.ts +115 -0
  187. package/dist/esm/canvas/utils/Image/imageProperties.d.ts.map +1 -0
  188. package/dist/esm/canvas/utils/Image/imageProperties.js +602 -0
  189. package/dist/esm/canvas/utils/Image/imageProperties.js.map +1 -0
  190. package/dist/esm/canvas/utils/Texts/textProperties.d.ts +17 -0
  191. package/dist/esm/canvas/utils/Texts/textProperties.d.ts.map +1 -0
  192. package/dist/esm/canvas/utils/Texts/textProperties.js +160 -0
  193. package/dist/esm/canvas/utils/Texts/textProperties.js.map +1 -0
  194. package/dist/esm/canvas/utils/types.d.ts +622 -0
  195. package/dist/esm/canvas/utils/types.d.ts.map +1 -0
  196. package/dist/esm/canvas/utils/types.js +7 -0
  197. package/dist/esm/canvas/utils/types.js.map +1 -0
  198. package/dist/esm/canvas/utils/utils.d.ts +19 -0
  199. package/dist/esm/canvas/utils/utils.d.ts.map +1 -0
  200. package/dist/esm/canvas/utils/utils.js +53 -0
  201. package/dist/esm/canvas/utils/utils.js.map +1 -0
  202. package/dist/esm/index.d.ts +29 -0
  203. package/dist/esm/index.d.ts.map +1 -0
  204. package/dist/esm/index.js +117 -0
  205. package/dist/esm/index.js.map +1 -0
  206. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -0
  207. package/dist/esm/utils.d.ts +5 -0
  208. package/dist/esm/utils.d.ts.map +1 -0
  209. package/dist/esm/utils.js +16 -0
  210. package/dist/esm/utils.js.map +1 -0
  211. package/lib/ai/ApexAI.ts +2 -2
  212. package/lib/ai/ApexModules.ts +8 -8
  213. package/lib/ai/modals/electronHub/chatmodels.ts +1 -1
  214. package/lib/ai/modals/electronHub/imageModels.ts +2 -2
  215. package/lib/ai/modals/electronHub/speechModels.ts +1 -1
  216. package/lib/ai/utils.ts +3 -3
  217. package/lib/canvas/ApexPainter.ts +1 -1
  218. package/lib/canvas/utils/Background/bg.ts +1 -1
  219. package/lib/canvas/utils/Charts/charts.ts +1 -1
  220. package/lib/canvas/utils/Custom/customLines.ts +2 -2
  221. package/lib/canvas/utils/General/general functions.ts +1 -1
  222. package/lib/canvas/utils/Image/imageProperties.ts +1 -1
  223. package/lib/canvas/utils/Texts/textProperties.ts +1 -1
  224. package/lib/canvas/utils/utils.ts +8 -8
  225. package/lib/index.ts +5 -5
  226. package/lib/utils.ts +3 -3
  227. package/package.json +3 -6
  228. package/dist/tsconfig.cjs.tsbuildinfo +0 -1
  229. package/dist/tsconfig.esm.tsbuildinfo +0 -1
@@ -0,0 +1,145 @@
1
+ import { Message } from "discord.js";
2
+ export interface Options {
3
+ /**
4
+ * Configuration options related to voice functionality.
5
+ * @param voice.textVoice Configuration options for text-to-voice functionality.
6
+ * @param voice.textVoice.enable Whether text-to-voice functionality is enabled.
7
+ * @param voice.textVoice.voiceModel The voice model to be used.
8
+ * @param voice.textVoice.character The character name.
9
+ */
10
+ voice?: {
11
+ enable?: boolean;
12
+ voiceModel?: "elevenlabs" | "myshell-tts" | "deepinfra-tts" | "whisper-large-v3" | "distil-large-v3" | string;
13
+ characterName?: string;
14
+ };
15
+ /**
16
+ * Configuration options related to image generation.
17
+ * @param imagine.enable Whether image generation is enabled.
18
+ * @param imagine.drawTrigger The trigger phrases for initiating image generation.
19
+ * @param imagine.imageModal The model for the image generation.
20
+ * @param imagine.numOfImages The number of images to generate.
21
+ * @param imagine.nsfw Configuration options for NSFW filtering.
22
+ * @param imagine.nsfw.enable Whether NSFW filtering is enabled.
23
+ * @param imagine.nsfw.keywords Keywords for NSFW filtering.
24
+ * @param imagine.enhancer.enable Whether image enhancement is enabled (rewrites your prompt in more descriptive way).
25
+ * @param imagine.enhancer.negative_prompt The negative prompt for image enhancement only for (Prodia models).
26
+ */
27
+ imagine?: {
28
+ enable: boolean;
29
+ drawTrigger: string[];
30
+ imageModel: string;
31
+ numOfImages: number;
32
+ ApiKeys?: {
33
+ electronHubKey?: string;
34
+ };
35
+ nsfw?: {
36
+ enable?: boolean;
37
+ keywords?: string[];
38
+ deepCheck?: boolean;
39
+ };
40
+ enhancer?: {
41
+ enable: boolean;
42
+ negative_prompt?: string;
43
+ width?: number;
44
+ height?: number;
45
+ format?: "jpeg" | "png";
46
+ quality?: number;
47
+ };
48
+ };
49
+ /**
50
+ * Configuration options related to chat functionality.
51
+ * @param chat.chatModel The chat model to be used.
52
+ * @param chat.readFiles Whether to read files.
53
+ * @param chat.readImages Whether to read images.
54
+ * @param chat.personality The personality for the chat.
55
+ * @param chat.API_KEY The API key for accessing the chat service.
56
+ * @param chat.lang The Language of the voice message sent.
57
+ * @param chat.memory Configuration options for memory.
58
+ * @param chat.memory.memoryOn Whether memory is enabled.
59
+ * @param chat.memory.id The ID for memory.
60
+ * @param chat.typeWriting Configuration options for typing effect.
61
+ * @param chat.typeWriting.enable Whether the typing effect is enabled.
62
+ * @param chat.typeWriting.speed The speed of typing.
63
+ * @param chat.typeWriting.delay The delay for typing.
64
+ */
65
+ chat?: {
66
+ enable?: boolean;
67
+ chatModel?: string;
68
+ readFiles?: boolean;
69
+ readImages?: boolean;
70
+ instruction?: string;
71
+ Api_Keys?: {
72
+ groq_API?: string;
73
+ electronHub_Key?: string;
74
+ };
75
+ memory?: {
76
+ memoryOn?: boolean;
77
+ id?: string;
78
+ threshold?: number;
79
+ limit?: number;
80
+ };
81
+ typeWriting?: {
82
+ enable?: boolean;
83
+ speed?: number;
84
+ delay?: number;
85
+ };
86
+ };
87
+ voiceChannel?: {
88
+ enable?: boolean;
89
+ channelId?: string;
90
+ personality?: string;
91
+ voiceModel?: "elevenlabs" | "myshell-tts" | "deepinfra-tts" | "whisper-large-v3" | "distil-large-v3" | string;
92
+ joinOn?: {
93
+ triggeredWords?: string[];
94
+ };
95
+ };
96
+ /**
97
+ * Additional configuration options.
98
+ * @param others.messageType Configuration options for message types.
99
+ * @param others.messageType.type The type of message.
100
+ * @param others.messageType.intialContent The initial content of the message.
101
+ * @param others.buttons Buttons configuration.
102
+ * @param others.keywords Keywords for response.
103
+ * @param others.keywordResponses Responses for keywords.
104
+ * @param others.loader Configuration options for loader.
105
+ * @param others.loader.enable Whether the loader is enabled.
106
+ * @param others.loader.loadingMessage The loading message.
107
+ * @param others.loader.loadingTimer The loading timer.
108
+ * @param others.channel Configuration options for channels.
109
+ * @param others.channel.enable Whether channels are enabled.
110
+ * @param others.channel.id The ID of the channels.
111
+ * @param others.permissions Configuration options for permissions.
112
+ * @param others.permissions.enable Whether permissions are enabled.
113
+ * @param others.permissions.role The role for permissions.
114
+ * @param others.permissions.permission The permission.
115
+ * @param others.permissions.blockedUsers Blocked users.
116
+ */
117
+ others?: {
118
+ messageType?: {
119
+ type?: string;
120
+ intialContent?: string;
121
+ sendAs?: string | "embed" | "content";
122
+ };
123
+ onMention?: boolean;
124
+ buttons?: any[];
125
+ keywordResponses?: Record<string, string>;
126
+ loader?: {
127
+ enable?: boolean;
128
+ loadingMessage?: string;
129
+ loadingTimer?: number;
130
+ };
131
+ channel?: {
132
+ enable?: boolean;
133
+ id?: string[];
134
+ };
135
+ permissions?: {
136
+ enable?: boolean;
137
+ role?: string[];
138
+ permission?: string[];
139
+ blockedUsers?: string[];
140
+ };
141
+ };
142
+ }
143
+ export declare function ApexAI(message: Message, ApexOptions: Options): Promise<any>;
144
+ export declare function handleVoiceAI(message: any, voiceChannelId: string, chat: any, modelName?: string, personality?: string): Promise<any>;
145
+ //# sourceMappingURL=ApexAI.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ApexAI.d.ts","sourceRoot":"","sources":["../../../lib/ai/ApexAI.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,494 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ApexAI = ApexAI;
7
+ exports.handleVoiceAI = handleVoiceAI;
8
+ const utils_1 = require("./utils");
9
+ const discord_js_1 = require("discord.js");
10
+ const voice_1 = require("@discordjs/voice");
11
+ const whisper_1 = require("./modals/groq/whisper");
12
+ const stream_1 = require("stream");
13
+ const prism_media_1 = __importDefault(require("prism-media"));
14
+ const path_1 = __importDefault(require("path"));
15
+ const fs_1 = __importDefault(require("fs"));
16
+ const child_process_1 = require("child_process");
17
+ function createButtonRows(buttons) {
18
+ if (!Array.isArray(buttons) || buttons.length === 0)
19
+ return [];
20
+ const buttonRows = [];
21
+ let currentRow = new discord_js_1.ActionRowBuilder();
22
+ for (const button of buttons) {
23
+ if (!button.label || !button.style || !button.custom_id)
24
+ continue;
25
+ const buttonComponent = new discord_js_1.ButtonBuilder()
26
+ .setLabel(button.label)
27
+ .setStyle(button.style)
28
+ .setCustomId(button.custom_id);
29
+ if (button.emoji)
30
+ buttonComponent.setEmoji(button.emoji);
31
+ if (button.url && button.style === discord_js_1.ButtonStyle.Link)
32
+ buttonComponent.setURL(button.url);
33
+ currentRow.addComponents(buttonComponent);
34
+ if (currentRow.components.length === 5) {
35
+ buttonRows.push(currentRow);
36
+ currentRow = new discord_js_1.ActionRowBuilder();
37
+ }
38
+ }
39
+ if (currentRow.components.length > 0) {
40
+ buttonRows.push(currentRow);
41
+ }
42
+ return buttonRows.slice(0, 5);
43
+ }
44
+ async function ApexAI(message, ApexOptions) {
45
+ if (!message.guild || message.author.bot)
46
+ return;
47
+ let prompt = message.content || "";
48
+ const { others, chat, voice, imagine, voiceChannel } = ApexOptions;
49
+ const { permissions, channel, messageType, onMention, loader, buttons } = others ?? {};
50
+ const { Api_Keys, typeWriting } = chat ?? {};
51
+ const { nsfw } = imagine ?? {};
52
+ if (permissions?.enable) {
53
+ const userRoles = message.member?.roles.cache.map((role) => role.id);
54
+ const hasPermission = permissions.role?.some((roleId) => userRoles?.includes(roleId)) ?? false;
55
+ const hasRequiredPerms = permissions.permission?.some((perm) => message.member?.permissions.has(perm)) ?? false;
56
+ const isBlocked = permissions.blockedUsers?.includes(message.author.id) ?? false;
57
+ if (!hasPermission || !hasRequiredPerms || isBlocked)
58
+ return;
59
+ }
60
+ if (channel?.enable && !channel.id?.includes(message.channel.id))
61
+ return;
62
+ if (onMention) {
63
+ const botMention = `<@${message.client.user.id}>`;
64
+ if (!prompt.startsWith(botMention))
65
+ return;
66
+ prompt = prompt.replace(botMention, "").trim();
67
+ }
68
+ const mainPrompt = prompt;
69
+ if (message.channel.isTextBased() && "sendTyping" in message.channel)
70
+ await message.channel.sendTyping();
71
+ if (loader?.enable) {
72
+ const loadingMessage = await message.reply({
73
+ content: loader.loadingMessage,
74
+ allowedMentions: { repliedUser: false },
75
+ });
76
+ setTimeout(() => loadingMessage.delete().catch(console.error), loader.loadingTimer || 3000);
77
+ }
78
+ if (message.attachments.size > 0) {
79
+ for (const attachment of message.attachments.values()) {
80
+ try {
81
+ const url = attachment.url;
82
+ const contentType = attachment.contentType || "";
83
+ const fileSize = attachment.size;
84
+ const maxSize = 25 * 1024 * 1024;
85
+ if (contentType.startsWith("audio/")) {
86
+ if (fileSize > maxSize) {
87
+ console.error("Audio file exceeds 25MB.");
88
+ continue;
89
+ }
90
+ prompt += `\n> Transcribed from audio:\n${await (0, whisper_1.whisper)(prompt, url)}`;
91
+ }
92
+ else if (["image/png", "image/jpeg", "image/jpg", "image/webp"].includes(contentType)) {
93
+ if (!Api_Keys?.groq_API) {
94
+ console.error("Missing Groq API Key.");
95
+ continue;
96
+ }
97
+ prompt += `\n> Image analysis:\n${await (0, utils_1.groqAnalyzer)({ img: url, ApiKey: Api_Keys.groq_API })}`;
98
+ }
99
+ else if (attachment.name.endsWith(".pdf") || attachment.name.endsWith(".txt")) {
100
+ const fileType = attachment.name.endsWith(".pdf") ? "pdf" : "txt";
101
+ const fileContent = await (0, utils_1.readFile)(url, fileType);
102
+ prompt += `\n\n- 📜 ${attachment.name} content:\n${fileContent}`;
103
+ }
104
+ else {
105
+ prompt += `\n> ❌ Unsupported file type uploaded: ${contentType}`;
106
+ }
107
+ }
108
+ catch (e) {
109
+ console.error("Error processing attachment:", e);
110
+ }
111
+ }
112
+ }
113
+ let prevReply = "";
114
+ if (message.reference?.messageId) {
115
+ const channel = message?.guild?.channels?.cache?.get(message.channel.id);
116
+ const messageId = message?.reference?.messageId;
117
+ // @ts-ignore
118
+ const fetchedMessage = await channel?.messages?.fetch(messageId);
119
+ if (fetchedMessage) {
120
+ prevReply += fetchedMessage.content || "";
121
+ const firstAttachment = fetchedMessage.attachments?.first();
122
+ if (firstAttachment && /\.(png|jpg|jpeg|webp)$/i.test(firstAttachment.url)) {
123
+ prevReply += await (0, utils_1.groqAnalyzer)({
124
+ img: firstAttachment.url,
125
+ ApiKey: Api_Keys?.groq_API,
126
+ prompt,
127
+ });
128
+ prompt += `\n- 📷 Image analysis:\n${prevReply}`;
129
+ }
130
+ }
131
+ }
132
+ if (others?.keywordResponses) {
133
+ for (const [keyword, response] of Object.entries(others.keywordResponses)) {
134
+ if (prompt.toLowerCase().includes(keyword.toLowerCase())) {
135
+ return await message.reply({
136
+ content: response,
137
+ allowedMentions: { repliedUser: false },
138
+ });
139
+ }
140
+ }
141
+ }
142
+ if (voiceChannel?.enable && voiceChannel.channelId && voiceChannel.joinOn?.triggeredWords) {
143
+ const { channelId, joinOn, personality, voiceModel } = voiceChannel;
144
+ const triggerDetected = joinOn.triggeredWords?.some(word => prompt.toLowerCase().startsWith(word.toLowerCase()));
145
+ if (triggerDetected) {
146
+ return handleVoiceAI(message, channelId, chat, voiceModel, personality);
147
+ }
148
+ }
149
+ let aiResponse = "";
150
+ const chatEnabled = chat?.enable ?? false;
151
+ const voiceEnabled = voice?.enable ?? false;
152
+ const imageEnabled = imagine?.enable ?? false;
153
+ let genImage = [];
154
+ const drawTrigger = imagine?.drawTrigger?.some(trigger => mainPrompt.toLowerCase().startsWith(trigger.toLowerCase()));
155
+ if (message.channel.isTextBased() && "sendTyping" in message.channel)
156
+ await message.channel.sendTyping();
157
+ if (chatEnabled && voiceEnabled) {
158
+ return await message.reply({
159
+ content: "❌ Error: Both Chat and Voice cannot be enabled at the same time.",
160
+ allowedMentions: { repliedUser: false },
161
+ });
162
+ }
163
+ if (chatEnabled) {
164
+ let instruction = chat?.instruction;
165
+ if (imageEnabled && drawTrigger) {
166
+ const enhancer = imagine?.enhancer?.enable ? imagine.enhancer : undefined;
167
+ let tempEnhancer;
168
+ if (enhancer) {
169
+ const enhancementRequest = `Rewrite this text below in a more descriptive way, making it clearer to be visualized correctly by an AI image generator. Use stronger words and return only the enhanced prompt—nothing more, nothing less.\n\n`;
170
+ tempEnhancer = await (0, utils_1.ApexChat)("gpt-4-turbo", prompt, { instruction: enhancementRequest });
171
+ }
172
+ genImage = await (0, utils_1.ApexImagine)(imagine?.imageModel, tempEnhancer || prompt, { width: imagine?.enhancer?.width, height: imagine?.enhancer?.height, format: imagine?.enhancer?.format,
173
+ quality: imagine?.enhancer?.quality, negative_prompt: imagine?.enhancer?.negative_prompt, nsfw: imagine?.nsfw?.enable,
174
+ nsfwWords: imagine?.nsfw?.keywords, deepCheck: imagine?.nsfw?.deepCheck, count: imagine?.numOfImages });
175
+ instruction += `\n\nThe image has already been generated. Do not attempt to generate or describe another image. Instead, provide feedback, thoughts, or a critique based on the given prompt:\n\n`;
176
+ }
177
+ aiResponse = await (0, utils_1.ApexChat)(chat?.chatModel, prompt, { instruction, memory: chat?.memory?.memoryOn, userId: chat?.memory?.id, limit: chat?.memory?.limit, threshold: chat?.memory?.threshold });
178
+ }
179
+ else if (voiceEnabled) {
180
+ let instruction = chat?.instruction;
181
+ if (imageEnabled && drawTrigger) {
182
+ const enhancer = imagine?.enhancer?.enable ? imagine.enhancer : undefined;
183
+ let tempEnhancer;
184
+ if (enhancer) {
185
+ const enhancementRequest = `Rewrite this text below in a more descriptive way, making it clearer to be visualized correctly by an AI image generator. Use stronger words and return only the enhanced prompt—nothing more, nothing less.\n\n`;
186
+ tempEnhancer = await (0, utils_1.ApexChat)("gpt-4-turbo", prompt, { instruction: enhancementRequest });
187
+ }
188
+ genImage = await (0, utils_1.ApexImagine)(imagine?.imageModel, tempEnhancer || prompt, { width: enhancer?.width, height: enhancer?.height, format: enhancer?.format,
189
+ quality: enhancer?.quality, negative_prompt: enhancer?.negative_prompt, nsfw: nsfw?.enable,
190
+ nsfwWords: nsfw?.keywords, deepCheck: nsfw?.deepCheck, count: imagine?.numOfImages });
191
+ instruction += `\n\nThe image has already been generated. Do not attempt to generate or describe another image. Instead, provide feedback, thoughts, or a critique based on the given prompt:\n\n`;
192
+ }
193
+ aiResponse = await (0, utils_1.ApexChat)(chat?.chatModel, prompt, { instruction, memory: chat?.memory?.memoryOn, userId: chat?.memory?.id, limit: chat?.memory?.limit, threshold: chat?.memory?.threshold });
194
+ aiResponse = await (0, utils_1.ApexText2Speech)({ modelName: voice?.voiceModel, inputText: aiResponse, personality: voice?.characterName });
195
+ }
196
+ else if (imageEnabled && drawTrigger) {
197
+ const enhancer = imagine?.enhancer?.enable ? imagine.enhancer : undefined;
198
+ let tempEnhancer;
199
+ if (enhancer) {
200
+ const enhancementRequest = `Rewrite this text below in a more descriptive way, making it clearer to be visualized correctly by an AI image generator. Use stronger words and return only the enhanced prompt—nothing more, nothing less.\n\n${prompt}`;
201
+ tempEnhancer = await (0, utils_1.ApexChat)("gpt-4-turbo", prompt, { instruction: enhancementRequest });
202
+ }
203
+ genImage = await (0, utils_1.ApexImagine)(imagine?.imageModel, tempEnhancer || prompt, { width: enhancer?.width, height: enhancer?.height, format: enhancer?.format,
204
+ quality: enhancer?.quality, negative_prompt: enhancer?.negative_prompt, nsfw: nsfw?.enable,
205
+ nsfwWords: nsfw?.keywords, deepCheck: nsfw?.deepCheck, count: imagine?.numOfImages });
206
+ }
207
+ else {
208
+ return await message.reply({
209
+ content: "❌ Error: No valid AI features are enabled.",
210
+ allowedMentions: { repliedUser: false },
211
+ });
212
+ }
213
+ const buttonRows = createButtonRows(buttons || []);
214
+ const imageAttachments = [];
215
+ if (genImage.length > 0) {
216
+ for (const imageUrl of genImage) {
217
+ imageAttachments.push(new discord_js_1.AttachmentBuilder(imageUrl, { name: `image-${Date.now()}.png` }));
218
+ }
219
+ }
220
+ let voiceAttachment = null;
221
+ if (voiceEnabled && aiResponse instanceof Buffer) {
222
+ voiceAttachment = new discord_js_1.AttachmentBuilder(aiResponse, { name: "ai_voice.mp3" });
223
+ }
224
+ const chunkMessage = (text, maxLength = 2000) => {
225
+ const chunks = [];
226
+ while (text.length > maxLength) {
227
+ let sliceIndex = text.lastIndexOf("\n", maxLength);
228
+ if (sliceIndex === -1)
229
+ sliceIndex = maxLength;
230
+ chunks.push(text.slice(0, sliceIndex));
231
+ text = text.slice(sliceIndex);
232
+ }
233
+ if (text.length > 0)
234
+ chunks.push(text);
235
+ return chunks;
236
+ };
237
+ const initialContent = messageType?.intialContent ? `${messageType.intialContent} ` : "";
238
+ const finalText = typeof aiResponse === "string" ? `${initialContent}${aiResponse}` : "";
239
+ const messageChunks = chunkMessage(finalText);
240
+ const sendMessage = async (content, components) => {
241
+ if (!content.trim())
242
+ return;
243
+ if (messageType?.sendAs === "embed") {
244
+ const embed = new discord_js_1.EmbedBuilder()
245
+ .setColor(0x0099ff)
246
+ .setDescription(content)
247
+ .setFooter({ text: "AI Response" });
248
+ if (messageType?.type === "send") {
249
+ return message.channel.send({ embeds: [embed], components });
250
+ }
251
+ else {
252
+ return message.reply({ embeds: [embed], allowedMentions: { repliedUser: false }, components });
253
+ }
254
+ }
255
+ else {
256
+ if (messageType?.type === "send") {
257
+ return message.channel.send({ content, components });
258
+ }
259
+ else {
260
+ return message.reply({ content, allowedMentions: { repliedUser: false }, components });
261
+ }
262
+ }
263
+ };
264
+ const sendTypeWritingMessage = async (content, components) => {
265
+ if (!typeWriting?.enable) {
266
+ return sendMessage(content, components);
267
+ }
268
+ content = content.trimStart();
269
+ const typingMessage = await sendMessage(content[0]);
270
+ let typedSentence = typingMessage?.content;
271
+ let i = 1;
272
+ while (i < content.length) {
273
+ typedSentence += content.slice(i, i + getStepCount(typeWriting.speed ?? 50));
274
+ await sleep(typeWriting.delay ?? 500);
275
+ await typingMessage?.edit({ content: typedSentence });
276
+ i += getStepCount(typeWriting.speed ?? 50);
277
+ }
278
+ if (components && components.length > 0) {
279
+ await typingMessage?.edit({ components });
280
+ }
281
+ return typingMessage;
282
+ };
283
+ function getStepCount(speed) {
284
+ const maxSteps = 120;
285
+ const steps = Math.min(Math.ceil(speed), maxSteps);
286
+ return steps > 0 ? steps : 1;
287
+ }
288
+ function sleep(ms) {
289
+ return new Promise((resolve) => setTimeout(resolve, ms));
290
+ }
291
+ (async () => {
292
+ if (imageAttachments.length > 0) {
293
+ await message.channel.send({ files: imageAttachments });
294
+ }
295
+ let lastSentMessage = null;
296
+ for (let i = 0; i < messageChunks.length; i++) {
297
+ const chunk = messageChunks[i].trim();
298
+ if (!chunk)
299
+ continue;
300
+ const isLastChunk = i === messageChunks.length - 1;
301
+ if (isLastChunk) {
302
+ const response = await sendTypeWritingMessage(chunk, buttonRows.length > 0 ? buttonRows : undefined);
303
+ if (response)
304
+ lastSentMessage = response;
305
+ }
306
+ else {
307
+ await sendTypeWritingMessage(chunk);
308
+ }
309
+ if (!isLastChunk) {
310
+ await new Promise((resolve) => setTimeout(resolve, chat?.typeWriting?.delay ?? 500));
311
+ }
312
+ }
313
+ if (voiceAttachment) {
314
+ await message.channel.send({ files: [voiceAttachment] });
315
+ }
316
+ if (lastSentMessage && buttonRows.length > 0) {
317
+ await lastSentMessage.edit({ components: buttonRows }).catch(() => null);
318
+ }
319
+ })();
320
+ }
321
+ ;
322
+ let voiceQueue = [];
323
+ let isProcessing = false;
324
+ let voiceConnection = null;
325
+ let activeUser = null;
326
+ let isRecording = false;
327
+ let silenceTimer = null;
328
+ const recordingsDir = path_1.default.join(process.cwd(), "recordings");
329
+ if (!fs_1.default.existsSync(recordingsDir)) {
330
+ fs_1.default.mkdirSync(recordingsDir, { recursive: true });
331
+ }
332
+ try {
333
+ (0, child_process_1.execSync)("ffmpeg -version > nul 2>&1");
334
+ }
335
+ catch (err) {
336
+ console.error("🚨 FFmpeg is NOT installed or not in PATH! Install it first.");
337
+ }
338
+ function resetSilenceTimer() {
339
+ if (silenceTimer)
340
+ clearTimeout(silenceTimer);
341
+ }
342
+ async function handleVoiceAI(message, voiceChannelId, chat, modelName, personality) {
343
+ const guild = message.guild;
344
+ if (!guild)
345
+ return;
346
+ const channel = guild.channels.cache.get(voiceChannelId);
347
+ if (!channel || channel.type !== 2) {
348
+ return await message.reply(`🚫 Invalid voice channel ID: ${voiceChannelId}`);
349
+ }
350
+ const botMember = guild.members.me;
351
+ if (!botMember)
352
+ return;
353
+ const permissions = channel.permissionsFor(botMember);
354
+ if (!permissions?.has(discord_js_1.PermissionFlagsBits.Connect) ||
355
+ !permissions.has(discord_js_1.PermissionFlagsBits.Speak) ||
356
+ !permissions.has(discord_js_1.PermissionFlagsBits.Stream) ||
357
+ !permissions.has(discord_js_1.PermissionFlagsBits.UseVAD)) {
358
+ return await message.reply("🚫 I don't have the required permissions to join and speak in this voice channel.");
359
+ }
360
+ if (voiceConnection) {
361
+ return await message.reply("⚠️ AI is already in a voice channel.");
362
+ }
363
+ voiceConnection = (0, voice_1.joinVoiceChannel)({
364
+ channelId: channel.id,
365
+ guildId: guild.id,
366
+ adapterCreator: guild.voiceAdapterCreator,
367
+ selfMute: false,
368
+ selfDeaf: false
369
+ });
370
+ activeUser = message.author.id;
371
+ captureAudio(voiceConnection, chat, modelName, personality);
372
+ }
373
+ function captureAudio(connection, chat, modelName, personality) {
374
+ const receiver = connection.receiver;
375
+ receiver.speaking.on("start", async (userId) => {
376
+ if (userId !== activeUser) {
377
+ activeUser = userId;
378
+ isRecording = false;
379
+ }
380
+ resetSilenceTimer();
381
+ const rawFilePath = path_1.default.join(recordingsDir, `${userId}.pcm`);
382
+ const wavFilePath = path_1.default.join(recordingsDir, `${userId}.wav`);
383
+ const opusStream = receiver.subscribe(userId, {
384
+ end: { behavior: voice_1.EndBehaviorType.AfterSilence, duration: 2000 }
385
+ });
386
+ const pcmStream = new prism_media_1.default.opus.Decoder({
387
+ frameSize: 960,
388
+ channels: 1,
389
+ rate: 48000
390
+ });
391
+ const writeStream = fs_1.default.createWriteStream(rawFilePath);
392
+ (0, stream_1.pipeline)(opusStream, pcmStream, writeStream, (err) => {
393
+ if (err) {
394
+ console.error("❌ Error writing PCM file:", err);
395
+ return;
396
+ }
397
+ convertPCMtoWAV(rawFilePath, wavFilePath, chat, modelName, personality);
398
+ });
399
+ });
400
+ receiver.speaking.on("end", async (userId) => {
401
+ if (userId === activeUser) {
402
+ startSilenceTimer(chat, modelName, personality);
403
+ }
404
+ });
405
+ }
406
+ function startSilenceTimer(chat, modelName, personality) {
407
+ resetSilenceTimer();
408
+ silenceTimer = setTimeout(() => {
409
+ if (voiceQueue.length > 0) {
410
+ const nextUser = voiceQueue.shift();
411
+ if (nextUser) {
412
+ activeUser = nextUser.userId;
413
+ processQueue(chat, modelName, personality);
414
+ }
415
+ }
416
+ else {
417
+ leaveVoiceChannel();
418
+ }
419
+ }, 5000);
420
+ }
421
+ function convertPCMtoWAV(inputPCM, outputWAV, chat, modelName, personality) {
422
+ if (!fs_1.default.existsSync(inputPCM) || fs_1.default.statSync(inputPCM).size === 0) {
423
+ return;
424
+ }
425
+ try {
426
+ (0, child_process_1.execSync)(`ffmpeg -y -f s16le -ar 48000 -ac 1 -i "${inputPCM}" -acodec pcm_s16le "${outputWAV}" > nul 2>&1`);
427
+ if (fs_1.default.existsSync(outputWAV)) {
428
+ transcribeAudio(outputWAV, chat, modelName, personality);
429
+ }
430
+ }
431
+ catch (error) {
432
+ console.error("❌ FFmpeg failed:", error);
433
+ }
434
+ }
435
+ async function transcribeAudio(filePath, chat, modelName, personality) {
436
+ try {
437
+ const transcribedText = await (0, utils_1.ApexListener)({
438
+ filepath: filePath,
439
+ prompt: "Transcribe what the user said in English.",
440
+ lang: "en"
441
+ });
442
+ if (transcribedText.transcribe) {
443
+ voiceQueue.push({ userId: activeUser || "unknown", text: transcribedText.transcribe });
444
+ processQueue(chat, modelName, personality);
445
+ }
446
+ fs_1.default.unlinkSync(filePath);
447
+ }
448
+ catch (error) {
449
+ console.error("❌ Error in transcription:", error);
450
+ }
451
+ }
452
+ async function processQueue(chat, modelName, personality) {
453
+ if (isProcessing || voiceQueue.length === 0)
454
+ return;
455
+ isProcessing = true;
456
+ const { userId, text } = voiceQueue.shift();
457
+ activeUser = userId;
458
+ resetSilenceTimer();
459
+ try {
460
+ const aiResponse = await (0, utils_1.ApexChat)(chat?.chatModel || "gpt-4o", text, {
461
+ instruction: chat.instruction,
462
+ memory: chat?.memory?.memoryOn,
463
+ userId,
464
+ limit: chat?.memory?.limit,
465
+ threshold: chat?.memory?.threshold
466
+ });
467
+ const audioBuffer = await (0, utils_1.ApexText2Speech)({ inputText: aiResponse, modelName, personality });
468
+ if (voiceConnection) {
469
+ const player = (0, voice_1.createAudioPlayer)();
470
+ const resource = (0, voice_1.createAudioResource)(stream_1.Readable.from(audioBuffer));
471
+ voiceConnection.subscribe(player);
472
+ player.play(resource);
473
+ player.on(voice_1.AudioPlayerStatus.Idle, () => {
474
+ isProcessing = false;
475
+ if (voiceQueue.length > 0) {
476
+ processQueue(chat, modelName, personality);
477
+ }
478
+ });
479
+ }
480
+ }
481
+ catch (error) {
482
+ console.error("❌ Error processing AI response:", error);
483
+ isProcessing = false;
484
+ }
485
+ }
486
+ function leaveVoiceChannel() {
487
+ if (voiceConnection) {
488
+ voiceConnection.destroy();
489
+ voiceConnection = null;
490
+ activeUser = null;
491
+ resetSilenceTimer();
492
+ }
493
+ }
494
+ //# sourceMappingURL=ApexAI.js.map