11package com .junnio .anticonfig ;
22
3+ import com .electronwill .nightconfig .core .file .FileConfig ;
4+ import com .electronwill .nightconfig .json .JsonFormat ;
5+ import com .electronwill .nightconfig .toml .TomlFormat ;
36import com .junnio .anticonfig .config .ConfigSync ;
47import com .junnio .anticonfig .config .ModConfig ;
58import com .junnio .anticonfig .net .ConfigScreenSync ;
811import net .fabricmc .fabric .api .client .networking .v1 .ClientPlayNetworking ;
912import net .fabricmc .fabric .api .networking .v1 .PacketByteBufs ;
1013import net .fabricmc .fabric .api .networking .v1 .PayloadTypeRegistry ;
14+ import net .fabricmc .loader .api .FabricLoader ;
1115import net .minecraft .network .PacketByteBuf ;
16+ import org .slf4j .Logger ;
17+ import org .slf4j .LoggerFactory ;
1218
19+ import java .nio .file .Files ;
20+ import java .nio .file .Path ;
1321import java .util .HashMap ;
1422import java .util .Map ;
1523
1624public class ConfigScreenHandler {
25+ private static final Logger LOGGER = LoggerFactory .getLogger ("ConfigScreenHandler" );
26+ private static Map <String , String > lastServerConfigs = new HashMap <>();
27+
1728 public static void init () {
18- // Register the payload type on client side
1929 PayloadTypeRegistry .playC2S ().register (ConfigSyncPayload .ID , ConfigSyncPayload .CODEC );
2030 }
2131
32+ // Method to store server's config list when received during login
33+ public static void setServerConfigs (Map <String , String > serverConfigs ) {
34+ lastServerConfigs = new HashMap <>(serverConfigs );
35+ }
36+
2237 public static void onConfigScreenClose () {
23- // Create config map
2438 Map <String , String > configsToSync = new HashMap <>();
25- ModConfig config = ModConfig .getInstance ();
39+ Path configDir = FabricLoader .getInstance (). getConfigDir ();
2640
27- // Gather current config states
28- for (String filename : config .getConfigFilesToCheck ()) {
29- String content = ConfigSync .getConfigContent (filename );
30- if (content != null ) {
31- configsToSync .put (filename , content );
41+ try {
42+ // Only read configs that were requested by server during login
43+ for (String filename : lastServerConfigs .keySet ()) {
44+ Path configPath = configDir .resolve (filename );
45+ if (Files .exists (configPath )) {
46+ FileConfig config ;
47+ if (filename .endsWith (".json" )) {
48+ config = FileConfig .of (configPath , JsonFormat .minimalInstance ());
49+ } else if (filename .endsWith (".toml" )) {
50+ config = FileConfig .of (configPath , TomlFormat .instance ());
51+ } else {
52+ continue ;
53+ }
54+ config .load ();
55+ configsToSync .put (filename , config .valueMap ().toString ());
56+ }
3257 }
33- }
3458
35- // Create and send payload
36- ConfigSyncPayload payload = new ConfigSyncPayload (configsToSync );
37- ClientPlayNetworking .send (payload );
59+ ConfigSyncPayload payload = new ConfigSyncPayload (configsToSync );
60+ ClientPlayNetworking .send (payload );
61+
62+ } catch (Exception e ) {
63+ LOGGER .error ("Failed to sync configs after screen close" , e );
64+ }
3865 }
3966}
0 commit comments