From 9d55faa3ebc4408cdd2bf7f5d6f048dfe75225e0 Mon Sep 17 00:00:00 2001 From: M_Viper Date: Fri, 30 Oct 2026 05:54:28 +0000 Subject: [PATCH] Upload via GUI (324 Dateien) --- src/streamdeck.js | 189 ++++++ src/streamdeckplugin.js | 82 +++ .../bin/package-lock.json | 33 ++ .../bin/package.json | 1 + .../bin/plugin.js | 536 ++++++++++++++++++ .../imgs/actions/icon.png | Bin 0 -> 1265 bytes .../imgs/actions/icon@2x.png | Bin 0 -> 3132 bytes .../imgs/actions/key.png | Bin 0 -> 6133 bytes .../imgs/actions/key@2x.png | Bin 0 -> 14196 bytes .../imgs/plugin/category-icon.png | Bin 0 -> 2017 bytes .../imgs/plugin/category-icon@2x.png | Bin 0 -> 4638 bytes .../imgs/plugin/marketplace.png | Bin 0 -> 27679 bytes .../imgs/plugin/marketplace@2x.png | Bin 0 -> 58504 bytes .../manifest.json | 365 ++++++++++++ .../ui/instanz.html | 72 +++ .../ui/konto.html | 65 +++ .../ui/schnellstart.html | 65 +++ .../ui/server.html | 110 ++++ 18 files changed, 1518 insertions(+) create mode 100644 src/streamdeck.js create mode 100644 src/streamdeckplugin.js create mode 100644 streamdeck-plugin/com.aeromc.launcher.sdPlugin/bin/package-lock.json create mode 100644 streamdeck-plugin/com.aeromc.launcher.sdPlugin/bin/package.json create mode 100644 streamdeck-plugin/com.aeromc.launcher.sdPlugin/bin/plugin.js create mode 100644 streamdeck-plugin/com.aeromc.launcher.sdPlugin/imgs/actions/icon.png create mode 100644 streamdeck-plugin/com.aeromc.launcher.sdPlugin/imgs/actions/icon@2x.png create mode 100644 streamdeck-plugin/com.aeromc.launcher.sdPlugin/imgs/actions/key.png create mode 100644 streamdeck-plugin/com.aeromc.launcher.sdPlugin/imgs/actions/key@2x.png create mode 100644 streamdeck-plugin/com.aeromc.launcher.sdPlugin/imgs/plugin/category-icon.png create mode 100644 streamdeck-plugin/com.aeromc.launcher.sdPlugin/imgs/plugin/category-icon@2x.png create mode 100644 streamdeck-plugin/com.aeromc.launcher.sdPlugin/imgs/plugin/marketplace.png create mode 100644 streamdeck-plugin/com.aeromc.launcher.sdPlugin/imgs/plugin/marketplace@2x.png create mode 100644 streamdeck-plugin/com.aeromc.launcher.sdPlugin/manifest.json create mode 100644 streamdeck-plugin/com.aeromc.launcher.sdPlugin/ui/instanz.html create mode 100644 streamdeck-plugin/com.aeromc.launcher.sdPlugin/ui/konto.html create mode 100644 streamdeck-plugin/com.aeromc.launcher.sdPlugin/ui/schnellstart.html create mode 100644 streamdeck-plugin/com.aeromc.launcher.sdPlugin/ui/server.html diff --git a/src/streamdeck.js b/src/streamdeck.js new file mode 100644 index 0000000..35da599 --- /dev/null +++ b/src/streamdeck.js @@ -0,0 +1,189 @@ +'use strict'; + +/* + * streamdeck.js – lokale Schnittstelle für das AeroMC-Plugin des Elgato Stream Deck + * ----------------------------------------------------------------------------- + * Ein kleiner HTTP-Server, der AUSSCHLIESSLICH auf 127.0.0.1 lauscht und nur auf + * Wunsch läuft (Einstellung "streamdeckEnabled", standardmäßig aus). + * + * Absicherung gegen fremde Zugriffe: + * - nur Loopback, kein Zugriff aus dem Netzwerk + * - jede Anfrage braucht den Zufalls-Schlüssel im Kopf "Authorization: Bearer …"; + * der wird bei jedem Start neu erzeugt und nur in eine Datei im + * Benutzerordner geschrieben, die das Plugin liest (streamdeck.json) + * - Anfragen mit "Origin"-Kopf (also aus einer Webseite im Browser) und mit + * fremdem "Host"-Kopf (DNS-Rebinding) werden abgewiesen + * + * Die eigentlichen Aktionen kommen von main.js (siehe init) – dieses Modul kennt + * weder Instanzen noch Aufnahmen und reicht nur weiter. + */ + +const http = require('http'); +const crypto = require('crypto'); +const fs = require('fs'); +const path = require('path'); + +const STANDARD_PORT = 48615; +const PORT_VERSUCHE = 10; +const MAX_BODY = 4096; + +let deps = null; +let server = null; +let schluessel = null; +let verbindungsDatei = null; + +/* + * deps: { + * userDataDir, + * zustand() -> { instanzen: [{ id, name, laeuft, seit }], aufnahme, clip } + * starte(id, server) -> { ok, message? } (server optional: direkt verbinden) + * neustart(id) -> { ok, message? } + * fenster() -> { ok } Launcher-Fenster zeigen bzw. wegminimieren + * clipModus() -> { ok, message? } + * ordner(id) -> { ok } Aufnahmen-Ordner öffnen + * serverListe(id) -> { ok, server: [{ name, ip }] } + * ping(ip) -> { ok, online, max, latencyMs } + * screenshot() -> { ok, message? } Bild des Spielfensters in den Screenshot-Ordner + * symbol(id) -> { ok, bild, pixel } Instanz-Bild als data:-URI + * kopf(uuid) -> { ok, bild } Spielerkopf eines Kontos als data:-URI + * absturz(id) -> { ok, bericht, zeit, frisch } neuester Absturzbericht der Instanz + * konto(id) -> { ok } aktives Konto wechseln + * backup() -> { ok, message? } Sicherung aller Instanzen starten + * oeffne(art, id) -> { ok, message? } Fenster öffnen: friends | logs | console | crash + * beende(id) -> { ok, message? } + * clipSpeichern() -> { ok, message? } + * aufnahmeUmschalten() -> { ok, message? } + * } + */ +function init(d) { + deps = d; + verbindungsDatei = path.join(d.userDataDir, 'streamdeck.json'); +} + +function istSchluesselGleich(angabe) { + if (!schluessel || typeof angabe !== 'string') return false; + const a = Buffer.from(angabe); + const b = Buffer.from(schluessel); + return a.length === b.length && crypto.timingSafeEqual(a, b); +} + +function antworte(res, status, daten) { + const text = JSON.stringify(daten); + res.writeHead(status, { + 'Content-Type': 'application/json; charset=utf-8', + 'Content-Length': Buffer.byteLength(text), + 'Cache-Control': 'no-store', + }); + res.end(text); +} + +function leseBody(req) { + return new Promise((resolve, reject) => { + let groesse = 0; + const teile = []; + req.on('data', (c) => { + groesse += c.length; + if (groesse > MAX_BODY) { reject(new Error('zu groß')); req.destroy(); return; } + teile.push(c); + }); + req.on('end', () => { + if (!teile.length) { resolve({}); return; } + try { resolve(JSON.parse(Buffer.concat(teile).toString('utf8')) || {}); } catch { reject(new Error('kein JSON')); } + }); + req.on('error', reject); + }); +} + +async function behandle(req, res, port) { + // Anfragen aus Webseiten (Origin) und DNS-Rebinding (fremder Host) gar nicht erst bedienen + const host = String(req.headers.host || '').toLowerCase(); + if (req.headers.origin || (host !== `127.0.0.1:${port}` && host !== `localhost:${port}`)) { + return antworte(res, 403, { ok: false, message: 'Nicht erlaubt.' }); + } + const auth = String(req.headers.authorization || ''); + if (!auth.startsWith('Bearer ') || !istSchluesselGleich(auth.slice(7))) { + return antworte(res, 401, { ok: false, message: 'Schlüssel fehlt oder ist falsch.' }); + } + + const url = new URL(req.url || '/', 'http://127.0.0.1'); + const pfad = url.pathname; + if (req.method === 'GET' && pfad === '/state') { + return antworte(res, 200, Object.assign({ ok: true }, deps.zustand({ freunde: url.searchParams.get('freunde') === '1' }))); + } + if (req.method === 'GET' && pfad === '/servers') { + return antworte(res, 200, await deps.serverListe(url.searchParams.get('id') || '')); + } + if (req.method === 'GET' && pfad === '/icon') { + const konto = url.searchParams.get('konto'); + return antworte(res, 200, konto ? await deps.kopf(konto) : await deps.symbol(url.searchParams.get('id') || '')); + } + if (req.method === 'GET' && pfad === '/crash') { + return antworte(res, 200, await deps.absturz(url.searchParams.get('id') || '')); + } + if (req.method === 'GET' && pfad === '/ping') { + return antworte(res, 200, await deps.ping(url.searchParams.get('ip') || '')); + } + if (req.method !== 'POST') return antworte(res, 405, { ok: false, message: 'Nur GET/POST.' }); + + let body; + try { body = await leseBody(req); } catch (err) { return antworte(res, 400, { ok: false, message: err.message }); } + const id = typeof body.id === 'string' ? body.id : ''; + + let erg; + if (pfad === '/launch' && id) erg = await deps.starte(id, typeof body.server === 'string' ? body.server.trim().slice(0, 253) : ''); + else if (pfad === '/restart' && id) erg = await deps.neustart(id); + else if (pfad === '/window') erg = await deps.fenster(); + else if (pfad === '/clipmode') erg = await deps.clipModus(); + else if (pfad === '/folder') erg = await deps.ordner(id); + else if (pfad === '/screenshot') erg = await deps.screenshot(); + else if (pfad === '/account' && id) erg = await deps.konto(id); + else if (pfad === '/backup') erg = await deps.backup(); + else if (pfad === '/open' && typeof body.art === 'string') erg = await deps.oeffne(body.art, id); + else if (pfad === '/stop' && id) erg = await deps.beende(id); + else if (pfad === '/clip') erg = await deps.clipSpeichern(); + else if (pfad === '/record') erg = await deps.aufnahmeUmschalten(); + else return antworte(res, 404, { ok: false, message: 'Unbekannte Aktion.' }); + return antworte(res, erg && erg.ok ? 200 : 409, erg || { ok: false }); +} + +function schreibeVerbindung(port) { + try { + fs.writeFileSync(verbindungsDatei, JSON.stringify({ port, token: schluessel }), 'utf8'); + } catch { /* ohne Datei findet das Plugin den Launcher nicht – mehr geht nicht */ } +} + +function loescheVerbindung() { + try { fs.rmSync(verbindungsDatei, { force: true }); } catch { /* egal */ } +} + +function lausche(port, versuche) { + const s = http.createServer((req, res) => { + behandle(req, res, port).catch(() => { try { antworte(res, 500, { ok: false }); } catch { /* egal */ } }); + }); + s.on('error', (err) => { + if (err.code === 'EADDRINUSE' && versuche > 1 && server === s) { lausche(port + 1, versuche - 1); return; } + if (server === s) server = null; + }); + server = s; + s.listen(port, '127.0.0.1', () => { + if (server === s) schreibeVerbindung(port); + }); +} + +function start() { + if (server || !deps) return; + schluessel = crypto.randomBytes(32).toString('hex'); + lausche(STANDARD_PORT, PORT_VERSUCHE); +} + +function stop() { + if (server) { try { server.close(); } catch { /* egal */ } server = null; } + schluessel = null; + if (verbindungsDatei) loescheVerbindung(); +} + +function configure(settings) { + if (settings && settings.streamdeckEnabled === true) start(); else stop(); +} + +module.exports = { init, configure, shutdown: stop }; diff --git a/src/streamdeckplugin.js b/src/streamdeckplugin.js new file mode 100644 index 0000000..19202c1 --- /dev/null +++ b/src/streamdeckplugin.js @@ -0,0 +1,82 @@ +'use strict'; + +/* + * streamdeckplugin.js – das AeroMC-Plugin in die Stream-Deck-Software kopieren + * ----------------------------------------------------------------------------- + * Das Plugin (Ordner streamdeck-plugin/com.aeromc.launcher.sdPlugin) liegt im + * Launcher mit dabei. Schaltet jemand "Stream Deck erlauben" ein – und bei jedem + * Start, solange es an ist – legt AeroMC es in den Plugin-Ordner der Stream-Deck- + * Software, falls es dort fehlt oder von einer anderen Fassung stammt. Nach dem + * Kopieren muss die Stream-Deck-Software einmal neu gestartet werden, damit sie + * das Plugin lädt. + */ + +const fs = require('fs'); +const path = require('path'); +const crypto = require('crypto'); + +const PLUGIN_NAME = 'com.aeromc.launcher.sdPlugin'; + +// Ordner mit dem mitgelieferten Plugin; null, wenn er in dieser Fassung fehlt +function quelle(istPaketiert, ressourcenOrdner) { + const kandidat = istPaketiert + ? path.join(ressourcenOrdner, 'streamdeck-plugin', PLUGIN_NAME) + : path.join(__dirname, '..', 'streamdeck-plugin', PLUGIN_NAME); + return fs.existsSync(path.join(kandidat, 'manifest.json')) ? kandidat : null; +} + +// Plugin-Ordner der Stream-Deck-Software; null, wenn sie nie installiert war +function pluginOrdner() { + const appdata = process.env.APPDATA; + if (!appdata) return null; + const ordner = path.join(appdata, 'Elgato', 'StreamDeck', 'Plugins'); + return fs.existsSync(ordner) ? ordner : null; +} + +// Was die Stream-Deck-Software selbst im Plugin-Ordner anlegt (Protokolle), zählt nicht mit +const IGNORIERT = new Set(['logs']); + +function dateien(basis, rel = '') { + const ergebnis = []; + for (const e of fs.readdirSync(path.join(basis, rel), { withFileTypes: true })) { + if (!rel && IGNORIERT.has(e.name)) continue; + const r = rel ? rel + '/' + e.name : e.name; + if (e.isDirectory()) ergebnis.push(...dateien(basis, r)); + else ergebnis.push(r); + } + return ergebnis.sort(); +} + +// Prüfsumme über Dateinamen und -inhalt - gleiche Prüfsumme = gleicher Stand +function fingerabdruck(ordner) { + const h = crypto.createHash('sha1'); + for (const rel of dateien(ordner)) { + h.update(rel + '\0'); + h.update(fs.readFileSync(path.join(ordner, ...rel.split('/')))); + } + return h.digest('hex'); +} + +/* + * -> { ok: true, status: 'installiert' | 'aktualisiert' | 'aktuell', neustart } + * { ok: false, grund: 'quelle-fehlt' | 'kein-streamdeck' | 'kopieren', message } + */ +function installiere(opt) { + const o = opt || {}; + if (!o.quelle) return { ok: false, grund: 'quelle-fehlt', message: 'Das Plugin ist in dieser Fassung nicht enthalten.' }; + const plugins = o.pluginOrdner !== undefined ? o.pluginOrdner : pluginOrdner(); + if (!plugins || !fs.existsSync(plugins)) { + return { ok: false, grund: 'kein-streamdeck', message: 'Die Stream-Deck-Software wurde nicht gefunden.' }; + } + const ziel = path.join(plugins, PLUGIN_NAME); + try { + const vorhanden = fs.existsSync(ziel); + if (vorhanden && fingerabdruck(ziel) === fingerabdruck(o.quelle)) return { ok: true, status: 'aktuell', neustart: false }; + fs.cpSync(o.quelle, ziel, { recursive: true, force: true, filter: (src) => !IGNORIERT.has(path.basename(src)) || src === o.quelle }); + return { ok: true, status: vorhanden ? 'aktualisiert' : 'installiert', neustart: true }; + } catch (err) { + return { ok: false, grund: 'kopieren', message: 'Das Plugin konnte nicht kopiert werden (' + err.message + '). Bitte die Stream-Deck-Software beenden und es erneut versuchen.' }; + } +} + +module.exports = { PLUGIN_NAME, quelle, pluginOrdner, installiere, fingerabdruck }; diff --git a/streamdeck-plugin/com.aeromc.launcher.sdPlugin/bin/package-lock.json b/streamdeck-plugin/com.aeromc.launcher.sdPlugin/bin/package-lock.json new file mode 100644 index 0000000..689ecd8 --- /dev/null +++ b/streamdeck-plugin/com.aeromc.launcher.sdPlugin/bin/package-lock.json @@ -0,0 +1,33 @@ +{ + "name": "bin", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "ws": "8.18.0" + } + }, + "node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + } + } +} diff --git a/streamdeck-plugin/com.aeromc.launcher.sdPlugin/bin/package.json b/streamdeck-plugin/com.aeromc.launcher.sdPlugin/bin/package.json new file mode 100644 index 0000000..c3aff41 --- /dev/null +++ b/streamdeck-plugin/com.aeromc.launcher.sdPlugin/bin/package.json @@ -0,0 +1 @@ +{ "type": "module", "dependencies": { "ws": "8.18.0" } } diff --git a/streamdeck-plugin/com.aeromc.launcher.sdPlugin/bin/plugin.js b/streamdeck-plugin/com.aeromc.launcher.sdPlugin/bin/plugin.js new file mode 100644 index 0000000..d73f5c8 --- /dev/null +++ b/streamdeck-plugin/com.aeromc.launcher.sdPlugin/bin/plugin.js @@ -0,0 +1,536 @@ +// AeroMC-Plugin für das Stream Deck. +// Spricht direkt das Stream-Deck-Protokoll (WebSocket) und mit dem Launcher über +// dessen lokale Schnittstelle (Einstellung "Stream Deck erlauben" in AeroMC). +// Port und Schlüssel stehen in %APPDATA%\AeroMC\streamdeck.json. + +import WebSocket from 'ws'; +import fs from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const A = (n) => 'com.aeromc.launcher.' + n; +const AKTION_INSTANZ = A('instanz'); +const AKTION_CLIP = A('clip'); +const AKTION_AUFNAHME = A('aufnahme'); +const AKTION_SERVER = A('server'); +const AKTION_ZULETZT = A('zuletzt'); +const AKTION_FENSTER = A('fenster'); +const AKTION_CLIPMODUS = A('clipmodus'); +const AKTION_NEUSTART = A('neustart'); +const AKTION_ORDNER = A('ordner'); +const AKTION_SPIELZEIT = A('spielzeit'); +const AKTION_SERVERSTATUS = A('serverstatus'); +const AKTION_SCREENSHOT = A('screenshot'); +const AKTION_DREH = A('dreh'); +const AKTION_FREUNDE = A('freunde'); +const AKTION_KONTO = A('konto'); +const AKTION_SCHNELL = A('schnellstart'); +const AKTION_BACKUP = A('backup'); +const AKTION_LOGS = A('logs'); +const AKTION_KONSOLE = A('konsole'); +const AKTION_ABSTURZ = A('absturz'); +const CRASH_MS = 30000; +const ABFRAGE_MS = 2000; +const PING_MS = 30000; + +const args = process.argv.slice(2); +const arg = (name) => { const i = args.indexOf(name); return i >= 0 ? args[i + 1] : null; }; +const port = arg('-port'); +const pluginUUID = arg('-pluginUUID'); +const registerEvent = arg('-registerEvent'); + +const tasten = new Map(); // context -> { action, settings } +let stand = null; // letzte Antwort von /state, null = Launcher nicht erreichbar +let meldung = null; // kurze Rückmeldung nach einem Tastendruck { context, text, bis } + +const ws = new WebSocket(`ws://127.0.0.1:${port}`); +const sende = (obj) => { if (ws.readyState === WebSocket.OPEN) ws.send(JSON.stringify(obj)); }; + +// ---------- Launcher ---------- + +function verbindung() { + const datei = path.join(process.env.APPDATA || '', 'AeroMC', 'streamdeck.json'); + try { return JSON.parse(fs.readFileSync(datei, 'utf8')); } catch { return null; } +} + +async function anfrage(methode, pfad, body) { + const v = verbindung(); + if (!v) return null; + try { + const res = await fetch(`http://127.0.0.1:${v.port}${pfad}`, { + method: methode, + headers: { Authorization: `Bearer ${v.token}`, 'Content-Type': 'application/json' }, + body: body ? JSON.stringify(body) : undefined, + signal: AbortSignal.timeout(3000), + }); + return await res.json(); + } catch { return null; } +} + +async function holeStand() { + // Freunde nur anfordern, wenn eine Freunde-Taste existiert (der Launcher fragt dafür den Server) + const mitFreunden = [...tasten.values()].some((t) => t.action === AKTION_FREUNDE); + const s = await anfrage('GET', '/state' + (mitFreunden ? '?freunde=1' : '')); + stand = s && s.ok ? s : null; +} + +// ---------- Tastenbild ---------- + +const esc = (t) => String(t).replace(/[&<>"]/g, (c) => ({ '&': '&', '<': '<', '>': '>', '"': '"' }[c])); + +function zeilen(text, breite = 9) { + const woerter = String(text || '').split(/\s+/).filter(Boolean); + const out = []; + let zeile = ''; + for (const w of woerter) { + if ((zeile + ' ' + w).trim().length <= breite) zeile = (zeile + ' ' + w).trim(); + else { if (zeile) out.push(zeile); zeile = w; } + } + if (zeile) out.push(zeile); + return out.slice(0, 2).map((z) => (z.length > breite ? z.slice(0, breite - 1) + '…' : z)); +} + +function dauer(seit) { + const s = Math.max(0, Math.floor((Date.now() - seit) / 1000)); + const h = Math.floor(s / 3600); + const m = Math.floor((s % 3600) / 60); + return h ? `${h}:${String(m).padStart(2, '0')} h` : `${m} min`; +} + +// AeroMC-Logo einmal einlesen und in jedes Tastenbild einbetten +let logo = ''; +try { + const datei = path.join(path.dirname(fileURLToPath(import.meta.url)), '..', 'imgs', 'actions', 'key@2x.png'); + logo = 'data:image/png;base64,' + fs.readFileSync(datei).toString('base64'); +} catch { /* ohne Logo geht es auch */ } + +function bild({ farbe, kopf, titel, fuss, symbol }) { + const sym = symbol && symbol.bild ? symbol : (logo ? { bild: logo, pixel: false } : null); + const t = zeilen(titel); + const texte = t.map((z, i) => `${esc(z)}`).join(''); + const svg = `` + + `` + + (sym ? `` : '') + + `${esc(kopf)}` + + texte + + `${esc(fuss)}` + + ``; + return 'data:image/svg+xml;charset=utf8,' + encodeURIComponent(svg); +} + +const GRAU = '#6b7280', GRUEN = '#34d399', ROT = '#f87171', GELB = '#fbbf24', BLAU = '#60a5fa'; + +const symbole = new Map(); // Instanz-ID -> { bildId, bild, pixel } + +const koepfe = new Map(); // Konto-UUID -> { bild } +const abstuerze = new Map(); // Instanz-ID -> { zeit(Abfrage), bericht, frisch, berichtZeit } + +function symbolKonto(uuid) { + const x = uuid && koepfe.get(uuid); + return x && x.bild ? x : null; +} + +// Instanz, die gerade läuft, sonst die zuletzt gespielte - für Tasten ohne feste Auswahl +function standardInstanz() { + const l = (stand && stand.instanzen) || []; + const lauf = l.find((x) => x.laeuft); + return lauf ? lauf.id : (stand && stand.zuletzt) || null; +} + +function vor(ms) { + const min = Math.max(0, Math.floor((Date.now() - ms) / 60000)); + if (min < 1) return 'gerade eben'; + if (min < 60) return 'vor ' + min + ' min'; + if (min < 1440) return 'vor ' + Math.floor(min / 60) + ' h'; + return 'vor ' + Math.floor(min / 1440) + ' Tg.'; +} + +async function pollAbstuerze(erzwingen) { + const ids = new Set(); + for (const t of tasten.values()) if (t.action === AKTION_ABSTURZ) { const id = instanzId(t); if (id) ids.add(id); } + for (const id of ids) { + const alt = abstuerze.get(id); + if (!erzwingen && alt && Date.now() - alt.zeit < CRASH_MS) continue; + const r = await anfrage('GET', '/crash?id=' + encodeURIComponent(id)); + abstuerze.set(id, { zeit: Date.now(), bericht: !!(r && r.bericht), frisch: !!(r && r.frisch), berichtZeit: r && r.zeit }); + } +} + +function symbolFuer(id) { + const x = id && symbole.get(id); + return x && x.bild ? x : null; +} + +// Instanz-Bilder (eigenes Bild oder Minecraft-Icon) nachladen, sobald sie gebraucht werden oder sich ändern +async function holeSymbole() { + if (!stand) return; + const ids = new Set(); + for (const t of tasten.values()) { const id = instanzId(t); if (id) ids.add(id); } + for (const t of tasten.values()) { + const u = t.action === AKTION_KONTO && t.settings.kontoId; + if (u && !koepfe.has(u)) { + const r = await anfrage('GET', '/icon?konto=' + encodeURIComponent(u)); + koepfe.set(u, { bild: r && r.ok ? r.bild : null }); + } + } + for (const id of ids) { + const inst = (stand.instanzen || []).find((x) => x.id === id); + if (!inst) continue; + const alt = symbole.get(id); + if (alt && alt.bildId === inst.bildId) continue; + const r = await anfrage('GET', '/icon?id=' + encodeURIComponent(id)); + symbole.set(id, { bildId: inst.bildId, bild: r && r.ok ? r.bild : null, pixel: !!(r && r.pixel) }); + } +} + +// ---------- Drehregler (Stream Deck+) ---------- + +function dialListe() { return (stand && stand.instanzen) || []; } + +function dialIndex(t) { + const l = dialListe(); + let i = l.findIndex((x) => x.id === t.settings.instanceId); + if (i < 0) i = l.findIndex((x) => x.id === (stand && stand.zuletzt)); + return i < 0 ? 0 : i; +} + +function zeichneDial(context) { + const t = tasten.get(context); + if (!t) return; + const l = dialListe(); + let fb; + if (meldung && meldung.context === context && meldung.bis > Date.now()) { + fb = { title: 'HINWEIS', value: meldung.text, icon: logo || '', indicator: { value: 0 } }; + } else if (!stand) { + fb = { title: 'AeroMC', value: 'Launcher aus', icon: logo || '', indicator: { value: 0 } }; + } else if (!l.length) { + fb = { title: 'AeroMC', value: 'Keine Instanz', icon: logo || '', indicator: { value: 0 } }; + } else { + const i = dialIndex(t); + const x = l[i]; + const sym = symbolFuer(x.id); + fb = { + title: x.name, + value: x.laeuft ? '● ' + dauer(x.seit || Date.now()) : '▶ bereit', + icon: (sym && sym.bild) || logo || '', + indicator: { value: Math.round(((i + 1) / l.length) * 100) }, + }; + } + sende({ event: 'setFeedback', context, payload: fb }); +} + +const pings = new Map(); // Adresse -> { ok, online, max, latencyMs, zeit } + +function stunden(sek) { + if (sek < 3600) return Math.floor(sek / 60) + ' min'; + const h = sek / 3600; + return (h < 100 ? h.toFixed(1).replace('.', ',') : Math.round(h)) + ' h'; +} + +// Welche Instanz gehört zu dieser Taste? +function instanzId(t) { + if (t.action === AKTION_ZULETZT) return stand && stand.zuletzt; + if (t.action === AKTION_SCHNELL) return (stand && stand.schnellstart && stand.schnellstart[t.settings.slot || '1']) || null; + if (t.action === AKTION_LOGS || t.action === AKTION_ABSTURZ) return t.settings.instanceId || standardInstanz(); + if (t.action === AKTION_DREH) return stand && dialListe().length ? dialListe()[dialIndex(t)].id : null; + return t.settings.instanceId || null; +} + +function adresse(t) { + return String(t.settings.adresse || t.settings.server || '').trim(); +} + +function zeichne(context) { + const t = tasten.get(context); + if (!t) return; + if (t.action === AKTION_DREH) { zeichneDial(context); return; } + const id = instanzId(t); + const sym = t.action === AKTION_KONTO ? symbolKonto(t.settings.kontoId) : symbolFuer(id); + const i = stand && id ? (stand.instanzen || []).find((x) => x.id === id) : null; + if (i) t.name = i.name; // merken, damit die Taste auch bei ausgeschaltetem Launcher ihren Namen zeigt + const aus = !stand; + const name = (i && i.name) || t.name || 'Instanz'; + let b; + if (meldung && meldung.context === context && meldung.bis > Date.now()) { + b = bild({ symbol: sym, farbe: GELB, kopf: 'HINWEIS', titel: meldung.text, fuss: '' }); + } else switch (t.action) { + case AKTION_INSTANZ: + case AKTION_ZULETZT: { + const kopfLeer = t.action === AKTION_ZULETZT ? 'ZULETZT' : 'INSTANZ'; + if (t.action === AKTION_INSTANZ && !id) b = bild({ symbol: sym, farbe: GRAU, kopf: kopfLeer, titel: 'Bitte wählen', fuss: '' }); + else if (aus) b = bild({ symbol: sym, farbe: GRAU, kopf: 'AUS', titel: name, fuss: 'Launcher aus' }); + else if (!i) b = bild({ symbol: sym, farbe: GRAU, kopf: kopfLeer, titel: t.action === AKTION_ZULETZT ? 'noch nichts gespielt' : 'nicht gefunden', fuss: '' }); + else if (i.laeuft) b = bild({ symbol: sym, farbe: GRUEN, kopf: '● LÄUFT', titel: i.name, fuss: i.seit ? dauer(i.seit) : '■ beenden' }); + else b = bild({ symbol: sym, farbe: BLAU, kopf: t.action === AKTION_ZULETZT ? '▶ ZULETZT' : '▶ START', titel: i.name, fuss: '' }); + break; + } + case AKTION_SERVER: { + const adr = adresse(t); + if (!id || !adr) b = bild({ symbol: sym, farbe: GRAU, kopf: 'SERVER', titel: 'Bitte wählen', fuss: '' }); + else if (aus) b = bild({ symbol: sym, farbe: GRAU, kopf: 'AUS', titel: adr, fuss: 'Launcher aus' }); + else if (i && i.laeuft) b = bild({ symbol: sym, farbe: GRUEN, kopf: '● LÄUFT', titel: adr, fuss: name }); + else b = bild({ symbol: sym, farbe: BLAU, kopf: '▶ BEITRETEN', titel: t.settings.serverName || adr, fuss: name }); + break; + } + case AKTION_NEUSTART: + if (!id) b = bild({ symbol: sym, farbe: GRAU, kopf: 'NEUSTART', titel: 'Bitte wählen', fuss: '' }); + else if (aus) b = bild({ symbol: sym, farbe: GRAU, kopf: 'NEUSTART', titel: name, fuss: 'Launcher aus' }); + else if (i && i.laeuft) b = bild({ symbol: sym, farbe: GELB, kopf: '↻ NEUSTART', titel: name, fuss: dauer(i.seit || Date.now()) }); + else b = bild({ symbol: sym, farbe: GRAU, kopf: 'NEUSTART', titel: name, fuss: 'läuft nicht' }); + break; + case AKTION_FENSTER: + b = bild({ symbol: sym, farbe: aus ? GRAU : BLAU, kopf: 'LAUNCHER', titel: 'Fenster', fuss: aus ? 'Launcher aus' : 'zeigen / weg' }); + break; + case AKTION_CLIPMODUS: + if (aus) b = bild({ symbol: sym, farbe: GRAU, kopf: 'CLIP-MODUS', titel: 'Puffer', fuss: 'Launcher aus' }); + else if (stand.clipStartet) b = bild({ symbol: sym, farbe: GELB, kopf: 'CLIP-MODUS', titel: 'Puffer', fuss: 'startet …' }); + else b = stand.clip ? bild({ symbol: sym, farbe: GRUEN, kopf: 'CLIP-MODUS', titel: 'Puffer', fuss: '● an' }) : bild({ symbol: sym, farbe: GRAU, kopf: 'CLIP-MODUS', titel: 'Puffer', fuss: 'aus' }); + break; + case AKTION_ORDNER: + b = bild({ symbol: sym, farbe: aus ? GRAU : BLAU, kopf: 'ORDNER', titel: 'Aufnahmen', fuss: aus ? 'Launcher aus' : (id ? name : '') }); + break; + case AKTION_SPIELZEIT: { + if (aus) { b = bild({ symbol: sym, farbe: GRAU, kopf: 'SPIELZEIT', titel: '–', fuss: 'Launcher aus' }); break; } + const liste = id ? (i ? [i] : []) : stand.instanzen || []; + const summe = liste.reduce((n, x) => n + (x.gesamt || 0), 0); + const lauf = liste.find((x) => x.laeuft && x.seit); + b = lauf + ? bild({ symbol: sym, farbe: GRUEN, kopf: '● SITZUNG', titel: dauer(lauf.seit), fuss: 'gesamt ' + stunden(summe + Math.floor((Date.now() - lauf.seit) / 1000)) }) + : bild({ symbol: sym, farbe: BLAU, kopf: 'SPIELZEIT', titel: stunden(summe), fuss: id ? name : 'alle Instanzen' }); + break; + } + case AKTION_SERVERSTATUS: { + const adr = adresse(t); + const p = adr && pings.get(adr); + if (!adr) b = bild({ symbol: sym, farbe: GRAU, kopf: 'SERVER', titel: 'Bitte wählen', fuss: '' }); + else if (aus) b = bild({ symbol: sym, farbe: GRAU, kopf: 'AUS', titel: adr, fuss: 'Launcher aus' }); + else if (!p) b = bild({ symbol: sym, farbe: GRAU, kopf: 'SERVER', titel: adr, fuss: 'prüfe …' }); + else if (!p.ok) b = bild({ symbol: sym, farbe: ROT, kopf: '● OFFLINE', titel: t.settings.serverName || adr, fuss: '' }); + else b = bild({ symbol: sym, farbe: GRUEN, kopf: '● ONLINE', titel: p.online != null ? p.online + ' Spieler' : 'online', fuss: (p.max != null ? 'max ' + p.max + ' · ' : '') + p.latencyMs + ' ms' }); + break; + } + case AKTION_SCHNELL: { + const slot = t.settings.slot || '1'; + if (aus) b = bild({ symbol: sym, farbe: GRAU, kopf: 'AUS', titel: name, fuss: 'Launcher aus' }); + else if (!id || !i) b = bild({ symbol: sym, farbe: GRAU, kopf: 'STRG+' + slot, titel: 'nicht belegt', fuss: '' }); + else if (i.laeuft) b = bild({ symbol: sym, farbe: GRUEN, kopf: '● LÄUFT', titel: i.name, fuss: i.seit ? dauer(i.seit) : '■ beenden' }); + else b = bild({ symbol: sym, farbe: BLAU, kopf: '▶ STRG+' + slot, titel: i.name, fuss: '' }); + break; + } + case AKTION_KONTO: { + const k = stand && (stand.konten || []).find((x) => x.id === t.settings.kontoId); + if (!t.settings.kontoId) b = bild({ symbol: sym, farbe: GRAU, kopf: 'KONTO', titel: 'Bitte wählen', fuss: '' }); + else if (aus) b = bild({ symbol: sym, farbe: GRAU, kopf: 'AUS', titel: t.name || 'Konto', fuss: 'Launcher aus' }); + else if (!k) b = bild({ symbol: sym, farbe: ROT, kopf: 'KONTO', titel: 'nicht gefunden', fuss: '' }); + else { t.name = k.name; b = bild({ symbol: sym, farbe: k.aktiv ? GRUEN : BLAU, kopf: k.aktiv ? '● AKTIV' : 'KONTO', titel: k.name, fuss: k.spielt ? 'spielt gerade' : (k.aktiv ? '' : 'wechseln') }); } + break; + } + case AKTION_FREUNDE: { + const f = stand && stand.freunde; + if (aus) b = bild({ symbol: sym, farbe: GRAU, kopf: 'FREUNDE', titel: '–', fuss: 'Launcher aus' }); + else if (!f) b = bild({ symbol: sym, farbe: GRAU, kopf: 'FREUNDE', titel: 'Keine Daten', fuss: 'aus / lädt' }); + else b = bild({ symbol: sym, farbe: f.online ? GRUEN : GRAU, kopf: f.online ? '● ONLINE' : 'FREUNDE', titel: f.online + ' online', fuss: 'von ' + f.gesamt }); + break; + } + case AKTION_BACKUP: { + const bk = stand && stand.backup; + const frisch = bk && bk.zeit && Date.now() - bk.zeit < 600000; + if (aus) b = bild({ symbol: sym, farbe: GRAU, kopf: 'BACKUP', titel: 'Jetzt sichern', fuss: 'Launcher aus' }); + else if (bk && bk.laeuft) b = bild({ symbol: sym, farbe: GELB, kopf: '● LÄUFT', titel: 'Backup', fuss: 'bitte warten' }); + else if (frisch && bk.ok) b = bild({ symbol: sym, farbe: GRUEN, kopf: '✔ FERTIG', titel: 'Backup', fuss: vor(bk.zeit) }); + else if (frisch) b = bild({ symbol: sym, farbe: ROT, kopf: 'FEHLER', titel: 'Backup', fuss: vor(bk.zeit) }); + else b = bild({ symbol: sym, farbe: BLAU, kopf: 'BACKUP', titel: 'Jetzt sichern', fuss: '' }); + break; + } + case AKTION_LOGS: + b = bild({ symbol: sym, farbe: aus ? GRAU : BLAU, kopf: 'LOGS', titel: 'Logs öffnen', fuss: aus ? 'Launcher aus' : (i ? i.name : '') }); + break; + case AKTION_KONSOLE: + b = bild({ symbol: sym, farbe: aus ? GRAU : BLAU, kopf: 'KONSOLE', titel: 'Konsole', fuss: aus ? 'Launcher aus' : '' }); + break; + case AKTION_ABSTURZ: { + const a = id && abstuerze.get(id); + if (aus) b = bild({ symbol: sym, farbe: GRAU, kopf: 'ABSTURZ', titel: 'Bericht', fuss: 'Launcher aus' }); + else if (!a) b = bild({ symbol: sym, farbe: GRAU, kopf: 'ABSTURZ', titel: 'Bericht', fuss: id ? 'prüfe …' : 'keine Instanz' }); + else if (!a.bericht) b = bild({ symbol: sym, farbe: GRAU, kopf: 'ABSTURZ', titel: 'keiner', fuss: i ? i.name : '' }); + else if (a.frisch) b = bild({ symbol: sym, farbe: ROT, kopf: '⚠ ABSTURZ', titel: 'Bericht zeigen', fuss: a.berichtZeit ? vor(a.berichtZeit) : '' }); + else b = bild({ symbol: sym, farbe: GRAU, kopf: 'ABSTURZ', titel: 'kein neuer', fuss: a.berichtZeit ? 'letzter ' + vor(a.berichtZeit) : '' }); + break; + } + case AKTION_SCREENSHOT: + b = bild({ symbol: sym, farbe: aus ? GRAU : BLAU, kopf: 'SCREENSHOT', titel: 'Spielfenster', fuss: aus ? 'Launcher aus' : '' }); + break; + case AKTION_CLIP: + if (aus) b = bild({ symbol: sym, farbe: GRAU, kopf: 'CLIP', titel: 'Clip speichern', fuss: 'Launcher aus' }); + else if (stand.clipStartet) b = bild({ symbol: sym, farbe: GELB, kopf: 'CLIP', titel: 'Clip speichern', fuss: 'startet …' }); + else b = stand.clip + ? bild({ symbol: sym, farbe: GRUEN, kopf: 'CLIP', titel: 'Clip speichern', fuss: 'bereit' }) + : bild({ symbol: sym, farbe: GRAU, kopf: 'CLIP', titel: 'Clip speichern', fuss: 'Modus aus' }); + break; + default: + if (aus) b = bild({ symbol: sym, farbe: GRAU, kopf: 'AUFNAHME', titel: 'Aufnahme starten', fuss: 'Launcher aus' }); + else b = stand.aufnahme + ? bild({ symbol: sym, farbe: ROT, kopf: '● REC', titel: 'Aufnahme stoppen', fuss: '' }) + : bild({ symbol: sym, farbe: BLAU, kopf: 'AUFNAHME', titel: 'Aufnahme starten', fuss: '' }); + } + sende({ event: 'setImage', context, payload: { image: b, target: 0 } }); +} + +const zeichneAlle = () => { for (const c of tasten.keys()) zeichne(c); }; + +async function pingeFaellige(erzwingen) { + const adressen = new Set(); + for (const t of tasten.values()) if (t.action === AKTION_SERVERSTATUS && adresse(t)) adressen.add(adresse(t)); + for (const adr of adressen) { + const alt = pings.get(adr); + if (!erzwingen && alt && Date.now() - alt.zeit < PING_MS) continue; + const r = await anfrage('GET', '/ping?ip=' + encodeURIComponent(adr)); + pings.set(adr, Object.assign({ ok: false }, r || {}, { zeit: Date.now() })); + } +} + +async function abfrage() { + if (!tasten.size) return; + await holeStand(); + if (stand) { await holeSymbole(); await pingeFaellige(false); await pollAbstuerze(false); } + zeichneAlle(); +} + +// ---------- Stream-Deck-Ereignisse ---------- + +function zeigeMeldung(context, text) { + meldung = { context, text, bis: Date.now() + 2500 }; + zeichne(context); + setTimeout(() => zeichne(context), 2600); +} + +const FEHLERTEXT = { + [AKTION_CLIP]: 'Clip-Modus aus', + [AKTION_AUFNAHME]: 'Spiel läuft nicht', + [AKTION_CLIPMODUS]: 'Spiel läuft nicht', + [AKTION_NEUSTART]: 'Läuft nicht', + [AKTION_SERVER]: 'Läuft schon', + [AKTION_SCREENSHOT]: 'Kein Spiel', + [AKTION_ABSTURZ]: 'Kein Bericht', + [AKTION_BACKUP]: 'Läuft schon', + [AKTION_SCHNELL]: 'Nicht belegt', +}; + +async function tastendruck(context) { + const t = tasten.get(context); + if (!t) return; + const id = instanzId(t); + const i = stand && id ? (stand.instanzen || []).find((x) => x.id === id) : null; + let erg; + switch (t.action) { + case AKTION_INSTANZ: + case AKTION_ZULETZT: + case AKTION_SCHNELL: + case AKTION_DREH: + if (!id) { sende({ event: 'showAlert', context }); return; } + erg = await anfrage('POST', i && i.laeuft ? '/stop' : '/launch', { id }); + break; + case AKTION_SCREENSHOT: erg = await anfrage('POST', '/screenshot'); break; + case AKTION_FREUNDE: erg = await anfrage('POST', '/open', { art: 'friends' }); break; + case AKTION_KONSOLE: erg = await anfrage('POST', '/open', { art: 'console' }); break; + case AKTION_LOGS: erg = await anfrage('POST', '/open', { art: 'logs', id: id || '' }); break; + case AKTION_ABSTURZ: erg = await anfrage('POST', '/open', { art: 'crash', id: id || '' }); break; + case AKTION_BACKUP: erg = await anfrage('POST', '/backup'); break; + case AKTION_KONTO: + if (!t.settings.kontoId) { sende({ event: 'showAlert', context }); return; } + erg = await anfrage('POST', '/account', { id: t.settings.kontoId }); + break; + case AKTION_SERVER: + if (!id || !adresse(t)) { sende({ event: 'showAlert', context }); return; } + erg = await anfrage('POST', '/launch', { id, server: adresse(t) }); + break; + case AKTION_NEUSTART: + if (!id) { sende({ event: 'showAlert', context }); return; } + erg = await anfrage('POST', '/restart', { id }); + break; + case AKTION_FENSTER: erg = await anfrage('POST', '/window'); break; + case AKTION_CLIPMODUS: erg = await anfrage('POST', '/clipmode'); break; + case AKTION_ORDNER: erg = await anfrage('POST', '/folder', id ? { id } : {}); break; + case AKTION_SPIELZEIT: zeichne(context); return; + case AKTION_SERVERSTATUS: + pings.delete(adresse(t)); + await pingeFaellige(true); + zeichne(context); + return; + case AKTION_CLIP: + if (stand && stand.clipStartet) { zeigeMeldung(context, 'Startet noch …'); return; } + erg = await anfrage('POST', '/clip'); + break; + default: erg = await anfrage('POST', '/record'); + } + if (erg && erg.ok) sende({ event: 'showOk', context }); + else { + sende({ event: 'showAlert', context }); + zeigeMeldung(context, !erg ? 'Launcher aus' : FEHLERTEXT[t.action] || 'Nicht möglich'); + } + setTimeout(abfrage, 600); +} + +ws.on('open', () => sende({ event: registerEvent, uuid: pluginUUID })); + +ws.on('message', async (roh) => { + let m; + try { m = JSON.parse(roh.toString()); } catch { return; } + switch (m.event) { + case 'willAppear': + tasten.set(m.context, { action: m.action, settings: (m.payload && m.payload.settings) || {} }); + await holeStand(); + await holeSymbole(); + zeichneAlle(); + break; + case 'willDisappear': + tasten.delete(m.context); + break; + case 'didReceiveSettings': { + const t = tasten.get(m.context); + if (t) { t.settings = (m.payload && m.payload.settings) || {}; zeichne(m.context); holeSymbole().then(() => pollAbstuerze(true)).then(() => zeichne(m.context)); } + break; + } + case 'keyDown': + case 'dialDown': + tastendruck(m.context); + break; + case 'dialRotate': { + const t = tasten.get(m.context); + const l = dialListe(); + if (!t || !l.length) break; + const n = l.length; + const neu = (((dialIndex(t) + (m.payload.ticks || 0)) % n) + n) % n; + t.settings.instanceId = l[neu].id; + sende({ event: 'setSettings', context: m.context, payload: t.settings }); + zeichneDial(m.context); + holeSymbole().then(() => zeichneDial(m.context)); + break; + } + case 'touchTap': + // Tippen auf den Touch-Streifen: Launcher-Fenster zeigen bzw. wegminimieren + anfrage('POST', '/window'); + break; + case 'sendToPlugin': { + // Eigenschaften-Fenster fragt nach der Instanzliste bzw. den Servern einer Instanz + await holeStand(); + const payload = { + erreichbar: !!stand, + instanzen: stand ? stand.instanzen.map((i) => ({ id: i.id, name: i.name })) : [], + konten: stand ? (stand.konten || []) : [], + schnellstart: stand ? (stand.schnellstart || {}) : {}, + }; + const frage = m.payload || {}; + if (frage.frage === 'server' && frage.id && stand) { + const r = await anfrage('GET', '/servers?id=' + encodeURIComponent(frage.id)); + payload.server = (r && r.server) || []; + } + sende({ event: 'sendToPropertyInspector', action: m.action, context: m.context, payload }); + break; + } + default: + } +}); + +ws.on('close', () => process.exit(0)); +setInterval(abfrage, ABFRAGE_MS); diff --git a/streamdeck-plugin/com.aeromc.launcher.sdPlugin/imgs/actions/icon.png b/streamdeck-plugin/com.aeromc.launcher.sdPlugin/imgs/actions/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a440993b86f69129a6a91e81201a65823419cb78 GIT binary patch literal 1265 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1cpgOK~y+TwUg^l zn`Icr`KlQ(XzA(g`CM8`kF=%bP@okC2tpZK$7vkpAcBZHI3*f2V>8)?ZZQFz$z(2? zfQ=s{O-$soPK{&WVY*;6?$Z{g;!f=HexH|Q`v-iIU!M2<&|k0K_tlL5^(1=UGL}7a zcq~veHs_0teCn+nTJ}VrO}nH0>B929bYWR{+8OCg7lb=LcZS=S3L|Z^fy#rU^@$PP zj^fdYHcobXV$W|m%12=<8HP1H2utw*ETKM_gWWI{b;00ohu)Kf-rWkFs|C8kX6Rkb zu=<<-4o2IPJF1L~+T@hp6&>0(1^Zy451T{1M2{c}bU|C#3Wc#AYDW`v?iOgBP4wIV zmAw|6wHgX@97b2|-LmRlB@+hXBNO)0VVDCX3zCQz7WcvE?*wOQgr{~K$>R%fRt-X; zse&q>mp@JS9w@C(k+2f#{2JK(je|_+D(^pU4G&P7gF-4o?Pz81EpJ@HiS>Uly9rER zy^Y3W^HAICk*6vpSv4h$Lt(0*FRp^Y89&Q}jz~|6Ph~3VWU0)74#Y;z;PA>HIQ1uq zt^seZZDaZu;55BYesLY8-LFx?IOL{E$c<4Z)mSSoF`=!vbD2+Lq@inQPLY8HOsxaQ ze*>mgxADsN5AZ6%-&0qClQ)1Pm$%`ln}S3YgxpZZP?<`Xn9x#mAZ?^{25%BNX9L`A zi-^8{3kMc%Ve;|=99?~gL*H)W*bl&qU*ALB$?srjNI~I03b{TAnZAU<8N(?iH2L7^Hr1hSCRF4F0YY&`zFCaAeI|AcB!ZW;%f}x+_8CZcVGy_HC9MqMwP{%KT z^S=P8#z&hEGV;`3L8x&yrum}M4Ha$8-h3WKwKYM`V(X?)$t-kevq7O>m33aOsTwnr`!7p+1 zUtoT54X(O#5V>B4#G0T)ZW1|>OR^k!0pUP)p7|ptl$$Ev=UdO0lb(qv>s6l03$48h z!M!uc3cQ0%Z3`Q|m@6Qeo2BAKyQMZpX0GvFCX^Y=#yLw2GDE2VbxNv_FvK+QEU6QD z+A#8zuAOAO%t}3Opb4-IidDYHM0~0OeqP9y zSdk?*5k`{fww@HLFlXhNHOL79;66%$e&NGMWzAX3oq<&P(`FyXFT-OXLO znx-Aqqmv`|szoaAfQa+VP@0P*SR_G;uLDU^*-~4Iep)I^Y+lS187@+)Geqwbxk^qj bWMupYLQG_H9YxJg00000NkvXXu0mjf;3Y#u literal 0 HcmV?d00001 diff --git a/streamdeck-plugin/com.aeromc.launcher.sdPlugin/imgs/actions/icon@2x.png b/streamdeck-plugin/com.aeromc.launcher.sdPlugin/imgs/actions/icon@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..73cc625b590cdec611459b319f357686ba7a00a0 GIT binary patch literal 3132 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 Hu0mjfOC5*n literal 0 HcmV?d00001 diff --git a/streamdeck-plugin/com.aeromc.launcher.sdPlugin/imgs/actions/key@2x.png b/streamdeck-plugin/com.aeromc.launcher.sdPlugin/imgs/actions/key@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..672aa8977f0027a5e67e866678a9f13cc93004dd GIT binary patch literal 14196 zcmY*=WmHt(7xo>7?ijiSq)QQL1_Xxg?k)jAY7mhTB%}rqq&p;~Lr@xqE&&OpLy#Jf zl6vR&f4{u%hdXDTweFg8_SyS+&fd>C_r0z*jD(PZ5C8xYHB}{jOq=-MgO7{(-BDR@ z#WWyaeV8Kfd7Nn%)4_I8&{6<^IwaAJ9S){X;H_%r3jn0O|2-hoi!w(5cuJtAq+kfQ zKKO-~oih7H-uvZ?L#@KUPQe*D2j4E17lw@k(n<(5@ZOftb}Je|`0?Ef^&B)k$}{0d z_Y4|U(O5CIz1FH$w(P53&ytkC;- z@eewT)o6hlnq$j^9I0RN$DSp1rwYe$Q+bDd9B+%GnU`-bJB`o1J{I0Cg4K$as z4Aq$4WYaht&5y1s?{@Eb9Q^EcmKr++!9lnC4LZ==z#I!)CHVHOUK6O>XN*cE!tgr& zy(`00d&{wOin}ciSlpo8i@xaeqqTeV(M_nI7l||V4co&P?xyBvVWU6WO3otUM?R%# znm^H9ZhQ6I2(`%Q-ZuBsda3E~?)@*uH}Z8Zw+!0|WzUiMWXon|SA&lC)(i*-`3NwvI{G}J1v}Z;t zI{^Qtmm;xr?7(e!Rm zEaR%0UCVo0hZW_crm?T@ihf(bxjGLr8*(@R&Wc@2SecCBOl#N)x3#L|6AhjQcZw1d zf#R8ys}y}HWU|J#zP^t<7tNW0;uMoQPxdo(L_-o0&u1uSp3_I6x}e8TG731;oZ19M zzkE;GEX#1$31C%TdW5rUlswx@RifqG^6-QId*`7{P0@7 z(ltjL4hv*yOQtrIm3__|X4o;%`a@}Jsqo>SF?dO8)m*3A!1#OLIhT#0_=LQ*q4Xc_ zU9NAw&!!pH`+nSIwI`2kbJ9E|u{3-dbld%L*J8ZZeY(Z_DQbGAC4+D2hps~J%i$_( zOko>X8MVn#*UQJg`DLP zJ;|9ATmBluob{zG`X0u3T(p061Frn|%8x#^opT`?W29X2lR+k0e|mIc-G$*iO=a!( zuS>QU;t{J$Qlw(I`jb>H2+8}UkiivVI46>p z*`8*w^S4Q?Jdn#sY&=A|-EsK5tJS=6zOZH|MmUq%X0h#G^G7$@P)Sd;(af*T@V&OD z-eN-~r**r&ey01nKl?%P4%vVkxf+N-$r>x>5wU8&16Cplk~uL3rbeWkPpHiK^zHe%q%h9?Q+!<2ePi9uPLlU$RIRYVnT@g4GU%qwvuUEWi3kA)vDYnzRY z9WLL?%VR(H<+tZlNdGwb!o|`+@NC1YZT~^Eu zfx4{P8fUVMyzS0)qzOzB3ld#Z0|beMA0%0GL8{537KQsZxJiZ=tRsFoyT_=R3%HWm7xegAeU zN;k2r&NT*pP3|22`DoR31AvWrgI`w3$zeg(@KsGhI1wIjY&OHf+IR0|*wIZ)`hMn* zsb@#?n|b-mIvfaewK^y)g3gZ&VkYwF&8C{S@ukh0v^&#ZK2JLtbL8f{+P>zagbx0o zO`HOmSo{J%2bpypOL9_kybk>MVc%*^<+m(Xf;kXXDrC$DRcFqnH>by6$6 zH(yocl^tT>lyy}38(sSw?FvY;F%YvQpil_QHS~Ok<*5APITsi*%&$k%sl~rvI56Hn zGx;S&|5W-j^^)}FA8BQhk;B8>V98EY+S=O1$nnRLc#n-=*pEL5)?fTtzYJu5hO1gF z_Zb-4W|hrXB~|S&!rA=%Z*VaUH<5#-&**FoA;E$}4ue>Xv6oN>=sWzNtjG|{qiisz ziIHV#OEqYR`}`TLo{>A%e?um^BCrst{?wXMkjcz3G!k`nGy|SyJK+3nwob8XLUacRLbe++A*FlV{S|n-?$m%WbuZ6L#`64_CC6<45{S zC0`U%E|f|u;i}Lq2^OAD8%<~eQK0aMt4{Bx3 zIX%5Iu~8*jednRg`)*^hF&V@8+Wmx~+xE+eiusBB`G=BTg|hV|Ka_AwYHg^ZE{5cy zdRKO(p;#07pz>K14;$^l2t}g7na{5d2^JXC19u%^%2-*NpRS%g&QRV~!kPgipx1ib z|MA+ZBz1HwZ~ohw#`!Z{xr^1Z!`8R|2E{F@n8`8A(1#k5Lv9~AR?h@OllO{1j<4^0 z%H)JV1TreX?qV8oVhjq0jdm7>1EDlf?#9oHl1kI{GMlKQxKrckpSyOp^X{m8KCaF8 z!s`84&$b9uXeo_hAu^V3ph)HQ*Y7*^_aSn4n`mrj0OKvtU?hwX<3PO4y}u>B8x)D= zA!3NhfiS%Y0ktMWaUYtBNz0fCk4(YlH^;HJah0XM2Rr+9;=9yDmyu=iij!XXzK)Cu z^T)M=wXHFikJ~0b-AhM7$WacE#P+?7S9kP(cVodX`-(uD?_eMZrNw(=V+G!;1H+Y$ z#Cnak+`hT%?WE)&e~qUtV~Z-()s;NCo+&hmOMIKH3lFTp_7r)&G`B0eq={iLBGvxz z`D0g5P>$1CJoy1G3D#6TQ0FR_wtX~xf9;52Msv)3WZ5*_X*(uA zAPOviX+u_EdTk1%Ux|Fo7JQZj(nsS%tw|?7S0MQ@uNsGh0Xza7F){9?nAo2Ap7g%y zDl9CpveoS>{6nctOwqMs2k0M(zWuY}1=WzoEWtlQIg5IIP2Gf;h{#TX0Y{Diq|dw zR0;B%+N^J&or8IuUNsBwrBd$UVp`PNLIMn6=sT`jtpgLr@fEeksZ_XUf>jSL2uZh1 z%&)#CFMe)v;af6x2v5OlT@qJr(NiB6dN8&_k!M4u+TZ&CTx`sWqYKyPj^OgwJqY9f zJr(=k_lYP>#thI&U>vqXxp9GKNEJHd(xSI zS!i~tU5yv14d|nz&r87AG6|Tmk&wjFe-e$tdB&`?2t|8-p3cIwli}by3Wz~6r)s)I z#F<9T^S$=;`uUp=Bis1Y3F5Dy0;S|ZRf@j6)=KvQV>?|tTX0j4ds6gK!`hT_9=+?c zkjwREef`Ab4jIT?#m(G3AXu*TVLoz zvU0rNzDE^z#m&%_GqpL zy$HX1+?#gC1AZ5&j^E5ox=WF))8n-A1>masuUdX*j4p`2XUC%Z8(wfSPm)z}nH$1X z?WG=yh=*d=RUsI(cwvG?3}I=^dV#o#upEw|hVBhu@c6h26ZrIP8@k{@ zda@o2%;xlC)N%$vC7ard!iIDu{_?9OnS3VtDL$V2NlmoDX-Q! z*9Xk1n2lAsqIGhM|J1HMeGT=S{UhLln^QTpcn;b)+z9=&oD=B4bJUMJ^O9$v5|egS z?s4E1yV0&z8cJqsCIA8`^3>iMw5PkX9*snl{g!y^jM#K{+c8dw9U~5@;r+43gjND-DBN#N;qf}WdRAY%1E zvgB8a*$jI8cWoFtEV3?DPcl?RYv_rC~JG4IB@f~0mnHeSe$1)-Q>rG#V-H6wy*$=zP z<$%qanT{)CIXoQG3dB1jW?>Avkvn@1U`z^y4^`0Pl6ar0>;8t{i8}B#b&_r>mn)rx zE;m|7VjhHIi^J z=v?nO9}A>|Xi86hnK?Dk#`B=OUVT!e`Q>w(UtQ*=>TaFPi42UK^lVR{4m8OOFcH#O zm3XcuJlGbmVf&`k;_-a2-;-6#x1b;t|0lN{bd7_EM^TP-1ic&j*Mz?Fcm2kummXd@ z=)GQ$+wmp*d(aH%u zs#O^V=>CJku*0#&za71=4FZasL?u?DfoUVx8fl%^Y6dlTICnbV#MrAKbn_)TSLN~Lz=-Bkvn7wYC$$7*d@)Gm11#%XIr_XmX9p02&^A|4Z8 z&P3HeAATYzP@dm+H+-N2mmwa{tw2(-Naqh0^9>8-Xx5cCrQtI~&IO*h)5`XKzMx8z z510S?LDpS|R5c#pjOZ&w6%Wu;j|jvJ?>}qb%io{#7dskval?z;$Qg7J&MDRC?EkV) zr=6I-Dhsnkw9M#GkkpzXUjcp?l zBpj7D?O&b{+3!*7@BjoEy}i~U$*lO`D0E4{|S08d}j{nrz$s3fDi zkjC1y7>17p44R+HJhs^L#FZl1>hPgLqHd2r$QP%`-nG7&9cw&9h8E`ROH-^Q(XvWv z(Qd^4t4XhR{jtyJI&}-mm+nfrG*U6k+u=12jFr#7V>ELk-w>KB6+IPycuHD&q4c&@0;EZ2|09 zcC5Fwd%LzWm0S5s^F50=`4GU$yu@sgMmWfd=vg1;2?tkvQ$9ZaI!~3hIX4lH?`esGv$PuI2L9LzOs2j+vykC>~L;z z+h$N_WxsF}WcweC!e-}*b+Gp#U3iZ&Q+B_7-BC8mm z`w=bv?UKvi`r=W4(=Ql%s(i`dqQxa!b-oWSC#vYCA|Ye1SKBrKS`EoE4*s;d7F73~ z&DmruSh^*ELIfbXC((jI6OzL9ix4m4)j^F(eByb9Ct9q!Lv0sj@Pqc5fZIIR{-XQh zSR2V_S)x=PJ+v1~xf%%$hrQ&or`#{}7UNd*z55R!qG+Ld@fBDSRcIMT8yIl?^HNk| z3H`g0thX1}6_J4MevJT8}sY^G(U9R<3@s&5=NWLbEi`c2{GGqi@%e3 zW!?)M5OaUL2%{CXxqqk(s*{tiQJ~n|v zHW7QPXlK0j^TM}+R$|qMxb_m?&=41x1tyh&MhXN%MQit8V7d3Kw4whHUOG~)B>qz9 zSDeEw?(3++%VEs=y%fmJnL@%T3s zPsfHep-_9O09ELN$$U?@?|*%PHZ`Ea?=4E}i~{a~uxu3K!r5d6LG||8nYAFPmLZ-0 z#lxrfqgB7}MPg;sHNQQ=fjL5w8CFH`)o~1)cc1a$WKNSDwQ5f7wM;E8mo_tMPo2Q- z6|%hb&F_E&PxEk!eS5HvOQ3D@2UNSXr`ImPSNOa5FyJOGb(9L&rR=9ZoY5fl$AdU zrU7zu=*`^8egj`n8b;EbcOQu=Zva@zZ;nfrN>KZrcMa2;(L!epNI>};w< zNHAZ9u%1R=(fOMsl)~(wd)KK!ew^os7VZe51LtS=3e9ga@dI3jpvlOKAb(!7i;wT~ zORA;RaQL->N zj(GNCCL;(R6-YXW&w>F!=pH6J>;hyJfS8H0PlJ6iHUuoWX@orAUMF;|^CH+|A&D|` ze**yX*mG>?a}a)NzlZ4)J~}v6__><)*LEam1cTRQt`LpxF5Ph3f8(a2XsZ zabG4bH1+w^$9d*x;$F2HgT`&nE#Xk`?7pBJYc-rf5c`?<(#%^I@&IYW?j4)68#i+# zD5$$Pv|xG`X+M5N5%FhNO1O=Cmj?c7}&LOI4A@JN%$|AV+@m_rLI7% zPygY0)Up2~ENZ7eS5>~ral5=xAFwysns(Mrw}gQjaS!kja{xIxv3Nw~a`9KE8V9*o zQO?U3yw!cXF0%#S8?mxvAoOq=ZUMt=C!Mp5U zFkp1*{y6;$3{`E*AQBDolkAeW^*g5)E9WkdDsK= zgLTnufk8OD=BK3-$@0fiTY{lEdo}R9ZF@QMh#*J6(^Hb~Lrp!yf&12}lGW2rmG{3c zbal}n!kU3Z%L|81@fFAQ9EhHOIBp`p%;MfgG)zB)6E2aDkIR#1um2n<>*LHXr2nKJ zyYK?)`nks`_Epf+;NsdD36O8Xlj`_&e&ZsXy6d1?bmhu%(8ztS33~~7MX{q!xsrN+q@BbadqfHow7t#$w|*d=vY|B@ zRHB0jsvu;ZCMk3N1s03SYZB35X{VYJ$X8<@iukU>MLX7L)fO-RJ`Cd$Q3wnA7bsyANVD#@AsV(jwZL$x*0{%t;8{WUQlvjD{T9y_e14rG2y zQ$rcSZ`Mx#Z`10M?`7CtU?;`z8+@%;zh)g(iV7$XE2>6&U5d?8FR6*)81U-Og9 zW><9_=8WODc`xppOjuio!*3%SOb<_e`H^X-rTSW~5GV8!Pf!}3Nh5!SBlrr-XeZ-) z;|)&X?nS7kBoV7(Wm}S>`h|hg7}P|CuZVN6b6 z3FNCofb@k}+>lINwhrLFLp>IN&0~8(`|gA)rQwo#6joz!!5mtuT(y^Pb#{N@V%V`u zkX_-`z3VRQ^@IB+u7%hP!MUrZ^3ZCYJywM^w-*9o1|Rgrgw!K?g+X z`{%dpT}APa1yF+pzl&ZAT)+O9LK7p%2vzQ?3&s)m?SH>E)I~7-?O4J|SWe}M^m0k0 zEQ-f@`T%0+EgNCN(xrk$1{Px~$52FCB|;sWjT-s-Q12KcA@&sk^&1L3_2_1%m}uc5 z@=7%*I_TRc%9Br6$X88z9*yGm8zI!v`A=(;dhu1WwrcbYIh=En|MWdv7W=BeNF?0J zfSCU_PMjDl!(x#JX7T)EKN|(^8KLkgfq0BPCg5q=F??;E*X6*8SoN10O8%)?SHeH3 z4&YaFhF+oV$QZXbq(c?#sDrl{Uo{tD1oT7=nSO|Ez~R~~4C$h1N&`4GaL52#nT&-F zzHK`FTUu*b!QzEj`iD>C623m#x9fdvi2_5+-+&`bnCb3paf$es!iU4Z(}u5OA^!|- z+zomWp+0E60s2HD`fDfLD0PX!DNC_q)Mo8b{%MGa-sfd69VLB^{uBXlzDYlBhs?en@av)p42k}3VhdqR zc7kVDB1w>7Hc6Hee>V^gZ0%IZF#~5Ni0@&0)`leGdsSzIkkX$n(O10U-n$yTEaIc6 zrWGRS4}0(hNvH^3MCze20E#0;I-L2K1^wKZ`cKk)xacH@^DYY;k~$T{C-wZ1c*~eu zL(~Jl{GU!JUOdFh+PA&TnEz=8>Fz#(Bz%~!{q#~kBGvNk9vIrSPKjJ7Fq>{mapXZf zK=1TC8Uxjr24*WVez&yx1(gtgnsiH_6kUuP!)qNghbG(-=*AV2l;Rw+dX+Lw%Tmy~ zAgsS#$T5x7`+zrE=Xs&4x;rZ|ydr{GeImgxObG9P>lhuUt~+Tx$%yqWo^2z-6ie{Z z*BPW-+LCAA=_RnVUw{vWU?2lvaI-MqRiHZkvsWx|g0XSq(~%x7pgi&F?aHv+N2A_! zV}K9D#60mdhIK4J>@73X@OXKFhr@TQzY-3VNX0bN7`R$K?02y{wIOlZDJ!aDwbSl7d6nyQ2nej%DdGL2N z1(l9mX*B)V%Bj?LNztZFkTedBbvN>)!089^i^&1Sm}W3}JMa*^Ns4SA-XKNN=rXJp zqs{OUnm5*TKm>OSKwinVzToJQ1U_a$O%##g8MfjZt@AhubrHCMoRisAXa0sa4uIMG zZ_)EEGcAX93^`vus5o1XN4W(Qvo@!IbPEW1R$g!Ucv#^c1EirVt*ej?gn(MS!kXF` ztC=a$`UEG(g9Z5asW)<3Jyh;P=B?z2gy=CjG0yjycTB)H-e@|D&d?kG%*JCch8%y% z_~D;iY$VSxFoJj)XxjiABhCGlao7_Q@4k6j>c*f~;#*1^u_L*kgt*$Ja(r2EYxqWX zZMoMl{hMk4pcd#;`;G53ikf;Q7rDS5?Z4>T_zxk8@xkw@A7w$yR$`ArxGN~b8>18_ zoYiY^@~g|_fWG|Jo?g(Ga+&6hwyyBs$EqN%dqqqsUO2r7?n%y)x2=XXV|-BijsY<5 zLQW4m%gb}tX$RvXmdQE4T99E>aINeR?)cGp1&8_od*2$$tWmEh5myIxoHQTk9Svwu zkfpEgMD>uzZvZTYMaD;Fy^UZYmyxN-k9&1ryIIPPHN&Z8is4}JBo>f~2R*G_dq)0e z=9AmmT{lSo2bhetXn40}D#&eVYB`|r0Wag2R}?1zA%@;bg!n*nk0p#)`Z!pEx4M58 z0X<7794`7!MKf>9(|5JS0~e-Cb@HLJlMe+tGFxina9}(kho^(x>}rmAM?jtbzrXZt z*H2;P_KVej!)H9j9{S?RpOdMH1mhG%_(0Qr{NR3%$<~dwdlstLRTb;RX~+)dPC=Kde$ZR(VP$kqZx{Sa0kjgrR3kA*Q!*Gu%txVI>>=CkCroxuO>OiTH|t+% z3*xWHOqovZwp>A7DulsAS&s{xB6G&B7f)(;ns=rqV33QQ|D!K}>|n9!Ui4&Qi9jh$ zI$tDxUG}Rdj#G6p;(zV{G@BAGJ>%`s#3oHGf&X$=6u_h=_Wp?~@sX5RF|6%=ybBJ6r^HKFfzGzLlR zj0F=4J)#mnvb7y=kH*?qLPXvMD3w<45qF&6Ls|I9dW!&cJA@ZCCZbmNw@+(>YA$IK zV|t}nuKdVkrMr&0yZ28q z)trf@=IwqiJLNpVUn`)2wEra*(qe7rRd?=G;5x%2j;3s9my9tnmpwxeh%c zH1r;o=J)5@gn{<8^}mTeL5cTPxWrZd^d!f&s?M|AA|aqFixFL)M(;*A6CaXSX8Zpd zIY0~v4PUi$)Vd4wSZ5CiTW927f}8o#Io5&oiXzstrK}Vu=jP9ns<|q8-1d%uUHpnE z-;|f#29Z?Dw-VJqgB3k)SLf1fa!Z#EgL4U`UKAfamY_!%0OZbL>{(4!`Bg>`^2d5z zdQpxr85TYyIJ?`JB^Lk)`<8AuF7TNKXv8mgaS~5UgBc|$J^$LmFTYE>_Xzng8oj%C zqU$$Cs-Am>T{139%%sDivsXK~P6V}CAH4f+!(3Xw40bij@>y)drVB_Xs+3YT(bE;m z@|B_%^O!@QlPX3HKVHU5jas8;Ozc__f5;XPm2c-^*TCX~r%Kvo0CX8K6&%m!El!D6 zQR2X;^-bMr`^Aqwr7Ym_mfVv=Wp~BxKCl+OW&Dcw_jHA&pg#AuOd`w8aIYVd(#gz5 z9`Kx#X~OI4S8CsJVuW2Fp*?ilyHP$fkz_>ZSi+D+mgR__toLywSiN|PYF+$4{af{> z4{ssKvTebcqrV`Y={>_6w@`82Ke_9AYM9fOP`Rk+>^JJa+wh{Tfl?RVpl#L?f<1$?>_;N+>2=k}jpilo3;2Q>z7!`DWz92f7$Gy>(iE<>j3Abgx zf;#C65_ZK?;Y`al2G363VJhV8Qp-eR>$sv=UHi{!@L4|p2xY!`eC8RFF+lqZy3=1% z)b(?OCwfgZ^`HwZA(_P^Vpo4cPAs=GxR(CH%v^?#$#Y9@4Q>)dhnaxSjb{1t22vh|ugVTOF@^+|!2XT9;z?_H|i~1}2i-%=rxcAr_3J*%L z(Tx2swy0X(af=^oUC{9YMMI0wxUSFSAmfy)|04P<(* zI~$GbZ4P0vA+kQ3p>6}sy^f&l$pjdW-J*l*TO9*zaEd>LwniEQ{_*A!wAo?YOcOLU zyKfRk&Bn*X%mRwqNa~(y7U-i$ppYRI)JT9?2hGIgl522q_kF~eZtU$bmR$Spl}EnE z_iyoFVv{6K~{3O`UL-zK>#`W+shvNZm_W6Cm zWjRuB-47d)>?{{S*qDb^KN?yd)4Rc5t5x;N8>vO%*hgJH|5}i7uin{j}>JDGyC@O(Y2F|$6i^qdFGcB8mYf~ z_fzZ7SAc97Pw~OM-s_bjXpzqJC^zW03K>EOCzsjPH;ad@4i;4P@}2Xz&s)@0N=bjw zTZdvN$u+&TdG!2RdZkQ}kF>kuU+#?o<*5H~=K9*GWOsOt&nv$SjXyxn;IkD#9WS`< zUV2kO69I7@8t@1!Xg&e@bwVR4U1XFA4DMG``shQ8k1IkTiC>bie1!tE55<3C>7C#} zYz2)LQv=46x_r$1v01EU(GV*l0fzFYm4H$>*JG9ikijTkv%w~&A;KZ&+8!z}gTv1atz3vm7? zh4mE(J+6tZp(j*Ta~AJ4bU=kMo}Fp&cYf_)qAN$O#9KR`w-1L|uKjTqJVk35_MJ3_ zaAS@_=v;IAnf~&aGvMy-N<oq^uxRk2hYzr{?icmEpT=J78(+H?9&0A)n`Tq9AKqLxXVw6$ zXG9Higp}Jf;{FVbg@wp5qk!$cITAtK<_MOPs%CAQD=Su#PofSy$1rHr-_EF868 zTh&#!p$GI&4*KY|;FB&3dhF}WGrt|rlARwcaNS^Lpg|Go4o}h{HYkuZ30)kkzmK#6 z-onIr$f#I6x7O&%pk?Z1&;}fwBV%vBAxq=8oA^I5N83ilsxz&g8t$6;K4A{H@noyS zg?qozzt_^;%@|~)B(TUv27Tr_<4FX)Pvz+K^E!+TqKx@>uX4eoV%f66`M#aHItngEgO@iPsYGJi+Eu6&7NLBh5oBFB)$Ie_(CQZj!;JkUSnwn$WwgB|SfV~| z)$NtNzj?XYdQ4fj)nWAptz3j9pbRsmw&%$%7=*$Jbz5(G~ zwW|vkMXF4fY8qv;M>@1R@nXmkaOmZDR;1G1D|dL~lY~-dC1(L)X*upjNdD9v<22qgeE|cM2Z1 z@p;|#_!2)M3A zcuEZm3{Ai#MHNMG9D7S_AE$eo@v-Rncl5aZiA>@Mzv-U~$(j2Y`s_&?08JcY&6H-_dDA%vaSMom}WJNU{sOAQh1r zuOJF7W@Y>GSqy3ijN0;z>2~`J6h&-A%rFw{*vU2W^C#x8C zX`5{Sn*N#5bEp>FFC*b8-~T7GPRZX9n%@8ae|`49p3C!iI`lnAEB-Ib(=bsD%$IV2 NnzFXiXGPnv{{tDjx)}ff literal 0 HcmV?d00001 diff --git a/streamdeck-plugin/com.aeromc.launcher.sdPlugin/imgs/plugin/category-icon.png b/streamdeck-plugin/com.aeromc.launcher.sdPlugin/imgs/plugin/category-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3db7df79ff8a2509d15e15b0e73b1010f59860d6 GIT binary patch literal 2017 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 U7o8$aYybcN07*qoM6N<$f?b2aPyhe` literal 0 HcmV?d00001 diff --git a/streamdeck-plugin/com.aeromc.launcher.sdPlugin/imgs/plugin/marketplace.png b/streamdeck-plugin/com.aeromc.launcher.sdPlugin/imgs/plugin/marketplace.png new file mode 100644 index 0000000000000000000000000000000000000000..3d0d5d65cc6f0aed68e72b4cf2d8854928ee946e GIT binary patch literal 27679 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

gSHu3Fe2_ZJHv61s4~ntNiHXqX$3?p7(N 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 literal 0 HcmV?d00001 diff --git a/streamdeck-plugin/com.aeromc.launcher.sdPlugin/manifest.json b/streamdeck-plugin/com.aeromc.launcher.sdPlugin/manifest.json new file mode 100644 index 0000000..e8fd17b --- /dev/null +++ b/streamdeck-plugin/com.aeromc.launcher.sdPlugin/manifest.json @@ -0,0 +1,365 @@ +{ + "Name": "AeroMC", + "Version": "1.1.0.0", + "Author": "M_Viper", + "Description": "Steuert den AeroMC-Launcher: Instanzen starten und beenden, Clips speichern und die Aufnahme umschalten - mit Live-Status auf den Tasten.", + "Category": "AeroMC", + "CategoryIcon": "imgs/plugin/category-icon", + "Icon": "imgs/plugin/marketplace", + "URL": "https://aeromc.viper.ipv64.net", + "SDKVersion": 2, + "UUID": "com.aeromc.launcher", + "Nodejs": { + "Version": "20" + }, + "Software": { + "MinimumVersion": "6.5" + }, + "OS": [ + { + "Platform": "windows", + "MinimumVersion": "10" + } + ], + "CodePath": "bin/plugin.js", + "Actions": [ + { + "Name": "Instanz starten/beenden", + "UUID": "com.aeromc.launcher.instanz", + "Icon": "imgs/actions/icon", + "Tooltip": "Startet die gewählte Instanz; läuft sie schon, beendet die Taste sie wieder. Zeigt den Zustand live an.", + "PropertyInspectorPath": "ui/instanz.html", + "Controllers": [ + "Keypad" + ], + "States": [ + { + "Image": "imgs/actions/key", + "TitleAlignment": "bottom", + "ShowTitle": false + } + ] + }, + { + "Name": "Clip speichern", + "UUID": "com.aeromc.launcher.clip", + "Icon": "imgs/actions/icon", + "Tooltip": "Speichert die letzten Sekunden als Clip. Der Clip-Modus muss laufen (Taste „Clip-Modus ein/aus“).", + "Controllers": [ + "Keypad" + ], + "States": [ + { + "Image": "imgs/actions/key", + "TitleAlignment": "bottom", + "ShowTitle": false + } + ] + }, + { + "Name": "Aufnahme starten/stoppen", + "UUID": "com.aeromc.launcher.aufnahme", + "Icon": "imgs/actions/icon", + "Tooltip": "Startet bzw. stoppt die Aufnahme des laufenden Spiels. Das Aufnahme-Fenster öffnet sich dabei unsichtbar von selbst.", + "Controllers": [ + "Keypad" + ], + "States": [ + { + "Image": "imgs/actions/key", + "TitleAlignment": "bottom", + "ShowTitle": false + } + ] + }, + { + "Name": "Server beitreten", + "UUID": "com.aeromc.launcher.server", + "Icon": "imgs/actions/icon", + "Tooltip": "Startet die gewählte Instanz und verbindet direkt mit dem gewählten Server.", + "PropertyInspectorPath": "ui/server.html", + "Controllers": [ + "Keypad" + ], + "States": [ + { + "Image": "imgs/actions/key", + "TitleAlignment": "bottom", + "ShowTitle": false + } + ] + }, + { + "Name": "Zuletzt gespielte Instanz", + "UUID": "com.aeromc.launcher.zuletzt", + "Icon": "imgs/actions/icon", + "Tooltip": "Startet (bzw. beendet) die Instanz, die du zuletzt gespielt hast – ohne Auswahl.", + "Controllers": [ + "Keypad" + ], + "States": [ + { + "Image": "imgs/actions/key", + "TitleAlignment": "bottom", + "ShowTitle": false + } + ] + }, + { + "Name": "Launcher-Fenster", + "UUID": "com.aeromc.launcher.fenster", + "Icon": "imgs/actions/icon", + "Tooltip": "Holt das AeroMC-Fenster nach vorn; ist es schon vorn, wird es minimiert.", + "Controllers": [ + "Keypad" + ], + "States": [ + { + "Image": "imgs/actions/key", + "TitleAlignment": "bottom", + "ShowTitle": false + } + ] + }, + { + "Name": "Clip-Modus ein/aus", + "UUID": "com.aeromc.launcher.clipmodus", + "Icon": "imgs/actions/icon", + "Tooltip": "Schaltet den Clip-Puffer des laufenden Spiels ein oder aus. Das Aufnahme-Fenster öffnet sich dabei unsichtbar von selbst.", + "Controllers": [ + "Keypad" + ], + "States": [ + { + "Image": "imgs/actions/key", + "TitleAlignment": "bottom", + "ShowTitle": false + } + ] + }, + { + "Name": "Instanz neu starten", + "UUID": "com.aeromc.launcher.neustart", + "Icon": "imgs/actions/icon", + "Tooltip": "Beendet die laufende Instanz sauber und startet sie wieder (mit demselben Server).", + "PropertyInspectorPath": "ui/instanz.html", + "Controllers": [ + "Keypad" + ], + "States": [ + { + "Image": "imgs/actions/key", + "TitleAlignment": "bottom", + "ShowTitle": false + } + ] + }, + { + "Name": "Aufnahmen-Ordner", + "UUID": "com.aeromc.launcher.ordner", + "Icon": "imgs/actions/icon", + "Tooltip": "Öffnet den Ordner mit Aufnahmen und Clips im Explorer.", + "PropertyInspectorPath": "ui/instanz.html", + "Controllers": [ + "Keypad" + ], + "States": [ + { + "Image": "imgs/actions/key", + "TitleAlignment": "bottom", + "ShowTitle": false + } + ] + }, + { + "Name": "Spielzeit", + "UUID": "com.aeromc.launcher.spielzeit", + "Icon": "imgs/actions/icon", + "Tooltip": "Zeigt die Gesamtspielzeit (einer Instanz oder aller) und während des Spielens die aktuelle Sitzung.", + "PropertyInspectorPath": "ui/instanz.html", + "Controllers": [ + "Keypad" + ], + "States": [ + { + "Image": "imgs/actions/key", + "TitleAlignment": "bottom", + "ShowTitle": false + } + ] + }, + { + "Name": "Server-Status", + "UUID": "com.aeromc.launcher.serverstatus", + "Icon": "imgs/actions/icon", + "Tooltip": "Zeigt, ob ein Server online ist, wie viele Spieler drauf sind und den Ping. Aktualisiert alle 30 Sekunden.", + "PropertyInspectorPath": "ui/server.html", + "Controllers": [ + "Keypad" + ], + "States": [ + { + "Image": "imgs/actions/key", + "TitleAlignment": "bottom", + "ShowTitle": false + } + ] + }, + { + "Name": "Screenshot", + "UUID": "com.aeromc.launcher.screenshot", + "Icon": "imgs/actions/icon", + "Tooltip": "Speichert ein Bild des Spielfensters im Screenshot-Ordner der laufenden Instanz. Überlagernde Fenster (z. B. das Stream Deck) erscheinen mit auf dem Bild.", + "Controllers": [ + "Keypad" + ], + "States": [ + { + "Image": "imgs/actions/key", + "TitleAlignment": "bottom", + "ShowTitle": false + } + ] + }, + { + "Name": "Instanz-Drehregler", + "UUID": "com.aeromc.launcher.dreh", + "Icon": "imgs/actions/icon", + "Tooltip": "Für das Stream Deck+: Drehen wählt die Instanz, Drücken startet bzw. beendet sie, Tippen auf den Streifen zeigt oder minimiert den Launcher.", + "Controllers": [ + "Encoder" + ], + "Encoder": { + "layout": "$B1", + "TriggerDescription": { + "Rotate": "Instanz wählen", + "Push": "Starten / Beenden", + "Touch": "Launcher-Fenster" + } + }, + "States": [ + { + "Image": "imgs/actions/key", + "TitleAlignment": "bottom", + "ShowTitle": false + } + ] + }, + { + "Name": "Freunde online", + "UUID": "com.aeromc.launcher.freunde", + "Icon": "imgs/actions/icon", + "Tooltip": "Zeigt, wie viele deiner AeroMC-Freunde gerade online sind. Ein Druck öffnet das Freunde-Fenster.", + "Controllers": [ + "Keypad" + ], + "States": [ + { + "Image": "imgs/actions/key", + "TitleAlignment": "bottom", + "ShowTitle": false + } + ] + }, + { + "Name": "Konto wechseln", + "UUID": "com.aeromc.launcher.konto", + "Icon": "imgs/actions/icon", + "Tooltip": "Setzt das gewählte Konto als aktives Konto in AeroMC. Zeigt den Spielerkopf; grün = gerade aktiv.", + "PropertyInspectorPath": "ui/konto.html", + "Controllers": [ + "Keypad" + ], + "States": [ + { + "Image": "imgs/actions/key", + "TitleAlignment": "bottom", + "ShowTitle": false + } + ] + }, + { + "Name": "Schnellstart 1–5", + "UUID": "com.aeromc.launcher.schnellstart", + "Icon": "imgs/actions/icon", + "Tooltip": "Startet die Instanz, die du in AeroMC auf Strg+1 bis Strg+5 gelegt hast (bzw. beendet sie, wenn sie läuft).", + "PropertyInspectorPath": "ui/schnellstart.html", + "Controllers": [ + "Keypad" + ], + "States": [ + { + "Image": "imgs/actions/key", + "TitleAlignment": "bottom", + "ShowTitle": false + } + ] + }, + { + "Name": "Backup jetzt", + "UUID": "com.aeromc.launcher.backup", + "Icon": "imgs/actions/icon", + "Tooltip": "Sichert alle Instanzen. Zeigt „läuft“ und nach dem Ende „fertig“ bzw. „Fehler“.", + "Controllers": [ + "Keypad" + ], + "States": [ + { + "Image": "imgs/actions/key", + "TitleAlignment": "bottom", + "ShowTitle": false + } + ] + }, + { + "Name": "Logdateien", + "UUID": "com.aeromc.launcher.logs", + "Icon": "imgs/actions/icon", + "Tooltip": "Öffnet die Logdateien der gewählten (sonst der laufenden oder zuletzt gespielten) Instanz.", + "PropertyInspectorPath": "ui/instanz.html", + "Controllers": [ + "Keypad" + ], + "States": [ + { + "Image": "imgs/actions/key", + "TitleAlignment": "bottom", + "ShowTitle": false + } + ] + }, + { + "Name": "Konsole", + "UUID": "com.aeromc.launcher.konsole", + "Icon": "imgs/actions/icon", + "Tooltip": "Öffnet die Konsole von AeroMC.", + "Controllers": [ + "Keypad" + ], + "States": [ + { + "Image": "imgs/actions/key", + "TitleAlignment": "bottom", + "ShowTitle": false + } + ] + }, + { + "Name": "Letzter Absturz", + "UUID": "com.aeromc.launcher.absturz", + "Icon": "imgs/actions/icon", + "Tooltip": "Öffnet den Absturzbericht der gewählten (sonst laufenden/zuletzt gespielten) Instanz. Leuchtet rot, wenn der letzte Start abgestürzt ist.", + "PropertyInspectorPath": "ui/instanz.html", + "Controllers": [ + "Keypad" + ], + "States": [ + { + "Image": "imgs/actions/key", + "TitleAlignment": "bottom", + "ShowTitle": false + } + ] + } + ] +} diff --git a/streamdeck-plugin/com.aeromc.launcher.sdPlugin/ui/instanz.html b/streamdeck-plugin/com.aeromc.launcher.sdPlugin/ui/instanz.html new file mode 100644 index 0000000..bfbdf1c --- /dev/null +++ b/streamdeck-plugin/com.aeromc.launcher.sdPlugin/ui/instanz.html @@ -0,0 +1,72 @@ + + + + +AeroMC-Instanz + + + + + +

+ + + diff --git a/streamdeck-plugin/com.aeromc.launcher.sdPlugin/ui/konto.html b/streamdeck-plugin/com.aeromc.launcher.sdPlugin/ui/konto.html new file mode 100644 index 0000000..c379cb4 --- /dev/null +++ b/streamdeck-plugin/com.aeromc.launcher.sdPlugin/ui/konto.html @@ -0,0 +1,65 @@ + + + + +AeroMC-Konto + + + + + +

+ + + diff --git a/streamdeck-plugin/com.aeromc.launcher.sdPlugin/ui/schnellstart.html b/streamdeck-plugin/com.aeromc.launcher.sdPlugin/ui/schnellstart.html new file mode 100644 index 0000000..4ac04dd --- /dev/null +++ b/streamdeck-plugin/com.aeromc.launcher.sdPlugin/ui/schnellstart.html @@ -0,0 +1,65 @@ + + + + +AeroMC-Schnellstart + + + + + +

+ + + diff --git a/streamdeck-plugin/com.aeromc.launcher.sdPlugin/ui/server.html b/streamdeck-plugin/com.aeromc.launcher.sdPlugin/ui/server.html new file mode 100644 index 0000000..b13b51a --- /dev/null +++ b/streamdeck-plugin/com.aeromc.launcher.sdPlugin/ui/server.html @@ -0,0 +1,110 @@ + + + + +AeroMC-Server + + + + + + + + + +

+ + +