This commit is contained in:
Alessandro Autiero
2024-05-20 17:24:00 +02:00
parent 7c2caed16c
commit 9f5590d41c
562 changed files with 3303 additions and 156787 deletions

View File

@@ -16,7 +16,7 @@ class AuthenticatorController extends ServerController {
String get defaultHost => kDefaultAuthenticatorHost;
@override
String get defaultPort => kDefaultAuthenticatorPort;
String get defaultPort => kDefaultAuthenticatorPort.toString();
@override
Future<bool> get isPortFree => isAuthenticatorPortFree();

View File

@@ -3,17 +3,38 @@ import 'package:reboot_common/common.dart';
class BuildController extends GetxController {
List<FortniteBuild>? _builds;
Rxn<FortniteBuild> selectedBuild;
Rxn<FortniteBuild> _selectedBuild;
Rx<FortniteBuildSource> _selectedBuildSource;
BuildController() : selectedBuild = Rxn();
BuildController() : _selectedBuild = Rxn(),
_selectedBuildSource = Rx(FortniteBuildSource.manifest);
List<FortniteBuild>? get builds => _builds;
FortniteBuild? get selectedBuild => _selectedBuild.value;
set selectedBuild(FortniteBuild? value) {
_selectedBuild.value = value;
if(value != null && value.source != value.source) {
_selectedBuildSource.value = value.source;
}
}
FortniteBuildSource get selectedBuildSource => _selectedBuildSource.value;
set selectedBuildSource(FortniteBuildSource value) {
_selectedBuildSource.value = value;
final selected = selectedBuild;
if(selected == null || selected.source != value) {
final selectable = builds?.firstWhereOrNull((element) => element.source == value);
_selectedBuild.value = selectable;
}
}
set builds(List<FortniteBuild>? builds) {
_builds = builds;
if(builds == null || builds.isEmpty){
return;
}
selectedBuild.value = builds[0];
final selectable = builds?.firstWhereOrNull((element) => element.source == selectedBuildSource);
_selectedBuild.value = selectable;
}
}

View File

@@ -39,14 +39,9 @@ class GameController extends GetxController {
customLaunchArgs.addListener(() =>
_storage.write("custom_launch_args", customLaunchArgs.text));
started = RxBool(false);
var serializedInstance = _storage.read("instance");
instance = Rxn(serializedInstance != null ? GameInstance.fromJson(jsonDecode(serializedInstance)) : null);
instance.listen((_) => saveInstance());
instance = Rxn();
}
Future<void> saveInstance() =>
_storage.write("instance", jsonEncode(instance.value?.toJson()));
void reset() {
username.text = kDefaultPlayerName;
password.text = "";

View File

@@ -1,10 +1,7 @@
import 'dart:convert';
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';
@@ -16,8 +13,10 @@ class HostingController extends GetxController {
late final TextEditingController password;
late final RxBool showPassword;
late final RxBool discoverable;
late final RxBool headless;
late final RxBool started;
late final RxBool published;
late final RxBool automaticServer;
late final Rxn<GameInstance> instance;
late final Rxn<Set<Map<String, dynamic>>> servers;
@@ -33,24 +32,27 @@ class HostingController extends GetxController {
password.addListener(() => _storage.write("password", password.text));
discoverable = RxBool(_storage.read("discoverable") ?? true);
discoverable.listen((value) => _storage.write("discoverable", value));
headless = RxBool(_storage.read("headless") ?? true);
headless.listen((value) => _storage.write("headless", value));
started = RxBool(false);
published = RxBool(false);
showPassword = RxBool(false);
var serializedInstance = _storage.read("instance");
instance = Rxn(serializedInstance != null ? GameInstance.fromJson(jsonDecode(serializedInstance)) : null);
instance.listen((_) => saveInstance());
var supabase = Supabase.instance.client;
instance = Rxn();
automaticServer = RxBool(_storage.read("auto") ?? true);
automaticServer.listen((value) => _storage.write("auto", value));
final supabase = Supabase.instance.client;
servers = Rxn();
supabase.from('hosts')
supabase.from("hosting")
.stream(primaryKey: ['id'])
.map((event) => _parseValidServers(event))
.listen((event) => servers.value = event);
.listen((event) {
servers.value = event;
published.value = event.any((element) => element["id"] == uuid);
});
}
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 = "";
description.text = "";

View File

@@ -1,5 +1,4 @@
import 'package:get/get.dart';
import 'package:reboot_common/common.dart';
class InfoController extends GetxController {
List<String>? links;

View File

@@ -45,7 +45,7 @@ class MatchmakerController extends ServerController {
String get defaultHost => kDefaultMatchmakerHost;
@override
String get defaultPort => kDefaultMatchmakerPort;
String get defaultPort => kDefaultMatchmakerPort.toString();
@override
Future<bool> get isPortFree => isMatchmakerPortFree();

View File

@@ -17,7 +17,6 @@ abstract class ServerController extends GetxController {
late RxBool started;
late RxBool detached;
StreamSubscription? worker;
int? embeddedServerPid;
HttpServer? localServer;
HttpServer? remoteServer;
@@ -93,8 +92,16 @@ abstract class ServerController extends GetxController {
return;
}
yield ServerResult(ServerResultType.starting);
started.value = true;
if(type() != ServerType.local) {
started.value = true;
yield ServerResult(ServerResultType.starting);
}else {
started.value = false;
if(port != defaultPort) {
yield ServerResult(ServerResultType.starting);
}
}
try {
var host = this.host.text.trim();
if (host.isEmpty) {
@@ -117,7 +124,7 @@ abstract class ServerController extends GetxController {
return;
}
if (type() != ServerType.local && await isPortTaken) {
if ((type() != ServerType.local || port != defaultPort) && await isPortTaken) {
yield ServerResult(ServerResultType.freeingPort);
var result = await freePort();
yield ServerResult(result ? ServerResultType.freePortSuccess : ServerResultType.freePortError);
@@ -126,9 +133,15 @@ abstract class ServerController extends GetxController {
return;
}
}
switch(type()){
case ServerType.embedded:
embeddedServerPid = await startEmbeddedInternal();
final pid = await startEmbeddedInternal();
watchProcess(pid).then((value) {
if(started()) {
started.value = false;
}
});
break;
case ServerType.remote:
yield ServerResult(ServerResultType.pingingRemote);
@@ -143,7 +156,7 @@ abstract class ServerController extends GetxController {
break;
case ServerType.local:
if(port != defaultPort) {
localServer = await startRemoteAuthenticatorProxy(Uri.parse("http://$defaultHost:$defaultPort"));
localServer = await startRemoteAuthenticatorProxy(Uri.parse("http://$defaultHost:$port"));
}
break;
@@ -153,6 +166,8 @@ abstract class ServerController extends GetxController {
var uriResult = await pingServer(defaultHost, defaultPort);
if(uriResult == null) {
yield ServerResult(ServerResultType.pingError);
remoteServer?.close(force: true);
localServer?.close(force: true);
started.value = false;
return;
}
@@ -164,6 +179,8 @@ abstract class ServerController extends GetxController {
error: error,
stackTrace: stackTrace
);
remoteServer?.close(force: true);
localServer?.close(force: true);
started.value = false;
}
}
@@ -178,7 +195,7 @@ abstract class ServerController extends GetxController {
try{
switch(type()){
case ServerType.embedded:
Process.killPid(embeddedServerPid!, ProcessSignal.sigabrt);
killProcessByPort(int.parse(defaultPort));
break;
case ServerType.remote:
await remoteServer?.close(force: true);

View File

@@ -1,9 +1,6 @@
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';
import 'package:reboot_launcher/src/util/translations.dart';

View File

@@ -17,36 +17,36 @@ class UpdateController {
timestamp = RxnInt(_storage.read("ts"));
timestamp.listen((value) => _storage.write("ts", value));
var timerIndex = _storage.read("timer");
timer = Rx(timerIndex == null ? UpdateTimer.never : UpdateTimer.values.elementAt(timerIndex));
timer = Rx(timerIndex == null ? UpdateTimer.hour : UpdateTimer.values.elementAt(timerIndex));
timer.listen((value) => _storage.write("timer", value.index));
url = TextEditingController(text: _storage.read("update_url") ?? rebootDownloadUrl);
url = TextEditingController(text: _storage.read("update_url") ?? kRebootDownloadUrl);
url.addListener(() => _storage.write("update_url", url.text));
status = Rx(UpdateStatus.waiting);
}
Future<void> update([bool force = false]) async {
if(timer.value == UpdateTimer.never) {
status.value = UpdateStatus.success;
return;
}
showInfoBar(
translations.updatingRebootDll,
loading: true,
duration: null
);
try {
timestamp.value = await downloadRebootDll(
url.text,
final needsUpdate = await hasRebootDllUpdate(
timestamp.value,
hours: timer.value.hours,
force: force
);
if(!needsUpdate) {
status.value = UpdateStatus.success;
return;
}
showInfoBar(
translations.downloadingDll("reboot"),
loading: true,
duration: null
);
timestamp.value = await downloadRebootDll(url.text);
status.value = UpdateStatus.success;
showInfoBar(
translations.updatedRebootDll,
translations.downloadDllSuccess("reboot"),
severity: InfoBarSeverity.success,
duration: snackbarShortDuration
duration: infoBarShortDuration
);
}catch(message) {
var error = message.toString();
@@ -54,12 +54,12 @@ class UpdateController {
error = error.toLowerCase();
status.value = UpdateStatus.error;
showInfoBar(
translations.updateRebootDllError(error.toString()),
duration: snackbarLongDuration,
translations.downloadDllError(error.toString()),
duration: infoBarLongDuration,
severity: InfoBarSeverity.error,
action: Button(
onPressed: () => update(true),
child: Text(translations.updateRebootDllErrorAction),
child: Text(translations.downloadDllRetry),
)
);
}
@@ -68,7 +68,7 @@ class UpdateController {
void reset() {
timestamp.value = null;
timer.value = UpdateTimer.never;
url.text = rebootDownloadUrl;
url.text = kRebootDownloadUrl;
status.value = UpdateStatus.waiting;
update();
}