checkpoint

This commit is contained in:
Alessandro Autiero
2023-02-24 15:24:24 +01:00
parent 013d15d7ff
commit 63c7cc5c5b
69 changed files with 1148 additions and 644 deletions

View File

@@ -328,6 +328,6 @@ File _getProfileFile(Context context) {
_profiles.createSync(recursive: true);
}
return File("${_profiles.path}\\ClientProfile-${parseSeasonBuild(context)}.json");
return File("${_profiles.path}\\ClientProfile.json");
}

View File

@@ -4,28 +4,19 @@ import 'dart:io';
import 'package:jaguar/jaguar.dart';
class EmbeddedErrorWriter extends ErrorWriter {
static const String _errorName = "errors.com.lawinserver.common.not_found";
static const String _errorName404 = "errors.com.lawinserver.common.not_found";
static const String _errorName500 = "errors.com.lawinserver.common.error";
static const String _errorCode = "1004";
@override
FutureOr<Response> make404(Context ctx) {
stdout.writeln("Unknown path: ${ctx.uri} with method ${ctx.method}");
ctx.response.headers.set('X-Epic-Error-Name', _errorName);
ctx.response.headers.set('X-Epic-Error-Name', _errorName404);
ctx.response.headers.set('X-Epic-Error-Code', _errorCode);
return Response.json(
statusCode: 204,
{}
);
}
@override
FutureOr<Response> make500(Context ctx, Object error, [StackTrace? stack]) {
ctx.response.headers.set('X-Epic-Error-Name', _errorName);
ctx.response.headers.set('X-Epic-Error-Code', _errorCode);
return Response(
statusCode: 500,
body: {
"errorCode": _errorName,
{
"errorCode": _errorName404,
"errorMessage": "Sorry the resource you were trying to find could not be found",
"numericErrorCode": _errorCode,
"originatingService": "any",
@@ -33,4 +24,20 @@ class EmbeddedErrorWriter extends ErrorWriter {
}
);
}
@override
FutureOr<Response> make500(Context ctx, Object error, [StackTrace? stack]) {
ctx.response.headers.set('X-Epic-Error-Name', _errorName500);
ctx.response.headers.set('X-Epic-Error-Code', _errorCode);
return Response.json(
statusCode: 500,
{
"errorCode": _errorName500,
"errorMessage": "Sorry the resource you were trying to find threw an error",
"numericErrorCode": _errorCode,
"originatingService": "any",
"intent": "prod"
}
);
}
}

View File

@@ -14,24 +14,11 @@ import "error.dart";
import "lightswitch.dart";
import 'matchmaking.dart';
bool _loggingCapabilities = false;
Future<Jaguar> startEmbeddedServer(String Function() ipQuery) async {
var server = _createServer(ipQuery);
await server.serve(logRequests: true);
return server;
}
Future<Jaguar> startEmbeddedMatchmaker() async {
var server = _createMatchmaker();
server.serve(logRequests: true);
return server;
}
Jaguar _createServer(String Function() ipQuery) {
var server = Jaguar(address: "127.0.0.1", port: 3551, errorWriter: EmbeddedErrorWriter());
var server = Jaguar(port: 3551, errorWriter: EmbeddedErrorWriter());
// Version
server.getJson("unknown", (context) => Response(body: "lawinserver"));
server.getJson("/fortnite/api/version", getVersion);
server.getJson("/fortnite/api/v2/versioncheck/*", hasUpdate);
server.getJson("/fortnite/api/v2/versioncheck*", hasUpdate);
@@ -105,23 +92,7 @@ Jaguar _createServer(String Function() ipQuery) {
server.getJson("/fortnite/api/game/v2/privacy/account/:accountId", getPrivacy);
server.postJson("/fortnite/api/game/v2/privacy/account/:accountId", postPrivacy);
return server;
}
Jaguar _createMatchmaker(){
var server = Jaguar(address: "127.0.0.1", port: 8080);
WebSocket? ws;
server.wsStream(
"/",
(_, input) => ws = input,
after: [(_) => queueMatchmaking(ws!)]
);
return _addLoggingCapabilities(server);
}
Jaguar _addLoggingCapabilities(Jaguar server) {
if(_loggingCapabilities){
return server;
}
await server.serve(logRequests: true);
server.log.onRecord.listen((line) {
stdout.writeln(line);
@@ -133,6 +104,17 @@ Jaguar _addLoggingCapabilities(Jaguar server) {
serverLogFile.writeAsString("An error occurred at ${ctx.uri}: \n$exception\n$trace\n", mode: FileMode.append);
});
_loggingCapabilities = true;
return server;
}
Future<Jaguar> startEmbeddedMatchmaker() async {
var server = Jaguar(port: 8080);
WebSocket? ws;
server.wsStream(
"/",
(_, input) => ws = input,
after: [(_) => queueMatchmaking(ws!)]
);
await server.serve(logRequests: true);
return server;
}

View File

@@ -1,4 +1,4 @@
import 'dart:convert';
import 'package:path/path.dart' as path;
import 'dart:io';
import 'package:jaguar/jaguar.dart';
@@ -11,23 +11,16 @@ import '../util/os.dart';
final Directory _settings = Directory("${Platform.environment["UserProfile"]}\\.reboot_launcher\\backend\\settings");
const String _engineName = "DefaultEngine.ini";
final String _engineIni = loadEmbedded("config/$_engineName").readAsStringSync();
List getStorageSettings(Context context) =>
loadEmbeddedDirectory("config")
.listSync()
.map((e) => File(e.path))
.map(_getStorageSetting)
.toList();
const String _gameName = "DefaultGame.ini";
final String _gameIni = loadEmbedded("config/$_gameName").readAsStringSync();
const String _runtimeName = "DefaultRuntimeOptions.ini";
final String _runtimeIni = loadEmbedded("config/$_runtimeName").readAsStringSync();
List<Map<String, Object>> getStorageSettings(Context context) => [
_getStorageSetting(_engineName, _engineIni),
_getStorageSetting(_gameName, _gameIni),
_getStorageSetting(_runtimeName, _runtimeIni)
];
Map<String, Object> _getStorageSetting(String name, String source){
var bytes = utf8.encode(source);
Map<String, Object> _getStorageSetting(File file){
var name = path.basename(file.path);
var bytes = file.readAsBytesSync();
return {
"uniqueFilename": name,
"filename": name,
@@ -43,16 +36,8 @@ Map<String, Object> _getStorageSetting(String name, String source){
}
Response getStorageSetting(Context context) {
switch(context.pathParams.get("file")){
case _engineName:
return Response(body: _engineIni);
case _gameName:
return Response(body: _gameIni);
case _runtimeName:
return Response(body: _runtimeIni);
default:
return Response();
}
var file = loadEmbedded("config\\${context.pathParams.get("file")}");
return Response(body: file.readAsStringSync());
}
Response getStorageFile(Context context) {
@@ -107,5 +92,5 @@ File _getSettingsFile(Context context) {
_settings.createSync(recursive: true);
}
return File("${_settings.path}\\ClientSettings-${parseSeasonBuild(context)}.Sav");
return File("${_settings.path}\\ClientSettings.Sav");
}