Upload background.js via GUI

This commit is contained in:
2026-02-09 21:05:53 +00:00
parent 700e6026b6
commit 1c89b4fdfe

View File

@@ -1,187 +1,187 @@
// background.js // background.js
const POLL_INTERVAL_SEC = 2; const POLL_INTERVAL_SEC = 2;
// Alarm erstellen // Alarm erstellen
chrome.runtime.onInstalled.addListener(() => { chrome.runtime.onInstalled.addListener(() => {
chrome.alarms.create('periodicRefresh', { periodInMinutes: POLL_INTERVAL_SEC / 60 }); chrome.alarms.create('periodicRefresh', { periodInMinutes: POLL_INTERVAL_SEC / 60 });
}); });
chrome.alarms.onAlarm.addListener((alarm) => { chrome.alarms.onAlarm.addListener((alarm) => {
if (alarm.name === 'periodicRefresh') { if (alarm.name === 'periodicRefresh') {
refreshAllServers().catch(console.error); refreshAllServers().catch(console.error);
} }
}); });
// Message Listener // Message Listener
chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => { chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => {
if (msg && msg.cmd === 'refreshNow') { if (msg && msg.cmd === 'refreshNow') {
refreshAllServers() refreshAllServers()
.then(statuses => sendResponse({ ok: true, statuses })) .then(statuses => sendResponse({ ok: true, statuses }))
.catch(err => sendResponse({ ok: false, error: String(err) })); .catch(err => sendResponse({ ok: false, error: String(err) }));
return true; return true;
} }
}); });
async function refreshAllServers() { async function refreshAllServers() {
const obj = await chrome.storage.local.get('servers'); const obj = await chrome.storage.local.get('servers');
const servers = obj.servers || []; const servers = obj.servers || [];
if (servers.length === 0) { if (servers.length === 0) {
await chrome.storage.local.set({ serverStatuses: {} }); await chrome.storage.local.set({ serverStatuses: {} });
chrome.action.setBadgeText({ text: '' }); chrome.action.setBadgeText({ text: '' });
return {}; return {};
} }
const results = {}; const results = {};
let totalOnlinePlayers = 0; let totalOnlinePlayers = 0;
const tasks = servers.map(async (srv) => { const tasks = servers.map(async (srv) => {
try { try {
const data = await fetchServerStatus(srv, 2000); const data = await fetchServerStatus(srv, 2000);
results[srv.id] = { ok: true, server: srv, fetched: Date.now(), data }; results[srv.id] = { ok: true, server: srv, fetched: Date.now(), data };
if (data) { if (data) {
if (Array.isArray(data.players)) totalOnlinePlayers += data.players.length; if (Array.isArray(data.players)) totalOnlinePlayers += data.players.length;
else if (typeof data.players === 'number') totalOnlinePlayers += data.players; else if (typeof data.players === 'number') totalOnlinePlayers += data.players;
} }
} catch (e) { } catch (e) {
results[srv.id] = { ok: false, server: srv, fetched: Date.now(), error: String(e) }; results[srv.id] = { ok: false, server: srv, fetched: Date.now(), error: String(e) };
} }
}); });
await Promise.all(tasks); await Promise.all(tasks);
await chrome.storage.local.set({ serverStatuses: results }); await chrome.storage.local.set({ serverStatuses: results });
const badgeText = totalOnlinePlayers > 0 ? String(totalOnlinePlayers) : ''; const badgeText = totalOnlinePlayers > 0 ? String(totalOnlinePlayers) : '';
chrome.action.setBadgeText({ text: badgeText }); chrome.action.setBadgeText({ text: badgeText });
chrome.action.setBadgeBackgroundColor({ color: '#3b82f6' }); chrome.action.setBadgeBackgroundColor({ color: '#3b82f6' });
return results; return results;
} }
async function fetchServerStatus(server, timeoutMs = 2000) { async function fetchServerStatus(server, timeoutMs = 2000) {
let serverObj = typeof server === 'string' ? { id: 'legacy', url: server } : server; let serverObj = typeof server === 'string' ? { id: 'legacy', url: server } : server;
let fetchUrl = serverObj.url || ''; let fetchUrl = serverObj.url || '';
// 1. Direkte URL-Abfrage // 1. Direkte URL-Abfrage
if (fetchUrl) { if (fetchUrl) {
if (!/^https?:\/\//i.test(fetchUrl)) fetchUrl = 'http://' + fetchUrl; if (!/^https?:\/\//i.test(fetchUrl)) fetchUrl = 'http://' + fetchUrl;
try { try {
const startTime = performance.now(); const startTime = performance.now();
const controller = new AbortController(); const controller = new AbortController();
const id = setTimeout(() => controller.abort(), timeoutMs); const id = setTimeout(() => controller.abort(), timeoutMs);
const resp = await fetch(fetchUrl, { method: 'GET', signal: controller.signal }); const resp = await fetch(fetchUrl, { method: 'GET', signal: controller.signal });
clearTimeout(id); clearTimeout(id);
const endTime = performance.now(); const endTime = performance.now();
const latency = Math.round(endTime - startTime); const latency = Math.round(endTime - startTime);
if (resp.ok) { if (resp.ok) {
let text = await resp.text(); let text = await resp.text();
const lastBrace = text.lastIndexOf('}'); const lastBrace = text.lastIndexOf('}');
if (lastBrace !== -1) text = text.substring(0, lastBrace + 1); if (lastBrace !== -1) text = text.substring(0, lastBrace + 1);
text = text.trim(); text = text.trim();
try { try {
const parsed = JSON.parse(text); const parsed = JSON.parse(text);
if (parsed && (typeof parsed.online !== 'undefined' || Array.isArray(parsed.players) || parsed.version)) { if (parsed && (typeof parsed.online !== 'undefined' || Array.isArray(parsed.players) || parsed.version)) {
parsed.ping = latency; // Ping hinzufügen parsed.ping = latency; // Ping hinzufügen
return parsed; return parsed;
} }
} catch (e) { } catch (e) {
// Parsing fehlgeschlagen → Fallback-Objekt mit Ping // Parsing fehlgeschlagen → Fallback-Objekt mit Ping
return { return {
online: false, online: false,
players: [], players: [],
max_players: 0, max_players: 0,
version: 'unknown', version: 'unknown',
motd: '', motd: '',
ping: latency > timeoutMs ? null : latency // bei Timeout kein sinnvoller Ping ping: latency > timeoutMs ? null : latency // bei Timeout kein sinnvoller Ping
}; };
} }
} }
// HTTP nicht ok → Offline mit gemessener Latenz (falls unter Timeout) // HTTP nicht ok → Offline mit gemessener Latenz (falls unter Timeout)
return { return {
online: false, online: false,
players: [], players: [],
max_players: 0, max_players: 0,
version: 'unknown', version: 'unknown',
motd: '', motd: '',
ping: latency > timeoutMs ? null : latency ping: latency > timeoutMs ? null : latency
}; };
} catch (e) { } catch (e) {
// Timeout oder Netzwerkfehler // Timeout oder Netzwerkfehler
return { return {
online: false, online: false,
players: [], players: [],
max_players: 0, max_players: 0,
version: 'unknown', version: 'unknown',
motd: '', motd: '',
ping: null ping: null
}; };
} }
} }
// 2. WordPress AJAX-Abfrage // 2. WordPress AJAX-Abfrage
const wpSite = serverObj.wpSite ? String(serverObj.wpSite).replace(/\/$/, '') : null; const wpSite = serverObj.wpSite ? String(serverObj.wpSite).replace(/\/$/, '') : null;
const wpServerId = serverObj.wpServerId ? String(serverObj.wpServerId) : null; const wpServerId = serverObj.wpServerId ? String(serverObj.wpServerId) : null;
if (wpSite && wpServerId) { if (wpSite && wpServerId) {
try { try {
const ajaxUrl = wpSite + '/wp-admin/admin-ajax.php'; const ajaxUrl = wpSite + '/wp-admin/admin-ajax.php';
const body = 'action=mcss_fetch&server_id=' + encodeURIComponent(wpServerId); const body = 'action=mcss_fetch&server_id=' + encodeURIComponent(wpServerId);
const startTime = performance.now(); const startTime = performance.now();
const controller2 = new AbortController(); const controller2 = new AbortController();
const id2 = setTimeout(() => controller2.abort(), timeoutMs); const id2 = setTimeout(() => controller2.abort(), timeoutMs);
const resp2 = await fetch(ajaxUrl, { const resp2 = await fetch(ajaxUrl, {
method: 'POST', method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body, body,
signal: controller2.signal signal: controller2.signal
}); });
clearTimeout(id2); clearTimeout(id2);
const endTime = performance.now(); const endTime = performance.now();
const latency = Math.round(endTime - startTime); const latency = Math.round(endTime - startTime);
if (!resp2.ok) throw new Error('WP AJAX HTTP ' + resp2.status); if (!resp2.ok) throw new Error('WP AJAX HTTP ' + resp2.status);
const json = await resp2.json(); const json = await resp2.json();
if (json && (typeof json.online !== 'undefined' || Array.isArray(json.players) || json.version)) { if (json && (typeof json.online !== 'undefined' || Array.isArray(json.players) || json.version)) {
json.ping = latency; // Ping hinzufügen json.ping = latency; // Ping hinzufügen
return json; return json;
} }
// JSON nicht im erwarteten Format // JSON nicht im erwarteten Format
return { return {
online: false, online: false,
players: [], players: [],
max_players: 0, max_players: 0,
version: 'unknown', version: 'unknown',
motd: '', motd: '',
ping: latency > timeoutMs ? null : latency ping: latency > timeoutMs ? null : latency
}; };
} catch (e) { } catch (e) {
return { return {
online: false, online: false,
players: [], players: [],
max_players: 0, max_players: 0,
version: 'unknown', version: 'unknown',
motd: '', motd: '',
ping: null ping: null
}; };
} }
} }
// Keine gültige Konfiguration // Keine gültige Konfiguration
return { return {
online: false, online: false,
players: [], players: [],
max_players: 0, max_players: 0,
version: 'unknown', version: 'unknown',
motd: '', motd: '',
ping: null ping: null
}; };
} }