"; } else if ($type === "Video") { return ""; } else if ($type === "Voice") { return ""; } else { return " {$fileName} "; } } return "[Attachment Failed]"; } // Hapus Webhook jika sebelumnya pernah diset (Webhook dan Polling tidak bisa bersamaan) request($website . "/deleteWebhook"); $offset = 0; while (true) { // Ambil data (Long Polling) $response = request($website . "/getUpdates", [ 'offset' => $offset, 'timeout' => 20 // Tahan koneksi sampai 20 detik jika tak ada pesan baru ]); if (!empty($response['ok']) && !empty($response['result'])) { foreach ($response['result'] as $update) { $offset = $update['update_id'] + 1; // Update offset agar pesan ini tidak ditarik lagi if (isset($update["message"])) { $chatId = $update["message"]["chat"]["id"]; $username = isset($update["message"]["from"]["first_name"]) ? $update["message"]["from"]["first_name"] : "User"; echo "[".date('Y-m-d H:i:s')."] Pesan dari $username ($chatId): "; // Command /start if (isset($update["message"]["text"]) && $update["message"]["text"] === "/start") { echo "/start\n"; $text = "Halo! Saya adalah *Identia*.\n\n" . "Penting untuk diketahui: *Ini bukanlah Bot otomatis yang bisa menjawab secara otomatis*. Ini adalah *saluran interaksi langsung* untuk terhubung secara personal dengan Admin Identia.\n\n" . "Namun, untuk memulai obrolan langsung dengan Admin, kami perlu memverifikasi data Anda terlebih dahulu.\n\n" . "👇 *Silakan klik tombol di bawah ini untuk Membagikan Kontak Anda* agar kami dapat mencocokkan nomor handphone Anda dengan sistem kami."; $postData = [ 'chat_id' => $chatId, 'text' => $text, 'parse_mode' => 'Markdown', 'reply_markup' => [ 'keyboard' => [ [ ['text' => '📱 Bagikan Kontak Saya', 'request_contact' => true] ] ], 'resize_keyboard' => true, 'one_time_keyboard' => true ] ]; request($website."/sendMessage", $postData); continue; // lanjut ke update berikutnya } // Konfirmasi / Cek Nomor HP if (isset($update["message"]["contact"])) { $phoneNumber = $update["message"]["contact"]["phone_number"]; echo "[Share Contact: $phoneNumber]\n"; $normalizedPhone = preg_replace('/^\+?62/', '0', $phoneNumber); // Cek database di tabel occupant try { $pdo->exec("ALTER TABLE occupant ADD COLUMN telegram_id VARCHAR(100) NULL AFTER no_hp"); } catch(PDOException $e) {} $stmt = $pdo->prepare("SELECT id_occupant FROM occupant WHERE no_hp = ? OR no_hp = ? OR no_hp = ?"); $stmt->execute([ $phoneNumber, $normalizedPhone, "62" . ltrim($normalizedPhone, '0') ]); $occupant = $stmt->fetch(PDO::FETCH_ASSOC); if ($occupant) { $updateStmt = $pdo->prepare("UPDATE occupant SET telegram_id = ? WHERE id_occupant = ?"); $updateStmt->execute([$chatId, $occupant['id_occupant']]); $text = "✅ *Verifikasi Berhasil!*\n\n" . "Nomor Anda telah terverifikasi sebagai Penghuni *Identia* yang sah.\n\n" . "Saat ini, Anda sudah *Terhubung Langsung* dengan saluran pribadi Admin *Identia*.\n\n" . "Silakan sampaikan pertanyaan, laporan kendala, atau pesan Anda di sini kapan pun Anda butuhkan. Admin akan membalas pesan Anda dari Control Panel sesegera mungkin."; $postData = [ 'chat_id' => $chatId, 'text' => $text, 'parse_mode' => 'Markdown', 'reply_markup' => ['remove_keyboard' => true] ]; request($website."/sendMessage", $postData); } else { $postData = [ 'chat_id' => $chatId, 'text' => "❌ Maaf, nomor handphone Anda ($phoneNumber) tidak ditemukan pada daftar penghuni Identia.\n\nPastikan Anda mendaftar melalui Admin terlebih dahulu." ]; request($website."/sendMessage", $postData); } continue; } // Handle Teks Biasa (Occupant membalas/chat ke Admin) if (isset($update["message"])) { $msgObj = $update["message"]; $textMessage = ""; $captionStr = isset($msgObj["caption"]) ? htmlspecialchars($msgObj["caption"]) : ""; if (isset($msgObj["text"])) { $textMessage = htmlspecialchars($msgObj["text"]); echo "Teks: $textMessage\n"; } else { // Kalau bukan text biasa, kita abaikan saja agar tidak tersimpan di database continue; } if (!empty($textMessage)) { try { $pdo->exec("ALTER TABLE occupant ADD COLUMN telegram_id VARCHAR(100) NULL AFTER no_hp"); } catch(PDOException $e) {} $stmt = $pdo->prepare("SELECT id_occupant FROM occupant WHERE telegram_id = ?"); $stmt->execute([$chatId]); $occupant = $stmt->fetch(PDO::FETCH_ASSOC); if ($occupant) { $id_account = 1; try { $pdo->exec("ALTER TABLE chats ADD COLUMN reply_to_chat_id INT NULL AFTER telegram_msg_id"); } catch(PDOException $e) {} $replyToId = null; if (isset($msgObj['reply_to_message']) && isset($msgObj['reply_to_message']['message_id'])) { $tgReplyId = $msgObj['reply_to_message']['message_id']; // Temukan chat lokal berdasarkan telegram_msg_id $qRep = $pdo->prepare("SELECT id_chat FROM chats WHERE telegram_msg_id = ? LIMIT 1"); $qRep->execute([$tgReplyId]); $foundRep = $qRep->fetch(); if ($foundRep) $replyToId = $foundRep['id_chat']; } $insertStmt = $pdo->prepare("INSERT INTO chats (id_account, id_occupant, sender, message, is_read, telegram_msg_id, reply_to_chat_id) VALUES (?, ?, 'occupant', ?, 0, ?, ?)"); $insertStmt->execute([$id_account, $occupant['id_occupant'], $textMessage, $msgObj['message_id'], $replyToId]); // ALL PREVIOUS MESSAGES TO THIS USER ARE NOW READ try { $pdo->exec("UPDATE chats SET is_read = 1 WHERE id_occupant = {$occupant['id_occupant']} AND sender = 'account'"); } catch(PDOException $e) {} try { $pdo->exec("ALTER TABLE occupant ADD COLUMN last_active DATETIME NULL"); } catch(PDOException $e) {} $updateLastActive = $pdo->prepare("UPDATE occupant SET last_active = NOW() WHERE id_occupant = ?"); $updateLastActive->execute([$occupant['id_occupant']]); } else { $postData = [ 'chat_id' => $chatId, 'text' => "Sesi chat Anda belum terhubung dengan Identia.\n\nSilakan kirim perintah /start lalu klik tombol 'Bagikan Kontak Saya' terlebih dahulu untuk memulai obrolan dengan Admin." ]; request($website."/sendMessage", $postData); } } } } // Handle Pesan Diedit (Occupant mengedit pesan di Telegram) if (isset($update["edited_message"])) { $chatId = $update["edited_message"]["chat"]["id"]; if (isset($update["edited_message"]["text"])) { $editedText = $update["edited_message"]["text"]; $messageId = $update["edited_message"]["message_id"]; $stmt = $pdo->prepare("SELECT id_occupant FROM occupant WHERE telegram_id = ?"); $stmt->execute([$chatId]); $occupant = $stmt->fetch(PDO::FETCH_ASSOC); if ($occupant) { $newText = htmlspecialchars($editedText) . " "; $updateStmt = $pdo->prepare("UPDATE chats SET message = ? WHERE telegram_msg_id = ? AND id_occupant = ?"); $updateStmt->execute([$newText, $messageId, $occupant['id_occupant']]); } } } } } else { // Sleep sebentar jika tidak ada payload baru sebelum lanjut polling sleep(1); } } ?>