Start to implement snapshotting
This commit is contained in:
parent
a2737c82f9
commit
e53fc977bc
5 changed files with 63 additions and 9 deletions
|
@ -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()
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
40
lib/pages/snapshots.dart
Normal 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),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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'
|
||||||
|
|
Loading…
Reference in a new issue