#!/bin/bash set -euo pipefail # 05-sync-groups.sh — Connect to WhatsApp, fetch group metadata, write to DB, exit. SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "$SCRIPT_DIR/../../../.." && pwd)" LOG_FILE="$PROJECT_ROOT/logs/setup.log" mkdir -p "$PROJECT_ROOT/logs" log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] [sync-groups] $*" >> "$LOG_FILE"; } cd "$PROJECT_ROOT" # Build TypeScript log "Building TypeScript" BUILD="failed" if npm run build >> "$LOG_FILE" 2>&1; then BUILD="success" log "Build succeeded" else log "Build failed" cat < { console.error('TIMEOUT'); process.exit(1); }, 30000); sock.ev.on('creds.update', saveCreds); sock.ev.on('connection.update', async (update) => { if (update.connection === 'open') { try { const groups = await sock.groupFetchAllParticipating(); const now = new Date().toISOString(); let count = 0; for (const [jid, metadata] of Object.entries(groups)) { if (metadata.subject) { upsert.run(jid, metadata.subject, now); count++; } } console.log('SYNCED:' + count); } catch (err) { console.error('FETCH_ERROR:' + err.message); } finally { clearTimeout(timeout); sock.end(undefined); db.close(); process.exit(0); } } else if (update.connection === 'close') { clearTimeout(timeout); console.error('CONNECTION_CLOSED'); process.exit(1); } }); " --input-type=module 2>&1) || true log "Sync output: $SYNC_OUTPUT" if echo "$SYNC_OUTPUT" | grep -q "SYNCED:"; then SYNC="success" fi # Check for groups in DB GROUPS_IN_DB=0 if [ -f "$PROJECT_ROOT/store/messages.db" ]; then GROUPS_IN_DB=$(sqlite3 "$PROJECT_ROOT/store/messages.db" "SELECT COUNT(*) FROM chats WHERE jid LIKE '%@g.us' AND jid <> '__group_sync__'" 2>/dev/null || echo "0") log "Groups found in DB: $GROUPS_IN_DB" fi STATUS="success" if [ "$SYNC" != "success" ]; then STATUS="failed" fi cat <