Final version

This commit is contained in:
Alessandro Autiero
2023-09-21 16:48:31 +02:00
parent 4bba21c038
commit 73c1cc8526
90 changed files with 3204 additions and 2608 deletions

View File

@@ -1,11 +1,13 @@
import 'package:reboot_common/common.dart';
import 'package:reboot_launcher/src/controller/server_controller.dart';
import 'package:reboot_launcher/src/page/abstract/page_type.dart';
import 'package:reboot_launcher/src/util/translations.dart';
class AuthenticatorController extends ServerController {
AuthenticatorController() : super();
@override
String get controllerName => "authenticator";
String get controllerName => translations.authenticatorName.toLowerCase();
@override
String get storageName => "authenticator";
@@ -22,6 +24,9 @@ class AuthenticatorController extends ServerController {
@override
Future<bool> freePort() => freeAuthenticatorPort();
@override
RebootPageType get pageType => RebootPageType.authenticator;
@override
Future<int> startEmbeddedInternal() => startEmbeddedAuthenticator(detached.value);

View File

@@ -14,7 +14,6 @@ class GameController extends GetxController {
late final Rx<List<FortniteVersion>> versions;
late final Rxn<FortniteVersion> _selectedVersion;
late final RxBool started;
late final RxBool autoStartGameServer;
late final Rxn<GameInstance> instance;
GameController() {
@@ -40,9 +39,6 @@ class GameController extends GetxController {
customLaunchArgs.addListener(() =>
_storage.write("custom_launch_args", customLaunchArgs.text));
started = RxBool(false);
autoStartGameServer = RxBool(_storage.read("auto_game_server") ?? true);
autoStartGameServer.listen((value) =>
_storage.write("auto_game_server", value));
var serializedInstance = _storage.read("instance");
instance = Rxn(serializedInstance != null ? GameInstance.fromJson(jsonDecode(serializedInstance)) : null);
instance.listen((_) => saveInstance());
@@ -56,7 +52,6 @@ class GameController extends GetxController {
password.text = "";
customLaunchArgs.text = "";
versions.value = [];
autoStartGameServer.value = true;
instance.value = null;
}

View File

@@ -4,12 +4,10 @@ import 'package:fluent_ui/fluent_ui.dart';
import 'package:get/get.dart';
import 'package:get_storage/get_storage.dart';
import 'package:reboot_common/common.dart';
import 'package:reboot_launcher/src/util/translations.dart';
import 'package:supabase_flutter/supabase_flutter.dart';
import 'package:uuid/uuid.dart';
const String kDefaultServerName = "Reboot Game Server";
const String kDefaultDescription = "Just another server";
class HostingController extends GetxController {
late final GetStorage _storage;
late final String uuid;
@@ -27,9 +25,9 @@ class HostingController extends GetxController {
_storage = GetStorage("hosting");
uuid = _storage.read("uuid") ?? const Uuid().v4();
_storage.write("uuid", uuid);
name = TextEditingController(text: _storage.read("name") ?? kDefaultServerName);
name = TextEditingController(text: _storage.read("name"));
name.addListener(() => _storage.write("name", name.text));
description = TextEditingController(text: _storage.read("description") ?? kDefaultDescription);
description = TextEditingController(text: _storage.read("description"));
description.addListener(() => _storage.write("description", description.text));
password = TextEditingController(text: _storage.read("password") ?? "");
password.addListener(() => _storage.write("password", password.text));
@@ -46,25 +44,16 @@ class HostingController extends GetxController {
supabase.from('hosts')
.stream(primaryKey: ['id'])
.map((event) => _parseValidServers(event))
.listen((event) {
if(servers.value == null) {
servers.value = event;
}else {
servers.value?.addAll(event);
}
});
.listen((event) => servers.value = event);
}
Set<Map<String, dynamic>> _parseValidServers(event) => event.where((element) => _isValidServer(element)).toSet();
bool _isValidServer(Map<String, dynamic> element) =>
element["id"] != uuid && element["ip"] != null;
Set<Map<String, dynamic>> _parseValidServers(event) => event.where((element) => element["ip"] != null).toSet();
Future<void> saveInstance() => _storage.write("instance", jsonEncode(instance.value?.toJson()));
void reset() {
name.text = kDefaultServerName;
description.text = kDefaultDescription;
name.text = "";
description.text = "";
showPassword.value = false;
discoverable.value = false;
started.value = false;

View File

@@ -2,6 +2,8 @@ import 'package:fluent_ui/fluent_ui.dart';
import 'package:get/get_rx/src/rx_types/rx_types.dart';
import 'package:reboot_common/common.dart';
import 'package:reboot_launcher/src/controller/server_controller.dart';
import 'package:reboot_launcher/src/page/abstract/page_type.dart';
import 'package:reboot_launcher/src/util/translations.dart';
class MatchmakerController extends ServerController {
late final TextEditingController gameServerAddress;
@@ -34,7 +36,7 @@ class MatchmakerController extends ServerController {
}
@override
String get controllerName => "matchmaker";
String get controllerName => translations.matchmakerName.toLowerCase();
@override
String get storageName => "matchmaker";
@@ -51,6 +53,9 @@ class MatchmakerController extends ServerController {
@override
Future<bool> freePort() => freeMatchmakerPort();
@override
RebootPageType get pageType => RebootPageType.matchmaker;
@override
Future<int> startEmbeddedInternal() => startEmbeddedMatchmaker(detached.value);

View File

@@ -5,6 +5,7 @@ import 'package:fluent_ui/fluent_ui.dart';
import 'package:get/get.dart';
import 'package:get_storage/get_storage.dart';
import 'package:reboot_common/common.dart';
import 'package:reboot_launcher/src/page/abstract/page_type.dart';
import 'package:sync/semaphore.dart';
abstract class ServerController extends GetxController {
@@ -15,6 +16,7 @@ abstract class ServerController extends GetxController {
late final Semaphore semaphore;
late RxBool started;
late RxBool detached;
StreamSubscription? worker;
int? embeddedServerPid;
HttpServer? localServer;
HttpServer? remoteServer;
@@ -58,6 +60,8 @@ abstract class ServerController extends GetxController {
Future<bool> get isPortTaken async => !(await isPortFree);
RebootPageType get pageType;
Future<bool> freePort();
@protected
@@ -196,15 +200,6 @@ abstract class ServerController extends GetxController {
}
}
Stream<ServerResult> restart() async* {
await resetWinNat();
if(started()) {
yield* stop();
}
yield* start();
}
Stream<ServerResult> toggle() async* {
if(started()) {
yield* stop();

View File

@@ -1,6 +1,9 @@
import 'dart:io';
import 'package:fluent_ui/fluent_ui.dart';
import 'package:get/get.dart';
import 'package:get_storage/get_storage.dart';
import 'package:intl/intl.dart';
import 'package:reboot_common/common.dart';
import 'package:reboot_launcher/main.dart';
@@ -10,30 +13,38 @@ class SettingsController extends GetxController {
late final TextEditingController gameServerDll;
late final TextEditingController unrealEngineConsoleDll;
late final TextEditingController authenticatorDll;
late final TextEditingController memoryLeakDll;
late final TextEditingController gameServerPort;
late final RxBool firstRun;
late final RxString language;
late final Rx<ThemeMode> themeMode;
late double width;
late double height;
late double? offsetX;
late double? offsetY;
late double scrollingDistance;
SettingsController() {
_storage = GetStorage("settings");
gameServerDll = _createController("game_server", "reboot.dll");
unrealEngineConsoleDll = _createController("unreal_engine_console", "console.dll");
authenticatorDll = _createController("authenticator", "cobalt.dll");
memoryLeakDll = _createController("memory_leak", "memoryleak.dll");
gameServerPort = TextEditingController(text: _storage.read("game_server_port") ?? kDefaultGameServerPort);
gameServerPort.addListener(() => _storage.write("game_server_port", gameServerPort.text));
width = _storage.read("width") ?? kDefaultWindowWidth;
height = _storage.read("height") ?? kDefaultWindowHeight;
offsetX = _storage.read("offset_x");
offsetY = _storage.read("offset_y");
scrollingDistance = 0.0;
firstRun = RxBool(_storage.read("first_run") ?? true);
firstRun.listen((value) => _storage.write("first_run", value));
themeMode = Rx(ThemeMode.values.elementAt(_storage.read("theme") ?? 0));
themeMode.listen((value) => _storage.write("theme", value.index));
language = RxString(_storage.read("language") ?? _defaultLocale);
language.listen((value) => _storage.write("language", value));
}
String get _defaultLocale => Intl.getCurrentLocale().split("_")[0];
TextEditingController _createController(String key, String name) {
var controller = TextEditingController(text: _storage.read(key) ?? _controllerDefaultPath(name));
controller.addListener(() => _storage.write(key, controller.text));
@@ -46,8 +57,10 @@ class SettingsController extends GetxController {
}
void saveWindowOffset(Offset position) {
_storage.write("offset_x", position.dx);
_storage.write("offset_y", position.dy);
offsetX = position.dx;
offsetY = position.dy;
_storage.write("offset_x", offsetX);
_storage.write("offset_y", offsetY);
}
void reset(){

View File

@@ -3,6 +3,7 @@ import 'package:get/get.dart';
import 'package:get_storage/get_storage.dart';
import 'package:reboot_common/common.dart';
import 'package:reboot_launcher/src/dialog/abstract/info_bar.dart';
import 'package:reboot_launcher/src/util/translations.dart';
class UpdateController {
late final GetStorage _storage;
@@ -30,7 +31,7 @@ class UpdateController {
}
showInfoBar(
"Downloading reboot dll...",
translations.updatingRebootDll,
loading: true,
duration: null
);
@@ -43,7 +44,7 @@ class UpdateController {
);
status.value = UpdateStatus.success;
showInfoBar(
"The reboot dll was downloaded successfully",
translations.updatedRebootDll,
severity: InfoBarSeverity.success,
duration: snackbarShortDuration
);
@@ -53,12 +54,12 @@ class UpdateController {
error = error.toLowerCase();
status.value = UpdateStatus.error;
showInfoBar(
"An error occurred while downloading the reboot dll: $error",
translations.updateRebootDllError(error.toString()),
duration: snackbarLongDuration,
severity: InfoBarSeverity.error,
action: Button(
onPressed: () => update(true),
child: const Text("Retry"),
child: Text(translations.updateRebootDllErrorAction),
)
);
}