ConanServerManager/client/lib/statemachine.dart
2024-05-22 00:14:25 -07:00

89 lines
2.9 KiB
Dart

import 'dart:async';
import 'dart:io';
import 'package:servermanager/game.dart';
import 'package:servermanager/pathtools.dart';
import 'package:servermanager/proton.dart';
import 'package:servermanager/settings.dart';
import 'package:mc_rcon_dart/mc_rcon_dart.dart';
enum States {
Idle, // For when the state machine is waiting for a state change
Starting, // For when the server is starting up
ModUpdateCheck, // For when the mods are being checked in the jail folder against the live mods
WarnPlayersNonIntrusive, // Gives a non-instrusive warning about the upcoming restart
WarnPlayersIntrusive, // Sends a message intrusively about the upcoming restart
FullStop, // Intends to set the inactive state, and immediately stops the server
Inactive // The inactive state will be used for when the state machine is not supposed to be doing anything.
}
class StateMachine {
var _currentState = States.Inactive;
StreamController<States> _stateController = StreamController.broadcast();
Stream<States> get stateChanges => _stateController.stream;
States get currentState => _currentState;
void changeState(States n) {
_currentState = n;
_stateController.add(n);
}
Future<void> runTask() async {
if (currentState == States.Idle) {
return; // Nothing to do here
} else if (currentState == States.FullStop) {
Settings settings = Settings();
await createSocket("127.0.0.1",
port: settings.inst!.serverSettings.RconPort);
login(settings.inst!.serverSettings.RconPassword);
sendCommand("shutdown");
changeState(States.Inactive);
} else if (currentState == States.Starting) {
// Server startup in progress
Settings settings = Settings();
await settings.RunUpdate(valid: false);
if (settings.inst!.downloadMods)
await doDownloadMods(settings.getModPath());
else
await doMigrateMods();
settings.inst!.mods = await doScanMods(settings.getModPath());
await settings.writeOutModListFile();
var conanArgs = [
"-RconEnabled=1",
"-RconPassword=${settings.inst!.serverSettings.RconPassword}",
"-RconPort=${settings.inst!.serverSettings.RconPort}",
"-Port=${settings.inst!.serverSettings.GamePort}",
"-QueryPort=${settings.inst!.serverSettings.QueryPort}",
"-log"
];
// Start the server now
if (Platform.isWindows) {
Process.start(
PathHelper.combine(
settings.getServerPath(), "ConanSandboxServer.exe"),
conanArgs,
workingDirectory: settings.getServerPath());
} else {
runDetachedProton(
PathHelper.combine(
settings.getServerPath(), "ConanSandboxServer.exe"),
conanArgs,
settings.getServerPath());
}
changeState(States.Idle);
}
}
StateMachine() {
stateChanges.listen((event) async {
await runTask();
});
}
}