@celestial-community/baileys 0.0.1-security → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of @celestial-community/baileys might be problematic. Click here for more details.
- package/WAProto/index.js +138933 -0
- package/engine-requirements.js +10 -0
- package/lib/Defaults/baileys-version.json +7 -0
- package/lib/Defaults/index.js +157 -0
- package/lib/Defaults/phonenumber-mcc.json +223 -0
- package/lib/Signal/Group/ciphertext-message.js +15 -0
- package/lib/Signal/Group/group-session-builder.js +94 -0
- package/lib/Signal/Group/group_cipher.js +118 -0
- package/lib/Signal/Group/index.js +138 -0
- package/lib/Signal/Group/keyhelper.js +75 -0
- package/lib/Signal/Group/queue-job.js +54 -0
- package/lib/Signal/Group/sender-chain-key.js +39 -0
- package/lib/Signal/Group/sender-key-distribution-message.js +71 -0
- package/lib/Signal/Group/sender-key-message.js +76 -0
- package/lib/Signal/Group/sender-key-name.js +50 -0
- package/lib/Signal/Group/sender-key-record.js +65 -0
- package/lib/Signal/Group/sender-key-state.js +114 -0
- package/lib/Signal/Group/sender-message-key.js +33 -0
- package/lib/Signal/libsignal.js +204 -0
- package/lib/Signal/lid-mapping.js +267 -0
- package/lib/Socket/Client/abstract-socket-client.js +13 -0
- package/lib/Socket/Client/index.js +32 -0
- package/lib/Socket/Client/mobile-socket-client.js +82 -0
- package/lib/Socket/Client/web-socket-client.js +89 -0
- package/lib/Socket/Denzy-ZeroDay.js +805 -0
- package/lib/Socket/business.js +279 -0
- package/lib/Socket/chats.js +1169 -0
- package/lib/Socket/community.d.ts +120 -0
- package/lib/Socket/community.js +388 -0
- package/lib/Socket/graphql.js +1122 -0
- package/lib/Socket/groups.js +345 -0
- package/lib/Socket/index.js +22 -0
- package/lib/Socket/interop.js +265 -0
- package/lib/Socket/lid-mapping.js +111 -0
- package/lib/Socket/messages-recv.js +1385 -0
- package/lib/Socket/messages-send.js +956 -0
- package/lib/Socket/mex.js +69 -0
- package/lib/Socket/newsletter.js +424 -0
- package/lib/Socket/privacy.js +229 -0
- package/lib/Socket/registration.js +190 -0
- package/lib/Socket/socket.js +783 -0
- package/lib/Socket/username.d.ts +185 -0
- package/lib/Socket/username.js +168 -0
- package/lib/Socket/usync.js +80 -0
- package/lib/Store/index.js +14 -0
- package/lib/Store/keyed-db.js +158 -0
- package/lib/Store/make-cache-manager-store.js +88 -0
- package/lib/Store/make-in-memory-store.js +484 -0
- package/lib/Store/make-ordered-dictionary.js +78 -0
- package/lib/Store/object-repository.js +27 -0
- package/lib/Types/Auth.js +2 -0
- package/lib/Types/Call.js +2 -0
- package/lib/Types/Chat.js +10 -0
- package/lib/Types/Contact.js +2 -0
- package/lib/Types/Events.js +2 -0
- package/lib/Types/GroupMetadata.js +2 -0
- package/lib/Types/Label.js +27 -0
- package/lib/Types/LabelAssociation.js +9 -0
- package/lib/Types/Message.js +14 -0
- package/lib/Types/MexUpdates.js +19 -0
- package/lib/Types/Newsletter.js +38 -0
- package/lib/Types/Product.js +2 -0
- package/lib/Types/RichType.js +30 -0
- package/lib/Types/Signal.js +2 -0
- package/lib/Types/Socket.js +2 -0
- package/lib/Types/State.js +2 -0
- package/lib/Types/USync.js +2 -0
- package/lib/Types/index.js +58 -0
- package/lib/Utils/anti-ban.js +339 -0
- package/lib/Utils/anti-delete.d.ts +158 -0
- package/lib/Utils/anti-delete.js +293 -0
- package/lib/Utils/antiban-presets.js +91 -0
- package/lib/Utils/antiban-profiles.js +43 -0
- package/lib/Utils/auth-utils.js +210 -0
- package/lib/Utils/baileys-event-stream.js +66 -0
- package/lib/Utils/browser-utils.js +52 -0
- package/lib/Utils/business.js +261 -0
- package/lib/Utils/chat-control.d.ts +113 -0
- package/lib/Utils/chat-control.js +230 -0
- package/lib/Utils/chat-utils.js +922 -0
- package/lib/Utils/companion-reg-client-utils.js +37 -0
- package/lib/Utils/contact-graph-warmer.js +208 -0
- package/lib/Utils/crypto.js +196 -0
- package/lib/Utils/decode-wa-message.js +208 -0
- package/lib/Utils/delivery-tracker.js +110 -0
- package/lib/Utils/device-fingerprint.js +135 -0
- package/lib/Utils/event-buffer.js +531 -0
- package/lib/Utils/generics.js +571 -0
- package/lib/Utils/group-operation-guard.js +147 -0
- package/lib/Utils/health-monitor.js +207 -0
- package/lib/Utils/history.js +122 -0
- package/lib/Utils/human-entropy.js +226 -0
- package/lib/Utils/identity-change-handler.js +72 -0
- package/lib/Utils/index.js +83 -0
- package/lib/Utils/interactive-message.d.ts +139 -0
- package/lib/Utils/interactive-message.js +273 -0
- package/lib/Utils/legitimacy-signal-injector.js +180 -0
- package/lib/Utils/link-preview.js +106 -0
- package/lib/Utils/logger.d.ts +13 -0
- package/lib/Utils/logger.js +9 -0
- package/lib/Utils/lt-hash.js +54 -0
- package/lib/Utils/make-mutex.js +41 -0
- package/lib/Utils/message-composer.d.ts +106 -0
- package/lib/Utils/message-composer.js +721 -0
- package/lib/Utils/message-retry-manager.d.ts +88 -0
- package/lib/Utils/message-retry-manager.js +160 -0
- package/lib/Utils/message-search.d.ts +52 -0
- package/lib/Utils/message-search.js +226 -0
- package/lib/Utils/messages-media.js +899 -0
- package/lib/Utils/messages.js +2698 -0
- package/lib/Utils/noise-handler.js +175 -0
- package/lib/Utils/offline-node-processor.js +45 -0
- package/lib/Utils/pre-key-manager.js +131 -0
- package/lib/Utils/presence-choreographer.js +438 -0
- package/lib/Utils/process-message.js +423 -0
- package/lib/Utils/rate-limiter.js +232 -0
- package/lib/Utils/reconnect-throttle.js +157 -0
- package/lib/Utils/reply-ratio-guard.js +137 -0
- package/lib/Utils/reporting-utils.js +307 -0
- package/lib/Utils/retry-reason-tracker.js +140 -0
- package/lib/Utils/rich-message-utils.d.ts +48 -0
- package/lib/Utils/rich-message-utils.js +400 -0
- package/lib/Utils/rich-response-utils.js +461 -0
- package/lib/Utils/scheduling.d.ts +135 -0
- package/lib/Utils/scheduling.js +246 -0
- package/lib/Utils/session-fingerprint.js +226 -0
- package/lib/Utils/session-stability.js +224 -0
- package/lib/Utils/signal.js +188 -0
- package/lib/Utils/stanza-ack.js +38 -0
- package/lib/Utils/state-manager.js +91 -0
- package/lib/Utils/status-posting.d.ts +81 -0
- package/lib/Utils/status-posting.js +187 -0
- package/lib/Utils/stealth-connect.js +124 -0
- package/lib/Utils/sync-action-utils.js +55 -0
- package/lib/Utils/tc-token-utils.js +171 -0
- package/lib/Utils/templates.d.ts +54 -0
- package/lib/Utils/templates.js +244 -0
- package/lib/Utils/timelock-guard.js +162 -0
- package/lib/Utils/use-mongo-file-auth-state.d.ts +6 -0
- package/lib/Utils/use-mongo-file-auth-state.js +81 -0
- package/lib/Utils/use-multi-file-auth-state.js +125 -0
- package/lib/Utils/use-single-file-auth-state.d.ts +13 -0
- package/lib/Utils/use-single-file-auth-state.js +86 -0
- package/lib/Utils/use-sqlite-auth-state.js +187 -0
- package/lib/Utils/vCard.d.ts +71 -0
- package/lib/Utils/vCard.js +196 -0
- package/lib/Utils/validate-connection.js +253 -0
- package/lib/Utils/warmup.js +154 -0
- package/lib/WABinary/constants.js +1303 -0
- package/lib/WABinary/decode.js +270 -0
- package/lib/WABinary/encode.js +279 -0
- package/lib/WABinary/generic-utils.js +223 -0
- package/lib/WABinary/index.js +34 -0
- package/lib/WABinary/jid-utils.js +84 -0
- package/lib/WABinary/types.js +2 -0
- package/lib/WAM/BinaryInfo.js +13 -0
- package/lib/WAM/constants.js +15254 -0
- package/lib/WAM/encode.js +149 -0
- package/lib/WAM/index.js +32 -0
- package/lib/WAUSync/Protocols/USyncContactProtocol.js +37 -0
- package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +71 -0
- package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +32 -0
- package/lib/WAUSync/Protocols/USyncStatusProtocol.js +49 -0
- package/lib/WAUSync/Protocols/USyncUsernameProtocol.js +23 -0
- package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js +58 -0
- package/lib/WAUSync/Protocols/UsyncLIDProtocol.js +24 -0
- package/lib/WAUSync/Protocols/index.js +34 -0
- package/lib/WAUSync/USyncQuery.js +99 -0
- package/lib/WAUSync/USyncUser.js +26 -0
- package/lib/WAUSync/USyncUsernameProtocol.d.ts +9 -0
- package/lib/WAUSync/USyncUsernameProtocol.js +37 -0
- package/lib/WAUSync/index.js +32 -0
- package/lib/index.js +59 -0
- package/package.json +105 -5
- package/README.md +0 -5
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Anti-Delete / Message Store untuk Baileys-Joss
|
|
3
|
+
*
|
|
4
|
+
* Fitur untuk menyimpan dan recover deleted messages
|
|
5
|
+
*
|
|
6
|
+
* @module anti-delete
|
|
7
|
+
*/
|
|
8
|
+
import type { WAMessage, WAMessageKey } from '../Types';
|
|
9
|
+
export interface StoredMessage {
|
|
10
|
+
/** Original message */
|
|
11
|
+
message: WAMessage;
|
|
12
|
+
/** Timestamp disimpan */
|
|
13
|
+
storedAt: number;
|
|
14
|
+
/** Sudah dihapus */
|
|
15
|
+
isDeleted: boolean;
|
|
16
|
+
/** Timestamp dihapus */
|
|
17
|
+
deletedAt?: number;
|
|
18
|
+
/** Siapa yang menghapus */
|
|
19
|
+
deletedBy?: string;
|
|
20
|
+
}
|
|
21
|
+
export interface DeletedMessageInfo {
|
|
22
|
+
/** Original message sebelum dihapus */
|
|
23
|
+
originalMessage: WAMessage;
|
|
24
|
+
/** Key dari message yang dihapus */
|
|
25
|
+
key: WAMessageKey;
|
|
26
|
+
/** Timestamp dihapus */
|
|
27
|
+
deletedAt: number;
|
|
28
|
+
/** Siapa yang menghapus (participant untuk group) */
|
|
29
|
+
deletedBy?: string;
|
|
30
|
+
/** Apakah dihapus oleh pengirim (delete for everyone) */
|
|
31
|
+
isRevokedBySender: boolean;
|
|
32
|
+
}
|
|
33
|
+
export interface MessageStoreOptions {
|
|
34
|
+
/** Max messages per chat */
|
|
35
|
+
maxMessagesPerChat?: number;
|
|
36
|
+
/** TTL dalam ms (default 24 jam) */
|
|
37
|
+
ttl?: number;
|
|
38
|
+
/** Auto cleanup interval dalam ms */
|
|
39
|
+
cleanupInterval?: number;
|
|
40
|
+
}
|
|
41
|
+
export declare class MessageStore {
|
|
42
|
+
private store;
|
|
43
|
+
private deletedMessages;
|
|
44
|
+
private options;
|
|
45
|
+
private cleanupTimer?;
|
|
46
|
+
constructor(options?: MessageStoreOptions);
|
|
47
|
+
private startCleanup;
|
|
48
|
+
/**
|
|
49
|
+
* Stop cleanup timer
|
|
50
|
+
*/
|
|
51
|
+
stopCleanup(): void;
|
|
52
|
+
/**
|
|
53
|
+
* Cleanup old messages
|
|
54
|
+
*/
|
|
55
|
+
cleanup(): void;
|
|
56
|
+
/**
|
|
57
|
+
* Get store key dari message key
|
|
58
|
+
*/
|
|
59
|
+
private getKey;
|
|
60
|
+
/**
|
|
61
|
+
* Store message
|
|
62
|
+
*/
|
|
63
|
+
storeMessage(message: WAMessage): void;
|
|
64
|
+
/**
|
|
65
|
+
* Store multiple messages
|
|
66
|
+
*/
|
|
67
|
+
storeMessages(messages: WAMessage[]): void;
|
|
68
|
+
/**
|
|
69
|
+
* Get stored message
|
|
70
|
+
*/
|
|
71
|
+
getMessage(key: WAMessageKey): StoredMessage | undefined;
|
|
72
|
+
/**
|
|
73
|
+
* Get original message (untuk anti-delete)
|
|
74
|
+
*/
|
|
75
|
+
getOriginalMessage(key: WAMessageKey): WAMessage | undefined;
|
|
76
|
+
/**
|
|
77
|
+
* Mark message as deleted dan store info
|
|
78
|
+
*/
|
|
79
|
+
markAsDeleted(key: WAMessageKey, deletedBy?: string): DeletedMessageInfo | null;
|
|
80
|
+
/**
|
|
81
|
+
* Get deleted message info
|
|
82
|
+
*/
|
|
83
|
+
getDeletedMessage(key: WAMessageKey): DeletedMessageInfo | undefined;
|
|
84
|
+
/**
|
|
85
|
+
* Get all deleted messages
|
|
86
|
+
*/
|
|
87
|
+
getAllDeletedMessages(): DeletedMessageInfo[];
|
|
88
|
+
/**
|
|
89
|
+
* Get deleted messages by chat
|
|
90
|
+
*/
|
|
91
|
+
getDeletedMessagesByChat(chatId: string): DeletedMessageInfo[];
|
|
92
|
+
/**
|
|
93
|
+
* Get all messages in chat
|
|
94
|
+
*/
|
|
95
|
+
getChatMessages(chatId: string): WAMessage[];
|
|
96
|
+
/**
|
|
97
|
+
* Get chat IDs
|
|
98
|
+
*/
|
|
99
|
+
getChatIds(): string[];
|
|
100
|
+
/**
|
|
101
|
+
* Get stats
|
|
102
|
+
*/
|
|
103
|
+
getStats(): {
|
|
104
|
+
totalChats: number;
|
|
105
|
+
totalMessages: number;
|
|
106
|
+
totalDeleted: number;
|
|
107
|
+
};
|
|
108
|
+
/**
|
|
109
|
+
* Clear all
|
|
110
|
+
*/
|
|
111
|
+
clear(): void;
|
|
112
|
+
/**
|
|
113
|
+
* Clear chat
|
|
114
|
+
*/
|
|
115
|
+
clearChat(chatId: string): void;
|
|
116
|
+
/**
|
|
117
|
+
* Get all messages in all chats (compatibility for bot saving)
|
|
118
|
+
*/
|
|
119
|
+
getAllMessages(): {
|
|
120
|
+
[jid: string]: WAMessage[];
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Check apakah message adalah delete/revoke message
|
|
125
|
+
*/
|
|
126
|
+
export declare const isDeleteMessage: (message: WAMessage) => boolean;
|
|
127
|
+
/**
|
|
128
|
+
* Get deleted message key dari revoke message
|
|
129
|
+
*/
|
|
130
|
+
export declare const getDeletedMessageKey: (message: WAMessage) => WAMessageKey | null;
|
|
131
|
+
/**
|
|
132
|
+
* Create anti-delete handler
|
|
133
|
+
* Bisa dipasang ke sock.ev.on('messages.update')
|
|
134
|
+
*/
|
|
135
|
+
export declare const createAntiDeleteHandler: (store: MessageStore) => (updates: {
|
|
136
|
+
key: WAMessageKey;
|
|
137
|
+
update: Partial<WAMessage>;
|
|
138
|
+
}[]) => DeletedMessageInfo[];
|
|
139
|
+
/**
|
|
140
|
+
* Create message store handler
|
|
141
|
+
* Bisa dipasang ke sock.ev.on('messages.upsert')
|
|
142
|
+
*/
|
|
143
|
+
export declare const createMessageStoreHandler: (store: MessageStore) => ({ messages }: {
|
|
144
|
+
messages: WAMessage[];
|
|
145
|
+
}) => void;
|
|
146
|
+
declare const _default: {
|
|
147
|
+
MessageStore: typeof MessageStore;
|
|
148
|
+
isDeleteMessage: (message: WAMessage) => boolean;
|
|
149
|
+
getDeletedMessageKey: (message: WAMessage) => WAMessageKey | null;
|
|
150
|
+
createAntiDeleteHandler: (store: MessageStore) => (updates: {
|
|
151
|
+
key: WAMessageKey;
|
|
152
|
+
update: Partial<WAMessage>;
|
|
153
|
+
}[]) => DeletedMessageInfo[];
|
|
154
|
+
createMessageStoreHandler: (store: MessageStore) => ({ messages }: {
|
|
155
|
+
messages: WAMessage[];
|
|
156
|
+
}) => void;
|
|
157
|
+
};
|
|
158
|
+
export default _default;
|
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
'use strict'
|
|
2
|
+
/**
|
|
3
|
+
* Anti-Delete / Message Store untuk Baileys-Joss
|
|
4
|
+
*
|
|
5
|
+
* Fitur untuk menyimpan dan recover deleted messages
|
|
6
|
+
*
|
|
7
|
+
* @module anti-delete
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, '__esModule', { value: true })
|
|
10
|
+
exports.createMessageStoreHandler =
|
|
11
|
+
exports.createAntiDeleteHandler =
|
|
12
|
+
exports.getDeletedMessageKey =
|
|
13
|
+
exports.isDeleteMessage =
|
|
14
|
+
exports.MessageStore =
|
|
15
|
+
void 0
|
|
16
|
+
const index_js_1 = require('../../WAProto/index.js')
|
|
17
|
+
|
|
18
|
+
// MESSAGE STORE CLASS
|
|
19
|
+
class MessageStore {
|
|
20
|
+
constructor(options = {}) {
|
|
21
|
+
this.store = new Map()
|
|
22
|
+
this.deletedMessages = new Map()
|
|
23
|
+
this.options = {
|
|
24
|
+
maxMessagesPerChat: options.maxMessagesPerChat || 1000,
|
|
25
|
+
ttl: options.ttl || 24 * 60 * 60 * 1000, // 24 hours
|
|
26
|
+
cleanupInterval: options.cleanupInterval || 60 * 60 * 1000 // 1 hour
|
|
27
|
+
}
|
|
28
|
+
// Start cleanup timer
|
|
29
|
+
this.startCleanup()
|
|
30
|
+
}
|
|
31
|
+
startCleanup() {
|
|
32
|
+
this.cleanupTimer = setInterval(() => {
|
|
33
|
+
this.cleanup()
|
|
34
|
+
}, this.options.cleanupInterval)
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Stop cleanup timer
|
|
38
|
+
*/
|
|
39
|
+
stopCleanup() {
|
|
40
|
+
if (this.cleanupTimer) {
|
|
41
|
+
clearInterval(this.cleanupTimer)
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Cleanup old messages
|
|
46
|
+
*/
|
|
47
|
+
cleanup() {
|
|
48
|
+
const now = Date.now()
|
|
49
|
+
const cutoff = now - this.options.ttl
|
|
50
|
+
for (const [chatId, messages] of this.store) {
|
|
51
|
+
for (const [msgId, stored] of messages) {
|
|
52
|
+
if (stored.storedAt < cutoff) {
|
|
53
|
+
messages.delete(msgId)
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
if (messages.size === 0) {
|
|
57
|
+
this.store.delete(chatId)
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// Cleanup deleted messages
|
|
61
|
+
for (const [key, info] of this.deletedMessages) {
|
|
62
|
+
if (info.deletedAt < cutoff) {
|
|
63
|
+
this.deletedMessages.delete(key)
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Get store key dari message key
|
|
69
|
+
*/
|
|
70
|
+
getKey(key) {
|
|
71
|
+
return `${key.remoteJid}:${key.id}`
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Store message
|
|
75
|
+
*/
|
|
76
|
+
storeMessage(message) {
|
|
77
|
+
const chatId = message.key.remoteJid
|
|
78
|
+
if (!chatId || !message.key.id) return
|
|
79
|
+
let chatMessages = this.store.get(chatId)
|
|
80
|
+
if (!chatMessages) {
|
|
81
|
+
chatMessages = new Map()
|
|
82
|
+
this.store.set(chatId, chatMessages)
|
|
83
|
+
}
|
|
84
|
+
// Enforce max messages per chat
|
|
85
|
+
if (chatMessages.size >= this.options.maxMessagesPerChat) {
|
|
86
|
+
// Remove oldest message
|
|
87
|
+
const oldestKey = chatMessages.keys().next().value
|
|
88
|
+
if (oldestKey) {
|
|
89
|
+
chatMessages.delete(oldestKey)
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
chatMessages.set(message.key.id, {
|
|
93
|
+
message,
|
|
94
|
+
storedAt: Date.now(),
|
|
95
|
+
isDeleted: false
|
|
96
|
+
})
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Store multiple messages
|
|
100
|
+
*/
|
|
101
|
+
storeMessages(messages) {
|
|
102
|
+
for (const msg of messages) {
|
|
103
|
+
this.storeMessage(msg)
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Get stored message
|
|
108
|
+
*/
|
|
109
|
+
getMessage(key) {
|
|
110
|
+
const chatMessages = this.store.get(key.remoteJid)
|
|
111
|
+
if (!chatMessages) return undefined
|
|
112
|
+
return chatMessages.get(key.id)
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Get original message (untuk anti-delete)
|
|
116
|
+
*/
|
|
117
|
+
getOriginalMessage(key) {
|
|
118
|
+
var _a
|
|
119
|
+
return (_a = this.getMessage(key)) === null || _a === void 0 ? void 0 : _a.message
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Mark message as deleted dan store info
|
|
123
|
+
*/
|
|
124
|
+
markAsDeleted(key, deletedBy) {
|
|
125
|
+
const stored = this.getMessage(key)
|
|
126
|
+
if (!stored) return null
|
|
127
|
+
const now = Date.now()
|
|
128
|
+
stored.isDeleted = true
|
|
129
|
+
stored.deletedAt = now
|
|
130
|
+
stored.deletedBy = deletedBy
|
|
131
|
+
const info = {
|
|
132
|
+
originalMessage: stored.message,
|
|
133
|
+
key,
|
|
134
|
+
deletedAt: now,
|
|
135
|
+
deletedBy,
|
|
136
|
+
isRevokedBySender: !deletedBy || deletedBy === stored.message.key.participant
|
|
137
|
+
}
|
|
138
|
+
this.deletedMessages.set(this.getKey(key), info)
|
|
139
|
+
return info
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Get deleted message info
|
|
143
|
+
*/
|
|
144
|
+
getDeletedMessage(key) {
|
|
145
|
+
return this.deletedMessages.get(this.getKey(key))
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Get all deleted messages
|
|
149
|
+
*/
|
|
150
|
+
getAllDeletedMessages() {
|
|
151
|
+
return Array.from(this.deletedMessages.values())
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Get deleted messages by chat
|
|
155
|
+
*/
|
|
156
|
+
getDeletedMessagesByChat(chatId) {
|
|
157
|
+
return Array.from(this.deletedMessages.values()).filter(
|
|
158
|
+
(info) => info.key.remoteJid === chatId
|
|
159
|
+
)
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Get all messages in chat
|
|
163
|
+
*/
|
|
164
|
+
getChatMessages(chatId) {
|
|
165
|
+
const chatMessages = this.store.get(chatId)
|
|
166
|
+
if (!chatMessages) return []
|
|
167
|
+
return Array.from(chatMessages.values()).map((s) => s.message)
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Get chat IDs
|
|
171
|
+
*/
|
|
172
|
+
getChatIds() {
|
|
173
|
+
return Array.from(this.store.keys())
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Get stats
|
|
177
|
+
*/
|
|
178
|
+
getStats() {
|
|
179
|
+
let totalMessages = 0
|
|
180
|
+
for (const messages of this.store.values()) {
|
|
181
|
+
totalMessages += messages.size
|
|
182
|
+
}
|
|
183
|
+
return {
|
|
184
|
+
totalChats: this.store.size,
|
|
185
|
+
totalMessages,
|
|
186
|
+
totalDeleted: this.deletedMessages.size
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Clear all
|
|
191
|
+
*/
|
|
192
|
+
clear() {
|
|
193
|
+
this.store.clear()
|
|
194
|
+
this.deletedMessages.clear()
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Clear chat
|
|
198
|
+
*/
|
|
199
|
+
clearChat(chatId) {
|
|
200
|
+
this.store.delete(chatId)
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Get all messages in all chats (compatibility for bot saving)
|
|
204
|
+
*/
|
|
205
|
+
getAllMessages() {
|
|
206
|
+
const all = {}
|
|
207
|
+
for (const [chatId, messages] of this.store) {
|
|
208
|
+
all[chatId] = Array.from(messages.values()).map((s) => s.message)
|
|
209
|
+
}
|
|
210
|
+
return all
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
exports.MessageStore = MessageStore
|
|
214
|
+
|
|
215
|
+
// HELPER FUNCTIONS
|
|
216
|
+
/**
|
|
217
|
+
* Check apakah message adalah delete/revoke message
|
|
218
|
+
*/
|
|
219
|
+
const isDeleteMessage = (message) => {
|
|
220
|
+
var _a
|
|
221
|
+
const content = message.message
|
|
222
|
+
if (!content) return false
|
|
223
|
+
return (
|
|
224
|
+
((_a = content.protocolMessage) === null || _a === void 0 ? void 0 : _a.type) ===
|
|
225
|
+
index_js_1.proto.Message.ProtocolMessage.Type.REVOKE
|
|
226
|
+
)
|
|
227
|
+
}
|
|
228
|
+
exports.isDeleteMessage = isDeleteMessage
|
|
229
|
+
/**
|
|
230
|
+
* Get deleted message key dari revoke message
|
|
231
|
+
*/
|
|
232
|
+
const getDeletedMessageKey = (message) => {
|
|
233
|
+
const content = message.message
|
|
234
|
+
if (!content) return null
|
|
235
|
+
const protoMsg = content.protocolMessage
|
|
236
|
+
if (
|
|
237
|
+
(protoMsg === null || protoMsg === void 0 ? void 0 : protoMsg.type) !==
|
|
238
|
+
index_js_1.proto.Message.ProtocolMessage.Type.REVOKE
|
|
239
|
+
)
|
|
240
|
+
return null
|
|
241
|
+
return protoMsg.key || null
|
|
242
|
+
}
|
|
243
|
+
exports.getDeletedMessageKey = getDeletedMessageKey
|
|
244
|
+
/**
|
|
245
|
+
* Create anti-delete handler
|
|
246
|
+
* Bisa dipasang ke sock.ev.on('messages.update')
|
|
247
|
+
*/
|
|
248
|
+
const createAntiDeleteHandler = (store) => {
|
|
249
|
+
return (updates) => {
|
|
250
|
+
var _a
|
|
251
|
+
const deletedMessages = []
|
|
252
|
+
for (const { key, update } of updates) {
|
|
253
|
+
// Check if message was deleted
|
|
254
|
+
if (update.messageStubType === index_js_1.proto.WebMessageInfo.StubType.REVOKE) {
|
|
255
|
+
const deletedInfo = store.markAsDeleted(
|
|
256
|
+
key,
|
|
257
|
+
(_a = update.messageStubParameters) === null || _a === void 0 ? void 0 : _a[0]
|
|
258
|
+
)
|
|
259
|
+
if (deletedInfo) {
|
|
260
|
+
deletedMessages.push(deletedInfo)
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
return deletedMessages
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
exports.createAntiDeleteHandler = createAntiDeleteHandler
|
|
268
|
+
/**
|
|
269
|
+
* Create message store handler
|
|
270
|
+
* Bisa dipasang ke sock.ev.on('messages.upsert')
|
|
271
|
+
*/
|
|
272
|
+
const createMessageStoreHandler = (store) => {
|
|
273
|
+
return ({ messages }) => {
|
|
274
|
+
// Filter out protocol messages
|
|
275
|
+
const regularMessages = messages.filter((msg) => {
|
|
276
|
+
const content = msg.message
|
|
277
|
+
if (!content) return false
|
|
278
|
+
// Skip protocol messages (delete, read receipt, etc)
|
|
279
|
+
if (content.protocolMessage) return false
|
|
280
|
+
if (content.senderKeyDistributionMessage) return false
|
|
281
|
+
return true
|
|
282
|
+
})
|
|
283
|
+
store.storeMessages(regularMessages)
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
exports.createMessageStoreHandler = createMessageStoreHandler
|
|
287
|
+
exports.default = {
|
|
288
|
+
MessageStore,
|
|
289
|
+
isDeleteMessage: exports.isDeleteMessage,
|
|
290
|
+
getDeletedMessageKey: exports.getDeletedMessageKey,
|
|
291
|
+
createAntiDeleteHandler: exports.createAntiDeleteHandler,
|
|
292
|
+
createMessageStoreHandler: exports.createMessageStoreHandler
|
|
293
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use strict"
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true })
|
|
3
|
+
exports.resolve_antiban_config = exports.antiban_presets = void 0
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* @file antiban-presets.js
|
|
7
|
+
* @description Predefined anti-ban configuration presets — conservative
|
|
8
|
+
* (safest, slowest), moderate (balanced), aggressive (fastest, riskier).
|
|
9
|
+
* `resolve_antiban_config` accepts a preset name, an object with a
|
|
10
|
+
* `preset` key plus overrides, or nothing (defaults to conservative).
|
|
11
|
+
* @author Denzy ZeroDay
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
const antiban_presets = {
|
|
15
|
+
conservative: {
|
|
16
|
+
maxPerMinute: 5,
|
|
17
|
+
maxPerHour: 100,
|
|
18
|
+
maxPerDay: 800,
|
|
19
|
+
minDelayMs: 2500,
|
|
20
|
+
maxDelayMs: 7000,
|
|
21
|
+
newChatDelayMs: 4000,
|
|
22
|
+
warmupDays: 10,
|
|
23
|
+
day1Limit: 15,
|
|
24
|
+
growthFactor: 1.8,
|
|
25
|
+
inactivityThresholdHours: 72,
|
|
26
|
+
autoPauseAt: 'medium',
|
|
27
|
+
groupMultiplier: 0.5,
|
|
28
|
+
groupProfiles: false,
|
|
29
|
+
logging: true
|
|
30
|
+
},
|
|
31
|
+
moderate: {
|
|
32
|
+
maxPerMinute: 10,
|
|
33
|
+
maxPerHour: 300,
|
|
34
|
+
maxPerDay: 1500,
|
|
35
|
+
minDelayMs: 1500,
|
|
36
|
+
maxDelayMs: 5000,
|
|
37
|
+
newChatDelayMs: 3000,
|
|
38
|
+
warmupDays: 7,
|
|
39
|
+
day1Limit: 20,
|
|
40
|
+
growthFactor: 1.8,
|
|
41
|
+
inactivityThresholdHours: 72,
|
|
42
|
+
autoPauseAt: 'high',
|
|
43
|
+
groupMultiplier: 0.7,
|
|
44
|
+
groupProfiles: false,
|
|
45
|
+
logging: true
|
|
46
|
+
},
|
|
47
|
+
aggressive: {
|
|
48
|
+
maxPerMinute: 20,
|
|
49
|
+
maxPerHour: 800,
|
|
50
|
+
maxPerDay: 4000,
|
|
51
|
+
minDelayMs: 800,
|
|
52
|
+
maxDelayMs: 3000,
|
|
53
|
+
newChatDelayMs: 2000,
|
|
54
|
+
warmupDays: 4,
|
|
55
|
+
day1Limit: 35,
|
|
56
|
+
growthFactor: 2,
|
|
57
|
+
inactivityThresholdHours: 48,
|
|
58
|
+
autoPauseAt: 'critical',
|
|
59
|
+
groupMultiplier: 0.9,
|
|
60
|
+
groupProfiles: false,
|
|
61
|
+
logging: true
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
exports.antiban_presets = antiban_presets
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Resolve an anti-ban config from a preset name, an object with overrides,
|
|
68
|
+
* or nothing (defaults to 'conservative').
|
|
69
|
+
*
|
|
70
|
+
* @param {string|object|undefined} input
|
|
71
|
+
* @returns {object} resolved config
|
|
72
|
+
*/
|
|
73
|
+
function resolve_antiban_config(input) {
|
|
74
|
+
if (input === undefined) {
|
|
75
|
+
return { ...antiban_presets.conservative }
|
|
76
|
+
}
|
|
77
|
+
if (typeof input === 'string') {
|
|
78
|
+
if (!(input in antiban_presets)) {
|
|
79
|
+
throw new Error(`Unknown preset "${input}". Valid: ${Object.keys(antiban_presets).join(', ')}`)
|
|
80
|
+
}
|
|
81
|
+
return { ...antiban_presets[input] }
|
|
82
|
+
}
|
|
83
|
+
const { preset = 'conservative', ...overrides } = input
|
|
84
|
+
if (!(preset in antiban_presets)) {
|
|
85
|
+
throw new Error(`Unknown preset "${preset}". Valid: ${Object.keys(antiban_presets).join(', ')}`)
|
|
86
|
+
}
|
|
87
|
+
return { ...antiban_presets[preset], ...overrides }
|
|
88
|
+
}
|
|
89
|
+
exports.resolve_antiban_config = resolve_antiban_config
|
|
90
|
+
|
|
91
|
+
module.exports = { antiban_presets, resolve_antiban_config }
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict"
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true })
|
|
3
|
+
exports.apply_group_multiplier = exports.should_use_group_profile = exports.is_broadcast = exports.is_newsletter = exports.is_group = void 0
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* @file antiban-profiles.js
|
|
7
|
+
* @description Small JID-classification helpers and a rate-limit multiplier
|
|
8
|
+
* applier used to give groups/newsletters looser (or tighter) limits than
|
|
9
|
+
* 1:1 chats.
|
|
10
|
+
* @author Denzy ZeroDay
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
function is_group(jid) {
|
|
14
|
+
return jid.endsWith('@g.us')
|
|
15
|
+
}
|
|
16
|
+
exports.is_group = is_group
|
|
17
|
+
|
|
18
|
+
function is_newsletter(jid) {
|
|
19
|
+
return jid.endsWith('@newsletter')
|
|
20
|
+
}
|
|
21
|
+
exports.is_newsletter = is_newsletter
|
|
22
|
+
|
|
23
|
+
function is_broadcast(jid) {
|
|
24
|
+
return jid === 'status@broadcast' || jid.endsWith('@broadcast')
|
|
25
|
+
}
|
|
26
|
+
exports.is_broadcast = is_broadcast
|
|
27
|
+
|
|
28
|
+
function should_use_group_profile(jid) {
|
|
29
|
+
return is_group(jid) || is_newsletter(jid)
|
|
30
|
+
}
|
|
31
|
+
exports.should_use_group_profile = should_use_group_profile
|
|
32
|
+
|
|
33
|
+
/** Scale maxPerMinute/Hour/Day limits by a multiplier (min 1 each) */
|
|
34
|
+
function apply_group_multiplier(limits, multiplier) {
|
|
35
|
+
return {
|
|
36
|
+
maxPerMinute: Math.max(1, Math.floor(limits.maxPerMinute * multiplier)),
|
|
37
|
+
maxPerHour: Math.max(1, Math.floor(limits.maxPerHour * multiplier)),
|
|
38
|
+
maxPerDay: Math.max(1, Math.floor(limits.maxPerDay * multiplier))
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
exports.apply_group_multiplier = apply_group_multiplier
|
|
42
|
+
|
|
43
|
+
module.exports = { is_group, is_newsletter, is_broadcast, should_use_group_profile, apply_group_multiplier }
|