";
} 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);
}
}
?>