Live-Ergebnisse aus CS2-Serverlogs (Backend)
Server bekommt beim Konfigurieren logaddress_add_http mit geheimem Match-Schlüssel. Ein Parser wertet Rundenende, Seitenzuordnung, Matchstart und Spielende aus; Stand, Rundenverlauf und Sieger werden pro Map gespeichert und live verteilt. Der Demo-Adapter simuliert nach der Aufwärmphase einen Matchverlauf über dieselben Logzeilen. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
5ea5638115
commit
5fade769e7
11 files changed
+515
-11
No files matched your search
@@ -1,4 +1,5 @@
|
||||
import { buildMapCommands } from './cs2Config.js';
|
||||
import { buildMapCommands, sanitizeConsoleText } from './cs2Config.js';
|
||||
import { DemoMatchSimulator } from './demoMatchSimulator.js';
|
||||
import { HttpError, CLOSED_STATUSES } from '../matchService.js';
|
||||
import { randomPassword } from '../security.js';
|
||||
|
||||
@@ -24,6 +25,7 @@ export class ServerManager {
|
||||
constructor({ db, service, adapter, config, logger = console }) {
|
||||
Object.assign(this, { db, service, adapter, config, logger });
|
||||
this.busy = new Set();
|
||||
this.simulator = new DemoMatchSimulator();
|
||||
this.lastPoll = new Map();
|
||||
this.timers = [];
|
||||
}
|
||||
@@ -53,6 +55,7 @@ export class ServerManager {
|
||||
}
|
||||
|
||||
stopLoops() {
|
||||
this.simulator.stopAll();
|
||||
this.timers.forEach(clearInterval);
|
||||
this.timers = [];
|
||||
}
|
||||
@@ -220,7 +223,10 @@ export class ServerManager {
|
||||
seriesMap: { map: seriesMap.map, ctTeam: seriesMap.ct_team },
|
||||
secrets: { serverPassword: row.server_password, tvPassword: row.tv_password },
|
||||
settings: this.config.match,
|
||||
logUrl: `${this.config.logReceiverUrl}/api/logs/${matchId}/${row.config_key}`,
|
||||
});
|
||||
this.simulator.stop(matchId);
|
||||
this.service.resetLiveScore(matchId, seriesMap.number);
|
||||
try {
|
||||
await this.adapter.configure(JSON.parse(row.handle), { map: seriesMap.map, ...plan });
|
||||
} catch (err) {
|
||||
@@ -286,9 +292,33 @@ export class ServerManager {
|
||||
throw new HttpError(502, `Befehl konnte nicht gesendet werden: ${err.message}`, 'server_error');
|
||||
}
|
||||
this.service.log(viewer.matchId, 'server', this.adapter.simulated ? 'Aufwärmphase beendet (simuliert)' : 'Aufwärmphase beendet – Match startet');
|
||||
if (this.adapter.simulated) this.startDemoSimulation(viewer.matchId);
|
||||
this.service.changed(viewer.matchId);
|
||||
}
|
||||
|
||||
/** Demo-Modus: simuliert einen Matchverlauf, indem echte CS2-Logzeilen erzeugt und ausgewertet werden. */
|
||||
startDemoSimulation(matchId) {
|
||||
const match = this.service.getMatch(matchId);
|
||||
const seriesMap = this.service.seriesMaps(matchId).find((m) => m.number === match.current_map_number);
|
||||
if (!seriesMap) return;
|
||||
this.service.log(matchId, 'server', 'Demo: simulierter Spielverlauf startet (keine echten Ergebnisse)');
|
||||
this.simulator.start(matchId, {
|
||||
map: seriesMap.map,
|
||||
teamNames: { A: sanitizeConsoleText(match.team_a_name), B: sanitizeConsoleText(match.team_b_name) },
|
||||
ctTeam: seriesMap.ct_team ?? 'A',
|
||||
maxRounds: match.mode === 'wingman' ? this.config.match.maxRoundsWingman : this.config.match.maxRoundsCompetitive,
|
||||
roundMs: this.config.demo.roundSeconds * 1000,
|
||||
onLines: (lines) => {
|
||||
try {
|
||||
this.service.applyLiveLog(matchId, lines);
|
||||
} catch (err) {
|
||||
this.logger.warn(`[demo] Simulation für ${matchId}: ${err.message}`);
|
||||
this.simulator.stop(matchId);
|
||||
}
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
async stopByOrganizer(viewer) {
|
||||
this.service.require(viewer, 'organizer');
|
||||
await this.stop(viewer.matchId, 'Vom Organisator gestoppt');
|
||||
@@ -303,6 +333,7 @@ export class ServerManager {
|
||||
}
|
||||
|
||||
async stop(matchId, reason) {
|
||||
this.simulator.stop(matchId);
|
||||
const row = this.row(matchId);
|
||||
if (!row || row.status === 'stopped') return;
|
||||
if (row.handle) await this.safeStop(row);
|
||||
|
||||
Reference in new issue
Block a user