Start to implement snapshotting

This commit is contained in:
zontreck 2024-07-01 23:43:48 -07:00
parent a2737c82f9
commit e53fc977bc
5 changed files with 63 additions and 9 deletions

View file

@ -8,6 +8,7 @@ import 'package:servermanager/pages/ModManager.dart';
import 'package:servermanager/pages/autorestart.dart'; import 'package:servermanager/pages/autorestart.dart';
import 'package:servermanager/pages/credentials_prompt.dart'; import 'package:servermanager/pages/credentials_prompt.dart';
import 'package:servermanager/pages/home.dart'; import 'package:servermanager/pages/home.dart';
import 'package:servermanager/pages/snapshots.dart';
import 'package:servermanager/structs/settings.dart'; import 'package:servermanager/structs/settings.dart';
import 'pages/ServerSettings.dart'; import 'pages/ServerSettings.dart';
@ -34,7 +35,8 @@ class MyApp extends StatelessWidget {
"/server/ports": (context) => ServerSettingsPage(), "/server/ports": (context) => ServerSettingsPage(),
"/server/mods": (context) => ModManager(settings: appSettings), "/server/mods": (context) => ModManager(settings: appSettings),
"/server/mods/edit": (context) => ModPage(), "/server/mods/edit": (context) => ModPage(),
"/server/discord": (context) => DiscordConfigPage() "/server/discord": (context) => DiscordConfigPage(),
"/server/snapshots": (context) => SnapshotsPage()
}); });
} }
} }

View file

@ -45,6 +45,12 @@ class GameServerPageState extends State<GameServerPage> {
Navigator.pushNamed(context, "/server/mods"); Navigator.pushNamed(context, "/server/mods");
}, },
), ),
ListTile(
title: Text("Server Snapshots"),
leading: Icon(Icons.photo),
subtitle: Text("Manage server database snapshots"),
onTap: () {},
),
ListTile( ListTile(
title: Text("Configure AutoRestart"), title: Text("Configure AutoRestart"),
leading: Icon(Icons.timer), leading: Icon(Icons.timer),

40
lib/pages/snapshots.dart Normal file
View file

@ -0,0 +1,40 @@
import 'package:flutter/material.dart';
import 'package:servermanager/pages/Constants.dart';
import 'package:servermanager/structs/settings.dart';
class SnapshotsPage extends StatefulWidget {
SnapshotsPage({super.key});
@override
State<StatefulWidget> createState() {
return SnapshotsState();
}
}
class SnapshotsState extends State<SnapshotsPage> {
SnapshotsState();
Settings settings = Settings();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Server Snapshots Manager"),
backgroundColor: Constants.TITLEBAR_COLOR,
),
body: Padding(
padding: EdgeInsets.all(8),
child: SingleChildScrollView(
child: Column(
children: [
ListTile(
title: Text("Server DB File"),
subtitle: Text(settings.gameServerDBFile),
),
],
),
),
),
);
}
}

View file

@ -33,6 +33,7 @@ class Settings {
String steamcmd_path = ""; String steamcmd_path = "";
String game_path = ""; String game_path = "";
String base_path = ""; String base_path = "";
String gameServerDBFile = "";
bool FTS = true; bool FTS = true;
Credentials serverLoginCreds = Credentials serverLoginCreds =
Credentials(username: "admin", password: "changeMe123"); Credentials(username: "admin", password: "changeMe123");
@ -51,6 +52,7 @@ class Settings {
tag.put("steamcmd", StringTag.valueOf(steamcmd_path)); tag.put("steamcmd", StringTag.valueOf(steamcmd_path));
tag.put("game", StringTag.valueOf(game_path)); tag.put("game", StringTag.valueOf(game_path));
tag.put("base", StringTag.valueOf(base_path)); tag.put("base", StringTag.valueOf(base_path));
tag.put("dbfile", StringTag.valueOf(getWorldGameDB()));
NbtUtils.writeBoolean(tag, "fts", FTS); NbtUtils.writeBoolean(tag, "fts", FTS);
tag.put("server_creds", serverLoginCreds.save()); tag.put("server_creds", serverLoginCreds.save());
@ -73,6 +75,9 @@ class Settings {
steamcmd_path = tag.get("steamcmd")!.asString(); steamcmd_path = tag.get("steamcmd")!.asString();
game_path = tag.get("game")!.asString(); game_path = tag.get("game")!.asString();
base_path = tag.get("base")!.asString(); base_path = tag.get("base")!.asString();
if (tag.containsKey("dbfile"))
gameServerDBFile = tag.get("dbfile")!.asString();
FTS = NbtUtils.readBoolean(tag, "fts"); // First Time Setup. FTS = NbtUtils.readBoolean(tag, "fts"); // First Time Setup.
// FTS should be disabled by the client when sending it back to the server in a C2SApplySettingsPacket // FTS should be disabled by the client when sending it back to the server in a C2SApplySettingsPacket
@ -167,12 +172,13 @@ class Settings {
} }
String getWorldGameDB() { String getWorldGameDB() {
var path = PathHelper(pth: getServerPath()).resolve("ConanSandbox").resolve("Saved"); var path = PathHelper(pth: getServerPath())
.resolve("ConanSandbox")
.resolve("Saved");
var pth2 = path.resolve("game.db"); var pth2 = path.resolve("game.db");
if(pth2.exists()) return pth2.build(); if (pth2.exists()) return pth2.build();
var pth1 = path.resolve("dlc_siptah.db"); var pth1 = path.resolve("dlc_siptah.db");
if(pth1.exists()) return pth1.build(); if (pth1.exists()) return pth1.build();
return pth2.build(); // Fallback to game.db return pth2.build(); // Fallback to game.db
} }
@ -181,7 +187,7 @@ class Settings {
Directory dir = Directory(getWorldSnapshotFolder()); Directory dir = Directory(getWorldSnapshotFolder());
var lst = await dir.list().toList(); var lst = await dir.list().toList();
List<String> backupNames = []; List<String> backupNames = [];
for(var file in lst) { for (var file in lst) {
backupNames.add(file.path); backupNames.add(file.path);
} }
@ -205,9 +211,9 @@ class Settings {
} }
Future<void> createBackupsFolderIfNotExists() async { Future<void> createBackupsFolderIfNotExists() async {
if(Directory(getWorldSnapshotFolder()).existsSync()) { if (Directory(getWorldSnapshotFolder()).existsSync()) {
return; return;
}else { } else {
await Directory(getWorldSnapshotFolder()).create(recursive: true); await Directory(getWorldSnapshotFolder()).create(recursive: true);
} }
} }

View file

@ -16,7 +16,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
# In Windows, build-name is used as the major, minor, and patch parts # In Windows, build-name is used as the major, minor, and patch parts
# of the product and file versions while build-number is used as the build suffix. # of the product and file versions while build-number is used as the build suffix.
version: 1.1.0+1 version: 1.1.0+32
environment: environment:
sdk: '>=3.1.4 <4.0.0' sdk: '>=3.1.4 <4.0.0'