MCSI-8 feat: implement server properties management with DTO and file storage

This commit is contained in:
SquidSpirit 2025-07-12 18:48:08 +08:00
parent 94556a49d7
commit 440bee16fb
9 changed files with 192 additions and 0 deletions

View File

@ -0,0 +1,84 @@
import 'package:minecraft_server_installer/properties/domain/entity/server_properties.dart';
import 'package:minecraft_server_installer/properties/domain/enum/difficulty.dart';
import 'package:minecraft_server_installer/properties/domain/enum/game_mode.dart';
class ServerPropertiesDto {
final int serverPort;
final int maxPlayers;
final int spawnProtection;
final int viewDistance;
final bool pvp;
final String gameMode;
final String difficulty;
final bool enableCommandBlock;
final bool onlineMode;
final String motd;
const ServerPropertiesDto({
required this.serverPort,
required this.maxPlayers,
required this.spawnProtection,
required this.viewDistance,
required this.pvp,
required this.gameMode,
required this.difficulty,
required this.enableCommandBlock,
required this.onlineMode,
required this.motd,
});
ServerPropertiesDto.fromEntity(ServerProperties serverProperties)
: serverPort = serverProperties.serverPort,
maxPlayers = serverProperties.maxPlayers,
spawnProtection = serverProperties.spawnProtection,
viewDistance = serverProperties.viewDistance,
pvp = serverProperties.pvp,
gameMode = serverProperties.gameMode.value,
difficulty = serverProperties.difficulty.value,
enableCommandBlock = serverProperties.enableCommandBlock,
onlineMode = serverProperties.onlineMode,
motd = serverProperties.motd;
Map<String, String> toStringMap() => {
'server-port': serverPort.toString(),
'max-players': maxPlayers.toString(),
'spawn-protection': spawnProtection.toString(),
'view-distance': viewDistance.toString(),
'pvp': pvp.toString(),
'gamemode': gameMode,
'difficulty': difficulty,
'enable-command-block': enableCommandBlock.toString(),
'online-mode': onlineMode.toString(),
'motd': motd,
};
}
extension _GameModeExtension on GameMode {
String get value {
switch (this) {
case GameMode.survival:
return 'survival';
case GameMode.creative:
return 'creative';
case GameMode.adventure:
return 'adventure';
case GameMode.spectator:
return 'spectator';
}
}
}
extension _DifficultyExtension on Difficulty {
String get value {
switch (this) {
case Difficulty.peaceful:
return 'peaceful';
case Difficulty.easy:
return 'easy';
case Difficulty.normal:
return 'normal';
case Difficulty.hard:
return 'hard';
}
}
}

View File

@ -0,0 +1,5 @@
import 'package:minecraft_server_installer/properties/adapter/gateway/server_properties_dto.dart';
abstract interface class ServerPropertiesFileStorage {
Future<void> writeServerProperties(ServerPropertiesDto serverPropertiesDto, String directoryPath);
}

View File

@ -0,0 +1,17 @@
import 'package:minecraft_server_installer/properties/adapter/gateway/server_properties_dto.dart';
import 'package:minecraft_server_installer/properties/adapter/gateway/server_properties_file_storage.dart';
import 'package:minecraft_server_installer/properties/application/repository/server_properties_repository.dart';
import 'package:minecraft_server_installer/properties/domain/entity/server_properties.dart';
class ServerPropertiesRepositoryImpl implements ServerPropertiesRepository {
final ServerPropertiesFileStorage _serverPropertiesFileStorage;
ServerPropertiesRepositoryImpl(this._serverPropertiesFileStorage);
@override
Future<void> writeServerProperties(ServerProperties serverProperties, String directoryPath) =>
_serverPropertiesFileStorage.writeServerProperties(
ServerPropertiesDto.fromEntity(serverProperties),
directoryPath,
);
}

View File

@ -0,0 +1,5 @@
import 'package:minecraft_server_installer/properties/domain/entity/server_properties.dart';
abstract interface class ServerPropertiesRepository {
Future<void> writeServerProperties(ServerProperties serverProperties, String directoryPath);
}

View File

@ -0,0 +1,11 @@
import 'package:minecraft_server_installer/properties/application/repository/server_properties_repository.dart';
import 'package:minecraft_server_installer/properties/domain/entity/server_properties.dart';
class WriteServerPropertiesUseCase {
final ServerPropertiesRepository _serverPropertiesRepository;
WriteServerPropertiesUseCase(this._serverPropertiesRepository);
Future<void> call(ServerProperties serverProperties, String directoryPath) =>
_serverPropertiesRepository.writeServerProperties(serverProperties, directoryPath);
}

View File

@ -0,0 +1,43 @@
import 'package:equatable/equatable.dart';
import 'package:minecraft_server_installer/properties/domain/enum/difficulty.dart';
import 'package:minecraft_server_installer/properties/domain/enum/game_mode.dart';
class ServerProperties with EquatableMixin {
final int serverPort;
final int maxPlayers;
final int spawnProtection;
final int viewDistance;
final bool pvp;
final GameMode gameMode;
final Difficulty difficulty;
final bool enableCommandBlock;
final bool onlineMode;
final String motd;
const ServerProperties({
required this.serverPort,
required this.maxPlayers,
required this.spawnProtection,
required this.viewDistance,
required this.pvp,
required this.gameMode,
required this.difficulty,
required this.enableCommandBlock,
required this.onlineMode,
required this.motd,
});
@override
List<Object?> get props => [
serverPort,
maxPlayers,
spawnProtection,
viewDistance,
pvp,
gameMode,
difficulty,
enableCommandBlock,
onlineMode,
motd,
];
}

View File

@ -0,0 +1,6 @@
enum Difficulty {
peaceful,
easy,
normal,
hard,
}

View File

@ -0,0 +1,6 @@
enum GameMode {
survival,
creative,
adventure,
spectator,
}

View File

@ -0,0 +1,15 @@
import 'dart:io';
import 'package:minecraft_server_installer/properties/adapter/gateway/server_properties_dto.dart';
import 'package:minecraft_server_installer/properties/adapter/gateway/server_properties_file_storage.dart';
class ServerPropertiesFileStorageImpl implements ServerPropertiesFileStorage {
@override
Future<void> writeServerProperties(ServerPropertiesDto serverPropertiesDto, String directoryPath) async {
File file = File('$directoryPath/server.properties');
await file.create(recursive: true);
final propertiesMap = serverPropertiesDto.toStringMap();
await file.writeAsString(propertiesMap.entries.map((e) => '${e.key}=${e.value}').join('\n'));
}
}