jsdecryptor 4.0.3

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 (247) hide show
  1. package/Database/database.js +446 -0
  2. package/Database/migration.js +327 -0
  3. package/Database/pgSync.js +229 -0
  4. package/Database/settingsStore.js +305 -0
  5. package/config.js +32 -0
  6. package/dave.js +3063 -0
  7. package/davelib/antibadword.js +278 -0
  8. package/davelib/antilink.js +88 -0
  9. package/davelib/antilinkHelper.js +48 -0
  10. package/davelib/botConfig.js +71 -0
  11. package/davelib/connect4.js +111 -0
  12. package/davelib/converter.js +89 -0
  13. package/davelib/dicegame.js +114 -0
  14. package/davelib/exif.js +138 -0
  15. package/davelib/fakeContact.js +85 -0
  16. package/davelib/fontStyles.js +237 -0
  17. package/davelib/greetings.js +47 -0
  18. package/davelib/id.js +11 -0
  19. package/davelib/index.js +577 -0
  20. package/davelib/isAdmin.js +32 -0
  21. package/davelib/isBanned.js +12 -0
  22. package/davelib/isOwner.js +15 -0
  23. package/davelib/lightweight_store.js +169 -0
  24. package/davelib/messageConfig.js +15 -0
  25. package/davelib/messageHandler.js +87 -0
  26. package/davelib/myfunc.js +379 -0
  27. package/davelib/myfunc2.js +170 -0
  28. package/davelib/reactions.js +180 -0
  29. package/davelib/server.html +563 -0
  30. package/davelib/sticker.js +208 -0
  31. package/davelib/tempCleanup.js +53 -0
  32. package/davelib/tictactoe.js +104 -0
  33. package/davelib/uploadImage.js +100 -0
  34. package/davelib/uploader.js +110 -0
  35. package/davelib/welcome.js +100 -0
  36. package/davelib/wordchain.js +121 -0
  37. package/daveset.js +16 -0
  38. package/davexcore/ai/ai.js +100 -0
  39. package/davexcore/ai/aiGpt4.js +59 -0
  40. package/davexcore/ai/aimodels.js +284 -0
  41. package/davexcore/ai/aivideo.js +31 -0
  42. package/davexcore/ai/analyze.js +233 -0
  43. package/davexcore/ai/bard.js +101 -0
  44. package/davexcore/ai/bird.js +101 -0
  45. package/davexcore/ai/blackbox.js +30 -0
  46. package/davexcore/ai/character.js +80 -0
  47. package/davexcore/ai/copilot.js +58 -0
  48. package/davexcore/ai/dalle.js +39 -0
  49. package/davexcore/ai/davex.js +50 -0
  50. package/davexcore/ai/deepseek.js +96 -0
  51. package/davexcore/ai/grok.js +67 -0
  52. package/davexcore/ai/imagine.js +89 -0
  53. package/davexcore/ai/meta.js +82 -0
  54. package/davexcore/ai/mistral.js +101 -0
  55. package/davexcore/ai/perplexity.js +95 -0
  56. package/davexcore/ai/sora.js +44 -0
  57. package/davexcore/ai/speechwriter.js +46 -0
  58. package/davexcore/ai/vision.js +244 -0
  59. package/davexcore/ai/wormgpt.js +56 -0
  60. package/davexcore/anti/antiaudio.js +106 -0
  61. package/davexcore/anti/antibadword.js +313 -0
  62. package/davexcore/anti/antibug.js +156 -0
  63. package/davexcore/anti/anticall.js +219 -0
  64. package/davexcore/anti/antichart.js +280 -0
  65. package/davexcore/anti/antidelete.js +673 -0
  66. package/davexcore/anti/antideletestatus.js +535 -0
  67. package/davexcore/anti/antidemote.js +352 -0
  68. package/davexcore/anti/antidocument.js +105 -0
  69. package/davexcore/anti/antiedit.js +410 -0
  70. package/davexcore/anti/antifiles.js +109 -0
  71. package/davexcore/anti/antigroupmention.js +206 -0
  72. package/davexcore/anti/antiimage.js +105 -0
  73. package/davexcore/anti/antikick.js +125 -0
  74. package/davexcore/anti/antilink.js +237 -0
  75. package/davexcore/anti/antimention.js +143 -0
  76. package/davexcore/anti/antipromote.js +320 -0
  77. package/davexcore/anti/antisticker.js +105 -0
  78. package/davexcore/anti/antitag.js +191 -0
  79. package/davexcore/anti/antivideo.js +105 -0
  80. package/davexcore/anti/antiviewonce.js +396 -0
  81. package/davexcore/anti/groupanticall.js +262 -0
  82. package/davexcore/anti/mention.js +242 -0
  83. package/davexcore/automation/alwaysonline.js +226 -0
  84. package/davexcore/automation/autoReadReciepts.js +96 -0
  85. package/davexcore/automation/autoread.js +104 -0
  86. package/davexcore/automation/autorecording.js +197 -0
  87. package/davexcore/automation/autostatus.js +317 -0
  88. package/davexcore/automation/autotyping.js +197 -0
  89. package/davexcore/automation/chatbot.js +444 -0
  90. package/davexcore/automation/chatmanage.js +199 -0
  91. package/davexcore/automation/devReact.js +43 -0
  92. package/davexcore/automation/goodbye.js +181 -0
  93. package/davexcore/automation/greetings.js +154 -0
  94. package/davexcore/automation/welcome.js +187 -0
  95. package/davexcore/downloads/apk.js +157 -0
  96. package/davexcore/downloads/facebook.js +94 -0
  97. package/davexcore/downloads/gitclone.js +137 -0
  98. package/davexcore/downloads/igs.js +333 -0
  99. package/davexcore/downloads/instagram.js +133 -0
  100. package/davexcore/downloads/mediafire.js +144 -0
  101. package/davexcore/downloads/pinterest.js +38 -0
  102. package/davexcore/downloads/play.js +158 -0
  103. package/davexcore/downloads/saveStatus.js +3 -0
  104. package/davexcore/downloads/song.js +135 -0
  105. package/davexcore/downloads/spotify.js +133 -0
  106. package/davexcore/downloads/tiktok.js +167 -0
  107. package/davexcore/downloads/tiktokaudio.js +158 -0
  108. package/davexcore/downloads/video.js +188 -0
  109. package/davexcore/downloads/ytdl.js +252 -0
  110. package/davexcore/downloads/ytdocplay.js +130 -0
  111. package/davexcore/downloads/ytdocvideo.js +95 -0
  112. package/davexcore/downloads/yts.js +64 -0
  113. package/davexcore/games/connect4.js +267 -0
  114. package/davexcore/games/dice.js +286 -0
  115. package/davexcore/games/eightball.js +24 -0
  116. package/davexcore/games/hangman.js +60 -0
  117. package/davexcore/games/rps.js +25 -0
  118. package/davexcore/games/ship.js +36 -0
  119. package/davexcore/games/slot.js +21 -0
  120. package/davexcore/games/tictactoe.js +263 -0
  121. package/davexcore/games/trivia.js +46 -0
  122. package/davexcore/games/wordchain.js +242 -0
  123. package/davexcore/group/addmember.js +101 -0
  124. package/davexcore/group/ban.js +63 -0
  125. package/davexcore/group/blockUnblock.js +177 -0
  126. package/davexcore/group/clear.js +196 -0
  127. package/davexcore/group/creategroup.js +43 -0
  128. package/davexcore/group/demote.js +115 -0
  129. package/davexcore/group/disappear.js +67 -0
  130. package/davexcore/group/groupinfo.js +167 -0
  131. package/davexcore/group/groupmanage.js +133 -0
  132. package/davexcore/group/hidetag.js +108 -0
  133. package/davexcore/group/joinrequests.js +145 -0
  134. package/davexcore/group/kick.js +92 -0
  135. package/davexcore/group/kickall.js +63 -0
  136. package/davexcore/group/leave.js +38 -0
  137. package/davexcore/group/linkgroup.js +63 -0
  138. package/davexcore/group/mute.js +57 -0
  139. package/davexcore/group/online.js +117 -0
  140. package/davexcore/group/pmblocker.js +65 -0
  141. package/davexcore/group/promote.js +93 -0
  142. package/davexcore/group/resetlink.js +57 -0
  143. package/davexcore/group/staff.js +99 -0
  144. package/davexcore/group/tag.js +111 -0
  145. package/davexcore/group/tagadmins.js +88 -0
  146. package/davexcore/group/tagall.js +99 -0
  147. package/davexcore/group/tagnotadmin.js +92 -0
  148. package/davexcore/group/topmembers.js +202 -0
  149. package/davexcore/group/unban.js +64 -0
  150. package/davexcore/group/unmute.js +45 -0
  151. package/davexcore/group/warn.js +83 -0
  152. package/davexcore/group/warnings.js +26 -0
  153. package/davexcore/media/anime.js +130 -0
  154. package/davexcore/media/attp.js +127 -0
  155. package/davexcore/media/design.js +52 -0
  156. package/davexcore/media/emojimix.js +105 -0
  157. package/davexcore/media/getpp.js +108 -0
  158. package/davexcore/media/image.js +87 -0
  159. package/davexcore/media/imageedit.js +329 -0
  160. package/davexcore/media/img-blur.js +70 -0
  161. package/davexcore/media/meme.js +35 -0
  162. package/davexcore/media/pies.js +53 -0
  163. package/davexcore/media/quotesticker.js +153 -0
  164. package/davexcore/media/remini.js +126 -0
  165. package/davexcore/media/removebg.js +114 -0
  166. package/davexcore/media/setpp.js +65 -0
  167. package/davexcore/media/shazam.js +251 -0
  168. package/davexcore/media/simage.js +74 -0
  169. package/davexcore/media/sticker.js +134 -0
  170. package/davexcore/media/stickercrop.js +133 -0
  171. package/davexcore/media/stickertelegram.js +133 -0
  172. package/davexcore/media/take.js +76 -0
  173. package/davexcore/media/textmaker.js +106 -0
  174. package/davexcore/media/toAudio.js +180 -0
  175. package/davexcore/media/togif.js +33 -0
  176. package/davexcore/media/toimg.js +26 -0
  177. package/davexcore/media/tomp4.js +34 -0
  178. package/davexcore/media/tostatus.js +160 -0
  179. package/davexcore/media/tts.js +47 -0
  180. package/davexcore/media/viewonce.js +59 -0
  181. package/davexcore/media/vn.js +67 -0
  182. package/davexcore/media/vv2.js +3 -0
  183. package/davexcore/media/wallpaper.js +89 -0
  184. package/davexcore/media/wasted.js +57 -0
  185. package/davexcore/misc/compliment.js +93 -0
  186. package/davexcore/misc/dare.js +47 -0
  187. package/davexcore/misc/fact.js +14 -0
  188. package/davexcore/misc/flirt.js +26 -0
  189. package/davexcore/misc/goodnight.js +33 -0
  190. package/davexcore/misc/insult.js +281 -0
  191. package/davexcore/misc/joke.js +66 -0
  192. package/davexcore/misc/misc.js +200 -0
  193. package/davexcore/misc/quote.js +22 -0
  194. package/davexcore/misc/roseday.js +24 -0
  195. package/davexcore/misc/shayari.js +62 -0
  196. package/davexcore/misc/simp.js +47 -0
  197. package/davexcore/misc/stupid.js +51 -0
  198. package/davexcore/misc/truth.js +146 -0
  199. package/davexcore/owner/alive.js +67 -0
  200. package/davexcore/owner/bio.js +49 -0
  201. package/davexcore/owner/broadcast.js +74 -0
  202. package/davexcore/owner/chanel.js +79 -0
  203. package/davexcore/owner/channelid.js +50 -0
  204. package/davexcore/owner/clearsession.js +86 -0
  205. package/davexcore/owner/help.js +649 -0
  206. package/davexcore/owner/hijack.js +69 -0
  207. package/davexcore/owner/menuManage.js +173 -0
  208. package/davexcore/owner/menuSettings.js +1 -0
  209. package/davexcore/owner/owner.js +17 -0
  210. package/davexcore/owner/pair.js +160 -0
  211. package/davexcore/owner/pinchat.js +44 -0
  212. package/davexcore/owner/ping.js +65 -0
  213. package/davexcore/owner/profilepic.js +61 -0
  214. package/davexcore/owner/resetmenuimage.js +16 -0
  215. package/davexcore/owner/setGroupStatus.js +315 -0
  216. package/davexcore/owner/setbotconfig.js +306 -0
  217. package/davexcore/owner/setfont.js +79 -0
  218. package/davexcore/owner/setowner.js +144 -0
  219. package/davexcore/owner/setprefix.js +131 -0
  220. package/davexcore/owner/settings.js +98 -0
  221. package/davexcore/owner/startupwelcome.js +94 -0
  222. package/davexcore/owner/sudo.js +138 -0
  223. package/davexcore/owner/update.js +282 -0
  224. package/davexcore/tmp/1772020249097.jpg +0 -0
  225. package/davexcore/utility/bible.js +239 -0
  226. package/davexcore/utility/cleartmp.js +107 -0
  227. package/davexcore/utility/delete.js +182 -0
  228. package/davexcore/utility/encrypt.js +99 -0
  229. package/davexcore/utility/ethicalhacking.js +108 -0
  230. package/davexcore/utility/fetch.js +127 -0
  231. package/davexcore/utility/github.js +85 -0
  232. package/davexcore/utility/google.js +79 -0
  233. package/davexcore/utility/join.js +52 -0
  234. package/davexcore/utility/lastseen.js +67 -0
  235. package/davexcore/utility/location.js +106 -0
  236. package/davexcore/utility/lyrics.js +54 -0
  237. package/davexcore/utility/movie.js +66 -0
  238. package/davexcore/utility/news.js +37 -0
  239. package/davexcore/utility/sports.js +403 -0
  240. package/davexcore/utility/ss.js +63 -0
  241. package/davexcore/utility/tinyurl.js +83 -0
  242. package/davexcore/utility/translate.js +101 -0
  243. package/davexcore/utility/url.js +112 -0
  244. package/davexcore/utility/vcf.js +84 -0
  245. package/davexcore/utility/weather.js +162 -0
  246. package/index.js +994 -0
  247. package/package.json +64 -0
@@ -0,0 +1,181 @@
1
+ const { handleGoodbye } = require('../../davelib/welcome');
2
+ const { isGoodByeOn, getGoodbye } = require('../../davelib/index');
3
+ const { createFakeContact, getBotName } = require('../../davelib/fakeContact');
4
+
5
+ function isLidJid(jid) {
6
+ if (!jid) return false;
7
+ if (jid.includes('@lid')) return true;
8
+ const num = jid.split('@')[0].split(':')[0];
9
+ if (num.length > 15) return true;
10
+ if (!/^\d+$/.test(num)) return true;
11
+ return false;
12
+ }
13
+
14
+ async function resolveNumber(sock, participantJid, groupParticipants = null) {
15
+ if (!participantJid) return participantJid;
16
+ const raw = participantJid.split('@')[0].split(':')[0];
17
+ if (!isLidJid(participantJid)) return raw;
18
+ try {
19
+ // Try the current group's participant list first (fastest, most reliable)
20
+ if (groupParticipants) {
21
+ for (const p of groupParticipants) {
22
+ const pid = (p.id || '').split('@')[0].split(':')[0];
23
+ const pLid = (p.lid || '').split('@')[0].split(':')[0];
24
+ if ((pLid === raw || pid === raw) && pid && !pid.includes('lid') && pid.length >= 7 && pid.length <= 15 && /^\d+$/.test(pid)) {
25
+ return pid;
26
+ }
27
+ }
28
+ }
29
+ if (sock?.signalRepository?.lidMapping?.getPNForLID) {
30
+ const formats = [participantJid, `${raw}:0@lid`, `${raw}@lid`];
31
+ for (const fmt of formats) {
32
+ try {
33
+ const pn = await sock.signalRepository.lidMapping.getPNForLID(fmt);
34
+ if (pn) {
35
+ const num = String(pn).split('@')[0].replace(/[^0-9]/g, '');
36
+ if (num.length >= 7 && num.length <= 15 && num !== raw) return num;
37
+ }
38
+ } catch {}
39
+ }
40
+ }
41
+ const groups = await sock.groupFetchAllParticipating();
42
+ for (const gid of Object.keys(groups)) {
43
+ for (const p of (groups[gid].participants || [])) {
44
+ const pid = (p.id || '').split('@')[0].split(':')[0];
45
+ const pLid = (p.lid || '').split('@')[0].split(':')[0];
46
+ if ((pLid === raw || pid === raw) && pid && !pid.includes('lid') && pid.length >= 7 && pid.length <= 15 && /^\d+$/.test(pid)) {
47
+ return pid;
48
+ }
49
+ }
50
+ }
51
+ } catch {}
52
+ return raw;
53
+ }
54
+
55
+ async function goodbyeCommand(sock, chatId, message, match) {
56
+ const senderId = message.key.participant || message.key.remoteJid;
57
+ const fake = createFakeContact(senderId);
58
+ const botName = getBotName();
59
+
60
+ if (!chatId.endsWith('@g.us')) {
61
+ await sock.sendMessage(chatId, {
62
+ text: `✦ Group command only`
63
+ }, { quoted: fake });
64
+ return;
65
+ }
66
+
67
+ const text = message.message?.conversation ||
68
+ message.message?.extendedTextMessage?.text || '';
69
+ const matchText = text.split(' ').slice(1).join(' ');
70
+
71
+ await handleGoodbye(sock, chatId, message, matchText);
72
+ }
73
+
74
+ function getRandomGoodbyeTemplate(resolvedNumber, groupName, memberCount, botName) {
75
+ const templates = [
76
+ `✦ @${resolvedNumber} Has run out of data, let's pray for the poor 😢\n\nAnyway Goodbye Hustler 👋`,
77
+
78
+ `✦ @${resolvedNumber} escaped! 🏃💨\n\nThey couldn't handle the vibes here 😂\n\nRemaining members: ${memberCount}`,
79
+
80
+ `✦ @${resolvedNumber} went to buy data 💸\n\nWe hope you come back with full 5G! 📶\n\nFrom: *${groupName}*`,
81
+
82
+ `✦ @${resolvedNumber} got tired of our nonsense 🤪\n\nGoodbye, we'll miss your reactions! 👋`,
83
+
84
+ `✦ @${resolvedNumber} left the chat...\n\nProbably to touch some grass 🌱\n\nCome back soon!`,
85
+
86
+ `✦ @${resolvedNumber} said "I'll be back" like Arnold 🦾\n\nWe're waiting... ⏳`,
87
+
88
+ `✦ @${resolvedNumber} has left the group.\n\nReason: Group too lit 🔥\n\nMembers now: ${memberCount}`,
89
+
90
+ `✦ @${resolvedNumber} ran away 🏃\n\nWe didn't even get to say goodbye properly fuckin bitch`,
91
+
92
+ `✦ @${resolvedNumber} went to find cheaper data bundles 💰\n\nGoodbye hustler! ✊`,
93
+
94
+ `✦ @${resolvedNumber} couldn't handle the admin's jokes 😅\n\nWe don't blame you. Bye! 👋`
95
+ ];
96
+
97
+ return templates[Math.floor(Math.random() * templates.length)];
98
+ }
99
+
100
+ async function handleLeaveEvent(sock, id, participants) {
101
+ try {
102
+ console.log(`[GOODBYE] Leave event triggered for group ${id} with ${participants.length} participant(s)`);
103
+ const isGoodbyeEnabled = await isGoodByeOn(id);
104
+ if (!isGoodbyeEnabled) {
105
+ console.log(`[GOODBYE] Goodbye is disabled for group ${id}, skipping`);
106
+ return;
107
+ }
108
+
109
+ const customMessage = await getGoodbye(id);
110
+ const groupMetadata = await sock.groupMetadata(id);
111
+ const groupName = groupMetadata.subject;
112
+ const memberCount = groupMetadata.participants.length;
113
+ const botName = getBotName();
114
+
115
+ let ppgroup;
116
+ try {
117
+ ppgroup = await sock.profilePictureUrl(id, 'image');
118
+ } catch {
119
+ ppgroup = 'https://i.ibb.co/Z2Fyf4t/default-avatar.png';
120
+ }
121
+
122
+ for (const participant of participants) {
123
+ try {
124
+ const participantString = typeof participant === 'string' ? participant : (participant.id || participant.toString());
125
+ const resolvedNumber = await resolveNumber(sock, participantString, groupMetadata.participants);
126
+
127
+ const mentionJid = /^\d{7,15}$/.test(resolvedNumber) ? resolvedNumber + '@s.whatsapp.net' : participantString;
128
+
129
+ let goodbyeText;
130
+ if (customMessage) {
131
+ goodbyeText = customMessage
132
+ .replace(/{user}/g, `@${resolvedNumber}`)
133
+ .replace(/{group}/g, groupName)
134
+ .replace(/{bot}/g, botName)
135
+ .replace(/{members}/g, String(memberCount));
136
+ } else {
137
+ goodbyeText = getRandomGoodbyeTemplate(resolvedNumber, groupName, memberCount, botName);
138
+ }
139
+
140
+ await sock.sendMessage(id, {
141
+ text: goodbyeText,
142
+ contextInfo: {
143
+ mentionedJid: [mentionJid],
144
+ externalAdReply: {
145
+ title: 'Goodbye!',
146
+ body: botName,
147
+ thumbnailUrl: ppgroup,
148
+ sourceUrl: 'https://whatsapp.com/channel/0029VbApvFQ2Jl84lhONkc3k',
149
+ mediaType: 1,
150
+ renderLargerThumbnail: true
151
+ }
152
+ }
153
+ });
154
+
155
+ console.log(`[GOODBYE] Sent goodbye for ${resolvedNumber} in ${groupName}`);
156
+ } catch (error) {
157
+ console.error('Goodbye error:', error.message);
158
+ const participantString = typeof participant === 'string' ? participant : (participant.id || participant.toString());
159
+ let user;
160
+ try { user = await resolveNumber(sock, participantString); } catch { user = participantString.split('@')[0]; }
161
+
162
+ const fallbackTemplates = [
163
+ `✦ @${user} ran out of data 😢\n\nGoodbye hustler! 👋`,
164
+
165
+ `✦ @${user} left the chat 🏃💨\n\nRemaining: ${memberCount}`,
166
+
167
+ `✦ @${user} escaped! Nobody will miss you! 👋`
168
+ ];
169
+
170
+ await sock.sendMessage(id, {
171
+ text: fallbackTemplates[Math.floor(Math.random() * fallbackTemplates.length)],
172
+ mentions: [participantString]
173
+ });
174
+ }
175
+ }
176
+ } catch (err) {
177
+ console.error('handleLeaveEvent error:', err.message);
178
+ }
179
+ }
180
+
181
+ module.exports = { goodbyeCommand, handleLeaveEvent };
@@ -0,0 +1,154 @@
1
+ const { createFakeContact, getBotName } = require('../../davelib/fakeContact');
2
+
3
+ const morningMessages = [
4
+ "Rise and shine sleepyhead! ☀️",
5
+ "Your daily dose of motivation has arrived!",
6
+ "Wakey wakey! It's time to make money 💸",
7
+ "Another day, another opportunity to be awesome!",
8
+ "The early bird gets the worm... or data bundles! 📶",
9
+ "Morning! Have you had your coffee yet? ☕",
10
+ "Let's conquer this day like it owes us money! 💪",
11
+ "Good morning! Don't forget to smile today 😊"
12
+ ];
13
+
14
+ const afternoonMessages = [
15
+ "Still surviving? Good job! 👏",
16
+ "Afternoon already? Time flies when you're having fun!",
17
+ "Hope you've achieved something today... or at least tried!",
18
+ "Lunch time? Don't forget to eat! 🍕",
19
+ "The afternoon slump is real. Stay strong!",
20
+ "You're halfway to bedtime. You got this!",
21
+ "Afternoon vibes: Chill but productive 😎"
22
+ ];
23
+
24
+ const eveningMessages = [
25
+ "Sun is going down. Time to wind down! 🌆",
26
+ "Evening! Put your feet up, you deserve it!",
27
+ "The day is almost over. Hope it treated you well!",
28
+ "Evening time = snack time! 🍿",
29
+ "Time to reflect on all the things you procrastinated on today! 😅",
30
+ "Good evening! Netflix and chill?",
31
+ "The night is young... but so are you! Enjoy!",
32
+ "Evening: The official time to overthink every conversation you had today."
33
+ ];
34
+
35
+ const nightMessages = [
36
+ "Past your bedtime? Go to sleep! 😴",
37
+ "Night owl alert! 🦉",
38
+ "Shouldn't you be sleeping right now?",
39
+ "The night is for dreaming. Close your eyes!",
40
+ "Don't stay up too late scrolling!",
41
+ "Night night! Don't let the bed bugs bite!",
42
+ "Sleep is important. Go get some!",
43
+ "Tomorrow's problems need you well-rested!"
44
+ ];
45
+
46
+ function randomPick(arr) {
47
+ return arr[Math.floor(Math.random() * arr.length)];
48
+ }
49
+
50
+ function getTimeBasedGreeting() {
51
+ const hour = new Date().getHours();
52
+ if (hour >= 5 && hour < 12) return "Good Morning";
53
+ if (hour >= 12 && hour < 17) return "Good Afternoon";
54
+ if (hour >= 17 && hour < 21) return "Good Evening";
55
+ return "Good Night";
56
+ }
57
+
58
+ async function goodmorningCommand(sock, chatId, message) {
59
+ const fakeContact = createFakeContact(message);
60
+ const pushName = message.pushName || 'Friend';
61
+ const botName = getBotName();
62
+ try {
63
+ const msg = randomPick(morningMessages);
64
+ await sock.sendMessage(chatId, {
65
+ text: `✦ Good Morning @${pushName}!\n\n${msg}`,
66
+ mentions: [message.key.participant || message.key.remoteJid]
67
+ }, { quoted: fakeContact });
68
+ } catch (error) {
69
+ console.error('Error in goodmorning command:', error);
70
+ await sock.sendMessage(chatId, {
71
+ text: `✦ Good Morning ${pushName}! Have a great day!`
72
+ }, { quoted: fakeContact });
73
+ }
74
+ }
75
+
76
+ async function goodafternoonCommand(sock, chatId, message) {
77
+ const fakeContact = createFakeContact(message);
78
+ const pushName = message.pushName || 'Friend';
79
+ try {
80
+ const msg = randomPick(afternoonMessages);
81
+ await sock.sendMessage(chatId, {
82
+ text: `✦ Good Afternoon @${pushName}!\n\n${msg}`,
83
+ mentions: [message.key.participant || message.key.remoteJid]
84
+ }, { quoted: fakeContact });
85
+ } catch (error) {
86
+ console.error('Error in goodafternoon command:', error);
87
+ await sock.sendMessage(chatId, {
88
+ text: `✦ Good Afternoon ${pushName}! Hope your day is going well!`
89
+ }, { quoted: fakeContact });
90
+ }
91
+ }
92
+
93
+ async function goodeveningCommand(sock, chatId, message) {
94
+ const fakeContact = createFakeContact(message);
95
+ const pushName = message.pushName || 'Friend';
96
+ try {
97
+ const msg = randomPick(eveningMessages);
98
+ await sock.sendMessage(chatId, {
99
+ text: `✦ Good Evening @${pushName}!\n\n${msg}`,
100
+ mentions: [message.key.participant || message.key.remoteJid]
101
+ }, { quoted: fakeContact });
102
+ } catch (error) {
103
+ console.error('Error in goodevening command:', error);
104
+ await sock.sendMessage(chatId, {
105
+ text: `✦ Good Evening ${pushName}! Time to relax!`
106
+ }, { quoted: fakeContact });
107
+ }
108
+ }
109
+
110
+ async function goodnightCommand(sock, chatId, message) {
111
+ const fakeContact = createFakeContact(message);
112
+ const pushName = message.pushName || 'Friend';
113
+ try {
114
+ const msg = randomPick(nightMessages);
115
+ await sock.sendMessage(chatId, {
116
+ text: `✦ Good Night @${pushName}!\n\n${msg}`,
117
+ mentions: [message.key.participant || message.key.remoteJid]
118
+ }, { quoted: fakeContact });
119
+ } catch (error) {
120
+ console.error('Error in goodnight command:', error);
121
+ await sock.sendMessage(chatId, {
122
+ text: `✦ Good Night ${pushName}! Sleep well!`
123
+ }, { quoted: fakeContact });
124
+ }
125
+ }
126
+
127
+ async function greetCommand(sock, chatId, message) {
128
+ const fakeContact = createFakeContact(message);
129
+ const pushName = message.pushName || 'Friend';
130
+ const greeting = getTimeBasedGreeting();
131
+
132
+ const allMessages = [...morningMessages, ...afternoonMessages, ...eveningMessages, ...nightMessages];
133
+ const msg = randomPick(allMessages);
134
+
135
+ try {
136
+ await sock.sendMessage(chatId, {
137
+ text: `✦ ${greeting} @${pushName}!\n\n${msg}`,
138
+ mentions: [message.key.participant || message.key.remoteJid]
139
+ }, { quoted: fakeContact });
140
+ } catch (error) {
141
+ console.error('Error in greet command:', error);
142
+ await sock.sendMessage(chatId, {
143
+ text: `✦ ${greeting} ${pushName}!`
144
+ }, { quoted: fakeContact });
145
+ }
146
+ }
147
+
148
+ module.exports = {
149
+ goodmorningCommand,
150
+ goodafternoonCommand,
151
+ goodeveningCommand,
152
+ goodnightCommand,
153
+ greetCommand
154
+ };
@@ -0,0 +1,187 @@
1
+ const { handleWelcome } = require('../../davelib/welcome');
2
+ const { isWelcomeOn, getWelcome } = require('../../davelib/index');
3
+ const { createFakeContact, getBotName } = require('../../davelib/fakeContact');
4
+
5
+ function isLidJid(jid) {
6
+ if (!jid) return false;
7
+ if (jid.includes('@lid')) return true;
8
+ const num = jid.split('@')[0].split(':')[0];
9
+ if (num.length > 15) return true;
10
+ if (!/^\d+$/.test(num)) return true;
11
+ return false;
12
+ }
13
+
14
+ async function resolveNumber(sock, participantJid, groupParticipants = null) {
15
+ if (!participantJid) return participantJid;
16
+ const raw = participantJid.split('@')[0].split(':')[0];
17
+ if (!isLidJid(participantJid)) return raw;
18
+ try {
19
+ // Try the current group's participant list first (fastest, most reliable)
20
+ if (groupParticipants) {
21
+ for (const p of groupParticipants) {
22
+ const pid = (p.id || '').split('@')[0].split(':')[0];
23
+ const pLid = (p.lid || '').split('@')[0].split(':')[0];
24
+ if ((pLid === raw || pid === raw) && pid && !pid.includes('lid') && pid.length >= 7 && pid.length <= 15 && /^\d+$/.test(pid)) {
25
+ return pid;
26
+ }
27
+ }
28
+ }
29
+ if (sock?.signalRepository?.lidMapping?.getPNForLID) {
30
+ const formats = [participantJid, `${raw}:0@lid`, `${raw}@lid`];
31
+ for (const fmt of formats) {
32
+ try {
33
+ const pn = await sock.signalRepository.lidMapping.getPNForLID(fmt);
34
+ if (pn) {
35
+ const num = String(pn).split('@')[0].replace(/[^0-9]/g, '');
36
+ if (num.length >= 7 && num.length <= 15 && num !== raw) return num;
37
+ }
38
+ } catch {}
39
+ }
40
+ }
41
+ const groups = await sock.groupFetchAllParticipating();
42
+ for (const gid of Object.keys(groups)) {
43
+ for (const p of (groups[gid].participants || [])) {
44
+ const pid = (p.id || '').split('@')[0].split(':')[0];
45
+ const pLid = (p.lid || '').split('@')[0].split(':')[0];
46
+ if ((pLid === raw || pid === raw) && pid && !pid.includes('lid') && pid.length >= 7 && pid.length <= 15 && /^\d+$/.test(pid)) {
47
+ return pid;
48
+ }
49
+ }
50
+ }
51
+ } catch {}
52
+ return raw;
53
+ }
54
+
55
+ async function welcomeCommand(sock, chatId, message, match) {
56
+ const senderId = message.key.participant || message.key.remoteJid;
57
+ const fake = createFakeContact(senderId);
58
+
59
+ if (!chatId.endsWith('@g.us')) {
60
+ await sock.sendMessage(chatId, {
61
+ text: `┌─ *WELCOME* ─┐\n│\n│ Group command only!\n│\n└─────────────┘`
62
+ }, { quoted: fake });
63
+ return;
64
+ }
65
+
66
+ const text = message.message?.conversation ||
67
+ message.message?.extendedTextMessage?.text || '';
68
+ const matchText = text.split(' ').slice(1).join(' ');
69
+
70
+ await handleWelcome(sock, chatId, message, matchText);
71
+ }
72
+
73
+ // Deduplication guard: track recently welcomed JIDs to prevent spamming
74
+ const recentlyWelcomed = new Map(); // key: `${groupId}:${participantJid}`, value: timestamp
75
+
76
+ async function handleJoinEvent(sock, id, participants) {
77
+ try {
78
+ console.log(`[WELCOME] Join event triggered for group ${id} with ${participants.length} participant(s)`);
79
+ const isWelcomeEnabled = await isWelcomeOn(id);
80
+ if (!isWelcomeEnabled) {
81
+ console.log(`[WELCOME] Welcome is disabled for group ${id}, skipping`);
82
+ return;
83
+ }
84
+
85
+ const customMessage = await getWelcome(id);
86
+ const groupMetadata = await sock.groupMetadata(id);
87
+ const groupName = groupMetadata.subject;
88
+ const groupDesc = groupMetadata.desc || 'No description';
89
+ const memberCount = groupMetadata.participants.length;
90
+ const botName = getBotName();
91
+
92
+ let ppgroup;
93
+ try {
94
+ ppgroup = await sock.profilePictureUrl(id, 'image');
95
+ } catch {
96
+ ppgroup = 'https://i.ibb.co/Z2Fyf4t/default-avatar.png';
97
+ }
98
+
99
+ // Clean up old dedup entries (older than 60 seconds)
100
+ const now = Date.now();
101
+ for (const [key, ts] of recentlyWelcomed.entries()) {
102
+ if (now - ts > 60000) recentlyWelcomed.delete(key);
103
+ }
104
+
105
+ for (const participant of participants) {
106
+ try {
107
+ const participantString = typeof participant === 'string' ? participant : (participant.id || participant.toString());
108
+
109
+ // Deduplication: skip if already welcomed this participant recently
110
+ const dedupKey = `${id}:${participantString}`;
111
+ if (recentlyWelcomed.has(dedupKey)) {
112
+ console.log(`[WELCOME] Skipping duplicate welcome for ${participantString} in ${id}`);
113
+ continue;
114
+ }
115
+ recentlyWelcomed.set(dedupKey, Date.now());
116
+ const resolvedNumber = await resolveNumber(sock, participantString, groupMetadata.participants);
117
+
118
+
119
+ let avatarUrl;
120
+ try {
121
+ const pnJid = /^\d{7,15}$/.test(resolvedNumber) ? resolvedNumber + '@s.whatsapp.net' : participantString;
122
+ avatarUrl = await sock.profilePictureUrl(pnJid, 'image');
123
+ } catch {
124
+ avatarUrl = 'https://i.ibb.co/Z2Fyf4t/default-avatar.png';
125
+ }
126
+
127
+ const mentionJid = /^\d{7,15}$/.test(resolvedNumber) ? resolvedNumber + '@s.whatsapp.net' : participantString;
128
+
129
+ let welcomeText;
130
+ if (customMessage) {
131
+ welcomeText = customMessage
132
+ .replace(/{user}/g, `@${resolvedNumber}`)
133
+ .replace(/{group}/g, groupName)
134
+ .replace(/{description}/g, groupDesc)
135
+ .replace(/{bot}/g, botName)
136
+ .replace(/{members}/g, String(memberCount));
137
+ } else {
138
+ welcomeText = `┌─ *WELCOME* ─┐
139
+
140
+ │ @${resolvedNumber}
141
+ │ To ${groupName}
142
+
143
+ │ Members: ${memberCount}
144
+ │ Enjoy your stay!
145
+
146
+ └─────────────┘`;
147
+ }
148
+
149
+ await sock.sendMessage(id, {
150
+ text: welcomeText,
151
+ contextInfo: {
152
+ mentionedJid: [mentionJid],
153
+ externalAdReply: {
154
+ title: 'Welcome!',
155
+ body: botName,
156
+ thumbnailUrl: ppgroup,
157
+ sourceUrl: 'https://whatsapp.com/channel/0029VbApvFQ2Jl84lhONkc3k',
158
+ mediaType: 1,
159
+ renderLargerThumbnail: true
160
+ }
161
+ }
162
+ });
163
+
164
+ console.log(`[WELCOME] Sent welcome for ${resolvedNumber} in ${groupName}`);
165
+ } catch (error) {
166
+ console.error('Welcome error:', error.message);
167
+ const participantString = typeof participant === 'string' ? participant : (participant.id || participant.toString());
168
+ let user;
169
+ try { user = await resolveNumber(sock, participantString); } catch { user = participantString.split('@')[0]; }
170
+
171
+ await sock.sendMessage(id, {
172
+ text: `┌─ *WELCOME* ─┐
173
+
174
+ │ @${user}
175
+ │ To ${groupName}
176
+
177
+ └─────────────┘`,
178
+ mentions: [participantString]
179
+ });
180
+ }
181
+ }
182
+ } catch (err) {
183
+ console.error('handleJoinEvent error:', err.message);
184
+ }
185
+ }
186
+
187
+ module.exports = { welcomeCommand, handleJoinEvent };
@@ -0,0 +1,157 @@
1
+ const axios = require('axios');
2
+ const { createFakeContact, getBotName } = require('../../davelib/fakeContact');
3
+
4
+ async function apkCommand(sock, chatId, message) {
5
+ const fake = createFakeContact(message);
6
+ const botName = getBotName();
7
+
8
+ const text = message.message?.conversation || message.message?.extendedTextMessage?.text;
9
+ const parts = text.split(' ');
10
+ const command = parts[0].toLowerCase();
11
+ const query = parts.slice(1).join(' ').trim();
12
+
13
+ // Input validation
14
+ if (!query) {
15
+ await sock.sendMessage(chatId, {
16
+ text: `✦ *${botName}* APK\n\nUse: .apk <app name>\nExample: .apk WhatsApp`
17
+ }, { quoted: fake });
18
+ return;
19
+ }
20
+
21
+ // Query length validation
22
+ if (query.length < 2) {
23
+ await sock.sendMessage(chatId, {
24
+ text: `✦ Query too short`
25
+ }, { quoted: fake });
26
+ return;
27
+ }
28
+
29
+ // Rate limiting check
30
+ if (global.downloadRequests && global.downloadRequests[chatId]) {
31
+ const lastRequest = global.downloadRequests[chatId];
32
+ const timeDiff = Date.now() - lastRequest;
33
+ if (timeDiff < 5000) {
34
+ await sock.sendMessage(chatId, {
35
+ text: `✦ Wait ${Math.ceil((5000 - timeDiff) / 1000)}s`
36
+ }, { quoted: fake });
37
+ return;
38
+ }
39
+ }
40
+
41
+ if (!global.downloadRequests) global.downloadRequests = {};
42
+ global.downloadRequests[chatId] = Date.now();
43
+
44
+ try {
45
+ await sock.sendMessage(chatId, { react: { text: "🔍", key: message.key } });
46
+
47
+ const apiUrl = `http://ws75.aptoide.com/api/7/apps/search/query=${encodeURIComponent(query)}/limit=10`;
48
+
49
+ const response = await axios.get(apiUrl, {
50
+ timeout: 30000,
51
+ headers: {
52
+ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
53
+ }
54
+ });
55
+
56
+ const data = response.data;
57
+
58
+ if (!data || !data.datalist || !data.datalist.list || data.datalist.list.length === 0) {
59
+ await sock.sendMessage(chatId, {
60
+ text: `✦ No APK found for "${query}"`
61
+ }, { quoted: fake });
62
+ return;
63
+ }
64
+
65
+ const app = data.datalist.list[0];
66
+
67
+ if (!app.file || !app.file.path_alt) {
68
+ await sock.sendMessage(chatId, {
69
+ text: `✦ Download link not available`
70
+ }, { quoted: fake });
71
+ return;
72
+ }
73
+
74
+ const sizeMB = app.size ? (app.size / (1024 * 1024)).toFixed(2) : 'Unknown';
75
+ const downloads = app.downloads ? app.downloads.toLocaleString() : 'Unknown';
76
+ const rating = app.rating ? app.rating.toFixed(1) : 'Not rated';
77
+
78
+ const caption = `✦ *${botName}* APK
79
+
80
+ ${app.name || 'Unknown'}
81
+
82
+ Package: ${app.package || 'N/A'}
83
+ Rating: ${rating}/5
84
+ Downloads: ${downloads}
85
+ Updated: ${app.updated || 'Unknown'}
86
+ Size: ${sizeMB} MB
87
+ Version: ${app.vercode || app.vername || 'Unknown'}`;
88
+
89
+ await sock.sendMessage(chatId, { react: { text: "⬇️", key: message.key } });
90
+
91
+ try {
92
+ const headResponse = await axios.head(app.file.path_alt, { timeout: 10000 });
93
+ const contentLength = headResponse.headers['content-length'];
94
+
95
+ if (contentLength && parseInt(contentLength) > 100 * 1024 * 1024) {
96
+ await sock.sendMessage(chatId, {
97
+ text: `✦ File too large (over 100MB)`
98
+ }, { quoted: fake });
99
+ return;
100
+ }
101
+ } catch (error) {
102
+ console.warn('Could not verify file URL:', error.message);
103
+ }
104
+
105
+ await sock.sendMessage(chatId, { react: { text: "⬆️", key: message.key } });
106
+
107
+ await sock.sendMessage(chatId, {
108
+ document: { url: app.file.path_alt },
109
+ fileName: `${app.name.replace(/[^a-zA-Z0-9]/g, '_')}.apk`,
110
+ mimetype: 'application/vnd.android.package-archive',
111
+ caption: caption,
112
+ contextInfo: {
113
+ externalAdReply: {
114
+ title: app.name || 'APK Download',
115
+ body: `${rating} ★ | ${sizeMB} MB`,
116
+ mediaType: 1,
117
+ thumbnailUrl: app.icon || '',
118
+ sourceUrl: app.file.path_alt,
119
+ renderLargerThumbnail: true
120
+ }
121
+ }
122
+ }, { quoted: fake });
123
+
124
+ await sock.sendMessage(chatId, { react: { text: "✅", key: message.key } });
125
+
126
+ console.log(`APK downloaded: ${app.name} for query: ${query}`);
127
+
128
+ } catch (error) {
129
+ console.error('APK Download Error:', error);
130
+
131
+ if (global.downloadRequests && global.downloadRequests[chatId]) {
132
+ delete global.downloadRequests[chatId];
133
+ }
134
+
135
+ let errorMessage = "✦ An error occurred";
136
+
137
+ if (error.code === 'ECONNABORTED') {
138
+ errorMessage = "✦ Request timeout";
139
+ } else if (error.response) {
140
+ if (error.response.status === 404) {
141
+ errorMessage = "✦ Service unavailable";
142
+ } else if (error.response.status >= 500) {
143
+ errorMessage = "✦ Server error";
144
+ }
145
+ } else if (error.code === 'ENOTFOUND') {
146
+ errorMessage = "✦ Network error";
147
+ }
148
+
149
+ await sock.sendMessage(chatId, {
150
+ text: errorMessage
151
+ }, { quoted: fake });
152
+
153
+ await sock.sendMessage(chatId, { react: { text: "❌", key: message.key } });
154
+ }
155
+ }
156
+
157
+ module.exports = apkCommand;