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.
- package/Database/database.js +446 -0
- package/Database/migration.js +327 -0
- package/Database/pgSync.js +229 -0
- package/Database/settingsStore.js +305 -0
- package/config.js +32 -0
- package/dave.js +3063 -0
- package/davelib/antibadword.js +278 -0
- package/davelib/antilink.js +88 -0
- package/davelib/antilinkHelper.js +48 -0
- package/davelib/botConfig.js +71 -0
- package/davelib/connect4.js +111 -0
- package/davelib/converter.js +89 -0
- package/davelib/dicegame.js +114 -0
- package/davelib/exif.js +138 -0
- package/davelib/fakeContact.js +85 -0
- package/davelib/fontStyles.js +237 -0
- package/davelib/greetings.js +47 -0
- package/davelib/id.js +11 -0
- package/davelib/index.js +577 -0
- package/davelib/isAdmin.js +32 -0
- package/davelib/isBanned.js +12 -0
- package/davelib/isOwner.js +15 -0
- package/davelib/lightweight_store.js +169 -0
- package/davelib/messageConfig.js +15 -0
- package/davelib/messageHandler.js +87 -0
- package/davelib/myfunc.js +379 -0
- package/davelib/myfunc2.js +170 -0
- package/davelib/reactions.js +180 -0
- package/davelib/server.html +563 -0
- package/davelib/sticker.js +208 -0
- package/davelib/tempCleanup.js +53 -0
- package/davelib/tictactoe.js +104 -0
- package/davelib/uploadImage.js +100 -0
- package/davelib/uploader.js +110 -0
- package/davelib/welcome.js +100 -0
- package/davelib/wordchain.js +121 -0
- package/daveset.js +16 -0
- package/davexcore/ai/ai.js +100 -0
- package/davexcore/ai/aiGpt4.js +59 -0
- package/davexcore/ai/aimodels.js +284 -0
- package/davexcore/ai/aivideo.js +31 -0
- package/davexcore/ai/analyze.js +233 -0
- package/davexcore/ai/bard.js +101 -0
- package/davexcore/ai/bird.js +101 -0
- package/davexcore/ai/blackbox.js +30 -0
- package/davexcore/ai/character.js +80 -0
- package/davexcore/ai/copilot.js +58 -0
- package/davexcore/ai/dalle.js +39 -0
- package/davexcore/ai/davex.js +50 -0
- package/davexcore/ai/deepseek.js +96 -0
- package/davexcore/ai/grok.js +67 -0
- package/davexcore/ai/imagine.js +89 -0
- package/davexcore/ai/meta.js +82 -0
- package/davexcore/ai/mistral.js +101 -0
- package/davexcore/ai/perplexity.js +95 -0
- package/davexcore/ai/sora.js +44 -0
- package/davexcore/ai/speechwriter.js +46 -0
- package/davexcore/ai/vision.js +244 -0
- package/davexcore/ai/wormgpt.js +56 -0
- package/davexcore/anti/antiaudio.js +106 -0
- package/davexcore/anti/antibadword.js +313 -0
- package/davexcore/anti/antibug.js +156 -0
- package/davexcore/anti/anticall.js +219 -0
- package/davexcore/anti/antichart.js +280 -0
- package/davexcore/anti/antidelete.js +673 -0
- package/davexcore/anti/antideletestatus.js +535 -0
- package/davexcore/anti/antidemote.js +352 -0
- package/davexcore/anti/antidocument.js +105 -0
- package/davexcore/anti/antiedit.js +410 -0
- package/davexcore/anti/antifiles.js +109 -0
- package/davexcore/anti/antigroupmention.js +206 -0
- package/davexcore/anti/antiimage.js +105 -0
- package/davexcore/anti/antikick.js +125 -0
- package/davexcore/anti/antilink.js +237 -0
- package/davexcore/anti/antimention.js +143 -0
- package/davexcore/anti/antipromote.js +320 -0
- package/davexcore/anti/antisticker.js +105 -0
- package/davexcore/anti/antitag.js +191 -0
- package/davexcore/anti/antivideo.js +105 -0
- package/davexcore/anti/antiviewonce.js +396 -0
- package/davexcore/anti/groupanticall.js +262 -0
- package/davexcore/anti/mention.js +242 -0
- package/davexcore/automation/alwaysonline.js +226 -0
- package/davexcore/automation/autoReadReciepts.js +96 -0
- package/davexcore/automation/autoread.js +104 -0
- package/davexcore/automation/autorecording.js +197 -0
- package/davexcore/automation/autostatus.js +317 -0
- package/davexcore/automation/autotyping.js +197 -0
- package/davexcore/automation/chatbot.js +444 -0
- package/davexcore/automation/chatmanage.js +199 -0
- package/davexcore/automation/devReact.js +43 -0
- package/davexcore/automation/goodbye.js +181 -0
- package/davexcore/automation/greetings.js +154 -0
- package/davexcore/automation/welcome.js +187 -0
- package/davexcore/downloads/apk.js +157 -0
- package/davexcore/downloads/facebook.js +94 -0
- package/davexcore/downloads/gitclone.js +137 -0
- package/davexcore/downloads/igs.js +333 -0
- package/davexcore/downloads/instagram.js +133 -0
- package/davexcore/downloads/mediafire.js +144 -0
- package/davexcore/downloads/pinterest.js +38 -0
- package/davexcore/downloads/play.js +158 -0
- package/davexcore/downloads/saveStatus.js +3 -0
- package/davexcore/downloads/song.js +135 -0
- package/davexcore/downloads/spotify.js +133 -0
- package/davexcore/downloads/tiktok.js +167 -0
- package/davexcore/downloads/tiktokaudio.js +158 -0
- package/davexcore/downloads/video.js +188 -0
- package/davexcore/downloads/ytdl.js +252 -0
- package/davexcore/downloads/ytdocplay.js +130 -0
- package/davexcore/downloads/ytdocvideo.js +95 -0
- package/davexcore/downloads/yts.js +64 -0
- package/davexcore/games/connect4.js +267 -0
- package/davexcore/games/dice.js +286 -0
- package/davexcore/games/eightball.js +24 -0
- package/davexcore/games/hangman.js +60 -0
- package/davexcore/games/rps.js +25 -0
- package/davexcore/games/ship.js +36 -0
- package/davexcore/games/slot.js +21 -0
- package/davexcore/games/tictactoe.js +263 -0
- package/davexcore/games/trivia.js +46 -0
- package/davexcore/games/wordchain.js +242 -0
- package/davexcore/group/addmember.js +101 -0
- package/davexcore/group/ban.js +63 -0
- package/davexcore/group/blockUnblock.js +177 -0
- package/davexcore/group/clear.js +196 -0
- package/davexcore/group/creategroup.js +43 -0
- package/davexcore/group/demote.js +115 -0
- package/davexcore/group/disappear.js +67 -0
- package/davexcore/group/groupinfo.js +167 -0
- package/davexcore/group/groupmanage.js +133 -0
- package/davexcore/group/hidetag.js +108 -0
- package/davexcore/group/joinrequests.js +145 -0
- package/davexcore/group/kick.js +92 -0
- package/davexcore/group/kickall.js +63 -0
- package/davexcore/group/leave.js +38 -0
- package/davexcore/group/linkgroup.js +63 -0
- package/davexcore/group/mute.js +57 -0
- package/davexcore/group/online.js +117 -0
- package/davexcore/group/pmblocker.js +65 -0
- package/davexcore/group/promote.js +93 -0
- package/davexcore/group/resetlink.js +57 -0
- package/davexcore/group/staff.js +99 -0
- package/davexcore/group/tag.js +111 -0
- package/davexcore/group/tagadmins.js +88 -0
- package/davexcore/group/tagall.js +99 -0
- package/davexcore/group/tagnotadmin.js +92 -0
- package/davexcore/group/topmembers.js +202 -0
- package/davexcore/group/unban.js +64 -0
- package/davexcore/group/unmute.js +45 -0
- package/davexcore/group/warn.js +83 -0
- package/davexcore/group/warnings.js +26 -0
- package/davexcore/media/anime.js +130 -0
- package/davexcore/media/attp.js +127 -0
- package/davexcore/media/design.js +52 -0
- package/davexcore/media/emojimix.js +105 -0
- package/davexcore/media/getpp.js +108 -0
- package/davexcore/media/image.js +87 -0
- package/davexcore/media/imageedit.js +329 -0
- package/davexcore/media/img-blur.js +70 -0
- package/davexcore/media/meme.js +35 -0
- package/davexcore/media/pies.js +53 -0
- package/davexcore/media/quotesticker.js +153 -0
- package/davexcore/media/remini.js +126 -0
- package/davexcore/media/removebg.js +114 -0
- package/davexcore/media/setpp.js +65 -0
- package/davexcore/media/shazam.js +251 -0
- package/davexcore/media/simage.js +74 -0
- package/davexcore/media/sticker.js +134 -0
- package/davexcore/media/stickercrop.js +133 -0
- package/davexcore/media/stickertelegram.js +133 -0
- package/davexcore/media/take.js +76 -0
- package/davexcore/media/textmaker.js +106 -0
- package/davexcore/media/toAudio.js +180 -0
- package/davexcore/media/togif.js +33 -0
- package/davexcore/media/toimg.js +26 -0
- package/davexcore/media/tomp4.js +34 -0
- package/davexcore/media/tostatus.js +160 -0
- package/davexcore/media/tts.js +47 -0
- package/davexcore/media/viewonce.js +59 -0
- package/davexcore/media/vn.js +67 -0
- package/davexcore/media/vv2.js +3 -0
- package/davexcore/media/wallpaper.js +89 -0
- package/davexcore/media/wasted.js +57 -0
- package/davexcore/misc/compliment.js +93 -0
- package/davexcore/misc/dare.js +47 -0
- package/davexcore/misc/fact.js +14 -0
- package/davexcore/misc/flirt.js +26 -0
- package/davexcore/misc/goodnight.js +33 -0
- package/davexcore/misc/insult.js +281 -0
- package/davexcore/misc/joke.js +66 -0
- package/davexcore/misc/misc.js +200 -0
- package/davexcore/misc/quote.js +22 -0
- package/davexcore/misc/roseday.js +24 -0
- package/davexcore/misc/shayari.js +62 -0
- package/davexcore/misc/simp.js +47 -0
- package/davexcore/misc/stupid.js +51 -0
- package/davexcore/misc/truth.js +146 -0
- package/davexcore/owner/alive.js +67 -0
- package/davexcore/owner/bio.js +49 -0
- package/davexcore/owner/broadcast.js +74 -0
- package/davexcore/owner/chanel.js +79 -0
- package/davexcore/owner/channelid.js +50 -0
- package/davexcore/owner/clearsession.js +86 -0
- package/davexcore/owner/help.js +649 -0
- package/davexcore/owner/hijack.js +69 -0
- package/davexcore/owner/menuManage.js +173 -0
- package/davexcore/owner/menuSettings.js +1 -0
- package/davexcore/owner/owner.js +17 -0
- package/davexcore/owner/pair.js +160 -0
- package/davexcore/owner/pinchat.js +44 -0
- package/davexcore/owner/ping.js +65 -0
- package/davexcore/owner/profilepic.js +61 -0
- package/davexcore/owner/resetmenuimage.js +16 -0
- package/davexcore/owner/setGroupStatus.js +315 -0
- package/davexcore/owner/setbotconfig.js +306 -0
- package/davexcore/owner/setfont.js +79 -0
- package/davexcore/owner/setowner.js +144 -0
- package/davexcore/owner/setprefix.js +131 -0
- package/davexcore/owner/settings.js +98 -0
- package/davexcore/owner/startupwelcome.js +94 -0
- package/davexcore/owner/sudo.js +138 -0
- package/davexcore/owner/update.js +282 -0
- package/davexcore/tmp/1772020249097.jpg +0 -0
- package/davexcore/utility/bible.js +239 -0
- package/davexcore/utility/cleartmp.js +107 -0
- package/davexcore/utility/delete.js +182 -0
- package/davexcore/utility/encrypt.js +99 -0
- package/davexcore/utility/ethicalhacking.js +108 -0
- package/davexcore/utility/fetch.js +127 -0
- package/davexcore/utility/github.js +85 -0
- package/davexcore/utility/google.js +79 -0
- package/davexcore/utility/join.js +52 -0
- package/davexcore/utility/lastseen.js +67 -0
- package/davexcore/utility/location.js +106 -0
- package/davexcore/utility/lyrics.js +54 -0
- package/davexcore/utility/movie.js +66 -0
- package/davexcore/utility/news.js +37 -0
- package/davexcore/utility/sports.js +403 -0
- package/davexcore/utility/ss.js +63 -0
- package/davexcore/utility/tinyurl.js +83 -0
- package/davexcore/utility/translate.js +101 -0
- package/davexcore/utility/url.js +112 -0
- package/davexcore/utility/vcf.js +84 -0
- package/davexcore/utility/weather.js +162 -0
- package/index.js +994 -0
- package/package.json +64 -0
|
@@ -0,0 +1,410 @@
|
|
|
1
|
+
const { getOwnerConfig, setOwnerConfig, getGroupConfig, setGroupConfig, parseToggleCommand } = require('../../Database/settingsStore');
|
|
2
|
+
const db = require('../../Database/database');
|
|
3
|
+
const { createFakeContact, getBotName } = require('../../davelib/fakeContact');
|
|
4
|
+
|
|
5
|
+
const originalMessages = new Map();
|
|
6
|
+
const MAX_STORED_MESSAGES = 5000;
|
|
7
|
+
const MESSAGE_RETENTION_MS = 604800000;
|
|
8
|
+
|
|
9
|
+
async function isAuthorized(sock, message) {
|
|
10
|
+
try {
|
|
11
|
+
const senderId = message.key.participant || message.key.remoteJid;
|
|
12
|
+
if (message.key.fromMe) return true;
|
|
13
|
+
return db.isSudo(senderId);
|
|
14
|
+
} catch {
|
|
15
|
+
return message.key.fromMe;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function normalizeOwnerConfig(raw) {
|
|
20
|
+
if (!raw || typeof raw !== 'object') {
|
|
21
|
+
return { gc: { enabled: true, mode: 'private' }, pm: { enabled: true, mode: 'private' } };
|
|
22
|
+
}
|
|
23
|
+
if (raw.gc && raw.pm) return raw;
|
|
24
|
+
const enabled = raw.enabled !== undefined ? raw.enabled : true;
|
|
25
|
+
const mode = raw.mode || 'private';
|
|
26
|
+
return { gc: { enabled, mode }, pm: { enabled, mode } };
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function getEffectiveConfig(chatId) {
|
|
30
|
+
const isGroup = chatId.endsWith('@g.us');
|
|
31
|
+
if (isGroup) {
|
|
32
|
+
if (db.hasGroupSetting(chatId, 'antiedit')) {
|
|
33
|
+
const groupConf = getGroupConfig(chatId, 'antiedit');
|
|
34
|
+
if (typeof groupConf === 'object' && groupConf.enabled !== undefined) {
|
|
35
|
+
return groupConf;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
const ownerRaw = getOwnerConfig('antiedit');
|
|
39
|
+
const ownerConf = normalizeOwnerConfig(ownerRaw);
|
|
40
|
+
return { enabled: ownerConf.gc.enabled, mode: ownerConf.gc.mode };
|
|
41
|
+
} else {
|
|
42
|
+
const ownerRaw = getOwnerConfig('antiedit');
|
|
43
|
+
const ownerConf = normalizeOwnerConfig(ownerRaw);
|
|
44
|
+
return { enabled: ownerConf.pm.enabled, mode: ownerConf.pm.mode };
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
async function antieditCommand(sock, chatId, message, args) {
|
|
49
|
+
const isGroup = chatId.endsWith('@g.us');
|
|
50
|
+
const senderId = message.key.participant || message.key.remoteJid;
|
|
51
|
+
const botName = getBotName();
|
|
52
|
+
const fake = createFakeContact(senderId);
|
|
53
|
+
|
|
54
|
+
if (isGroup) {
|
|
55
|
+
try {
|
|
56
|
+
const groupMetadata = await sock.groupMetadata(chatId);
|
|
57
|
+
const participant = groupMetadata.participants.find(p => p.id === senderId);
|
|
58
|
+
if (!participant?.admin && !message.key.fromMe && !db.isSudo(senderId)) {
|
|
59
|
+
return sock.sendMessage(chatId, {
|
|
60
|
+
text: `*${botName}*\nAdmin only command!`
|
|
61
|
+
}, { quoted: fake });
|
|
62
|
+
}
|
|
63
|
+
} catch {}
|
|
64
|
+
} else {
|
|
65
|
+
if (!await isAuthorized(sock, message)) {
|
|
66
|
+
return sock.sendMessage(chatId, {
|
|
67
|
+
text: `*${botName}*\nOwner only command!`
|
|
68
|
+
}, { quoted: fake });
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const ownerRaw = getOwnerConfig('antiedit');
|
|
73
|
+
const ownerConf = normalizeOwnerConfig(ownerRaw);
|
|
74
|
+
const sub = (args || '').trim().toLowerCase();
|
|
75
|
+
|
|
76
|
+
if (!sub) {
|
|
77
|
+
const { getPrefix } = require('../owner/setprefix');
|
|
78
|
+
const p = getPrefix();
|
|
79
|
+
let groupStatus = '';
|
|
80
|
+
if (isGroup) {
|
|
81
|
+
const gc = getEffectiveConfig(chatId);
|
|
82
|
+
groupStatus = `This Group: ${gc.enabled ? 'ON' : 'OFF'} (${gc.mode})\n`;
|
|
83
|
+
}
|
|
84
|
+
const helpText = `*${botName} ANTIEDIT*\n\n` +
|
|
85
|
+
`Groups: ${ownerConf.gc.enabled ? 'ON' : 'OFF'} (${ownerConf.gc.mode})\n` +
|
|
86
|
+
`PMs: ${ownerConf.pm.enabled ? 'ON' : 'OFF'} (${ownerConf.pm.mode})\n` +
|
|
87
|
+
`Tracked: ${originalMessages.size} messages\n\n` +
|
|
88
|
+
`*Commands:*\n` +
|
|
89
|
+
`${p}antiedit on — Enable all\n` +
|
|
90
|
+
`${p}antiedit off — Disable all\n` +
|
|
91
|
+
`${p}antiedit private — Notify in your DM\n` +
|
|
92
|
+
`${p}antiedit chat — Notify in same chat\n` +
|
|
93
|
+
`${p}antiedit both — Notify in DM + chat\n` +
|
|
94
|
+
`${p}antiedit gc off — Disable groups only\n` +
|
|
95
|
+
`${p}antiedit gc on — Enable groups only\n` +
|
|
96
|
+
`${p}antiedit pm off — Disable PMs only\n` +
|
|
97
|
+
`${p}antiedit pm on — Enable PMs only\n` +
|
|
98
|
+
`${p}antiedit status — Show status`;
|
|
99
|
+
|
|
100
|
+
await sock.sendMessage(chatId, { text: helpText }, { quoted: fake });
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
let responseText = '';
|
|
105
|
+
const parts = sub.split(/\s+/);
|
|
106
|
+
const scope = parts[0];
|
|
107
|
+
const action = parts[1] || '';
|
|
108
|
+
|
|
109
|
+
if (scope === 'gc' || scope === 'group' || scope === 'groups') {
|
|
110
|
+
const toggle = parseToggleCommand(action);
|
|
111
|
+
if (toggle === 'on') {
|
|
112
|
+
ownerConf.gc.enabled = true;
|
|
113
|
+
setOwnerConfig('antiedit', ownerConf);
|
|
114
|
+
responseText = `*${botName}*\nAntiEdit GROUPS: ON\nMode: ${ownerConf.gc.mode}`;
|
|
115
|
+
} else if (toggle === 'off') {
|
|
116
|
+
ownerConf.gc.enabled = false;
|
|
117
|
+
setOwnerConfig('antiedit', ownerConf);
|
|
118
|
+
responseText = `*${botName}*\nAntiEdit GROUPS: OFF`;
|
|
119
|
+
} else if (['private', 'prvt', 'priv', 'pm'].includes(action)) {
|
|
120
|
+
ownerConf.gc.enabled = true;
|
|
121
|
+
ownerConf.gc.mode = 'private';
|
|
122
|
+
setOwnerConfig('antiedit', ownerConf);
|
|
123
|
+
responseText = `*${botName}*\nAntiEdit GROUPS: PRIVATE\nEdit notifications sent to owner DM.`;
|
|
124
|
+
} else if (['chat', 'cht'].includes(action)) {
|
|
125
|
+
ownerConf.gc.enabled = true;
|
|
126
|
+
ownerConf.gc.mode = 'chat';
|
|
127
|
+
setOwnerConfig('antiedit', ownerConf);
|
|
128
|
+
responseText = `*${botName}*\nAntiEdit GROUPS: CHAT\nEdit notifications sent to same chat.`;
|
|
129
|
+
} else if (['both', 'all'].includes(action)) {
|
|
130
|
+
ownerConf.gc.enabled = true;
|
|
131
|
+
ownerConf.gc.mode = 'both';
|
|
132
|
+
setOwnerConfig('antiedit', ownerConf);
|
|
133
|
+
responseText = `*${botName}*\nAntiEdit GROUPS: BOTH\nEdit notifications sent to owner DM and chat.`;
|
|
134
|
+
} else {
|
|
135
|
+
responseText = `*${botName}*\nUsage: .antiedit gc on/off/private/chat/both`;
|
|
136
|
+
}
|
|
137
|
+
} else if (scope === 'pm' || scope === 'dm' || scope === 'pms' || scope === 'dms') {
|
|
138
|
+
const toggle = parseToggleCommand(action);
|
|
139
|
+
if (toggle === 'on') {
|
|
140
|
+
ownerConf.pm.enabled = true;
|
|
141
|
+
setOwnerConfig('antiedit', ownerConf);
|
|
142
|
+
responseText = `*${botName}*\nAntiEdit PMs: ON\nMode: ${ownerConf.pm.mode}`;
|
|
143
|
+
} else if (toggle === 'off') {
|
|
144
|
+
ownerConf.pm.enabled = false;
|
|
145
|
+
setOwnerConfig('antiedit', ownerConf);
|
|
146
|
+
responseText = `*${botName}*\nAntiEdit PMs: OFF`;
|
|
147
|
+
} else if (['private', 'prvt', 'priv'].includes(action)) {
|
|
148
|
+
ownerConf.pm.enabled = true;
|
|
149
|
+
ownerConf.pm.mode = 'private';
|
|
150
|
+
setOwnerConfig('antiedit', ownerConf);
|
|
151
|
+
responseText = `*${botName}*\nAntiEdit PMs: PRIVATE\nEdit notifications sent to owner DM.`;
|
|
152
|
+
} else if (['chat', 'cht'].includes(action)) {
|
|
153
|
+
ownerConf.pm.enabled = true;
|
|
154
|
+
ownerConf.pm.mode = 'chat';
|
|
155
|
+
setOwnerConfig('antiedit', ownerConf);
|
|
156
|
+
responseText = `*${botName}*\nAntiEdit PMs: CHAT\nEdit notifications sent to same chat.`;
|
|
157
|
+
} else if (['both', 'all'].includes(action)) {
|
|
158
|
+
ownerConf.pm.enabled = true;
|
|
159
|
+
ownerConf.pm.mode = 'both';
|
|
160
|
+
setOwnerConfig('antiedit', ownerConf);
|
|
161
|
+
responseText = `*${botName}*\nAntiEdit PMs: BOTH\nEdit notifications sent to owner DM and chat.`;
|
|
162
|
+
} else {
|
|
163
|
+
responseText = `*${botName}*\nUsage: .antiedit pm on/off/private/chat/both`;
|
|
164
|
+
}
|
|
165
|
+
} else if (scope === 'status') {
|
|
166
|
+
responseText = `*${botName} ANTIEDIT STATUS*\n\n` +
|
|
167
|
+
`Groups: ${ownerConf.gc.enabled ? 'ON' : 'OFF'} (${ownerConf.gc.mode})\n` +
|
|
168
|
+
`PMs: ${ownerConf.pm.enabled ? 'ON' : 'OFF'} (${ownerConf.pm.mode})\n` +
|
|
169
|
+
`Tracked: ${originalMessages.size} messages`;
|
|
170
|
+
} else {
|
|
171
|
+
const toggle = parseToggleCommand(scope);
|
|
172
|
+
if (toggle === 'on') {
|
|
173
|
+
ownerConf.gc.enabled = true;
|
|
174
|
+
ownerConf.pm.enabled = true;
|
|
175
|
+
setOwnerConfig('antiedit', ownerConf);
|
|
176
|
+
responseText = `*${botName}*\nAntiEdit ENABLED (Groups + PMs)\nMode: ${ownerConf.gc.mode}`;
|
|
177
|
+
} else if (toggle === 'off') {
|
|
178
|
+
ownerConf.gc.enabled = false;
|
|
179
|
+
ownerConf.pm.enabled = false;
|
|
180
|
+
setOwnerConfig('antiedit', ownerConf);
|
|
181
|
+
responseText = `*${botName}*\nAntiEdit DISABLED (Groups + PMs)`;
|
|
182
|
+
} else if (['private', 'prvt', 'priv'].includes(scope)) {
|
|
183
|
+
ownerConf.gc.enabled = true;
|
|
184
|
+
ownerConf.gc.mode = 'private';
|
|
185
|
+
ownerConf.pm.enabled = true;
|
|
186
|
+
ownerConf.pm.mode = 'private';
|
|
187
|
+
setOwnerConfig('antiedit', ownerConf);
|
|
188
|
+
responseText = `*${botName}*\nAntiEdit PRIVATE (all chats).\nEdit notifications → your own DM.`;
|
|
189
|
+
} else if (['chat', 'cht'].includes(scope)) {
|
|
190
|
+
ownerConf.gc.enabled = true;
|
|
191
|
+
ownerConf.gc.mode = 'chat';
|
|
192
|
+
ownerConf.pm.enabled = true;
|
|
193
|
+
ownerConf.pm.mode = 'chat';
|
|
194
|
+
setOwnerConfig('antiedit', ownerConf);
|
|
195
|
+
responseText = `*${botName}*\nAntiEdit CHAT (all chats).\nEdit notifications → same chat where edit happened.`;
|
|
196
|
+
} else if (['both', 'all'].includes(scope)) {
|
|
197
|
+
ownerConf.gc.enabled = true;
|
|
198
|
+
ownerConf.gc.mode = 'both';
|
|
199
|
+
ownerConf.pm.enabled = true;
|
|
200
|
+
ownerConf.pm.mode = 'both';
|
|
201
|
+
setOwnerConfig('antiedit', ownerConf);
|
|
202
|
+
responseText = `*${botName}*\nAntiEdit BOTH (all chats).\nEdit notifications → your DM + same chat.`;
|
|
203
|
+
} else {
|
|
204
|
+
responseText = `*${botName}*\nInvalid! Use:\n` +
|
|
205
|
+
`.antiedit on/off\n` +
|
|
206
|
+
`.antiedit private/chat/both\n` +
|
|
207
|
+
`.antiedit gc on/off - Toggle groups only\n` +
|
|
208
|
+
`.antiedit pm on/off - Toggle PMs only`;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
await sock.sendMessage(chatId, { text: responseText }, { quoted: fake });
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
function storeOriginalMessage(message) {
|
|
216
|
+
try {
|
|
217
|
+
if (!message?.key?.id) return;
|
|
218
|
+
|
|
219
|
+
const chatId = message.key.remoteJid;
|
|
220
|
+
if (!chatId || chatId === 'status@broadcast') return;
|
|
221
|
+
|
|
222
|
+
let text = '';
|
|
223
|
+
const msg = message.message;
|
|
224
|
+
if (!msg) return;
|
|
225
|
+
|
|
226
|
+
if (msg.protocolMessage || msg.senderKeyDistributionMessage) return;
|
|
227
|
+
|
|
228
|
+
if (msg.conversation) {
|
|
229
|
+
text = msg.conversation;
|
|
230
|
+
} else if (msg.extendedTextMessage?.text) {
|
|
231
|
+
text = msg.extendedTextMessage.text;
|
|
232
|
+
} else if (msg.imageMessage?.caption) {
|
|
233
|
+
text = msg.imageMessage.caption;
|
|
234
|
+
} else if (msg.videoMessage?.caption) {
|
|
235
|
+
text = msg.videoMessage.caption;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
if (!text) return;
|
|
239
|
+
|
|
240
|
+
if (originalMessages.size >= MAX_STORED_MESSAGES) {
|
|
241
|
+
const firstKey = originalMessages.keys().next().value;
|
|
242
|
+
originalMessages.delete(firstKey);
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
originalMessages.set(message.key.id, {
|
|
246
|
+
text,
|
|
247
|
+
sender: message.key.participant || message.key.remoteJid,
|
|
248
|
+
chatId,
|
|
249
|
+
timestamp: Date.now(),
|
|
250
|
+
pushName: message.pushName || 'Unknown'
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
} catch (err) {
|
|
254
|
+
console.error('Error storing original message:', err.message, 'Line:', err.stack?.split('\n')[1]);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
async function handleEditedMessage(sock, editedMessage) {
|
|
259
|
+
try {
|
|
260
|
+
const chatId = editedMessage.key?.remoteJid;
|
|
261
|
+
if (!chatId) {
|
|
262
|
+
const msg = editedMessage.message || editedMessage.update?.message;
|
|
263
|
+
const protoKey = msg?.protocolMessage?.key;
|
|
264
|
+
if (protoKey?.id) {
|
|
265
|
+
const orig = originalMessages.get(protoKey.id);
|
|
266
|
+
if (orig?.chatId) {
|
|
267
|
+
editedMessage = { ...editedMessage, key: { ...editedMessage.key, remoteJid: orig.chatId } };
|
|
268
|
+
} else {
|
|
269
|
+
return;
|
|
270
|
+
}
|
|
271
|
+
} else {
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
const resolvedChatId = editedMessage.key.remoteJid;
|
|
277
|
+
|
|
278
|
+
let messageId = editedMessage.key.id;
|
|
279
|
+
|
|
280
|
+
const msg = editedMessage.message;
|
|
281
|
+
if (msg?.protocolMessage?.key?.id) {
|
|
282
|
+
messageId = msg.protocolMessage.key.id;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
if (editedMessage.update?.message?.protocolMessage?.key?.id) {
|
|
286
|
+
messageId = editedMessage.update.message.protocolMessage.key.id;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
const original = originalMessages.get(messageId);
|
|
290
|
+
if (!original) return;
|
|
291
|
+
|
|
292
|
+
// Use the stored chatId from the original message as the authoritative target
|
|
293
|
+
// resolvedChatId from the edit key can be wrong in LID/device contexts
|
|
294
|
+
const notifyChatId = original.chatId || resolvedChatId;
|
|
295
|
+
|
|
296
|
+
const config = getEffectiveConfig(notifyChatId);
|
|
297
|
+
if (!config?.enabled) return;
|
|
298
|
+
|
|
299
|
+
let newText = '';
|
|
300
|
+
|
|
301
|
+
if (msg?.protocolMessage?.editedMessage) {
|
|
302
|
+
const edited = msg.protocolMessage.editedMessage;
|
|
303
|
+
if (edited.conversation) {
|
|
304
|
+
newText = edited.conversation;
|
|
305
|
+
} else if (edited.extendedTextMessage?.text) {
|
|
306
|
+
newText = edited.extendedTextMessage.text;
|
|
307
|
+
} else if (edited.imageMessage?.caption) {
|
|
308
|
+
newText = edited.imageMessage.caption;
|
|
309
|
+
} else if (edited.videoMessage?.caption) {
|
|
310
|
+
newText = edited.videoMessage.caption;
|
|
311
|
+
}
|
|
312
|
+
} else if (msg?.editedMessage) {
|
|
313
|
+
const em = msg.editedMessage.message || msg.editedMessage;
|
|
314
|
+
if (em.conversation) {
|
|
315
|
+
newText = em.conversation;
|
|
316
|
+
} else if (em.extendedTextMessage?.text) {
|
|
317
|
+
newText = em.extendedTextMessage.text;
|
|
318
|
+
} else if (em.imageMessage?.caption) {
|
|
319
|
+
newText = em.imageMessage.caption;
|
|
320
|
+
} else if (em.videoMessage?.caption) {
|
|
321
|
+
newText = em.videoMessage.caption;
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
if (!newText && editedMessage.update?.message) {
|
|
326
|
+
const updateMsg = editedMessage.update.message;
|
|
327
|
+
if (updateMsg.conversation) {
|
|
328
|
+
newText = updateMsg.conversation;
|
|
329
|
+
} else if (updateMsg.extendedTextMessage?.text) {
|
|
330
|
+
newText = updateMsg.extendedTextMessage.text;
|
|
331
|
+
} else if (updateMsg.imageMessage?.caption) {
|
|
332
|
+
newText = updateMsg.imageMessage.caption;
|
|
333
|
+
} else if (updateMsg.videoMessage?.caption) {
|
|
334
|
+
newText = updateMsg.videoMessage.caption;
|
|
335
|
+
} else if (updateMsg.protocolMessage?.editedMessage) {
|
|
336
|
+
const pe = updateMsg.protocolMessage.editedMessage;
|
|
337
|
+
newText = pe.conversation || pe.extendedTextMessage?.text || pe.imageMessage?.caption || pe.videoMessage?.caption || '';
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
if (!newText && msg) {
|
|
342
|
+
newText = msg.conversation || msg.extendedTextMessage?.text || msg.imageMessage?.caption || msg.videoMessage?.caption || '';
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
if (!newText || newText === original.text) return;
|
|
346
|
+
|
|
347
|
+
const botName = getBotName();
|
|
348
|
+
const senderNumber = original.sender.split('@')[0];
|
|
349
|
+
const time = new Date().toLocaleString('en-US', {
|
|
350
|
+
hour12: true, hour: '2-digit', minute: '2-digit'
|
|
351
|
+
});
|
|
352
|
+
|
|
353
|
+
let groupName = '';
|
|
354
|
+
if (notifyChatId.endsWith('@g.us')) {
|
|
355
|
+
try {
|
|
356
|
+
const metadata = await sock.groupMetadata(notifyChatId);
|
|
357
|
+
groupName = metadata.subject;
|
|
358
|
+
} catch {}
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
let notificationText = `*${botName} - MESSAGE EDITED*\n\n` +
|
|
362
|
+
`By: @${senderNumber}\n` +
|
|
363
|
+
`Name: ${original.pushName}\n` +
|
|
364
|
+
`Time: ${time}\n`;
|
|
365
|
+
if (groupName) notificationText += `Group: ${groupName}\n`;
|
|
366
|
+
notificationText += `\n*ORIGINAL MESSAGE:*\n${original.text.substring(0, 500)}${original.text.length > 500 ? '...' : ''}\n\n` +
|
|
367
|
+
`*EDITED TO:*\n${newText.substring(0, 500)}${newText.length > 500 ? '...' : ''}`;
|
|
368
|
+
|
|
369
|
+
const ownerNumber = sock.user.id.split(':')[0] + '@s.whatsapp.net';
|
|
370
|
+
const fake = createFakeContact(original.sender);
|
|
371
|
+
const mode = config.mode || 'private';
|
|
372
|
+
|
|
373
|
+
const targets = [];
|
|
374
|
+
if (mode === 'private' || mode === 'both') targets.push(ownerNumber);
|
|
375
|
+
if ((mode === 'chat' || mode === 'both') && notifyChatId !== ownerNumber) targets.push(notifyChatId);
|
|
376
|
+
if (targets.length === 0) targets.push(ownerNumber);
|
|
377
|
+
|
|
378
|
+
for (const target of targets) {
|
|
379
|
+
await sock.sendMessage(target, {
|
|
380
|
+
text: notificationText,
|
|
381
|
+
mentions: [original.sender]
|
|
382
|
+
}, { quoted: fake });
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
originalMessages.set(messageId, {
|
|
386
|
+
...original,
|
|
387
|
+
text: newText,
|
|
388
|
+
timestamp: Date.now()
|
|
389
|
+
});
|
|
390
|
+
|
|
391
|
+
} catch (err) {
|
|
392
|
+
console.error('Error handling edited message:', err.message, 'Line:', err.stack?.split('\n')[1]);
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
setInterval(() => {
|
|
397
|
+
const cutoff = Date.now() - MESSAGE_RETENTION_MS;
|
|
398
|
+
for (const [key, value] of originalMessages.entries()) {
|
|
399
|
+
if (value.timestamp < cutoff) {
|
|
400
|
+
originalMessages.delete(key);
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
}, 3600000);
|
|
404
|
+
|
|
405
|
+
module.exports = {
|
|
406
|
+
antieditCommand,
|
|
407
|
+
storeOriginalMessage,
|
|
408
|
+
handleEditedMessage,
|
|
409
|
+
handleMessageUpdate: handleEditedMessage
|
|
410
|
+
};
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
const { getGroupConfig, setGroupConfig, deleteGroupToggle } = require('../../Database/settingsStore');
|
|
2
|
+
const isAdmin = require('../../davelib/isAdmin');
|
|
3
|
+
const db = require('../../Database/database');
|
|
4
|
+
const { createFakeContact, getBotName } = require('../../davelib/fakeContact');
|
|
5
|
+
|
|
6
|
+
async function antifilesCommand(sock, chatId, userMessage, senderId, isSenderAdmin, message) {
|
|
7
|
+
try {
|
|
8
|
+
const fake = createFakeContact(senderId);
|
|
9
|
+
const botName = getBotName();
|
|
10
|
+
|
|
11
|
+
if (!isSenderAdmin && !message?.key?.fromMe && !db.isSudo(senderId)) {
|
|
12
|
+
await sock.sendMessage(chatId, { text: `*${botName}*\nAdmin only command!` }, { quoted: fake });
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const args = userMessage.slice(10).toLowerCase().trim().split(' ');
|
|
17
|
+
const action = args[0];
|
|
18
|
+
|
|
19
|
+
if (!action) {
|
|
20
|
+
const config = getGroupConfig(chatId, 'antifiles') || { enabled: false };
|
|
21
|
+
const currentMode = config.enabled ? (config.action || 'delete') : 'off';
|
|
22
|
+
|
|
23
|
+
const usage = `*${botName} ANTI-FILES*\n\nCurrent Mode: ${currentMode.toUpperCase()}\n\n*Commands:*\n.antifiles off - Disable\n.antifiles delete - Delete files\n.antifiles warn - Delete + warn\n.antifiles kick - Delete + kick`;
|
|
24
|
+
|
|
25
|
+
await sock.sendMessage(chatId, { text: usage }, { quoted: fake });
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const validModes = ["off", "delete", "warn", "kick"];
|
|
30
|
+
|
|
31
|
+
if (!validModes.includes(action)) {
|
|
32
|
+
await sock.sendMessage(chatId, {
|
|
33
|
+
text: `*${botName}*\nInvalid mode! Use: off, delete, warn, kick`
|
|
34
|
+
}, { quoted: fake });
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
if (action === 'off') {
|
|
39
|
+
deleteGroupToggle(chatId, 'antifiles');
|
|
40
|
+
await sock.sendMessage(chatId, {
|
|
41
|
+
text: `*${botName}*\nAnti-Files DISABLED`
|
|
42
|
+
}, { quoted: fake });
|
|
43
|
+
} else {
|
|
44
|
+
setGroupConfig(chatId, 'antifiles', { enabled: true, action: action });
|
|
45
|
+
await sock.sendMessage(chatId, {
|
|
46
|
+
text: `*${botName}*\nAnti-Files: ${action.toUpperCase()}`
|
|
47
|
+
}, { quoted: fake });
|
|
48
|
+
}
|
|
49
|
+
} catch (error) {
|
|
50
|
+
console.error('Error in antifiles command:', error.message, 'Line:', error.stack?.split('\n')[1]);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
async function handleFilesDetection(sock, chatId, message, senderId) {
|
|
55
|
+
try {
|
|
56
|
+
const hasFile = message.message?.documentMessage ||
|
|
57
|
+
message.message?.imageMessage ||
|
|
58
|
+
message.message?.videoMessage ||
|
|
59
|
+
message.message?.audioMessage ||
|
|
60
|
+
message.message?.stickerMessage ||
|
|
61
|
+
message.message?.pttMessage;
|
|
62
|
+
|
|
63
|
+
if (!hasFile) return;
|
|
64
|
+
if (!chatId.endsWith('@g.us')) return;
|
|
65
|
+
|
|
66
|
+
const config = getGroupConfig(chatId, 'antifiles');
|
|
67
|
+
if (!config || !config.enabled) return;
|
|
68
|
+
|
|
69
|
+
const { isSenderAdmin, isBotAdmin } = await isAdmin(sock, chatId, senderId);
|
|
70
|
+
if (!isBotAdmin || isSenderAdmin || db.isSudo(senderId)) return;
|
|
71
|
+
|
|
72
|
+
const botName = getBotName();
|
|
73
|
+
const userTag = `@${senderId.split("@")[0]}`;
|
|
74
|
+
|
|
75
|
+
try {
|
|
76
|
+
await sock.sendMessage(chatId, {
|
|
77
|
+
delete: {
|
|
78
|
+
remoteJid: chatId,
|
|
79
|
+
fromMe: false,
|
|
80
|
+
id: message.key.id,
|
|
81
|
+
participant: senderId
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
} catch (e) {
|
|
85
|
+
console.error("[ANTI-FILES] Delete failed:", e.message);
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
if (config.action === 'kick') {
|
|
90
|
+
await sock.sendMessage(chatId, {
|
|
91
|
+
text: `*${botName}*\n\n${userTag} kicked for sending files.`,
|
|
92
|
+
mentions: [senderId]
|
|
93
|
+
});
|
|
94
|
+
await sock.groupParticipantsUpdate(chatId, [senderId], 'remove');
|
|
95
|
+
} else if (config.action === 'warn') {
|
|
96
|
+
await sock.sendMessage(chatId, {
|
|
97
|
+
text: `*${botName}*\n\n${userTag}, files are not allowed!`,
|
|
98
|
+
mentions: [senderId]
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
} catch (error) {
|
|
102
|
+
console.error('Error in handleFilesDetection:', error.message, 'Line:', error.stack?.split('\n')[1]);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
module.exports = {
|
|
107
|
+
antifilesCommand,
|
|
108
|
+
handleFilesDetection
|
|
109
|
+
};
|