Updated Spigot player data saving system.

This commit is contained in:
Aust1n46 2021-02-13 09:53:40 -06:00
parent ffc54bebaf
commit 9df128c9a6
7 changed files with 309 additions and 262 deletions

View File

@ -92,6 +92,13 @@ loglevel: info
# saveinterval is in minutes # saveinterval is in minutes
saveinterval: 30 saveinterval: 30
# If you're running a "cracked" server, player data might not be stored properly, and thus, you are on your own.
# If you run your server in offline mode, you might have to reset your player data when switching to online mode!
# If you see this warning by accident and you are using BungeeCord, make sure you have properly setup IP Forwarding.
# https://www.spigotmc.org/wiki/bungeecord-ip-forwarding/
# No player data will be saved in offline mode unless you set this acknowledgement to 'true'
offline_server_acknowledgement: false
# The time in seconds between each check to remove timed mutes # The time in seconds between each check to remove timed mutes
unmuteinterval: 60 unmuteinterval: 60

View File

@ -92,6 +92,13 @@ loglevel: info
# saveinterval is in minutes # saveinterval is in minutes
saveinterval: 30 saveinterval: 30
# If you're running a "cracked" server, player data might not be stored properly, and thus, you are on your own.
# If you run your server in offline mode, you might have to reset your player data when switching to online mode!
# If you see this warning by accident and you are using BungeeCord, make sure you have properly setup IP Forwarding.
# https://www.spigotmc.org/wiki/bungeecord-ip-forwarding/
# No player data will be saved in offline mode unless you set this acknowledgement to 'true'
offline_server_acknowledgement: false
# The time in seconds between each check to remove timed mutes # The time in seconds between each check to remove timed mutes
unmuteinterval: 60 unmuteinterval: 60

View File

@ -21,7 +21,6 @@ import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.StringTokenizer;
import java.util.UUID; import java.util.UUID;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
@ -148,7 +147,7 @@ public class MineverseChat extends JavaPlugin implements PluginMessageListener {
public static Set<MineverseChatPlayer> players = new HashSet<MineverseChatPlayer>(); public static Set<MineverseChatPlayer> players = new HashSet<MineverseChatPlayer>();
public static Set<MineverseChatPlayer> onlinePlayers = new HashSet<MineverseChatPlayer>(); public static Set<MineverseChatPlayer> onlinePlayers = new HashSet<MineverseChatPlayer>();
public static List<String> networkPlayerNames = new ArrayList<String>(); public static List<String> networkPlayerNames = new ArrayList<String>();
private boolean firstRun = true; //private boolean firstRun = true;
// Plugin Messaging Channel // Plugin Messaging Channel
public static final String PLUGIN_MESSAGING_CHANNEL = "venturechat:data"; public static final String PLUGIN_MESSAGING_CHANNEL = "venturechat:data";
@ -221,57 +220,8 @@ public class MineverseChat extends JavaPlugin implements PluginMessageListener {
jfInfo = new JsonFormatInfo(this); jfInfo = new JsonFormatInfo(this);
gsInfo = new GuiSlotInfo(); gsInfo = new GuiSlotInfo();
PlayerData.initialize(); PlayerData.loadLegacyPlayerData();
if(this.firstRun) { PlayerData.loadPlayerData();
for(String uuidString : PlayerData.getPlayerData().getConfigurationSection("players").getKeys(false)) {
UUID uuid = UUID.fromString(uuidString);
String name = PlayerData.getPlayerData().getConfigurationSection("players." + uuid).getString("name");
String currentChannelName = PlayerData.getPlayerData().getConfigurationSection("players." + uuid).getString("current");
ChatChannel currentChannel = ChatChannel.isChannel(currentChannelName) ? ChatChannel.getChannel(currentChannelName) : ChatChannel.getDefaultChannel();
Set<UUID> ignores = new HashSet<UUID>();
StringTokenizer i = new StringTokenizer(PlayerData.getPlayerData().getConfigurationSection("players." + uuidString).getString("ignores"), ",");
while(i.hasMoreTokens()) {
ignores.add(UUID.fromString(i.nextToken()));
}
Set<String> listening = new HashSet<String>();
StringTokenizer l = new StringTokenizer(PlayerData.getPlayerData().getConfigurationSection("players." + uuidString).getString("listen"), ",");
while(l.hasMoreTokens()) {
String channel = l.nextToken();
if(ChatChannel.isChannel(channel)) {
listening.add(channel);
}
}
HashMap<String, Integer> mutes = new HashMap<String, Integer>();
StringTokenizer m = new StringTokenizer(PlayerData.getPlayerData().getConfigurationSection("players." + uuidString).getString("mutes"), ",");
while(m.hasMoreTokens()) {
String[] parts = m.nextToken().split(":");
if(ChatChannel.isChannel(parts[0])) {
if(parts[1].equals("null")) {
log.info("[VentureChat] Null Mute Time: " + parts[0] + " " + name);
continue;
}
mutes.put(ChatChannel.getChannel(parts[0]).getName(), Integer.parseInt(parts[1]));
}
}
Set<String> blockedCommands = new HashSet<String>();
StringTokenizer b = new StringTokenizer(PlayerData.getPlayerData().getConfigurationSection("players." + uuidString).getString("blockedcommands"), ",");
while(b.hasMoreTokens()) {
blockedCommands.add(b.nextToken());
}
boolean host = PlayerData.getPlayerData().getConfigurationSection("players." + uuidString).getBoolean("host");
UUID party = PlayerData.getPlayerData().getConfigurationSection("players." + uuidString).getString("party").length() > 0 ? UUID.fromString(PlayerData.getPlayerData().getConfigurationSection("players." + uuidString).getString("party")) : null;
boolean filter = PlayerData.getPlayerData().getConfigurationSection("players." + uuidString).getBoolean("filter");
boolean notifications = PlayerData.getPlayerData().getConfigurationSection("players." + uuidString).getBoolean("notifications");
String nickname = PlayerData.getPlayerData().getConfigurationSection("players." + uuidString).getString("nickname");
String jsonFormat = "Default";
boolean spy = PlayerData.getPlayerData().getConfigurationSection("players." + uuidString).getBoolean("spy", false);
boolean commandSpy = PlayerData.getPlayerData().getConfigurationSection("players." + uuidString).getBoolean("commandspy", false);
boolean rangedSpy = PlayerData.getPlayerData().getConfigurationSection("players." + uuidString).getBoolean("rangedspy", false);
boolean messageToggle = PlayerData.getPlayerData().getConfigurationSection("players." + uuidString).getBoolean("messagetoggle", true);
boolean bungeeToggle = PlayerData.getPlayerData().getConfigurationSection("players." + uuidString).getBoolean("bungeetoggle", true);
players.add(new MineverseChatPlayer(uuid, name, currentChannel, ignores, listening, mutes, blockedCommands, host, party, filter, notifications, nickname, jsonFormat, spy, commandSpy, rangedSpy, messageToggle, bungeeToggle));
}
}
for(Player p : this.getServer().getOnlinePlayers()) { for(Player p : this.getServer().getOnlinePlayers()) {
MineverseChatPlayer mcp = MineverseChatAPI.getMineverseChatPlayer(p); MineverseChatPlayer mcp = MineverseChatAPI.getMineverseChatPlayer(p);
mcp.setName(p.getName()); mcp.setName(p.getName());
@ -452,7 +402,6 @@ public class MineverseChat extends JavaPlugin implements PluginMessageListener {
} }
} }
}, 0L, 1200L); // one minute interval }, 0L, 1200L); // one minute interval
this.firstRun = false;
} }
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")

View File

@ -49,44 +49,20 @@ public class MineverseChatPlayer {
private boolean rangedSpy; private boolean rangedSpy;
private boolean messageToggle; private boolean messageToggle;
private boolean bungeeToggle; private boolean bungeeToggle;
private boolean tempData;
//buttons variable no longer used //buttons variable no longer used
//mail variable no longer used //mail variable no longer used
@Deprecated @Deprecated
public MineverseChatPlayer(UUID uuid, String name, ChatChannel currentChannel, Set<UUID> ignores, Set<String> listening, HashMap<String, Integer> mutes, Set<String> blockedCommands, List<String> mail, boolean host, UUID party, boolean filter, boolean notifications, String nickname, String jsonFormat, boolean spy, boolean commandSpy, boolean rangedSpy, boolean buttons, boolean messageToggle, boolean bungeeToggle) { public MineverseChatPlayer(UUID uuid, String name, ChatChannel currentChannel, Set<UUID> ignores, Set<String> listening, HashMap<String, Integer> mutes, Set<String> blockedCommands, List<String> mail, boolean host, UUID party, boolean filter, boolean notifications, String nickname, String jsonFormat, boolean spy, boolean commandSpy, boolean rangedSpy, boolean buttons, boolean messageToggle, boolean bungeeToggle) {
this.uuid = uuid; this(uuid, name, currentChannel, ignores, listening, mutes, blockedCommands, host, party, filter, notifications, nickname, jsonFormat, spy, commandSpy, rangedSpy, messageToggle, bungeeToggle);
this.name = name;
this.currentChannel = currentChannel;
this.ignores = ignores;
this.listening = listening;
this.mutes = mutes;
this.blockedCommands = blockedCommands;
this.host = host;
this.party = party;
this.filter = filter;
this.notifications = notifications;
this.nickname = nickname;
this.online = false;
this.player = null;
this.hasPlayed = false;
this.conversation = null;
this.spy = spy;
this.rangedSpy = rangedSpy;
this.commandSpy = commandSpy;
this.quickChat = false;
this.quickChannel = null;
this.replyPlayer = null;
this.partyChat = false;
this.modified = false;
this.messages = new ArrayList<ChatMessage>();
this.jsonFormat = jsonFormat;
this.cooldowns = new HashMap<ChatChannel, Integer>();
this.spam = new HashMap<ChatChannel, List<Integer>>();
this.messageToggle = messageToggle;
this.bungeeToggle = bungeeToggle;
} }
public MineverseChatPlayer(UUID uuid, String name, ChatChannel currentChannel, Set<UUID> ignores, Set<String> listening, HashMap<String, Integer> mutes, Set<String> blockedCommands, boolean host, UUID party, boolean filter, boolean notifications, String nickname, String jsonFormat, boolean spy, boolean commandSpy, boolean rangedSpy, boolean messageToggle, boolean bungeeToggle) { public MineverseChatPlayer(UUID uuid, String name, ChatChannel currentChannel, Set<UUID> ignores, Set<String> listening, HashMap<String, Integer> mutes, Set<String> blockedCommands, boolean host, UUID party, boolean filter, boolean notifications, String nickname, String jsonFormat, boolean spy, boolean commandSpy, boolean rangedSpy, boolean messageToggle, boolean bungeeToggle) {
this(uuid, name, currentChannel, ignores, listening, mutes, blockedCommands, host, party, filter, notifications, nickname, jsonFormat, spy, commandSpy, rangedSpy, messageToggle, bungeeToggle, false);
}
public MineverseChatPlayer(UUID uuid, String name, ChatChannel currentChannel, Set<UUID> ignores, Set<String> listening, HashMap<String, Integer> mutes, Set<String> blockedCommands, boolean host, UUID party, boolean filter, boolean notifications, String nickname, String jsonFormat, boolean spy, boolean commandSpy, boolean rangedSpy, boolean messageToggle, boolean bungeeToggle, boolean tempData) {
this.uuid = uuid; this.uuid = uuid;
this.name = name; this.name = name;
this.currentChannel = currentChannel; this.currentChannel = currentChannel;
@ -117,6 +93,11 @@ public class MineverseChatPlayer {
this.spam = new HashMap<ChatChannel, List<Integer>>(); this.spam = new HashMap<ChatChannel, List<Integer>>();
this.messageToggle = messageToggle; this.messageToggle = messageToggle;
this.bungeeToggle = bungeeToggle; this.bungeeToggle = bungeeToggle;
this.tempData = tempData;
}
public boolean isTempData() {
return tempData;
} }
public boolean getBungeeToggle() { public boolean getBungeeToggle() {

View File

@ -2,104 +2,261 @@ package mineverse.Aust1n46.chat.database;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Calendar; import java.util.Calendar;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;
import java.util.StringTokenizer;
import java.util.UUID; import java.util.UUID;
import org.bukkit.Bukkit;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import mineverse.Aust1n46.chat.MineverseChat; import mineverse.Aust1n46.chat.MineverseChat;
import mineverse.Aust1n46.chat.api.MineverseChatPlayer; import mineverse.Aust1n46.chat.api.MineverseChatPlayer;
import mineverse.Aust1n46.chat.channel.ChatChannel; import mineverse.Aust1n46.chat.channel.ChatChannel;
import mineverse.Aust1n46.chat.utilities.Format;
import org.bukkit.configuration.ConfigurationSection; /**
import org.bukkit.configuration.file.FileConfiguration; * Class for reading and writing player data.
import org.bukkit.configuration.file.YamlConfiguration; *
* @author Aust1n46
//This class writes player data to the PlayerData.yml file in preparation for saving and shutting down the server. */
public class PlayerData { public class PlayerData {
private static FileConfiguration playerData; private static MineverseChat plugin = MineverseChat.getInstance();
private static File playerDataFile; private static final String PLAYER_DATA_DIRECTORY_PATH = plugin.getDataFolder().getAbsolutePath() + "/PlayerData";
private static MineverseChat plugin;
public static void initialize() { public static void loadLegacyPlayerData() {
plugin = MineverseChat.getInstance(); File legacyPlayerDataFile = new File(plugin.getDataFolder().getAbsolutePath(), "Players.yml");
playerDataFile = new File(plugin.getDataFolder().getAbsolutePath(), "Players.yml"); if(!legacyPlayerDataFile.isFile()) {
if(!playerDataFile.isFile()) { return;
plugin.saveResource("Players.yml", true);
} }
playerData = YamlConfiguration.loadConfiguration(playerDataFile);
}
public static FileConfiguration getPlayerData() {
return playerData;
}
public static void savePlayerData() {
try { try {
for(MineverseChatPlayer p : MineverseChat.players) { Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&c - Detected Legacy Player Data!"));
if(p.wasModified() || p.isOnline()) { Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&c - Converting to new structure and deleting old Players.yml file!"));
ConfigurationSection cs = playerData.getConfigurationSection("players." + p.getUUID().toString()); FileConfiguration playerData = YamlConfiguration.loadConfiguration(legacyPlayerDataFile);
String nickname = p.getNickname(); for(String uuidString : playerData.getConfigurationSection("players").getKeys(false)) {
if(cs == null) { UUID uuid = UUID.fromString(uuidString);
ConfigurationSection ps = playerData.getConfigurationSection("players"); String name = playerData.getConfigurationSection("players." + uuid).getString("name");
if(ps == null) { String currentChannelName = playerData.getConfigurationSection("players." + uuid).getString("current");
cs = playerData.createSection("players"); ChatChannel currentChannel = ChatChannel.isChannel(currentChannelName) ? ChatChannel.getChannel(currentChannelName) : ChatChannel.getDefaultChannel();
Set<UUID> ignores = new HashSet<UUID>();
StringTokenizer i = new StringTokenizer(playerData.getConfigurationSection("players." + uuidString).getString("ignores"), ",");
while(i.hasMoreTokens()) {
ignores.add(UUID.fromString(i.nextToken()));
} }
cs = playerData.createSection("players." + p.getUUID().toString()); Set<String> listening = new HashSet<String>();
StringTokenizer l = new StringTokenizer(playerData.getConfigurationSection("players." + uuidString).getString("listen"), ",");
while(l.hasMoreTokens()) {
String channel = l.nextToken();
if(ChatChannel.isChannel(channel)) {
listening.add(channel);
} }
cs.set("name", p.getName()); }
cs.set("current", p.getCurrentChannel().getName()); HashMap<String, Integer> mutes = new HashMap<String, Integer>();
StringTokenizer m = new StringTokenizer(playerData.getConfigurationSection("players." + uuidString).getString("mutes"), ",");
while(m.hasMoreTokens()) {
String[] parts = m.nextToken().split(":");
if(ChatChannel.isChannel(parts[0])) {
if(parts[1].equals("null")) {
Bukkit.getConsoleSender().sendMessage("[VentureChat] Null Mute Time: " + parts[0] + " " + name);
continue;
}
mutes.put(ChatChannel.getChannel(parts[0]).getName(), Integer.parseInt(parts[1]));
}
}
Set<String> blockedCommands = new HashSet<String>();
StringTokenizer b = new StringTokenizer(playerData.getConfigurationSection("players." + uuidString).getString("blockedcommands"), ",");
while(b.hasMoreTokens()) {
blockedCommands.add(b.nextToken());
}
boolean host = playerData.getConfigurationSection("players." + uuidString).getBoolean("host");
UUID party = playerData.getConfigurationSection("players." + uuidString).getString("party").length() > 0 ? UUID.fromString(playerData.getConfigurationSection("players." + uuidString).getString("party")) : null;
boolean filter = playerData.getConfigurationSection("players." + uuidString).getBoolean("filter");
boolean notifications = playerData.getConfigurationSection("players." + uuidString).getBoolean("notifications");
String nickname = playerData.getConfigurationSection("players." + uuidString).getString("nickname");
String jsonFormat = "Default";
boolean spy = playerData.getConfigurationSection("players." + uuidString).getBoolean("spy", false);
boolean commandSpy = playerData.getConfigurationSection("players." + uuidString).getBoolean("commandspy", false);
boolean rangedSpy = playerData.getConfigurationSection("players." + uuidString).getBoolean("rangedspy", false);
boolean messageToggle = playerData.getConfigurationSection("players." + uuidString).getBoolean("messagetoggle", true);
boolean bungeeToggle = playerData.getConfigurationSection("players." + uuidString).getBoolean("bungeetoggle", true);
MineverseChatPlayer mcp = new MineverseChatPlayer(uuid, name, currentChannel, ignores, listening, mutes, blockedCommands, host, party, filter, notifications, nickname, jsonFormat, spy, commandSpy, rangedSpy, messageToggle, bungeeToggle);
mcp.setModified(true);
MineverseChat.players.add(mcp);
}
}
catch (Exception e) {
MineverseChat.players.clear();
Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&c - Error Loading Legacy Player Data!"));
Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&c - Deleted Players.yml file!"));
}
finally {
legacyPlayerDataFile.delete();
}
}
public static void loadPlayerData() {
try {
File playerDataDirectory = new File(PLAYER_DATA_DIRECTORY_PATH);
if(!playerDataDirectory.exists()) {
playerDataDirectory.mkdirs();
}
Files.walk(Paths.get(PLAYER_DATA_DIRECTORY_PATH))
.filter(Files::isRegularFile)
.forEach((path) -> readPlayerDataFile(path));
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* Loads the player data file for a specific player. Corrupt/invalid data files are skipped and deleted.
*
* @param path
*/
private static void readPlayerDataFile(Path path) {
MineverseChatPlayer mcp;
File playerDataFile = path.toFile();
if(!playerDataFile.exists()) {
return;
}
try {
FileConfiguration playerDataFileYamlConfiguration = YamlConfiguration.loadConfiguration(playerDataFile);
String uuidString = playerDataFile.getName().replace(".yml", "");
UUID uuid = UUID.fromString(uuidString);
String name = playerDataFileYamlConfiguration.getString("name");
String currentChannelName = playerDataFileYamlConfiguration.getString("current");
ChatChannel currentChannel = ChatChannel.isChannel(currentChannelName) ? ChatChannel.getChannel(currentChannelName) : ChatChannel.getDefaultChannel();
Set<UUID> ignores = new HashSet<UUID>();
StringTokenizer i = new StringTokenizer(playerDataFileYamlConfiguration.getString("ignores"), ",");
while(i.hasMoreTokens()) {
ignores.add(UUID.fromString(i.nextToken()));
}
Set<String> listening = new HashSet<String>();
StringTokenizer l = new StringTokenizer(playerDataFileYamlConfiguration.getString("listen"), ",");
while(l.hasMoreTokens()) {
String channel = l.nextToken();
if(ChatChannel.isChannel(channel)) {
listening.add(channel);
}
}
HashMap<String, Integer> mutes = new HashMap<String, Integer>();
StringTokenizer m = new StringTokenizer(playerDataFileYamlConfiguration.getString("mutes"), ",");
while(m.hasMoreTokens()) {
String[] parts = m.nextToken().split(":");
if(ChatChannel.isChannel(parts[0])) {
if(parts[1].equals("null")) {
Bukkit.getConsoleSender().sendMessage("[VentureChat] Null Mute Time: " + parts[0] + " " + name);
continue;
}
mutes.put(ChatChannel.getChannel(parts[0]).getName(), Integer.parseInt(parts[1]));
}
}
Set<String> blockedCommands = new HashSet<String>();
StringTokenizer b = new StringTokenizer(playerDataFileYamlConfiguration.getString("blockedcommands"), ",");
while(b.hasMoreTokens()) {
blockedCommands.add(b.nextToken());
}
boolean host = playerDataFileYamlConfiguration.getBoolean("host");
UUID party = playerDataFileYamlConfiguration.getString("party").length() > 0 ? UUID.fromString(playerDataFileYamlConfiguration.getString("party")) : null;
boolean filter = playerDataFileYamlConfiguration.getBoolean("filter");
boolean notifications = playerDataFileYamlConfiguration.getBoolean("notifications");
String nickname = playerDataFileYamlConfiguration.getString("nickname");
String jsonFormat = "Default";
boolean spy = playerDataFileYamlConfiguration.getBoolean("spy", false);
boolean commandSpy = playerDataFileYamlConfiguration.getBoolean("commandspy", false);
boolean rangedSpy = playerDataFileYamlConfiguration.getBoolean("rangedspy", false);
boolean messageToggle = playerDataFileYamlConfiguration.getBoolean("messagetoggle", true);
boolean bungeeToggle = playerDataFileYamlConfiguration.getBoolean("bungeetoggle", true);
mcp = new MineverseChatPlayer(uuid, name, currentChannel, ignores, listening, mutes, blockedCommands, host, party, filter, notifications, nickname, jsonFormat, spy, commandSpy, rangedSpy, messageToggle, bungeeToggle);
}
catch (Exception e) {
Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&c - Error Loading Data File: " + playerDataFile.getName()));
Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&c - File will be skipped and deleted."));
playerDataFile.delete();
return;
}
if(mcp != null) {
MineverseChat.players.add(mcp);
}
}
public static void savePlayerData(MineverseChatPlayer mcp) {
if(mcp == null || mcp.isTempData() || (!mcp.isOnline() && !mcp.wasModified())) {
return;
}
try {
File playerDataFile = new File(PLAYER_DATA_DIRECTORY_PATH, mcp.getUUID() + ".yml");
FileConfiguration playerDataFileYamlConfiguration = YamlConfiguration.loadConfiguration(playerDataFile);
if(!playerDataFile.exists()) {
playerDataFileYamlConfiguration.save(playerDataFile);
}
playerDataFileYamlConfiguration.set("name", mcp.getName());
playerDataFileYamlConfiguration.set("current", mcp.getCurrentChannel().getName());
String ignores = ""; String ignores = "";
for(UUID s : p.getIgnores()) { for(UUID s : mcp.getIgnores()) {
ignores += s.toString() + ","; ignores += s.toString() + ",";
} }
cs.set("ignores", ignores); playerDataFileYamlConfiguration.set("ignores", ignores);
String listening = ""; String listening = "";
for(String channel : p.getListening()) { for(String channel : mcp.getListening()) {
ChatChannel c = ChatChannel.getChannel(channel); ChatChannel c = ChatChannel.getChannel(channel);
listening += c.getName() + ","; listening += c.getName() + ",";
} }
String mutes = ""; String mutes = "";
for(String channel : p.getMutes().keySet()) { for(String channel : mcp.getMutes().keySet()) {
ChatChannel c = ChatChannel.getChannel(channel); ChatChannel c = ChatChannel.getChannel(channel);
mutes += c.getName() + ":" + p.getMutes().get(c.getName()) + ","; mutes += c.getName() + ":" + mcp.getMutes().get(c.getName()) + ",";
} }
String blockedCommands = ""; String blockedCommands = "";
for(String s : p.getBlockedCommands()) { for(String s : mcp.getBlockedCommands()) {
blockedCommands += s + ","; blockedCommands += s + ",";
} }
if(listening.length() > 0) { if(listening.length() > 0) {
listening = listening.substring(0, listening.length() - 1); listening = listening.substring(0, listening.length() - 1);
} }
cs.set("listen", listening); playerDataFileYamlConfiguration.set("listen", listening);
if(mutes.length() > 0) { if(mutes.length() > 0) {
mutes = mutes.substring(0, mutes.length() - 1); mutes = mutes.substring(0, mutes.length() - 1);
} }
cs.set("mutes", mutes); playerDataFileYamlConfiguration.set("mutes", mutes);
if(blockedCommands.length() > 0) { if(blockedCommands.length() > 0) {
blockedCommands = blockedCommands.substring(0, blockedCommands.length() - 1); blockedCommands = blockedCommands.substring(0, blockedCommands.length() - 1);
} }
cs.set("blockedcommands", blockedCommands); playerDataFileYamlConfiguration.set("blockedcommands", blockedCommands);
cs.set("host", p.isHost()); playerDataFileYamlConfiguration.set("host", mcp.isHost());
cs.set("party", p.hasParty() ? p.getParty().toString() : ""); playerDataFileYamlConfiguration.set("party", mcp.hasParty() ? mcp.getParty().toString() : "");
cs.set("filter", p.hasFilter()); playerDataFileYamlConfiguration.set("filter", mcp.hasFilter());
cs.set("notifications", p.hasNotifications()); playerDataFileYamlConfiguration.set("notifications", mcp.hasNotifications());
cs.set("nickname", nickname); playerDataFileYamlConfiguration.set("nickname", mcp.getNickname());
cs.set("spy", p.isSpy()); playerDataFileYamlConfiguration.set("spy", mcp.isSpy());
cs.set("commandspy", p.hasCommandSpy()); playerDataFileYamlConfiguration.set("commandspy", mcp.hasCommandSpy());
cs.set("rangedspy", p.getRangedSpy()); playerDataFileYamlConfiguration.set("rangedspy", mcp.getRangedSpy());
cs.set("messagetoggle", p.getMessageToggle()); playerDataFileYamlConfiguration.set("messagetoggle", mcp.getMessageToggle());
cs.set("bungeetoggle", p.getBungeeToggle()); playerDataFileYamlConfiguration.set("bungeetoggle", mcp.getBungeeToggle());
Calendar currentDate = Calendar.getInstance(); Calendar currentDate = Calendar.getInstance();
SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MMM/dd HH:mm:ss"); SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MMM/dd HH:mm:ss");
String dateNow = formatter.format(currentDate.getTime()); String dateNow = formatter.format(currentDate.getTime());
cs.set("date", dateNow); playerDataFileYamlConfiguration.set("date", dateNow);
p.setModified(false); mcp.setModified(false);
}
} playerDataFileYamlConfiguration.save(playerDataFile);
playerData.save(playerDataFile);
} }
catch (IOException e) { catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
public static void savePlayerData() {
for(MineverseChatPlayer p : MineverseChat.players) {
savePlayerData(p);
}
}
} }

View File

@ -1,21 +1,10 @@
package mineverse.Aust1n46.chat.listeners; package mineverse.Aust1n46.chat.listeners;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.Set; import java.util.Set;
import java.util.UUID; import java.util.UUID;
import mineverse.Aust1n46.chat.MineverseChat;
import mineverse.Aust1n46.chat.api.MineverseChatAPI;
import mineverse.Aust1n46.chat.api.MineverseChatPlayer;
import mineverse.Aust1n46.chat.channel.ChatChannel;
import mineverse.Aust1n46.chat.database.PlayerData;
import mineverse.Aust1n46.chat.utilities.Format;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
@ -24,11 +13,18 @@ import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerKickEvent; import org.bukkit.event.player.PlayerKickEvent;
import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.player.PlayerQuitEvent;
import mineverse.Aust1n46.chat.MineverseChat;
import mineverse.Aust1n46.chat.api.MineverseChatAPI;
import mineverse.Aust1n46.chat.api.MineverseChatPlayer;
import mineverse.Aust1n46.chat.channel.ChatChannel;
import mineverse.Aust1n46.chat.database.PlayerData;
import mineverse.Aust1n46.chat.utilities.Format;
import mineverse.Aust1n46.chat.utilities.UUIDFetcher;
//This class listens for when Players login or logout and manages their wrapped MineverseChatPlayer //This class listens for when Players login or logout and manages their wrapped MineverseChatPlayer
//and it's data. //and it's data.
public class LoginListener implements Listener { public class LoginListener implements Listener {
private MineverseChat plugin = MineverseChat.getInstance(); private MineverseChat plugin = MineverseChat.getInstance();
private FileConfiguration playerData = PlayerData.getPlayerData();
@EventHandler(priority = EventPriority.LOW) @EventHandler(priority = EventPriority.LOW)
public void onPlayerKick(PlayerKickEvent plog) { public void onPlayerKick(PlayerKickEvent plog) {
@ -58,9 +54,8 @@ public class LoginListener implements Listener {
if(mcp == null) { if(mcp == null) {
Player player = event.getPlayer(); Player player = event.getPlayer();
String name = player.getName(); String name = player.getName();
// Disabling Mojang UUID Query UUID uuid = UUIDFetcher.getUUIDFromPlayer(player);
//UUID uuid = UUIDFetcher.getUUIDOf(name); boolean tempData = UUIDFetcher.uuidIsOffline(uuid);
UUID uuid = player.getUniqueId();
ChatChannel current = ChatChannel.getDefaultChannel(); ChatChannel current = ChatChannel.getDefaultChannel();
Set<UUID> ignores = new HashSet<UUID>(); Set<UUID> ignores = new HashSet<UUID>();
Set<String> listening = new HashSet<String>(); Set<String> listening = new HashSet<String>();
@ -68,7 +63,7 @@ public class LoginListener implements Listener {
HashMap<String, Integer> mutes = new HashMap<String, Integer>(); HashMap<String, Integer> mutes = new HashMap<String, Integer>();
Set<String> blockedCommands = new HashSet<String>(); Set<String> blockedCommands = new HashSet<String>();
String jsonFormat = "Default"; String jsonFormat = "Default";
mcp = new MineverseChatPlayer(uuid, name, current, ignores, listening, mutes, blockedCommands, false, null, true, true, name, jsonFormat, false, false, false, true, true); mcp = new MineverseChatPlayer(uuid, name, current, ignores, listening, mutes, blockedCommands, false, null, true, true, name, jsonFormat, false, false, false, true, true, tempData);
MineverseChat.players.add(mcp); MineverseChat.players.add(mcp);
} }
mcp.setName(event.getPlayer().getName()); mcp.setName(event.getPlayer().getName());
@ -109,84 +104,13 @@ public class LoginListener implements Listener {
if(!plugin.getConfig().getConfigurationSection("login").getBoolean("enabled", true)) { if(!plugin.getConfig().getConfigurationSection("login").getBoolean("enabled", true)) {
event.setJoinMessage(""); event.setJoinMessage("");
} }
/*
* if(MineverseChat.onlinePlayers.size() == 1) {
* plugin.updatePlayerList(sync, true); }
* plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, new
* Runnable() { public void run() {
* MineverseChat.networkPlayers.put(sync.getName(),
* sync.getPlayer().getServer().getServerName());
* plugin.updatePlayerList(sync, false); } }, 1L);
*/
} }
private void playerLeaving(Player player) { private void playerLeaving(Player player) {
MineverseChatPlayer mcp = MineverseChatAPI.getOnlineMineverseChatPlayer(player); MineverseChatPlayer mcp = MineverseChatAPI.getOnlineMineverseChatPlayer(player);
ConfigurationSection cs = playerData.getConfigurationSection("players." + mcp.getUUID().toString()); PlayerData.savePlayerData(mcp);
if(mcp.getPlayer() == null) {
return;
}
if(cs == null) {
ConfigurationSection ps = playerData.getConfigurationSection("players");
if(ps == null) {
cs = playerData.createSection("players");
}
cs = playerData.createSection("players." + mcp.getUUID().toString());
}
cs.set("name", mcp.getName());
cs.set("current", mcp.getCurrentChannel().getName());
String ignores = "";
for(UUID s : mcp.getIgnores()) {
ignores += s.toString() + ",";
}
cs.set("ignores", ignores);
String listening = "";
for(String channel : mcp.getListening()) {
ChatChannel c = ChatChannel.getChannel(channel);
listening += c.getName() + ",";
}
String mutes = "";
for(String channel : mcp.getMutes().keySet()) {
ChatChannel c = ChatChannel.getChannel(channel);
mutes += c.getName() + ":" + mcp.getMutes().get(c.getName()) + ",";
}
String blockedCommands = "";
for(String s : mcp.getBlockedCommands()) {
blockedCommands += s + ",";
}
if(listening.length() > 0) {
listening = listening.substring(0, listening.length() - 1);
}
cs.set("listen", listening);
if(mutes.length() > 0) {
mutes = mutes.substring(0, mutes.length() - 1);
}
cs.set("mutes", mutes);
if(blockedCommands.length() > 0) {
blockedCommands = blockedCommands.substring(0, blockedCommands.length() - 1);
}
cs.set("blockedcommands", blockedCommands);
cs.set("host", mcp.isHost());
cs.set("party", mcp.hasParty() ? mcp.getParty().toString() : "");
cs.set("filter", mcp.hasFilter());
cs.set("notifications", mcp.hasNotifications());
cs.set("nickname", mcp.getPlayer().getDisplayName());
mcp.setNickname(mcp.getPlayer().getDisplayName());
Calendar currentDate = Calendar.getInstance();
SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MMM/dd HH:mm:ss");
String dateNow = formatter.format(currentDate.getTime());
cs.set("date", dateNow);
mcp.clearMessages(); mcp.clearMessages();
mcp.setOnline(false); mcp.setOnline(false);
MineverseChat.onlinePlayers.remove(mcp); MineverseChat.onlinePlayers.remove(mcp);
// System.out.println(mcp.getName() + " logged off.");
/*
* final MineverseChatPlayer sync = mcp;
* plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, new
* Runnable() { public void run() {
* MineverseChat.networkPlayers.remove(sync.getName());
* plugin.updatePlayerList(sync, false); sync.setOnline(false);
* MineverseChat.onlinePlayers.remove(sync); } }, 1L);
*/
} }
} }

View File

@ -1,17 +1,25 @@
package mineverse.Aust1n46.chat.utilities; package mineverse.Aust1n46.chat.utilities;
import com.google.common.collect.ImmutableList;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.io.OutputStream; import java.io.OutputStream;
import java.net.HttpURLConnection; import java.net.HttpURLConnection;
import java.net.URL; import java.net.URL;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.util.*; import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.Callable; import java.util.concurrent.Callable;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import com.google.common.collect.ImmutableList;
//This class is used to query the Mojang servers to verify UUID's. //This class is used to query the Mojang servers to verify UUID's.
public class UUIDFetcher implements Callable<Map<String, UUID>> { //unimplemented public class UUIDFetcher implements Callable<Map<String, UUID>> { //unimplemented
private static final double PROFILES_PER_REQUEST = 100; private static final double PROFILES_PER_REQUEST = 100;
@ -102,4 +110,18 @@ public class UUIDFetcher implements Callable<Map<String, UUID>> { //unimplemente
public static boolean uuidIsOffline(UUID uuid) { public static boolean uuidIsOffline(UUID uuid) {
return uuid.version() == 3; return uuid.version() == 3;
} }
public static UUID getUUIDFromPlayer(Player player) {
UUID uuid = player.getUniqueId();
if(uuidIsOffline(uuid)) {
Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&c - Detected Offline UUID!"));
Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&c - If you are using BungeeCord, make sure you have properly setup IP Forwarding."));
Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&c - https://www.spigotmc.org/wiki/bungeecord-ip-forwarding/"));
Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&c - You can access this wiki page from the log file or just Google it."));
Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&c - If you're running a \"cracked\" server, player data might not be stored properly, and thus, you are on your own."));
Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&c - If you run your server in offline mode, you might have to reset your player data when switching to online mode!"));
Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&c - No player data will be saved in offline mode unless you set the \"cracked\" server acknowledgement in the config!"));
}
return uuid;
}
} }