Telegram se koristi kao pouzdan kanal za notifikacije jer:
- Korisnici već imaju Telegram
- Notifikacije rade izuzetno pouzdano (čak i na battery saver-u)
- Grupni chat je besplatan
- API je jednostavan
┌─────────────────────────────────────────────────────────────────────────────┐
│ TELEGRAM ARHITEKTURA │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ PWA radi: Telegram radi: │
│ • Registracija, grupe • Notifikacija o alarmu │
│ • PANIC button • Link nazad u app │
│ • "Preuzimam" reakcija • Update poruke │
│ • Mapa, istorija │
│ • Admin panel Telegram je samo "zvono" │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
┌─────────────┐
│ PATROLA │
│ BOT │
└─────────────┘
│
┌────────────────┼────────────────┐
▼ ▼ ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ TG Grupa: │ │ TG Grupa: │ │ TG Grupa: │
│ OŠ Kovačić │ │ OŠ Vuk │ │ OŠ Tesla │
└─────────────┘ └─────────────┘ └─────────────┘
✅ Jednostavnije - jedan bot za ceo sistem
✅ Centralizovano upravljanje
⚠️ Ako bot padne, SVE grupe su offline
⚠️ Rate limiting (30 poruka/sek po botu)
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ BOT Kovačić │ │ BOT Vuk │ │ BOT Tesla │
└─────────────┘ └─────────────┘ └─────────────┘
│ │ │
▼ ▼ ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ TG Grupa │ │ TG Grupa │ │ TG Grupa │
└─────────────┘ └─────────────┘ └─────────────┘
✅ Izolacija - problem jednog ne utiče na druge
✅ Nema rate limit problema
⚠️ Komplikovanije - admin mora da kreira svog bota
⚠️ Više tokena za čuvati
Preporuka: Opcija A za PoC/MVP, razmotriti B ako skalira
- Otvori Telegram, pronađi @BotFather
- Pošalji
/newbot - Unesi ime:
Patrola Bot - Unesi username:
patrola_bot - Sačuvaj BOT_TOKEN
- Kreiraj novu Telegram grupu
- Dodaj bota u grupu
- Postavi bota kao ADMIN (obavezno za slanje poruka)
# Pošalji poruku u grupu, pa pozovi:
curl "https://api.telegram.org/bot<TOKEN>/getUpdates"
# U odgovoru, nađi chat.id (negativan broj za grupe)
# Primer: -100123456789═══════════════════════════════════════════════════════════════════════════════
ADMIN POVEZUJE TELEGRAM GRUPU
═══════════════════════════════════════════════════════════════════════════════
KORAK 1: Admin dodaje bota u Telegram grupu
────────────────────────────────────────────
[Telegram app]
1. Admin kreira grupu "OŠ Kovačić - Patrola"
2. Dodaje @PatrolaBot u grupu
3. Postavlja bota kao ADMINA
KORAK 2: Bot šalje kod
──────────────────────
Bot detektuje da je dodat i šalje:
┌─────────────────────────────────────────────┐
│ 👋 Zdravo! Ja sam PatrolaBot. │
│ │
│ Da povežete ovu grupu sa aplikacijom, │
│ admin treba da unese ovaj kod u app: │
│ │
│ 🔑 KOD: TG-7X9K2M │
│ │
│ Kod važi 15 minuta. │
└─────────────────────────────────────────────┘
[Backend čuva: kod "TG-7X9K2M" → chat_id "-100123456"]
KORAK 3: Admin unosi kod u PWA
──────────────────────────────
[PWA - Podešavanja grupe]
┌─────────────────────────────────────────────┐
│ Poveži Telegram grupu │
│ │
│ Unesite kod koji je bot poslao: │
│ │
│ [ TG-7X9K2M_____________ ] │
│ │
│ [POVEŽI] │
└─────────────────────────────────────────────┘
KORAK 4: Verifikacija
─────────────────────
Backend:
1. Proverava da li kod postoji i nije istekao
2. Uzima chat_id vezan za kod
3. Šalje TEST poruku u Telegram grupu
┌─────────────────────────────────────────────┐
│ ✅ Uspešno povezano! │
│ │
│ Ova Telegram grupa je sada povezana sa: │
│ "OŠ Ivan Goran Kovačić - Roditelji" │
│ │
│ Alarmi će stizati ovde. │
└─────────────────────────────────────────────┘
🚨 *ALARM*
📍 Lokacija: https://maps.google.com/?q=44.81,20.46
💬 "Prate me"
👤 Od: Dete Markovića
👆 Otvori: https://patrola.rs/alarm/xyz
Zašto minimalna poruka:
- Privatnost - detalji ostaju u app-u
- Link vodi na app gde su puni podaci
- Članovi grupe ne vide sve lokacije
✅ Marko P. je preuzeo alarm
📍 Responder je stigao na lokaciju
✅ Alarm razrešen
Scenario: Marko ima kod, Jovan ga nekako sazna i poveže sa svojom app grupom.
Rešenje: Dvostepena potvrda
┌─────────────────────────────────────────────────────────────────────────────┐
│ VERIFIKACIJA │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ Opcija 1: Kod se šalje kao REPLY samo adminu TG grupe │
│ │
│ Opcija 2: Bot traži potvrdu pre povezivanja: │
│ │
│ ┌─────────────────────────────────────────────┐ │
│ │ ⚠️ Neko pokušava da poveže ovu grupu │ │
│ │ sa app grupom "OŠ Kovačić" │ │
│ │ │ │
│ │ Admin TG grupe, potvrdite: │ │
│ │ [✅ DOZVOLI] [❌ ODBIJ] │ │
│ └─────────────────────────────────────────────┘ │
│ │
│ Samo ako TG admin klikne DOZVOLI → povezivanje uspeva │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
Rešenje: Striktno 1:1 mapiranje
if (existing_group_with_this_chat_id) {
return error("Ova Telegram grupa je već povezana sa: {group_name}");
}Rešenje: Detekcija i obaveštenje
┌─────────────────────────────────────────────────────────────────────────────┐
│ DETEKCIJA │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ 1. Bot prima "removed from group" event → markira u bazi │
│ │
│ 2. App prikazuje UPOZORENJE adminu: │
│ │
│ ┌─────────────────────────────────────────────┐ │
│ │ ⚠️ PROBLEM SA TELEGRAM INTEGRACIJOM │ │
│ │ │ │
│ │ Bot je uklonjen iz Telegram grupe. │ │
│ │ Alarmi se NE DOSTAVLJAJU! │ │
│ │ │
│ │ [POVEŽI PONOVO] │ │
│ └─────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
Telegram limiti:
- 30 poruka po sekundi po botu
- 20 poruka po minuti u istu grupu
Rešenje: Queue sistem
const sendQueue = [];
async function sendTelegramAlert(chat_id, message) {
sendQueue.push({ chat_id, message, attempts: 0 });
}
// Worker procesira queue sa pauzama
setInterval(async () => {
const item = sendQueue.shift();
if (item) {
try {
await telegram.sendMessage(item.chat_id, item.message);
} catch (e) {
if (e.code === 429) { // Rate limited
item.attempts++;
if (item.attempts < 3) {
sendQueue.push(item); // Vrati u queue
}
}
}
}
}, 100); // Max 10 poruka/sek// Telegram link codes
telegram_link_codes: defineTable({
code: v.string(), // "TG-7X9K2M"
chat_id: v.string(), // "-100123456789"
chat_title: v.string(), // "OŠ Kovačić Patrola"
created_at: v.number(),
expires_at: v.number(), // created_at + 15min
used: v.boolean(),
used_by_group: v.optional(v.id("groups")),
})
// U groups tabeli
groups: defineTable({
// ...
telegram_chat_id: v.optional(v.string()),
telegram_connected_at: v.optional(v.number()),
telegram_connected_by: v.optional(v.id("users")),
})┌─────────────────────────────────────────────┐
│ Telegram integracija │
│ │
│ Status: ✅ Povezano │
│ Grupa: "OŠ Kovačić Patrola" │
│ Povezano: 15. jan 2025. │
│ │
│ [TEST KONEKCIJE] │
│ │
│ [PREKINI VEZU] [PROMENI GRUPU] │
└─────────────────────────────────────────────┘
- Jedan bot za ceo sistem
- Kod-bazirano povezivanje (15min expiry)
- 1:1 mapiranje
- Provera da li je bot u grupi pre slanja
- Minimalna poruka + link
- Admin UI za connect/disconnect
- Potvrda od TG admina pre linkovanja
- Queue sistem za rate limiting
- Opcija: svaka škola svoj bot
- Webhook umesto polling
Dokument kreiran: Januar 2026