#include <WiFi.h>
#include <HTTPClient.h>
#include <UniversalTelegramBot.h>
#include <WiFiClientSecure.h>
// Ganti dengan SSID dan password WiFi kamu
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// Webhook Discord
const char* discordWebhookURL = "https://discord.com/api/webhooks/1385459513842471062/FjSczaMyI-YrPk-pIgmFLA01ka9CK7q35-UJgqkUMBNHohmFybG1IlypEH5N7H_Dk9rC";
// Token & ID Telegram
const char* botToken = "7987542133:AAEnMyVH0YqxSO8pVJuhuEeu96w8pid_D7A";
const String groupChatID = "-1002855608325";
WiFiClientSecure client;
UniversalTelegramBot bot(botToken, client);
unsigned long lastTimeBotRan = 0;
const int botRequestDelay = 1000;
void setup() {
Serial.begin(115200);
Serial.println("Menyambung ke WiFi...");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi terhubung");
client.setCACert(TELEGRAM_CERTIFICATE_ROOT); // Sertifikat SSL
// Jika gagal SSL, bisa pakai client.setInsecure();
}
void reconnectWiFi() {
if (WiFi.status() != WL_CONNECTED) {
Serial.println("WiFi terputus. Menyambung ulang...");
WiFi.disconnect();
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi tersambung kembali.");
}
}
void kirimPesanDiscord(String pesan) {
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
// Timeout maksimal 5 detik
http.setTimeout(5000);
http.begin(discordWebhookURL);
http.addHeader("Content-Type", "application/json");
String payload = "{\"content\":\"" + pesan + "\"}";
Serial.println("Mengirim ke Discord...");
int httpResponseCode = http.POST(payload);
if (httpResponseCode > 0) {
Serial.print("Kode respon Discord: ");
Serial.println(httpResponseCode);
// Hapus jika tidak perlu respon isi (biar tidak delay)
// String response = http.getString();
// Serial.println(response);
} else {
Serial.print("Gagal kirim ke Discord. Error code: ");
Serial.println(httpResponseCode);
}
http.end(); // Tutup koneksi
Serial.println("Koneksi Discord ditutup.\n");
} else {
Serial.println("WiFi tidak terhubung.");
}
}
String getTelegramCommandArgument(String message, String command) {
message.trim();
if (message.startsWith(command)) {
int spaceIndex = message.indexOf(' ');
if (spaceIndex != -1 && spaceIndex + 1 < message.length()) {
return message.substring(spaceIndex + 1);
}
}
return "";
}
bool hapusPesan(String chat_id, int message_id) {
String url = "https://api.telegram.org/bot" + String(botToken) + "/deleteMessage";
HTTPClient http;
http.begin(url);
http.addHeader("Content-Type", "application/json");
// chat_id tidak pakai kutip karena integer
String payload = "{\"chat_id\":" + String(chat_id) + ",\"message_id\":" + String(message_id) + "}";
int httpCode = http.POST(payload);
http.end();
Serial.print("Status hapus: ");
Serial.println(httpCode);
return httpCode == 200;
}
void loop() {
reconnectWiFi();
if (millis() - lastTimeBotRan > botRequestDelay) {
int numMessages = bot.getUpdates(bot.last_message_received + 1);
Serial.print("Jumlah pesan baru: ");
Serial.println(numMessages);
if (numMessages > 0) {
for (int i = 0; i < numMessages; i++) {
String chat_id = bot.messages[i].chat_id;
String from_name = bot.messages[i].from_name;
if (from_name == "") from_name = "Guest";
// ⛔️ Batasi hanya untuk grup tertentu
if (chat_id != groupChatID) {
Serial.println("Pesan bukan dari grup yang diizinkan, diabaikan." + chat_id);
continue;
}
String pesan = bot.messages[i].text;
// Ambil timestamp pesan (String -> long)
unsigned long pesanWaktu = bot.messages[i].date.toInt();
unsigned long waktuSekarang = millis() / 1000;
hapusPesan(chat_id, bot.messages[i].message_id);
if (pesan.startsWith("/kajur")) {
String arg = getTelegramCommandArgument(pesan, "/kajur");
if (arg != "") {
Serial.println("Isi dari /kajur adalah: " + arg);
kirimPesanDiscord("Info Kajur : " + arg);
} else {
Serial.println("Tidak ada argumen setelah /kajur");
}
}
else if (pesan.startsWith("/sekjur")) {
String arg = getTelegramCommandArgument(pesan, "/sekjur");
if (arg != "") {
Serial.println("Isi dari /sekjur adalah: " + arg);
kirimPesanDiscord("Info Sekjur : " + arg);
} else {
Serial.println("Tidak ada argumen setelah /sekjur");
}
}
else {
Serial.println("Pesan lama diabaikan.");
}
Serial.println(chat_id + " " + bot.messages[i].message_id);
}
}
lastTimeBotRan = millis();
}
}