Skip to content

Commit 593c1fa

Browse files
Feat/file storage (#175)
* refactor: prepare adding file storage * fix: make it compile * feat: implement file storage
1 parent fbb50b9 commit 593c1fa

9 files changed

Lines changed: 427 additions & 172 deletions

File tree

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

Lines changed: 10 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@
1515
import net.pistonmaster.pistonchat.commands.whisper.ReplyCommand;
1616
import net.pistonmaster.pistonchat.commands.whisper.WhisperCommand;
1717
import net.pistonmaster.pistonchat.events.ChatEvent;
18+
import net.pistonmaster.pistonchat.storage.PCStorage;
19+
import net.pistonmaster.pistonchat.storage.file.FileStorage;
20+
import net.pistonmaster.pistonchat.storage.mysql.MySQLStorage;
1821
import net.pistonmaster.pistonchat.tools.*;
1922
import net.pistonmaster.pistonchat.utils.ConfigManager;
2023
import net.pistonmaster.pistonutils.update.GitHubUpdateChecker;
@@ -28,8 +31,6 @@
2831
import org.mariadb.jdbc.MariaDbPoolDataSource;
2932

3033
import java.io.IOException;
31-
import java.sql.Connection;
32-
import java.sql.SQLException;
3334
import java.util.logging.Logger;
3435

3536
@Getter
@@ -43,7 +44,7 @@ public final class PistonChat extends JavaPlugin {
4344
private final HardIgnoreTool hardIgnoreTool = new HardIgnoreTool(this);
4445
private final CommonTool commonTool = new CommonTool(this);
4546
private final FoliaLib foliaLib = new FoliaLib(this);
46-
private MariaDbPoolDataSource ds;
47+
private PCStorage storage;
4748
private BukkitAudiences adventure;
4849

4950
@Override
@@ -71,30 +72,12 @@ public void onEnable() {
7172
Bukkit.getPluginManager().disablePlugin(this);
7273
}
7374

74-
log.info(ChatColor.DARK_GREEN + "Connecting to database");
75-
ds = new MariaDbPoolDataSource();
76-
FileConfiguration config = configManager.get();
77-
try {
78-
ds.setUser(config.getString("mysql.username"));
79-
ds.setPassword(config.getString("mysql.password"));
80-
ds.setUrl("jdbc:mariadb://" + config.getString("mysql.host") + ":" + config.getInt("mysql.port") +
81-
"/" + config.getString("mysql.database")
82-
+ "?sslMode=disable&serverTimezone=UTC&maxPoolSize=10"
83-
);
84-
85-
try (Connection connection = ds.getConnection()) {
86-
connection.createStatement().execute("CREATE TABLE IF NOT EXISTS `pistonchat_settings_chat` (`uuid` VARCHAR(36) NOT NULL," +
87-
"`chat_enabled` tinyint(1) NOT NULL," +
88-
"PRIMARY KEY (`uuid`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;");
89-
connection.createStatement().execute("CREATE TABLE IF NOT EXISTS `pistonchat_settings_whisper` (`uuid` VARCHAR(36) NOT NULL," +
90-
"`whisper_enabled` tinyint(1) NOT NULL," +
91-
"PRIMARY KEY (`uuid`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;");
92-
connection.createStatement().execute("CREATE TABLE IF NOT EXISTS `pistonchat_hard_ignores` (`uuid` VARCHAR(36) NOT NULL," +
93-
"`ignored_uuid` VARCHAR(36) NOT NULL," +
94-
"PRIMARY KEY (`uuid`, `ignored_uuid`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;");
95-
}
96-
} catch (SQLException e) {
97-
e.printStackTrace();
75+
log.info(ChatColor.DARK_GREEN + "Loading storage");
76+
var storageType = configManager.get().getString("storage");
77+
if (storageType.equalsIgnoreCase("mysql")) {
78+
storage = new MySQLStorage(log, configManager);
79+
} else if (storageType.equalsIgnoreCase("file")) {
80+
storage = new FileStorage(log, getDataFolder().toPath());
9881
}
9982

10083
log.info(ChatColor.DARK_GREEN + "Registering commands");

PistonChat/src/main/java/net/pistonmaster/pistonchat/commands/ignore/HardIgnoreCommand.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import lombok.RequiredArgsConstructor;
44
import net.pistonmaster.pistonchat.PistonChat;
5+
import net.pistonmaster.pistonchat.storage.PCStorage;
56
import net.pistonmaster.pistonchat.tools.CommonTool;
67
import net.pistonmaster.pistonchat.tools.HardIgnoreTool;
78
import net.pistonmaster.pistonchat.utils.PlatformUtils;
@@ -38,13 +39,13 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
3839
}
3940

4041
plugin.runAsync(() -> {
41-
HardIgnoreTool.HardReturn type = plugin.getHardIgnoreTool().hardIgnorePlayer(player, ignored.get());
42+
PCStorage.HardReturn type = plugin.getHardIgnoreTool().hardIgnorePlayer(player, ignored.get());
4243

43-
if (type == HardIgnoreTool.HardReturn.IGNORE) {
44+
if (type == PCStorage.HardReturn.IGNORE) {
4445
plugin.getCommonTool().sendLanguageMessageNoPrefix(player,
4546
"ignorehard",
4647
CommonTool.getStrippedNameResolver(ignored.get()));
47-
} else if (type == HardIgnoreTool.HardReturn.UN_IGNORE) {
48+
} else if (type == PCStorage.HardReturn.UN_IGNORE) {
4849
plugin.getCommonTool().sendLanguageMessageNoPrefix(player,
4950
"unignorehard",
5051
CommonTool.getStrippedNameResolver(ignored.get()));
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package net.pistonmaster.pistonchat.storage;
2+
3+
import java.util.List;
4+
import java.util.UUID;
5+
6+
public interface PCStorage {
7+
void setChatEnabled(UUID uuid, boolean enabled);
8+
9+
boolean isChatEnabled(UUID uuid);
10+
11+
void setWhisperingEnabled(UUID uuid, boolean enabled);
12+
13+
boolean isWhisperingEnabled(UUID uuid);
14+
15+
HardReturn hardIgnorePlayer(UUID ignoringReceiver, UUID ignoredChatter);
16+
17+
boolean isHardIgnored(UUID chatter, UUID receiver);
18+
19+
List<UUID> getIgnoredList(UUID uuid);
20+
21+
void clearIgnoredPlayers(UUID player);
22+
23+
enum HardReturn {
24+
IGNORE, UN_IGNORE
25+
}
26+
}
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)