220 lines
7.7 KiB
Dart
220 lines
7.7 KiB
Dart
import 'dart:io';
|
|
|
|
import 'package:dio/dio.dart';
|
|
import 'package:flutter/cupertino.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:servermanager/pages/dialogbox.dart';
|
|
import 'package:servermanager/structs/credentials.dart';
|
|
import 'package:servermanager/structs/settings.dart';
|
|
|
|
class SteamCMD extends StatefulWidget {
|
|
Settings settings;
|
|
SteamCMD({super.key, required this.settings});
|
|
|
|
@override
|
|
SteamCMDState createState() => SteamCMDState(settings: settings);
|
|
}
|
|
|
|
class SteamCMDState extends State<SteamCMD> {
|
|
Settings settings = Settings();
|
|
SteamCMDState({required this.settings});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Scaffold(
|
|
appBar: AppBar(
|
|
title: Text("Conan Exiles Server Manager - Steam Command"),
|
|
backgroundColor: Color.fromARGB(255, 100, 0, 0),
|
|
),
|
|
body: SingleChildScrollView(
|
|
child: Column(
|
|
children: [
|
|
ListTile(
|
|
title: Text("Download/Initialize SteamCmd"),
|
|
leading: Icon(CupertinoIcons.cloud_download),
|
|
subtitle: Text(
|
|
"Creates the steamcmd folder, and downloads the steamcmd bootstrap. Then performs the initial update."),
|
|
onTap: () {
|
|
showDialog(
|
|
context: context,
|
|
builder: (X) => InputBox(
|
|
"",
|
|
promptText:
|
|
"This action will delete any existing copy of SteamCMD and download a fresh copy. \nAre you sure?",
|
|
changed: (X) {},
|
|
onSubmit: () async {
|
|
settings.initializeSteamCmd();
|
|
},
|
|
onCancel: () {},
|
|
isDefault: false,
|
|
hasInputField: false,
|
|
));
|
|
},
|
|
),
|
|
ListTile(
|
|
title: Text("Download SteamCmd-2fa"),
|
|
leading: Icon(CupertinoIcons.lock_shield_fill),
|
|
subtitle: Text(
|
|
"Downloads a modified version of steamcmd-2fa from https://github.com/zontreck/steamcmd-2fa"),
|
|
onTap: () async {
|
|
final dio = Dio();
|
|
await dio.download(
|
|
settings.Base2FAPath + (Platform.isWindows ? ".exe" : ""),
|
|
settings.steamcmd_path +
|
|
Platform.pathSeparator +
|
|
(Platform.isWindows
|
|
? "steamcmd-2fa.exe"
|
|
: "steamcmd-2fa"));
|
|
if (!Platform.isWindows) {
|
|
var proc = await Process.start("chmod", [
|
|
"+x",
|
|
"${settings.steamcmd_path}${Platform.pathSeparator}steamcmd-2fa"
|
|
]);
|
|
}
|
|
}),
|
|
ListTile(
|
|
title: Text("Credentials"),
|
|
leading: Icon(Icons.key_sharp),
|
|
subtitle: Text("Steam Credentials"),
|
|
onTap: () async {
|
|
var creds = await Navigator.pushNamed(context, "/steamcmd/creds",
|
|
arguments: settings.inst!.steam_creds);
|
|
if (creds != null) {
|
|
Credentials cred = creds as Credentials;
|
|
setState(() {
|
|
settings.inst!.steam_creds = cred;
|
|
settings.Write();
|
|
});
|
|
}
|
|
},
|
|
),
|
|
],
|
|
)),
|
|
);
|
|
}
|
|
}
|
|
|
|
// Returns a Credentials Object
|
|
class CredentialsPrompt extends StatelessWidget {
|
|
TextEditingController username = TextEditingController();
|
|
TextEditingController password = TextEditingController();
|
|
TextEditingController secret = TextEditingController();
|
|
bool initialInitDone = false;
|
|
bool z2fa = false;
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final args = ModalRoute.of(context)!.settings.arguments as Credentials?;
|
|
|
|
if (args != null) {
|
|
if (!initialInitDone) {
|
|
username.text = args.username;
|
|
password.text = args.password;
|
|
secret.text = args.secret;
|
|
initialInitDone = true;
|
|
}
|
|
}
|
|
|
|
return Scaffold(
|
|
appBar: AppBar(
|
|
title:
|
|
Text("Conan Exiles Server Manager - Steam Command - Credentials"),
|
|
backgroundColor: Color.fromARGB(255, 100, 0, 0),
|
|
),
|
|
body: WillPopScope(
|
|
child: SingleChildScrollView(
|
|
padding: EdgeInsets.all(16),
|
|
child: Column(
|
|
children: [
|
|
Row(
|
|
children: [
|
|
SizedBox(
|
|
width: 150,
|
|
child: Row(
|
|
children: [
|
|
Icon(Icons.person),
|
|
Text("Username:"),
|
|
],
|
|
)),
|
|
Expanded(
|
|
child: TextField(
|
|
controller: username,
|
|
decoration: InputDecoration(
|
|
border: OutlineInputBorder(
|
|
borderRadius: BorderRadius.circular(4))),
|
|
),
|
|
)
|
|
],
|
|
),
|
|
SizedBox(
|
|
height: 16,
|
|
),
|
|
Row(
|
|
children: [
|
|
SizedBox(
|
|
width: 150,
|
|
child: Row(
|
|
children: [
|
|
Icon(Icons.key),
|
|
Text("Password:"),
|
|
],
|
|
)),
|
|
Expanded(
|
|
child: TextField(
|
|
controller: password,
|
|
keyboardType: TextInputType.visiblePassword,
|
|
decoration: InputDecoration(
|
|
border: OutlineInputBorder(
|
|
borderRadius: BorderRadius.circular(4))),
|
|
),
|
|
)
|
|
],
|
|
),
|
|
SizedBox(
|
|
height: 16,
|
|
),
|
|
Row(
|
|
children: [
|
|
SizedBox(
|
|
width: 150,
|
|
child: Row(
|
|
children: [
|
|
Icon(Icons.dangerous),
|
|
Text("Secret:"),
|
|
],
|
|
)),
|
|
Expanded(
|
|
child: TextField(
|
|
controller: secret,
|
|
keyboardType: TextInputType.visiblePassword,
|
|
decoration: InputDecoration(
|
|
border: OutlineInputBorder(
|
|
borderRadius: BorderRadius.circular(4)),
|
|
hintText:
|
|
"2FA Shared Secret Code (Do Not Share With Others!)"),
|
|
))
|
|
],
|
|
),
|
|
SwitchListTile(
|
|
value: z2fa,
|
|
title: Text("Enable 2FA"),
|
|
subtitle: Text(
|
|
"This may or may not be broken... steamcmd is shit!"),
|
|
onChanged: (value) {
|
|
z2fa = value;
|
|
})
|
|
],
|
|
)),
|
|
onWillPop: () async {
|
|
Navigator.pop(
|
|
context,
|
|
Credentials(
|
|
username: username.text,
|
|
password: password.text,
|
|
secret: secret.text,
|
|
has_2fa: z2fa));
|
|
return true;
|
|
},
|
|
));
|
|
}
|
|
}
|