@deathnaitsa/wa-api 1.0.45 → 2.0.1
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/README.md +348 -0
- package/dist/WhatsAppClient.js +1 -0
- package/dist/index.js +1 -21
- package/package.json +9 -32
- package/socket.js +424 -0
- package/LICENSE +0 -2
- package/dist/Defaults/index.d.ts +0 -18
- package/dist/Defaults/index.d.ts.map +0 -1
- package/dist/Defaults/index.js +0 -28
- package/dist/Error/index.d.ts +0 -5
- package/dist/Error/index.d.ts.map +0 -1
- package/dist/Error/index.js +0 -14
- package/dist/Messaging/index.d.ts +0 -44
- package/dist/Messaging/index.d.ts.map +0 -1
- package/dist/Messaging/index.js +0 -121
- package/dist/Socket/Socket.d.ts +0 -21
- package/dist/Socket/Socket.d.ts.map +0 -1
- package/dist/Socket/Socket.interface.d.ts +0 -4
- package/dist/Socket/Socket.interface.d.ts.map +0 -1
- package/dist/Socket/Socket.interface.js +0 -2
- package/dist/Socket/Socket.js +0 -31
- package/dist/Socket/index.d.ts +0 -22
- package/dist/Socket/index.d.ts.map +0 -1
- package/dist/Socket/index.js +0 -375
- package/dist/Types/WhatsappOptions.d.ts +0 -3
- package/dist/Types/WhatsappOptions.d.ts.map +0 -1
- package/dist/Types/WhatsappOptions.js +0 -2
- package/dist/Types/index.d.ts +0 -51
- package/dist/Types/index.d.ts.map +0 -1
- package/dist/Types/index.js +0 -2
- package/dist/Utils/create-delay.d.ts +0 -2
- package/dist/Utils/create-delay.d.ts.map +0 -1
- package/dist/Utils/create-delay.js +0 -18
- package/dist/Utils/error.d.ts +0 -4
- package/dist/Utils/error.d.ts.map +0 -1
- package/dist/Utils/error.js +0 -8
- package/dist/Utils/index.d.ts +0 -5
- package/dist/Utils/index.d.ts.map +0 -1
- package/dist/Utils/index.js +0 -21
- package/dist/Utils/is-exist.d.ts +0 -3
- package/dist/Utils/is-exist.d.ts.map +0 -1
- package/dist/Utils/is-exist.js +0 -38
- package/dist/Utils/message-status.d.ts +0 -4
- package/dist/Utils/message-status.d.ts.map +0 -1
- package/dist/Utils/message-status.js +0 -18
- package/dist/Utils/phone-to-jid.d.ts +0 -5
- package/dist/Utils/phone-to-jid.d.ts.map +0 -1
- package/dist/Utils/phone-to-jid.js +0 -30
- package/dist/Utils/save-media.d.ts +0 -5
- package/dist/Utils/save-media.d.ts.map +0 -1
- package/dist/Utils/save-media.js +0 -47
- package/dist/Utils/set-credentials-dir.d.ts +0 -2
- package/dist/Utils/set-credentials-dir.d.ts.map +0 -1
- package/dist/Utils/set-credentials-dir.js +0 -8
- package/dist/Utils/set-credentials.d.ts +0 -2
- package/dist/Utils/set-credentials.d.ts.map +0 -1
- package/dist/Utils/set-credentials.js +0 -8
- package/dist/index.d.ts +0 -6
- package/dist/index.d.ts.map +0 -1
- package/dist/whatsapp/index.d.ts +0 -15
- package/dist/whatsapp/index.d.ts.map +0 -1
- package/dist/whatsapp/index.js +0 -206
- package/readme.md +0 -223
package/package.json
CHANGED
|
@@ -1,41 +1,18 @@
|
|
|
1
|
-
{
|
|
1
|
+
{
|
|
2
2
|
"name": "@deathnaitsa/wa-api",
|
|
3
|
-
"version": "
|
|
4
|
-
"
|
|
3
|
+
"version": "2.0.0001",
|
|
4
|
+
"type": "module",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
|
-
"types": "dist/index.d.ts",
|
|
7
|
-
"licenses": "LiCINSE",
|
|
8
|
-
"repository": {
|
|
9
|
-
"type": "git",
|
|
10
|
-
"url": "git+https://github.com/DeathNaitsa/wa-api.git"
|
|
11
|
-
},
|
|
12
|
-
"homepage": "https://github.com/DeathNaitsa/wa-api#readme",
|
|
13
|
-
"bugs": {
|
|
14
|
-
"url": "https://github.com/DeathNaitsa/wa-api/issues"
|
|
15
|
-
},
|
|
16
|
-
"files": [
|
|
17
|
-
"dist/**/*"
|
|
18
|
-
],
|
|
19
6
|
"scripts": {
|
|
20
|
-
"build": "
|
|
21
|
-
"
|
|
22
|
-
|
|
23
|
-
"start": "tsc && node ./dist/index.js",
|
|
24
|
-
"test": "jest",
|
|
25
|
-
"run-script": "node ./dist/index.js"
|
|
7
|
+
"build": "node build.js",
|
|
8
|
+
"prepublishOnly": "npm run build"
|
|
26
9
|
},
|
|
27
|
-
"author": "DeathNaitsa",
|
|
28
|
-
"license": "ISC",
|
|
29
10
|
"dependencies": {
|
|
30
|
-
"
|
|
31
|
-
"
|
|
32
|
-
"
|
|
33
|
-
"@deathnaitsa/baileys": "^1.0.19",
|
|
34
|
-
"mime": "^3.0.0",
|
|
35
|
-
"pino": "^8.11.0",
|
|
36
|
-
"qrcode-terminal": "^0.12.0"
|
|
11
|
+
"baileys": "latest",
|
|
12
|
+
"pino": "latest",
|
|
13
|
+
"qrcode-terminal": "latest"
|
|
37
14
|
},
|
|
38
15
|
"devDependencies": {
|
|
39
|
-
"
|
|
16
|
+
"javascript-obfuscator": "^4.1.0"
|
|
40
17
|
}
|
|
41
18
|
}
|
package/socket.js
ADDED
|
@@ -0,0 +1,424 @@
|
|
|
1
|
+
import { startSession, onMessage, sendText, client, getAllSessionsInfo, getGlobalStats, countReceivedMessage } from './nishi-wa-api-new/src/index.js';
|
|
2
|
+
|
|
3
|
+
// Start sessions
|
|
4
|
+
await startSession('bot');
|
|
5
|
+
await startSession('bot2');
|
|
6
|
+
|
|
7
|
+
// Command lock to prevent duplicate execution
|
|
8
|
+
const commandLocks = new Map();
|
|
9
|
+
|
|
10
|
+
async function acquireLock(key, timeoutMs = 5000) {
|
|
11
|
+
const now = Date.now();
|
|
12
|
+
const existing = commandLocks.get(key);
|
|
13
|
+
|
|
14
|
+
// Check if already locked
|
|
15
|
+
if (existing && now - existing < timeoutMs) {
|
|
16
|
+
return false; // Lock already held
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// Acquire lock
|
|
20
|
+
commandLocks.set(key, now);
|
|
21
|
+
return true;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function releaseLock(key) {
|
|
25
|
+
commandLocks.delete(key);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// Chat assignment system (only in this bot implementation)
|
|
29
|
+
const chatAssignments = new Map(); // chatId -> sessionId
|
|
30
|
+
|
|
31
|
+
function assignChat(chatId, sessionId) {
|
|
32
|
+
const sessions = client.getAllSessions();
|
|
33
|
+
if (!sessions.includes(sessionId)) {
|
|
34
|
+
throw new Error(`Session '${sessionId}' not found`);
|
|
35
|
+
}
|
|
36
|
+
chatAssignments.set(chatId, sessionId);
|
|
37
|
+
console.log(`📞 Chat ${chatId} assigned to ${sessionId}`);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function getChatAssignment(chatId) {
|
|
41
|
+
return chatAssignments.get(chatId);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function autoAssignChat(chatId, preferredSessionId) {
|
|
45
|
+
const assignedSession = chatAssignments.get(chatId);
|
|
46
|
+
const sessions = client.getAllSessions();
|
|
47
|
+
|
|
48
|
+
// Auto-assign if not assigned or assigned session is offline
|
|
49
|
+
if (!assignedSession || !sessions.includes(assignedSession)) {
|
|
50
|
+
// Prefer the session that received the message
|
|
51
|
+
const newSession = sessions.includes(preferredSessionId) ? preferredSessionId : sessions[0];
|
|
52
|
+
if (newSession) {
|
|
53
|
+
chatAssignments.set(chatId, newSession);
|
|
54
|
+
console.log(`📞 Chat ${chatId} auto-assigned to ${newSession}`);
|
|
55
|
+
return newSession;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return assignedSession;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function isAssignedToSession(chatId, sessionId) {
|
|
63
|
+
const assignedSession = autoAssignChat(chatId, sessionId);
|
|
64
|
+
return assignedSession === sessionId;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
console.log('\n📱 WhatsApp Bot läuft!');
|
|
68
|
+
console.log('WhatsApp Befehle:');
|
|
69
|
+
console.log(' !ping - Bot testen (nur diese Session)');
|
|
70
|
+
console.log(' !ping all - Alle Sessions testen');
|
|
71
|
+
console.log(' !info - Nachrichteninfo anzeigen');
|
|
72
|
+
console.log(' !liste - Alle Sessions auflisten');
|
|
73
|
+
console.log(' !stats - Detaillierte Session-Statistiken');
|
|
74
|
+
console.log(' !gesamtstats - Gesamtstatistik aller Sessions');
|
|
75
|
+
console.log(' !neustart <id> - Session neu starten');
|
|
76
|
+
console.log(' !pause <id> - Session pausieren');
|
|
77
|
+
console.log(' !fortsetzen <id> - Session fortsetzen');
|
|
78
|
+
console.log(' !stopp <id> - Session stoppen');
|
|
79
|
+
console.log(' !löschen <id> - Session-Daten löschen');
|
|
80
|
+
console.log(' !start <id> - Neue Session starten');
|
|
81
|
+
console.log(' !zuweisen <id> - Diesen Chat einer Session zuweisen');
|
|
82
|
+
console.log(' !zuweisungen - Alle Chat-Zuweisungen anzeigen\n');
|
|
83
|
+
|
|
84
|
+
// WhatsApp message handler
|
|
85
|
+
onMessage(async (msg) => {
|
|
86
|
+
// Ignore own messages
|
|
87
|
+
if (msg.fromMe) return;
|
|
88
|
+
|
|
89
|
+
// Check if this message is assigned to this session
|
|
90
|
+
if (!isAssignedToSession(msg.from, msg.sessionId)) {
|
|
91
|
+
const assignedTo = getChatAssignment(msg.from);
|
|
92
|
+
console.log(`⏭️ Skipping message for ${msg.from} (assigned to ${assignedTo})`);
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// Count this message (only for assigned session to avoid duplicates)
|
|
97
|
+
countReceivedMessage(msg.sessionId);
|
|
98
|
+
|
|
99
|
+
// Mark when we received and started processing this message
|
|
100
|
+
const messageProcessingStart = Date.now();
|
|
101
|
+
|
|
102
|
+
const [cmd, ...args] = msg.message.trim().split(' ');
|
|
103
|
+
const targetSession = args[0];
|
|
104
|
+
|
|
105
|
+
// Helper to safely send messages
|
|
106
|
+
const safeSend = async (text) => {
|
|
107
|
+
try {
|
|
108
|
+
const sessions = client.getAllSessions();
|
|
109
|
+
if (sessions.includes(msg.sessionId)) {
|
|
110
|
+
await sendText(msg.sessionId, msg.from, text);
|
|
111
|
+
}
|
|
112
|
+
} catch (e) {
|
|
113
|
+
console.error('Could not send message:', e.message);
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
try {
|
|
118
|
+
switch (cmd) {
|
|
119
|
+
case '!ping':
|
|
120
|
+
if (targetSession === 'all') {
|
|
121
|
+
// Test all sessions
|
|
122
|
+
const allSessions = client.getAllSessions();
|
|
123
|
+
let pingMessage = '🏓 *Ping Test - Alle Sessions*\n\n';
|
|
124
|
+
|
|
125
|
+
for (const sid of allSessions) {
|
|
126
|
+
const sessionSendStart = Date.now();
|
|
127
|
+
try {
|
|
128
|
+
// Send test message and measure time
|
|
129
|
+
await sendText(sid, msg.from, '🏓 Ping...');
|
|
130
|
+
const sendTime = Date.now() - sessionSendStart;
|
|
131
|
+
pingMessage += `🟢 *${sid}*: ${sendTime}ms\n`;
|
|
132
|
+
} catch (e) {
|
|
133
|
+
pingMessage += `🔴 *${sid}*: Fehler\n`;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// Final summary message
|
|
138
|
+
const totalLatency = Date.now() - messageProcessingStart;
|
|
139
|
+
pingMessage += `\n⏱️ Gesamt: ${totalLatency}ms`;
|
|
140
|
+
await sendText(msg.sessionId, msg.from, pingMessage);
|
|
141
|
+
} else {
|
|
142
|
+
// Only test current session - measure send time
|
|
143
|
+
const sendStart = Date.now();
|
|
144
|
+
await sendText(msg.sessionId, msg.from, `🏓 Pong!`);
|
|
145
|
+
const sendTime = Date.now() - sendStart;
|
|
146
|
+
const totalLatency = Date.now() - messageProcessingStart;
|
|
147
|
+
|
|
148
|
+
// Send detailed timing
|
|
149
|
+
const timingInfo = `⏱️ Verarbeitung: ${totalLatency}ms\n📤 Sendezeit: ${sendTime}ms`;
|
|
150
|
+
await sendText(msg.sessionId, msg.from, timingInfo);
|
|
151
|
+
}
|
|
152
|
+
break;
|
|
153
|
+
|
|
154
|
+
case '!info':
|
|
155
|
+
const info = `📱 *Session Info*\n\nSession: ${msg.sessionId}\nVon: ${msg.from}\nName: ${msg.name}\nGruppe: ${msg.isGroup ? 'Ja' : 'Nein'}\nTyp: ${msg.type}\nZeitstempel: ${new Date(msg.timestamp * 1000).toLocaleString('de-DE')}`;
|
|
156
|
+
await sendText(msg.sessionId, msg.from, info);
|
|
157
|
+
break;
|
|
158
|
+
|
|
159
|
+
case '!liste':
|
|
160
|
+
const sessions = client.getAllSessions();
|
|
161
|
+
const response = sessions.length
|
|
162
|
+
? `📋 *Aktive Sessions:*\n\n${sessions.map(s => `• ${s}`).join('\n')}`
|
|
163
|
+
: '❌ Keine aktiven Sessions';
|
|
164
|
+
await sendText(msg.sessionId, msg.from, response);
|
|
165
|
+
break;
|
|
166
|
+
|
|
167
|
+
case '!stats':
|
|
168
|
+
const allStats = getAllSessionsInfo();
|
|
169
|
+
|
|
170
|
+
if (allStats.length === 0) {
|
|
171
|
+
await safeSend('❌ Keine Sessions vorhanden');
|
|
172
|
+
break;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
let statsMessage = '📊 *Session Statistiken*\n\n';
|
|
176
|
+
|
|
177
|
+
for (const stat of allStats) {
|
|
178
|
+
const statusEmoji = stat.isActive ? '🟢' :
|
|
179
|
+
stat.status === 'stopped' ? '🔴' :
|
|
180
|
+
stat.status === 'paused' ? '⏸️' : '⚪';
|
|
181
|
+
|
|
182
|
+
const statusText = stat.isActive ? 'Aktiv' :
|
|
183
|
+
stat.status === 'stopped' ? 'Gestoppt' :
|
|
184
|
+
stat.status === 'paused' ? 'Pausiert' :
|
|
185
|
+
stat.status === 'connecting' ? 'Verbindet...' :
|
|
186
|
+
stat.status === 'disconnected' ? 'Getrennt' :
|
|
187
|
+
stat.status;
|
|
188
|
+
|
|
189
|
+
const totalMsgs = (stat.messagesReceived || 0) + (stat.messagesSent || 0);
|
|
190
|
+
|
|
191
|
+
statsMessage += `${statusEmoji} *${stat.sessionId}*\n`;
|
|
192
|
+
statsMessage += `├─ Status: ${statusText}\n`;
|
|
193
|
+
statsMessage += `├─ Uptime: ${stat.uptimeFormatted}\n`;
|
|
194
|
+
statsMessage += `├─ Neustarts: ${stat.restartCount}\n`;
|
|
195
|
+
statsMessage += `└─ Nachrichten: ${totalMsgs} (↓${stat.messagesReceived || 0} / ↑${stat.messagesSent || 0})\n\n`;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
statsMessage += `_Gesamt: ${allStats.length} Session(s)_`;
|
|
199
|
+
await safeSend(statsMessage);
|
|
200
|
+
break;
|
|
201
|
+
|
|
202
|
+
case '!gesamtstats':
|
|
203
|
+
const globalStats = getGlobalStats();
|
|
204
|
+
|
|
205
|
+
const formatDate = (timestamp) => {
|
|
206
|
+
const date = new Date(timestamp);
|
|
207
|
+
return date.toLocaleString('de-DE', {
|
|
208
|
+
day: '2-digit',
|
|
209
|
+
month: '2-digit',
|
|
210
|
+
year: 'numeric',
|
|
211
|
+
hour: '2-digit',
|
|
212
|
+
minute: '2-digit'
|
|
213
|
+
});
|
|
214
|
+
};
|
|
215
|
+
|
|
216
|
+
const formatUptime = (ms) => {
|
|
217
|
+
const seconds = Math.floor(ms / 1000);
|
|
218
|
+
const minutes = Math.floor(seconds / 60);
|
|
219
|
+
const hours = Math.floor(minutes / 60);
|
|
220
|
+
const days = Math.floor(hours / 24);
|
|
221
|
+
|
|
222
|
+
if (days > 0) return `${days}d ${hours % 24}h ${minutes % 60}m`;
|
|
223
|
+
if (hours > 0) return `${hours}h ${minutes % 60}m`;
|
|
224
|
+
if (minutes > 0) return `${minutes}m`;
|
|
225
|
+
return `${seconds}s`;
|
|
226
|
+
};
|
|
227
|
+
|
|
228
|
+
const totalMessages = (globalStats.totalMessagesReceived || 0) + (globalStats.totalMessagesSent || 0);
|
|
229
|
+
const received = (globalStats.totalMessagesReceived || 0).toLocaleString('de-DE');
|
|
230
|
+
const sent = (globalStats.totalMessagesSent || 0).toLocaleString('de-DE');
|
|
231
|
+
|
|
232
|
+
let globalMessage = '📊 *Gesamtstatistik*\n\n';
|
|
233
|
+
globalMessage += `📨 Nachrichten: ${totalMessages.toLocaleString('de-DE')} (↓${received} / ↑${sent})\n`;
|
|
234
|
+
globalMessage += `🔢 Sessions: ${globalStats.totalSessions}\n`;
|
|
235
|
+
globalMessage += `🔄 Neustarts: ${globalStats.totalRestarts}\n`;
|
|
236
|
+
globalMessage += `⏱️ Gesamtlaufzeit: ${formatUptime(globalStats.totalUptime)}\n`;
|
|
237
|
+
globalMessage += `🗓️ Seit: ${formatDate(globalStats.firstStarted)}\n`;
|
|
238
|
+
globalMessage += `🕐 Aktualisiert: ${formatDate(globalStats.lastUpdated)}`;
|
|
239
|
+
|
|
240
|
+
await safeSend(globalMessage);
|
|
241
|
+
break;
|
|
242
|
+
|
|
243
|
+
case '!neustart':
|
|
244
|
+
if (!targetSession) {
|
|
245
|
+
await safeSend('❌ Verwendung: !neustart <sessionId>');
|
|
246
|
+
break;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
// Check lock to prevent duplicate restart
|
|
250
|
+
const restartKey = `restart:${targetSession}`;
|
|
251
|
+
if (!await acquireLock(restartKey)) {
|
|
252
|
+
await safeSend(`⏳ Session *${targetSession}* wird bereits neu gestartet...`);
|
|
253
|
+
break;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
try {
|
|
257
|
+
// Send response first if restarting own session
|
|
258
|
+
if (targetSession === msg.sessionId) {
|
|
259
|
+
await safeSend(`🔄 Starte Session *${targetSession}* neu...`);
|
|
260
|
+
await new Promise(resolve => setTimeout(resolve, 1500));
|
|
261
|
+
await client.restartSession(targetSession);
|
|
262
|
+
} else {
|
|
263
|
+
await client.restartSession(targetSession);
|
|
264
|
+
await safeSend(`✅ Session *${targetSession}* wurde neu gestartet`);
|
|
265
|
+
}
|
|
266
|
+
} finally {
|
|
267
|
+
releaseLock(restartKey);
|
|
268
|
+
}
|
|
269
|
+
break;
|
|
270
|
+
|
|
271
|
+
case '!pause':
|
|
272
|
+
if (!targetSession) {
|
|
273
|
+
await safeSend('❌ Verwendung: !pause <sessionId>');
|
|
274
|
+
break;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
// Check lock to prevent duplicate pause
|
|
278
|
+
const pauseKey = `pause:${targetSession}`;
|
|
279
|
+
if (!await acquireLock(pauseKey)) {
|
|
280
|
+
await safeSend(`⏳ Session *${targetSession}* wird bereits pausiert...`);
|
|
281
|
+
break;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
try {
|
|
285
|
+
// Send response first if pausing own session
|
|
286
|
+
if (targetSession === msg.sessionId) {
|
|
287
|
+
await safeSend(`⏸️ Pausiere Session *${targetSession}*...`);
|
|
288
|
+
await new Promise(resolve => setTimeout(resolve, 1500));
|
|
289
|
+
await client.pauseSession(targetSession);
|
|
290
|
+
} else {
|
|
291
|
+
await client.pauseSession(targetSession);
|
|
292
|
+
await safeSend(`⏸️ Session *${targetSession}* wurde pausiert`);
|
|
293
|
+
}
|
|
294
|
+
} finally {
|
|
295
|
+
releaseLock(pauseKey);
|
|
296
|
+
}
|
|
297
|
+
break;
|
|
298
|
+
|
|
299
|
+
case '!fortsetzen':
|
|
300
|
+
if (!targetSession) {
|
|
301
|
+
await safeSend('❌ Verwendung: !fortsetzen <sessionId>');
|
|
302
|
+
break;
|
|
303
|
+
}
|
|
304
|
+
await client.resumeSession(targetSession);
|
|
305
|
+
await safeSend(`▶️ Session *${targetSession}* wurde fortgesetzt`);
|
|
306
|
+
break;
|
|
307
|
+
|
|
308
|
+
case '!stopp':
|
|
309
|
+
if (!targetSession) {
|
|
310
|
+
await safeSend('❌ Verwendung: !stopp <sessionId>');
|
|
311
|
+
break;
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
// Check lock to prevent duplicate stop
|
|
315
|
+
const stopKey = `stop:${targetSession}`;
|
|
316
|
+
if (!await acquireLock(stopKey)) {
|
|
317
|
+
await safeSend(`⏳ Session *${targetSession}* wird bereits gestoppt...`);
|
|
318
|
+
break;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
try {
|
|
322
|
+
// Send response first, then stop
|
|
323
|
+
if (targetSession === msg.sessionId) {
|
|
324
|
+
// Stopping own session - send message first
|
|
325
|
+
await safeSend(`⏹️ Stoppe Session *${targetSession}*...`);
|
|
326
|
+
await new Promise(resolve => setTimeout(resolve, 1500));
|
|
327
|
+
await client.stopSession(targetSession);
|
|
328
|
+
} else {
|
|
329
|
+
// Stopping different session
|
|
330
|
+
await client.stopSession(targetSession);
|
|
331
|
+
await safeSend(`⏹️ Session *${targetSession}* wurde gestoppt`);
|
|
332
|
+
}
|
|
333
|
+
} finally {
|
|
334
|
+
releaseLock(stopKey);
|
|
335
|
+
}
|
|
336
|
+
break;
|
|
337
|
+
|
|
338
|
+
case '!löschen':
|
|
339
|
+
if (!targetSession) {
|
|
340
|
+
await safeSend('❌ Verwendung: !löschen <sessionId>');
|
|
341
|
+
break;
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
// Check lock to prevent duplicate delete
|
|
345
|
+
const deleteKey = `delete:${targetSession}`;
|
|
346
|
+
if (!await acquireLock(deleteKey)) {
|
|
347
|
+
await safeSend(`⏳ Session *${targetSession}* wird bereits gelöscht...`);
|
|
348
|
+
break;
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
try {
|
|
352
|
+
// Send response first if deleting own session
|
|
353
|
+
if (targetSession === msg.sessionId) {
|
|
354
|
+
await safeSend(`🗑️ Lösche Session *${targetSession}*...`);
|
|
355
|
+
await new Promise(resolve => setTimeout(resolve, 1500));
|
|
356
|
+
await client.deleteSessionData(targetSession);
|
|
357
|
+
} else {
|
|
358
|
+
await client.deleteSessionData(targetSession);
|
|
359
|
+
await safeSend(`🗑️ Session *${targetSession}* wurde gelöscht`);
|
|
360
|
+
}
|
|
361
|
+
} finally {
|
|
362
|
+
releaseLock(deleteKey);
|
|
363
|
+
}
|
|
364
|
+
break;
|
|
365
|
+
|
|
366
|
+
case '!start':
|
|
367
|
+
if (!targetSession) {
|
|
368
|
+
await safeSend('❌ Verwendung: !start <sessionId>');
|
|
369
|
+
break;
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
// Check lock to prevent duplicate start
|
|
373
|
+
const startKey = `start:${targetSession}`;
|
|
374
|
+
if (!await acquireLock(startKey)) {
|
|
375
|
+
await safeSend(`⏳ Session *${targetSession}* wird bereits gestartet...`);
|
|
376
|
+
break;
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
try {
|
|
380
|
+
await startSession(targetSession);
|
|
381
|
+
await safeSend(`✅ Session *${targetSession}* wurde gestartet`);
|
|
382
|
+
} finally {
|
|
383
|
+
releaseLock(startKey);
|
|
384
|
+
}
|
|
385
|
+
break;
|
|
386
|
+
|
|
387
|
+
case '!zuweisen':
|
|
388
|
+
if (!targetSession) {
|
|
389
|
+
await safeSend('❌ Verwendung: !zuweisen <sessionId>');
|
|
390
|
+
break;
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
try {
|
|
394
|
+
assignChat(msg.from, targetSession);
|
|
395
|
+
await safeSend(`📞 Dieser Chat ist jetzt *${targetSession}* zugewiesen`);
|
|
396
|
+
} catch (e) {
|
|
397
|
+
await safeSend(`❌ ${e.message}`);
|
|
398
|
+
}
|
|
399
|
+
break;
|
|
400
|
+
|
|
401
|
+
case '!zuweisungen':
|
|
402
|
+
const assignmentList = Array.from(chatAssignments.entries())
|
|
403
|
+
.map(([chat, session]) => `• ${chat.split('@')[0]}: *${session}*`)
|
|
404
|
+
.join('\n');
|
|
405
|
+
|
|
406
|
+
await safeSend(assignmentList
|
|
407
|
+
? `📋 *Chat-Zuweisungen:*\n\n${assignmentList}`
|
|
408
|
+
: '📋 Noch keine Chat-Zuweisungen');
|
|
409
|
+
break;
|
|
410
|
+
}
|
|
411
|
+
} catch (error) {
|
|
412
|
+
console.error('❌ Error:', error.message);
|
|
413
|
+
// Only send error if session still exists
|
|
414
|
+
try {
|
|
415
|
+
const sessions = client.getAllSessions();
|
|
416
|
+
if (sessions.includes(msg.sessionId)) {
|
|
417
|
+
await sendText(msg.sessionId, msg.from, `❌ Error: ${error.message}`);
|
|
418
|
+
}
|
|
419
|
+
} catch (e) {
|
|
420
|
+
// Ignore if can't send error message
|
|
421
|
+
console.error('Could not send error message:', e.message);
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
});
|
package/LICENSE
DELETED
package/dist/Defaults/index.d.ts
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
export declare abstract class CREDENTIALS {
|
|
2
|
-
static DIR_NAME: string;
|
|
3
|
-
static SUFFIX: string;
|
|
4
|
-
}
|
|
5
|
-
export declare enum CALLBACK_KEY {
|
|
6
|
-
ON_MESSAGE_RECEIVED = "on-message-received",
|
|
7
|
-
ON_QR = "on-qr",
|
|
8
|
-
ON_CONNECTED = "on-connected",
|
|
9
|
-
ON_DISCONNECTED = "on-disconnected",
|
|
10
|
-
ON_CONNECTING = "on-connecting",
|
|
11
|
-
ON_MESSAGE_UPDATED = "on-message-updated"
|
|
12
|
-
}
|
|
13
|
-
export declare abstract class Messages {
|
|
14
|
-
static sessionAlreadyExist: (sessionId: string) => string;
|
|
15
|
-
static sessionNotFound: (sessionId: string) => string;
|
|
16
|
-
static paremetersRequired: (props: string[] | string) => string;
|
|
17
|
-
}
|
|
18
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/Defaults/index.ts"],"names":[],"mappings":"AAAA,8BAAsB,WAAW;IAC/B,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAoB;IAC3C,MAAM,CAAC,MAAM,EAAE,MAAM,CAAkB;CACxC;AAED,oBAAY,YAAY;IACtB,mBAAmB,wBAAwB;IAC3C,KAAK,UAAU;IACf,YAAY,iBAAiB;IAC7B,eAAe,oBAAoB;IACnC,aAAa,kBAAkB;IAC/B,kBAAkB,uBAAuB;CAC1C;AAED,8BAAsB,QAAQ;IAC5B,MAAM,CAAC,mBAAmB,cAAe,MAAM,KAAG,MAAM,CACe;IAEvE,MAAM,CAAC,eAAe,cAAe,MAAM,KAAG,MAAM,CACP;IAE7C,MAAM,CAAC,kBAAkB,UAAW,MAAM,EAAE,GAAG,MAAM,YAOpC;CAClB"}
|
package/dist/Defaults/index.js
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.Messages = exports.CALLBACK_KEY = exports.CREDENTIALS = void 0;
|
|
4
|
-
class CREDENTIALS {
|
|
5
|
-
}
|
|
6
|
-
exports.CREDENTIALS = CREDENTIALS;
|
|
7
|
-
CREDENTIALS.DIR_NAME = "wa_credentials";
|
|
8
|
-
CREDENTIALS.SUFFIX = "_credentials";
|
|
9
|
-
var CALLBACK_KEY;
|
|
10
|
-
(function (CALLBACK_KEY) {
|
|
11
|
-
CALLBACK_KEY["ON_MESSAGE_RECEIVED"] = "on-message-received";
|
|
12
|
-
CALLBACK_KEY["ON_QR"] = "on-qr";
|
|
13
|
-
CALLBACK_KEY["ON_CONNECTED"] = "on-connected";
|
|
14
|
-
CALLBACK_KEY["ON_DISCONNECTED"] = "on-disconnected";
|
|
15
|
-
CALLBACK_KEY["ON_CONNECTING"] = "on-connecting";
|
|
16
|
-
CALLBACK_KEY["ON_MESSAGE_UPDATED"] = "on-message-updated";
|
|
17
|
-
CALLBACK_KEY["ON_PAIRING_CODE"] = "on-pairing-code";
|
|
18
|
-
})(CALLBACK_KEY || (exports.CALLBACK_KEY = CALLBACK_KEY = {}));
|
|
19
|
-
class Messages {
|
|
20
|
-
}
|
|
21
|
-
exports.Messages = Messages;
|
|
22
|
-
Messages.sessionAlreadyExist = (sessionId) => `Session ID :${sessionId} is already exist, Try another Session ID.`;
|
|
23
|
-
Messages.sessionNotFound = (sessionId) => `Session with ID: ${sessionId} Not Exist!`;
|
|
24
|
-
Messages.paremetersRequired = (props) => `Parameter ${typeof props == "string"
|
|
25
|
-
? props
|
|
26
|
-
: props instanceof Array
|
|
27
|
-
? props.join(", ")
|
|
28
|
-
: ""} is required`;
|
package/dist/Error/index.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/Error/index.ts"],"names":[],"mappings":"AAAA,qBAAa,aAAc,SAAQ,KAAK;gBAC1B,OAAO,EAAE,MAAM;IAM3B,MAAM,CAAC,eAAe,CAAC,KAAK,EAAE,GAAG,GAAG,KAAK,IAAI,aAAa;CAG3D"}
|
package/dist/Error/index.js
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.WhatsappError = void 0;
|
|
4
|
-
class WhatsappError extends Error {
|
|
5
|
-
constructor(message) {
|
|
6
|
-
super(message);
|
|
7
|
-
this.name = "WhatsappError";
|
|
8
|
-
Object.setPrototypeOf(this, WhatsappError.prototype);
|
|
9
|
-
}
|
|
10
|
-
static isWhatsappError(error) {
|
|
11
|
-
return error instanceof WhatsappError || error instanceof Error;
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
exports.WhatsappError = WhatsappError;
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Send a message to target
|
|
5
|
-
*
|
|
6
|
-
* @param sessionId - Session ID
|
|
7
|
-
* @param jid - Target
|
|
8
|
-
* @param content - Message content
|
|
9
|
-
* @param options - Message options
|
|
10
|
-
*/
|
|
11
|
-
export declare function sendMessage(
|
|
12
|
-
sessionId: string,
|
|
13
|
-
jid: string,
|
|
14
|
-
content: import("@deathnaitsa/baileys").AnyMessageContent,
|
|
15
|
-
options?: import("@deathnaitsa/baileys").MiscMessageGenerationOptions
|
|
16
|
-
): Promise<import("@deathnaitsa/baileys").proto.WebMessageInfo>;
|
|
17
|
-
/**
|
|
18
|
-
* Sendet einen rohen WAMessage-Stanza an WhatsApp.
|
|
19
|
-
*
|
|
20
|
-
* @param sessionId Deine Session-ID
|
|
21
|
-
* @param jid Ziel-JID oder Telefonnummer (z. B. '491234567890@s.whatsapp.net' oder 'status@broadcast')
|
|
22
|
-
* @param content Raw-Message-Node (z. B. protocolMessage, videoMessage, etc.)
|
|
23
|
-
* @param options Optional: Relay-Parameter wie messageId, participant, additionalNodes, statusJidList
|
|
24
|
-
* @returns Promise mit der gesendeten Nachricht-ID (msgId)
|
|
25
|
-
*/
|
|
26
|
-
/**
|
|
27
|
-
* Low-level relayMessage-Wrapper für direkten Baileys-Stanza Dispatch.
|
|
28
|
-
*
|
|
29
|
-
* Sendet ein rohes WAMessage-Stanza (z.B. protocolMessage, disappearingMessagesInChat,
|
|
30
|
-
* videoMessage, etc.) direkt an WhatsApp über die interne `relayMessage`-Methode.
|
|
31
|
-
*
|
|
32
|
-
* @param sessionId Deine Multi-Session-ID
|
|
33
|
-
* @param jid Ziel-JID oder Telefonnummer (z.B. '491234567890@s.whatsapp.net' oder 'status@broadcast')
|
|
34
|
-
* @param content Raw-Message-Node (proto.WebMessageInfo oder AnyMessageContent-ähnlich)
|
|
35
|
-
* @param options Optional: Relay-Parameter wie `messageId`, `participant`, `additionalNodes`,
|
|
36
|
-
* `statusJidList`, `useCachedGroupMetadata`, usw.
|
|
37
|
-
* @returns Promise mit der gesendeten Nachricht-ID (`msgId`)
|
|
38
|
-
*/
|
|
39
|
-
export declare function relayMessage(
|
|
40
|
-
sessionId: string,
|
|
41
|
-
jid: string,
|
|
42
|
-
content: any,
|
|
43
|
-
options?: import('@deathnaitsa/baileys').MiscMessageGenerationOptions
|
|
44
|
-
): Promise<string>;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/Messaging/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAGhD,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,eAAe,EAChB,MAAM,UAAU,CAAC;AAOlB,eAAO,MAAM,eAAe,+CAMzB,gBAAgB,KAAG,QAAQ,MAAM,cAAc,GAAG,SAAS,CAsB7D,CAAC;AACF,eAAO,MAAM,SAAS,sDAOnB,cAAc,KAAG,QAAQ,MAAM,cAAc,GAAG,SAAS,CA8B3D,CAAC;AACF,eAAO,MAAM,SAAS,sDAOnB,cAAc,KAAG,QAAQ,MAAM,cAAc,GAAG,SAAS,CA8B3D,CAAC;AACF,eAAO,MAAM,YAAY;cASb,MAAM;MACd,QAAQ,MAAM,cAAc,GAAG,SAAS,CAuC3C,CAAC;AAEF,eAAO,MAAM,aAAa,gDAMvB,KAAK,cAAc,EAAE,MAAM,CAAC,KAAG,QAAQ,MAAM,cAAc,GAAG,SAAS,CAgCzE,CAAC;AAEF,eAAO,MAAM,WAAW,gDAMrB,cAAc,KAAG,QAAQ,MAAM,cAAc,GAAG,SAAS,CA+B3D,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,UAAU,0CAKpB,eAAe,kBAgBjB,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,WAAW,uBAA8B,aAAa,kBAKlE,CAAC"}
|