Dashboard Overview
Real-time statistics for Your App
Firebase Service Account Not Configured
Please upload your Google Firebase `serviceAccountKey.json` to enable sending push notifications.
Recent Dispatches
| Title | Message | Delivered | Date |
|---|---|---|---|
| No notifications sent yet. | |||
Why Self-Hosted?
New Push Notification
Compose and dispatch instant push notifications with rich media preview.
Notification History
Complete logs of sent push notifications and delivery statistics.
| Title & Message | Target Type | Delivered | Failed | Status | Failure Reason / Details | Date Sent |
|---|---|---|---|---|---|---|
| Loading history... | ||||||
Registered Subscribers
Devices registered via your mobile apps using Google FCM tokens.
App Live Connection Status:
Checking...Checking if mobile app is currently active or when it last communicated...
Device Connection Diagnostics & Live Error Logs
See in real time if your mobile app is reaching the server or why registration failed.
| Time | Client IP | Status | App ID Sent | Error / Diagnostic Details |
|---|---|---|---|---|
| Checking connection logs... | ||||
9b70d7bb-...)।
android/app/ ফোল্ডারে google-services.json ফাইলটি থাকা আবশ্যক।
FirebaseMessaging.instance.getToken() কোনো টোকেন পাচ্ছে কি না তা অ্যাপের টার্মিনালে print(token) করে চেক করুন।
https://notify.top1dv.online/api/v1/players হতে হবে।
| User UID (External ID) | Device & Platform | IP Address | FCM Device Token | Status | Last Active | Action |
|---|---|---|---|---|---|---|
| Loading devices... | ||||||
App Settings & REST API Keys
Configure credentials, App IDs, and Google Firebase service accounts.
App API Credentials OneSignal Equivalent
Google Firebase Service Account
Upload or paste your `serviceAccountKey.json` from Firebase Console → Project Settings → Service accounts.
Danger Zone: Delete App
Permanently remove this app and all associated subscriber tokens and notification history.
App SDK Integration Guide
Connect your mobile and web applications to Notificon in less than 5 minutes.
// Flutter Integration Guide:
// 1. Add packages in pubspec.yaml:
// firebase_core: latest
// firebase_messaging: latest
// http: latest
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';
import 'dart:io';
class NotificonService {
static const String serverUrl = 'https://notify.top1dv.online';
static const String appId = 'YOUR_APP_ID';
static Future initNotification() async {
FirebaseMessaging messaging = FirebaseMessaging.instance;
NotificationSettings settings = await messaging.requestPermission(
alert: true,
badge: true,
sound: true,
);
if (settings.authorizationStatus == AuthorizationStatus.authorized) {
String? token = await messaging.getToken();
if (token != null) {
await registerDeviceWithServer(token);
}
FirebaseMessaging.instance.onTokenRefresh.listen((newToken) {
registerDeviceWithServer(newToken);
});
}
}
static Future registerDeviceWithServer(String fcmToken, {String? userId}) async {
await http.post(
Uri.parse('$serverUrl/api/v1/players'),
headers: {'Content-Type': 'application/json'},
body: jsonEncode({
'app_id': appId,
'token': fcmToken,
'external_id': userId,
'device_type': Platform.isAndroid ? 'android' : 'ios',
'device_model': Platform.operatingSystem
}),
);
}
}
Client Handover Kit
Ready for Devsক্লায়েন্ট, অ্যান্ড্রয়েড ডেভেলপার এবং ওয়েব ডেভেলপারদের জন্য তৈরি পূর্ণাঙ্গ রেডিমেড কোড ও গাইড।
ধাপ ১: অ্যান্ড্রয়েড অ্যাপ ডেভেলপার (Android Dev)
অ্যাপের ভেতর Notificon সার্ভার কানেক্ট এবং WebView জাভাস্ক্রিপ্ট ইন্টারফেস যুক্ত করুন।
// Android App Integration:
// File: MyFirebaseService.kt
package com.top1bot.tournament.v1
import android.os.Build
import android.util.Log
import com.google.firebase.messaging.FirebaseMessagingService
import org.json.JSONObject
import java.net.HttpURLConnection
import java.net.URL
class MyFirebaseService : FirebaseMessagingService() {
companion object {
const val NOTIFICON_APP_ID = "YOUR_APP_ID_HERE"
const val NOTIFICON_API_URL = "https://notify.top1dv.online/api/v1/players"
fun sendRegistrationToServer(token: String, externalId: String = "") {
if (token.isBlank()) return
Thread {
try {
val url = URL(NOTIFICON_API_URL)
val conn = url.openConnection() as HttpURLConnection
conn.connectTimeout = 15000
conn.requestMethod = "POST"
conn.setRequestProperty("Content-Type", "application/json")
conn.doOutput = true
val safeModel = Build.MODEL.replace(" ", "_").lowercase()
val finalExternalId = if (externalId.isNotBlank()) externalId else "guest_$safeModel"
val payload = JSONObject().apply {
put("app_id", NOTIFICON_APP_ID)
put("token", token)
put("fcm_token", token)
put("player_id", token)
put("external_id", finalExternalId)
put("user_id", finalExternalId)
put("device_type", "android")
put("device_model", Build.MODEL)
}
conn.outputStream.use { os ->
os.write(payload.toString().toByteArray(Charsets.UTF_8))
}
Log.d("NOTIFICON", "Token registered. Code: ${conn.responseCode} for ID: $finalExternalId")
} catch (e: Exception) {
Log.e("NOTIFICON", "Error: ${e.message}")
}
}.start()
}
}
}
// In MainActivity.kt (Inside configureWebView()):
// webView.addJavascriptInterface(WebAppInterface(), "AndroidApp")
class WebAppInterface {
@android.webkit.JavascriptInterface
fun setUserId(userId: String) {
if (userId.isNotBlank()) {
com.google.firebase.messaging.FirebaseMessaging.getInstance().token.addOnCompleteListener { task ->
if (task.isSuccessful && task.result != null) {
MyFirebaseService.sendRegistrationToServer(task.result, userId)
}
}
}
}
}
ধাপ ২: লুডু ওয়েবসাইট ডেভেলপার (Website Dev)
প্লেয়ার যখন সাইটে লগইন করবে, এই ১ লাইন কোড কল করলেই তার UID Notificon এ যুক্ত হবে।
<!-- প্লেয়ার লগইন হওয়ার পর সাইটের যেকোনো পেজে বা লগইন সাকসেস ব্লকে এই স্ক্রিপ্টটি বসান: -->
<script>
(function() {
var playerUid = "<?php echo $user_id; ?>"; // আপনার ডাটাবেজের প্লেয়ার ইউজার আইডি
if (window.AndroidApp && typeof window.AndroidApp.setUserId === 'function') {
window.AndroidApp.setUserId(playerUid);
}
})();
</script>
ধাপ ৩: ম্যাচ ব্যাকএন্ড ডেভেলপার (PHP Push cURL)
OneSignal-এর বদলে Notificon সার্ভার দিয়ে নির্দিষ্ট প্লেয়ারের ফোনে রুম কোড নোটিফিকেশন পাঠানোর কোড।
<?php
/**
* Notificon Push Notification Sender (OneSignal Replacement)
* নির্দিষ্ট প্লেয়ারদের ইউজার আইডি (UID) অনুযায়ী রুম কোড পাঠানো
*/
function sendPlayerPushNotification($playerUserIds, $title, $message, $roomCode = "", $matchUrl = "") {
$serverUrl = "https://notify.top1dv.online/api/v1/notifications";
$appId = "YOUR_APP_ID_HERE";
$restApiKey = "YOUR_REST_API_KEY_HERE";
// প্লেয়ারদের UID অ্যারে ফরম্যাটে দিতে হবে (যেমন ["5894", "5242"])
if (!is_array($playerUserIds)) {
$playerUserIds = [$playerUserIds];
}
$payload = [
"app_id" => $appId,
"include_external_user_ids" => $playerUserIds,
"headings" => ["en" => $title],
"contents" => ["en" => $message],
"data" => [
"room_code" => $roomCode,
"url" => $matchUrl ?: "https://user.ludofy.fun/user/matches.php"
]
];
$ch = curl_init($serverUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Content-Type: application/json",
"Authorization: Key " . $restApiKey
]);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
return [
"code" => $httpCode,
"response" => json_decode($response, true)
];
}
// ব্যবহার করার উদাহরণ (যখন প্লেয়ার ম্যাচে জয়েন করে বা রুম কোড দেওয়া হয়):
// sendPlayerPushNotification(["5894"], "ম্যাচ শুরু হয়েছে! 🎲", "আপনার রুম কোড: 839210। দ্রুত গেমে যোগ দিন।", "839210");
?>
Security & Disaster Recovery
● 100% Anti-Hack Shieldসার্ভার নিরাপত্তা, অ্যান্টি-হ্যাক প্রোটেকশন, ১-ক্লিকে ডাটাবেজ ব্যাকআপ ও ডিজাস্টার রিকভারি ম্যানেজমেন্ট।
Database Health & Protection Shield
HEALTHY (WAL MODE)সব ডাটা নিরাপদ। কোনো হ্যাকার ফাইল এক্সেস করতে পারবে না। অটোমেটিক রোলিং স্ন্যাপশট সক্রিয় রয়েছে।
১-ক্লিক সম্পূর্ণ ডাটাবেজ ব্যাকআপ (Download Backup)
আপনার পিসিতে বা গুগল ড্রাইভে সেফটি ফাইল সংরক্ষণ করে রাখুন।
ভবিষ্যতে যেকোনো সময় সার্ভার চেঞ্জ (VPS Migration) করতে চাইলে বা কোনো কারণে সার্ভার ফরম্যাট দিলে এই ব্যাকআপ ফাইলটি থাকলে ১ সেকেন্ডে পুরো সিস্টেম আবার জীবন্ত করা যাবে।
ডিজাস্টার রিকভারি / ব্যাকআপ রিস্টোর (Disaster Recovery)
নতুন সার্ভারে ডাটা ট্রান্সফার বা ফাইল রিকভার করার মাধ্যম।
.bak) তৈরি করে নেবে। ফলে ভুল ফাইল আপলোড করলেও কোনো তথ্য মুছে যাবে না।
সাপোর্টেড ফরম্যাট: notifications.db, notificon-backup-*.db অথবা .json ফাইল।
Telegram Bot Daily Auto-Backup (টেলিগ্রামে স্বয়ংক্রিয় ব্যাকআপ)
Not Configuredপ্রতিদিন স্বয়ংক্রিয়ভাবে আপনার ডাটাবেজের সম্পূর্ণ কপি সরাসরি আপনার টেলিগ্রাম ইনবক্সে চলে আসবে।
BotFather থেকে পাওয়া আপনার টেলিগ্রাম বটের টোকেন।
আপনার চ্যাট আইডি (@userinfobot থেকে জানা যায়)।
সার্ভারের অটোমেটিক ডেইলি ব্যাকআপ স্ন্যাপশট (Rolling Daily Snapshots)
প্রতি ২৪ ঘণ্টায় সিস্টেম নিজে থেকে ব্যাকআপ জমা রাখে এবং শেষ ১৪ দিনের কপি সুরক্ষিত রাখে।
| Snapshot File | Type | Size | Created Date & Time | Action |
|---|---|---|---|---|
| Checking server snapshots... | ||||
Active Anti-Hack Security Firewall
100% Protectedসার্ভারের সক্রিয় থাকা সিকিউরিটি লেয়ার ও প্রোটেকশন মেকানিজম:
Change Master Admin Password
অ্যাডমিন ড্যাশবোর্ডের মাস্টার পাসওয়ার্ড পরিবর্তন করুন।