]> jfr.im git - irc/unrealircd/unrealircd-webpanel-plugins.git/blobdiff - live_map/index.php
Add Live Map plugin
[irc/unrealircd/unrealircd-webpanel-plugins.git] / live_map / index.php
diff --git a/live_map/index.php b/live_map/index.php
new file mode 100644 (file)
index 0000000..4f39eeb
--- /dev/null
@@ -0,0 +1,335 @@
+<?php
+
+require_once "../../inc/common.php";
+require_once "../../inc/header.php";
+require_once "../../inc/connection.php";
+global $rpc;
+?>
+<link rel="stylesheet" href="./leaflet.css" />
+<script src="./leaflet.js"></script>
+<h2>Live Map</h2>
+<hr>
+<style>
+    #map {
+        height: 400px;
+        width: 600px;
+    }
+
+    .new-number {
+        animation: fadeToWhite 15s forwards;
+    }
+    .number-icon {
+        background-color: white;
+        border: 2px solid black;
+        border-radius: 50%;
+        display: flex;
+        justify-content: center;
+        align-items: center;
+        max-height: 20px;
+        max-width: 20px;
+        font-size: 11px;
+        font-weight: bold;
+    }
+    @keyframes fadeToWhite {
+        0% { background-color: red; color: white; } /* Start with red */
+        100% { background-color: white; color: black; } /* End with white */
+    }
+</style>
+
+<div id="map"></div>
+<script>
+const countryCenters = {
+    "AF": { "lat": 33.93911, "lng": 67.709953 },
+    "AL": { "lat": 41.153332, "lng": 20.168331 },
+    "DZ": { "lat": 28.033886, "lng": 1.659626 },
+    "AO": { "lat": -11.202692, "lng": 17.873887 },
+    "AR": { "lat": -38.416097, "lng": -63.616672 },
+    "AM": { "lat": 40.069099, "lng": 45.038189 },
+    "AU": { "lat": -25.274398, "lng": 133.775136 },
+    "AT": { "lat": 47.516231, "lng": 14.550072 },
+    "AZ": { "lat": 40.143105, "lng": 47.576927 },
+    "BH": { "lat": 25.930414, "lng": 50.637772 },
+    "BD": { "lat": 23.684994, "lng": 90.356331 },
+    "BY": { "lat": 53.709807, "lng": 27.953389 },
+    "BE": { "lat": 50.503887, "lng": 4.469936 },
+    "BZ": { "lat": 17.189877, "lng": -88.49765 },
+    "BJ": { "lat": 9.30769, "lng": 2.315834 },
+    "BT": { "lat": 27.514162, "lng": 90.433601 },
+    "BO": { "lat": -16.290154, "lng": -63.588653 },
+    "BA": { "lat": 43.915886, "lng": 17.679076 },
+    "BW": { "lat": -22.328474, "lng": 24.684866 },
+    "BR": { "lat": -14.235004, "lng": -51.92528 },
+    "BN": { "lat": 4.535277, "lng": 114.727669 },
+    "BG": { "lat": 42.733883, "lng": 25.48583 },
+    "BF": { "lat": 12.238333, "lng": -1.561593 },
+    "BI": { "lat": -3.373056, "lng": 29.918886 },
+    "KH": { "lat": 12.565679, "lng": 104.990963 },
+    "CM": { "lat": 7.369722, "lng": 12.354722 },
+    "CA": { "lat": 56.130366, "lng": -106.346771 },
+    "CF": { "lat": 6.611111, "lng": 20.939444 },
+    "TD": { "lat": 15.454166, "lng": 18.732207 },
+    "CL": { "lat": -35.675147, "lng": -71.542969 },
+    "CN": { "lat": 35.86166, "lng": 104.195397 },
+    "CO": { "lat": 4.570868, "lng": -74.297333 },
+    "KM": { "lat": -11.875001, "lng": 43.872219 },
+    "CG": { "lat": -0.228021, "lng": 15.827659 },
+    "CR": { "lat": 9.748917, "lng": -83.753428 },
+    "HR": { "lat": 45.1, "lng": 15.2 },
+    "CU": { "lat": 21.521757, "lng": -77.781167 },
+    "CY": { "lat": 35.126413, "lng": 33.429859 },
+    "CZ": { "lat": 49.817492, "lng": 15.472962 },
+    "DK": { "lat": 56.26392, "lng": 9.501785 },
+    "DJ": { "lat": 11.825138, "lng": 42.590275 },
+    "DM": { "lat": 15.414999, "lng": -61.370976 },
+    "DO": { "lat": 18.735693, "lng": -70.162651 },
+    "EC": { "lat": -1.831239, "lng": -78.183406 },
+    "EG": { "lat": 26.820553, "lng": 30.802498 },
+    "SV": { "lat": 13.794185, "lng": -88.89653 },
+    "GQ": { "lat": 1.650801, "lng": 10.267895 },
+    "ER": { "lat": 15.179384, "lng": 39.782334 },
+    "EE": { "lat": 58.595272, "lng": 25.013607 },
+    "ET": { "lat": 9.145, "lng": 40.489673 },
+    "FJ": { "lat": -16.578193, "lng": 179.414413 },
+    "FI": { "lat": 61.92411, "lng": 25.748151 },
+    "FR": { "lat": 46.603354, "lng": 1.888334 },
+    "GA": { "lat": -0.803689, "lng": 11.609444 },
+    "GM": { "lat": 13.443182, "lng": -15.310139 },
+    "GE": { "lat": 42.315407, "lng": 43.356892 },
+    "DE": { "lat": 51.165691, "lng": 10.451526 },
+    "GH": { "lat": 7.946527, "lng": -1.023194 },
+    "GR": { "lat": 39.074208, "lng": 21.824312 },
+    "GD": { "lat": 12.262776, "lng": -61.604171 },
+    "GT": { "lat": 15.783471, "lng": -90.230759 },
+    "GN": { "lat": 9.945587, "lng": -9.696645 },
+    "GW": { "lat": 11.803749, "lng": -15.180413 },
+    "GY": { "lat": 4.860416, "lng": -58.93018 },
+    "HT": { "lat": 18.971187, "lng": -72.285215 },
+    "HN": { "lat": 15.199999, "lng": -86.241905 },
+    "HU": { "lat": 47.162494, "lng": 19.503304 },
+    "IS": { "lat": 64.963051, "lng": -19.020835 },
+    "IN": { "lat": 20.593684, "lng": 78.96288 },
+    "ID": { "lat": -0.789275, "lng": 113.921327 },
+    "IR": { "lat": 32.427908, "lng": 53.688046 },
+    "IQ": { "lat": 33.223191, "lng": 43.679291 },
+    "IE": { "lat": 53.41291, "lng": -8.24389 },
+    "IL": { "lat": 31.046051, "lng": 34.851612 },
+    "IT": { "lat": 41.87194, "lng": 12.56738 },
+    "JM": { "lat": 18.109581, "lng": -77.297508 },
+    "JP": { "lat": 36.204824, "lng": 138.252924 },
+    "JO": { "lat": 30.585164, "lng": 36.238414 },
+    "KZ": { "lat": 48.019573, "lng": 66.923684 },
+    "KE": { "lat": -0.023559, "lng": 37.906193 },
+    "KI": { "lat": -3.370417, "lng": -168.734039 },
+    "KP": { "lat": 40.339852, "lng": 127.510093 },
+    "KR": { "lat": 35.907757, "lng": 127.766922 },
+    "XK": { "lat": 42.602636, "lng": 20.902977 },
+    "KW": { "lat": 29.31166, "lng": 47.481766 },
+    "KG": { "lat": 41.20438, "lng": 74.766098 },
+    "LA": { "lat": 19.85627, "lng": 102.495496 },
+    "LV": { "lat": 56.879635, "lng": 24.603189 },
+    "LB": { "lat": 33.854721, "lng": 35.862285 },
+    "LS": { "lat": -29.609988, "lng": 28.233608 },
+    "LR": { "lat": 6.428055, "lng": -9.429499 },
+    "LY": { "lat": 26.3351, "lng": 17.228331 },
+    "LI": { "lat": 47.166, "lng": 9.555373 },
+    "LT": { "lat": 55.169438, "lng": 23.881275 },
+    "LU": { "lat": 49.815273, "lng": 6.129583 },
+    "MK": { "lat": 41.608635, "lng": 21.745275 },
+    "MG": { "lat": -18.766947, "lng": 46.869107 },
+    "MW": { "lat": -13.254308, "lng": 34.301525 },
+    "MY": { "lat": 4.210484, "lng": 101.975766 },
+    "MV": { "lat": 3.202778, "lng": 73.22068 },
+    "ML": { "lat": 17.570692, "lng": -3.996166 },
+    "MT": { "lat": 35.937496, "lng": 14.375416 },
+    "MH": { "lat": 7.131474, "lng": 171.184478 },
+    "MR": { "lat": 21.00789, "lng": -10.940835 },
+    "MU": { "lat": -20.348404, "lng": 57.552152 },
+    "MX": { "lat": 23.634501, "lng": -102.552784 },
+    "FM": { "lat": 7.425554, "lng": 150.550812 },
+    "MD": { "lat": 47.411631, "lng": 28.369885 },
+    "MC": { "lat": 43.750298, "lng": 7.412841 },
+    "MN": { "lat": 46.862496, "lng": 103.846656 },
+    "ME": { "lat": 42.708678, "lng": 19.37439 },
+    "MA": { "lat": 31.791702, "lng": -7.09262 },
+    "MZ": { "lat": -18.665695, "lng": 35.529562 },
+    "MM": { "lat": 21.913965, "lng": 95.956223 },
+    "NA": { "lat": -22.95764, "lng": 18.49041 },
+    "NR": { "lat": -0.522778, "lng": 166.931503 },
+    "NP": { "lat": 28.394857, "lng": 84.124008 },
+    "NL": { "lat": 52.132633, "lng": 5.291266 },
+    "NZ": { "lat": -40.900557, "lng": 174.885971 },
+    "NI": { "lat": 12.865416, "lng": -85.207229 },
+    "NE": { "lat": 17.607789, "lng": 8.081666 },
+    "NG": { "lat": 9.081999, "lng": 8.675277 },
+    "NO": { "lat": 60.472024, "lng": 8.468946 },
+    "OM": { "lat": 21.512583, "lng": 55.923255 },
+    "PK": { "lat": 30.375321, "lng": 69.345116 },
+    "PW": { "lat": 7.51498, "lng": 134.58252 },
+    "PA": { "lat": 8.537981, "lng": -80.782127 },
+    "PG": { "lat": -6.314993, "lng": 143.95555 },
+    "PY": { "lat": -23.442503, "lng": -58.443832 },
+    "PE": { "lat": -9.189967, "lng": -75.015152 },
+    "PH": { "lat": 12.879721, "lng": 121.774017 },
+    "PL": { "lat": 51.919438, "lng": 19.145136 },
+    "PT": { "lat": 39.399872, "lng": -8.224454 },
+    "QA": { "lat": 25.354826, "lng": 51.183884 },
+    "RO": { "lat": 45.943161, "lng": 24.96676 },
+    "RU": { "lat": 61.52401, "lng": 105.318756 },
+    "RW": { "lat": -1.940278, "lng": 29.873888 },
+    "KN": { "lat": 17.357822, "lng": -62.782998 },
+    "LC": { "lat": 13.909444, "lng": -60.978893 },
+    "VC": { "lat": 13.252817, "lng": -61.287228 },
+    "WS": { "lat": -13.759029, "lng": -172.104629 },
+    "SM": { "lat": 43.94236, "lng": 12.457777 },
+    "ST": { "lat": 0.18636, "lng": 6.613081 },
+    "SA": { "lat": 23.885942, "lng": 45.079162 },
+    "SN": { "lat": 14.497401, "lng": -14.452362 },
+    "RS": { "lat": 44.016521, "lng": 21.005859 },
+    "SC": { "lat": -4.679574, "lng": 55.491977 },
+    "SL": { "lat": 8.460555, "lng": -11.779889 },
+    "SG": { "lat": 1.352083, "lng": 103.819836 },
+    "SK": { "lat": 48.669026, "lng": 19.699024 },
+    "SI": { "lat": 46.151241, "lng": 14.995463 },
+    "SB": { "lat": -9.64571, "lng": 160.156194 },
+    "SO": { "lat": 5.152149, "lng": 46.199616 },
+    "ZA": { "lat": -30.559482, "lng": 22.937506 },
+    "ES": { "lat": 40.463667, "lng": -3.74922 },
+    "LK": { "lat": 7.873054, "lng": 80.771797 },
+    "SD": { "lat": 12.862807, "lng": 30.217636 },
+    "SR": { "lat": 3.919305, "lng": -56.027783 },
+    "SZ": { "lat": -26.522503, "lng": 31.465866 },
+    "SE": { "lat": 60.128161, "lng": 18.643501 },
+    "CH": { "lat": 46.818188, "lng": 8.227512 },
+    "SY": { "lat": 34.802075, "lng": 38.996815 },
+    "TW": { "lat": 23.69781, "lng": 120.960515 },
+    "TJ": { "lat": 38.861034, "lng": 71.276093 },
+    "TZ": { "lat": -6.369028, "lng": 34.888822 },
+    "TH": { "lat": 15.870032, "lng": 100.992541 },
+    "TL": { "lat": -8.874217, "lng": 125.727539 },
+    "TG": { "lat": 8.619543, "lng": 0.824782 },
+    "TO": { "lat": -21.178986, "lng": -175.198242 },
+    "TT": { "lat": 10.691803, "lng": -61.222503 },
+    "TN": { "lat": 33.886917, "lng": 9.537499 },
+    "TR": { "lat": 38.963745, "lng": 35.243322 },
+    "TM": { "lat": 38.969719, "lng": 59.556278 },
+    "TV": { "lat": -7.109535, "lng": 177.64933 },
+    "UG": { "lat": 1.373333, "lng": 32.290275 },
+    "UA": { "lat": 48.379433, "lng": 31.16558 },
+    "AE": { "lat": 23.424076, "lng": 53.847818 },
+    "GB": { "lat": 55.378051, "lng": -3.435973 },
+    "US": { "lat": 37.09024, "lng": -95.712891 },
+    "UY": { "lat": -32.522779, "lng": -55.765835 },
+    "UZ": { "lat": 41.377491, "lng": 64.585262 },
+    "VU": { "lat": -15.376706, "lng": 166.959158 },
+    "VE": { "lat": 6.42375, "lng": -66.58973 },
+    "VN": { "lat": 14.058324, "lng": 108.277199 },
+    "YE": { "lat": 15.552727, "lng": 48.516388 },
+    "ZM": { "lat": -13.133897, "lng": 27.849332 },
+    "ZW": { "lat": -19.015438, "lng": 29.154857 }
+};
+
+var map = L.map('map');
+map.setView([-0,-0], 1.4);
+
+var BASE_URL = "<?php echo get_config("base_url"); ?>";
+if (!!window.EventSource) {
+    var source = new EventSource(BASE_URL+"api/notification.php");
+    source.addEventListener('message', GetNotifs, false);
+}
+
+countrycounts = {};
+function GetNotifs(e)
+{
+    var event = JSON.parse(e.data);
+    if (event.subsystem !== "connect")
+        return;
+
+    if (event.event_id === "REMOTE_CLIENT_CONNECT"
+    || event.event_id === "LOCAL_CLIENT_CONNECT")
+    {
+        let cc = event.client.geoip.country_code;
+        const co = countryCenters[event.client.geoip.country_code];
+        if (countrycounts[cc] != NaN && countrycounts[cc] > 0)
+        {
+            let v = document.getElementsByClassName('country-'+cc)[0];
+            v.innerHTML = ++countrycounts[cc];
+            v.classList.add('new-number');
+            v.style.animation = 'none';
+            v.offsetHeight;
+            v.style.animation = null;
+        }
+        else {
+            var numberIcon = L.divIcon({
+                className: 'number-icon new-number country-'+cc,
+                html: 1,
+                iconSize: [30, 30],
+                iconAnchor: [15, 15] // Center the icon
+            });
+            countrycounts[cc] = 1;
+            L.marker([co.lat, co.lng], {icon: numberIcon}).addTo(map);
+        }        
+    }
+    if (event.event_id === "REMOTE_CLIENT_DISCONNECT"
+    || event.event_id === "LOCAL_CLIENT_DISCONNECT")
+    {
+        let cc = event.client.geoip.country_code;
+        const co = countryCenters[cc];
+        if (countrycounts[cc] && countrycounts[cc] > 0)
+        {
+            let v = document.getElementsByClassName('country-'+cc)[0];
+            v.innerHTML = --countrycounts[event.client.geoip.country_code];
+        }
+        else {
+            var numberIcon = L.divIcon({
+                className: 'number-icon',
+                html: --countrycounts[event.client.geoip.country_code],
+                iconSize: [30, 30],
+                iconAnchor: [15, 15] // Center the icon
+            });
+            L.marker([co.lat, co.lng], {icon: numberIcon}).addTo(map);
+        }
+        if (countrycounts[cc] == undefined || countrycounts[cc] < 1)
+        {
+            document.getElementsByClassName('country-'+cc)[0].remove();
+        }
+    }
+}
+
+L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', {
+    maxZoom: 10,
+    attribution: '&copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>'
+}).addTo(map);
+
+
+var users = <?php echo json_encode((object)$rpc->user()->getAll()); ?>;
+var count = 0;
+for (let i = 0; users[i] != null; i++)
+{
+    if (!users[i].geoip)
+        continue;
+    const cc = users[i].geoip.country_code;
+    const coords = countryCenters[cc];
+    if (countrycounts[cc])
+    {
+        let v = document.getElementsByClassName('country-'+cc)[0];
+        v.innerHTML = ++countrycounts[cc];
+    }
+    else {
+        countrycounts[cc] = 1;
+        var numberIcon = L.divIcon({
+            className: 'number-icon country-'+cc,
+            html: 1,
+            iconSize: [30, 30],
+            iconAnchor: [15, 15] // Center the icon
+        });
+        L.marker([coords.lat, coords.lng], {icon: numberIcon}).addTo(map);
+    }
+}
+
+
+    
+
+</script>
+<?php
+
+require_once "../../inc/footer.php";