Skip to content

Commit cc70ba8

Browse files
feat: implement file storage
1 parent 2298047 commit cc70ba8

File tree

2 files changed

+159
-3
lines changed

2 files changed

+159
-3
lines changed

PistonChat/src/main/java/net/pistonmaster/pistonchat/PistonChat.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import net.pistonmaster.pistonchat.commands.whisper.WhisperCommand;
1717
import net.pistonmaster.pistonchat.events.ChatEvent;
1818
import net.pistonmaster.pistonchat.storage.PCStorage;
19+
import net.pistonmaster.pistonchat.storage.file.FileStorage;
1920
import net.pistonmaster.pistonchat.storage.mysql.MySQLStorage;
2021
import net.pistonmaster.pistonchat.tools.*;
2122
import net.pistonmaster.pistonchat.utils.ConfigManager;
@@ -72,10 +73,11 @@ public void onEnable() {
7273
}
7374

7475
log.info(ChatColor.DARK_GREEN + "Loading storage");
75-
if (configManager.get().getString("storage").equalsIgnoreCase("mysql")) {
76+
var storageType = configManager.get().getString("storage");
77+
if (storageType.equalsIgnoreCase("mysql")) {
7678
storage = new MySQLStorage(log, configManager);
77-
} else if (configManager.get().getString("storage").equalsIgnoreCase("file")) {
78-
79+
} else if (storageType.equalsIgnoreCase("file")) {
80+
storage = new FileStorage(log, getDataFolder().toPath());
7981
}
8082

8183
log.info(ChatColor.DARK_GREEN + "Registering commands");
Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
package net.pistonmaster.pistonchat.storage.file;
2+
3+
import com.google.gson.Gson;
4+
import com.google.gson.GsonBuilder;
5+
import com.google.gson.reflect.TypeToken;
6+
import net.md_5.bungee.api.ChatColor;
7+
import net.pistonmaster.pistonchat.storage.PCStorage;
8+
9+
import java.io.*;
10+
import java.lang.reflect.Type;
11+
import java.nio.charset.StandardCharsets;
12+
import java.nio.file.Files;
13+
import java.nio.file.Path;
14+
import java.util.*;
15+
import java.util.concurrent.ConcurrentHashMap;
16+
import java.util.logging.Logger;
17+
18+
public class FileStorage implements PCStorage {
19+
private final Logger log;
20+
private final Gson gson;
21+
22+
private final Path chatSettingsFile;
23+
private final Path whisperSettingsFile;
24+
private final Path ignoreListFile;
25+
26+
private final Map<UUID, Boolean> chatSettings = new ConcurrentHashMap<>();
27+
private final Map<UUID, Boolean> whisperSettings = new ConcurrentHashMap<>();
28+
private final Map<UUID, List<UUID>> ignoreList = new ConcurrentHashMap<>();
29+
30+
public FileStorage(Logger log, Path dataFolder) {
31+
this.log = log;
32+
33+
log.info(ChatColor.DARK_GREEN + "Loading file storage");
34+
35+
gson = new GsonBuilder().setPrettyPrinting().create();
36+
37+
chatSettingsFile = dataFolder.resolve("chat_settings.json");
38+
whisperSettingsFile = dataFolder.resolve("whisper_settings.json");
39+
ignoreListFile = dataFolder.resolve("ignore_list.json");
40+
41+
// Load existing data
42+
loadData();
43+
44+
log.info(ChatColor.DARK_GREEN + "Loaded file storage");
45+
}
46+
47+
private void loadData() {
48+
try {
49+
// Load chat settings
50+
if (Files.exists(chatSettingsFile)) {
51+
Type type = new TypeToken<Map<UUID, Boolean>>() {
52+
}.getType();
53+
try (Reader reader = Files.newBufferedReader(chatSettingsFile, StandardCharsets.UTF_8)) {
54+
Map<UUID, Boolean> loaded = gson.fromJson(reader, type);
55+
if (loaded != null) {
56+
chatSettings.putAll(loaded);
57+
}
58+
}
59+
}
60+
61+
// Load whisper settings
62+
if (Files.exists(whisperSettingsFile)) {
63+
Type type = new TypeToken<Map<UUID, Boolean>>() {
64+
}.getType();
65+
try (Reader reader = Files.newBufferedReader(whisperSettingsFile, StandardCharsets.UTF_8)) {
66+
Map<UUID, Boolean> loaded = gson.fromJson(reader, type);
67+
if (loaded != null) {
68+
whisperSettings.putAll(loaded);
69+
}
70+
}
71+
}
72+
73+
// Load ignore lists
74+
if (Files.exists(ignoreListFile)) {
75+
Type type = new TypeToken<Map<UUID, List<UUID>>>() {
76+
}.getType();
77+
try (Reader reader = Files.newBufferedReader(ignoreListFile, StandardCharsets.UTF_8)) {
78+
Map<UUID, List<UUID>> loaded = gson.fromJson(reader, type);
79+
if (loaded != null) {
80+
ignoreList.putAll(loaded);
81+
}
82+
}
83+
}
84+
} catch (Exception e) {
85+
log.severe("Error loading data: " + e.getMessage());
86+
}
87+
}
88+
89+
private void saveMap(Map<?, ?> data, Path file) {
90+
try {
91+
Files.createDirectories(file.getParent());
92+
try (Writer writer = Files.newBufferedWriter(file, StandardCharsets.UTF_8)) {
93+
gson.toJson(data, writer);
94+
}
95+
} catch (IOException e) {
96+
log.severe("Could not save data: " + e.getMessage());
97+
}
98+
}
99+
100+
@Override
101+
public void setChatEnabled(UUID uuid, boolean enabled) {
102+
chatSettings.put(uuid, enabled);
103+
saveMap(chatSettings, chatSettingsFile);
104+
}
105+
106+
@Override
107+
public boolean isChatEnabled(UUID uuid) {
108+
return chatSettings.getOrDefault(uuid, true);
109+
}
110+
111+
@Override
112+
public void setWhisperingEnabled(UUID uuid, boolean enabled) {
113+
whisperSettings.put(uuid, enabled);
114+
saveMap(whisperSettings, whisperSettingsFile);
115+
}
116+
117+
@Override
118+
public boolean isWhisperingEnabled(UUID uuid) {
119+
return whisperSettings.getOrDefault(uuid, true);
120+
}
121+
122+
@Override
123+
public HardReturn hardIgnorePlayer(UUID ignoringReceiver, UUID ignoredChatter) {
124+
List<UUID> ignored = ignoreList.computeIfAbsent(ignoringReceiver, k -> new ArrayList<>());
125+
126+
if (ignored.contains(ignoredChatter)) {
127+
ignored.remove(ignoredChatter);
128+
saveMap(ignoreList, ignoreListFile);
129+
return HardReturn.UN_IGNORE;
130+
} else {
131+
ignored.add(ignoredChatter);
132+
saveMap(ignoreList, ignoreListFile);
133+
return HardReturn.IGNORE;
134+
}
135+
}
136+
137+
@Override
138+
public boolean isHardIgnored(UUID chatter, UUID receiver) {
139+
List<UUID> ignored = ignoreList.get(receiver);
140+
return ignored != null && ignored.contains(chatter);
141+
}
142+
143+
@Override
144+
public List<UUID> getIgnoredList(UUID uuid) {
145+
List<UUID> ignored = ignoreList.get(uuid);
146+
return ignored != null ? new ArrayList<>(ignored) : new ArrayList<>();
147+
}
148+
149+
@Override
150+
public void clearIgnoredPlayers(UUID player) {
151+
ignoreList.remove(player);
152+
saveMap(ignoreList, ignoreListFile);
153+
}
154+
}

0 commit comments

Comments
 (0)