More Bugfixes (2) [2.0.0-DEV]

Fixed Bugs:
- LastGameMode no longer null (PlayerLoginEvent > PlayerJoinEvent)
- Playtime no longer negative
- Logintimes now updated
- Serverdata now updating properly (PlayerLoginEvent > PlayerJoinEvent)

Known bugs:
- !! Database UserID is null when saving
- (GamemodeTimes is handling weird)
- (LastPlayed might be handling weird)
- (Database saves multiples of known things.)
- Locations not saved when player moves (UserID faulty)
- !! Location ID not primary key
This commit is contained in:
Rsl1122 2017-01-05 11:34:55 +02:00
parent 6ae61230df
commit 7758c5c581
10 changed files with 197 additions and 174 deletions

View File

@ -34,58 +34,61 @@ public class InspectCommand extends SubCommand {
@Override
public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
String playerName = DataUtils.getPlayerDisplayname(args, sender);
UUID uuid;
try {
uuid = UUIDFetcher.getUUIDOf(playerName);
if (uuid == null) {
throw new Exception("Username doesn't exist.");
}
} catch (Exception e) {
sender.sendMessage(Phrase.USERNAME_NOT_VALID.toString());
return true;
}
OfflinePlayer p = getOfflinePlayer(uuid);
if (!p.hasPlayedBefore()) {
sender.sendMessage(Phrase.USERNAME_NOT_SEEN.toString());
return true;
}
if (!plugin.getDB().wasSeenBefore(uuid)) {
sender.sendMessage(Phrase.USERNAME_NOT_KNOWN.toString());
return true;
}
Date refreshDate = new Date();
UserData data = plugin.getHandler().getCurrentData(uuid);
UserData data = plugin.getHandler().getCurrentData(uuid);
ChatColor operatorColor = Phrase.COLOR_MAIN.color();
ChatColor textColor = Phrase.COLOR_SEC.color();
List<String> msgs = new ArrayList<>();
msgs.add(""+data.getLoginTimes());
msgs.add(""+data.getBedLocation().getBlockX());
msgs.add(""+data.getDemData().getGeoLocation());
msgs.add(""+data.getGmTimes().keySet().toString());
msgs.add(""+data.getIps().toString());
msgs.add(""+data.getLastGamemode());
msgs.add(""+data.getLastGmSwapTime());
msgs.add(""+data.getLastPlayed());
msgs.add(""+data.getLocation().getBlockX());
msgs.add(""+data.getNicknames().toString());
msgs.add(""+data.getRegistered());
msgs.add(""+data.getTimesKicked());
msgs.add(""+data.getUuid());
msgs.add(operatorColor+"SERVER");
msgs.add("Logintimes " + data.getLoginTimes());
msgs.add("BedLocation " + data.getBedLocation().getBlockX());
msgs.add("GeoLoc " + data.getDemData().getGeoLocation());
msgs.add("GMTimes values " + data.getGmTimes().values().toString());
msgs.add("Ips " + data.getIps().toString());
msgs.add("Last gamemode " + data.getLastGamemode());
msgs.add("Last gm swap time " + data.getLastGmSwapTime());
msgs.add("Last Played" + data.getLastPlayed());
msgs.add("Location " + data.getLocation().getBlockX());
msgs.add("Nicknames " + data.getNicknames().toString());
msgs.add("Registered " + data.getRegistered());
msgs.add("TimesKicked " + data.getTimesKicked());
msgs.add("Uuid " + data.getUuid());
msgs.add(operatorColor + "SERVER");
ServerData sdata = plugin.getHandler().getServerData();
msgs.add(""+sdata.getCommandUsage().keySet().toString());
msgs.add(""+sdata.getNewPlayers());
msgs.add(""+sdata.getPlayersOnline());
msgs.add("Commands " + sdata.getCommandUsage().keySet().toString());
msgs.add("New Players " + sdata.getNewPlayers());
msgs.add("Online Players " + sdata.getPlayersOnline());
//header
sender.sendMessage(textColor + "-- [" + operatorColor + "PLAN - Inspect results: " + playerName +" - took "+DataFormatUtils.formatTimeAmountSinceDate(refreshDate, new Date())+ textColor + "] --");
sender.sendMessage(textColor + "-- [" + operatorColor + "PLAN - Inspect results: " + playerName + " - took " + DataFormatUtils.formatTimeAmountSinceDate(refreshDate, new Date()) + textColor + "] --");
for (String message : msgs) {
sender.sendMessage(textColor+message);
sender.sendMessage(textColor + message);
}
sender.sendMessage(textColor + "-- o --");
return true;
}

View File

@ -306,99 +306,86 @@ public abstract class SQLDB extends Database {
@Override
public UserData getUserData(UUID uuid) {
checkConnection();
// Check if user is in the database
if (!wasSeenBefore(uuid)) {
return null;
}
// Get the data
try {
UserData data = new UserData(getOfflinePlayer(uuid), new DemographicsData(), this);
if (wasSeenBefore(uuid)) {
PreparedStatement statement = connection.prepareStatement("SELECT * FROM " + userName + " WHERE UPPER(" + userColumnUUID + ") LIKE UPPER(?)");
statement.setString(1, uuid.toString());
ResultSet set = statement.executeQuery();
PreparedStatement statement = connection.prepareStatement("SELECT * FROM " + userName + " WHERE UPPER(" + userColumnUUID + ") LIKE UPPER(?)");
statement.setString(1, uuid.toString());
ResultSet set = statement.executeQuery();
String id = null;
while (set.next()) {
id = ""+set.getInt(userColumnID);
if (id == null) {
return null;
}
data.getDemData().setAge(set.getInt(userColumnDemAge));
data.getDemData().setGender(Gender.parse(set.getString(userColumnDemGender)));
data.getDemData().setGeoLocation(set.getString(userColumnDemGeoLocation));
data.setLastGamemode(MiscUtils.parseGM(set.getString(userColumnLastGM)));
data.setLastGmSwapTime(set.getLong(userColumnLastGMSwapTime));
data.setPlayTime(set.getLong(userColumnPlayTime));
data.setLoginTimes(set.getInt(userColumnLoginTimes));
}
set.close();
statement.close();
statement = connection.prepareStatement("SELECT * FROM " + locationName + " WHERE UPPER(" + locationColumnUserID + ") LIKE UPPER(?)");
statement.setString(1, id);
set = statement.executeQuery();
List<Location> locations = new ArrayList<>();
while (set.next()) {
locations.add(new Location(Bukkit.getWorld(set.getString(locationColumnWorld)), set.getInt(locationColumnCoordinatesX), 0, set.getInt(locationColumnCoordinatesZ)));
}
set.close();
statement.close();
data.addLocations(locations);
if (locations.isEmpty()) {
plugin.logToFile("DATABASE-SQLDB\nLocations list is empty");
} else {
data.setLocation(locations.get(locations.size() - 1));
}
statement = connection.prepareStatement("SELECT * FROM " + nicknamesName + " WHERE UPPER(" + nicknamesColumnUserID + ") LIKE UPPER(?)");
statement.setString(1, id);
set = statement.executeQuery();
List<String> nicknames = new ArrayList<>();
while (set.next()) {
nicknames.add(set.getString(nicknamesColumnNick));
}
set.close();
statement.close();
data.addNicknames(nicknames);
statement = connection.prepareStatement("SELECT * FROM " + ipsName + " WHERE UPPER(" + ipsColumnUserID + ") LIKE UPPER(?)");
statement.setString(1, id);
set = statement.executeQuery();
List<InetAddress> ips = new ArrayList<>();
while (set.next()) {
try {
ips.add(InetAddress.getByName(set.getString(ipsColumnIP)));
} catch (SQLException | UnknownHostException e) {
}
}
set.close();
statement.close();
data.addIpAddresses(ips);
statement = connection.prepareStatement("SELECT * FROM " + gamemodetimesName + " WHERE UPPER(" + gamemodetimesColumnUserID + ") LIKE UPPER(?)");
statement.setString(1, id);
set = statement.executeQuery();
HashMap<GameMode, Long> times = new HashMap<>();
while (set.next()) {
times.put(GameMode.valueOf(set.getString(gamemodetimesColumnGamemode)), set.getLong(gamemodetimesColumnTime));
}
set.close();
statement.close();
data.setGmTimes(times);
} else {
GameMode defaultGM = Bukkit.getServer().getDefaultGameMode();
if (defaultGM != null) {
data.setLastGamemode(defaultGM);
} else {
data.setLastGamemode(GameMode.SURVIVAL);
}
data.setPlayTime(Long.parseLong("0"));
data.setTimesKicked(0);
data.setLoginTimes(1);
data.setLastGmSwapTime(Long.parseLong("0"));
while (set.next()) {
data.getDemData().setAge(set.getInt(userColumnDemAge));
data.getDemData().setGender(Gender.parse(set.getString(userColumnDemGender)));
data.getDemData().setGeoLocation(set.getString(userColumnDemGeoLocation));
data.setLastGamemode(MiscUtils.parseGM(set.getString(userColumnLastGM)));
data.setLastGmSwapTime(set.getLong(userColumnLastGMSwapTime));
data.setPlayTime(set.getLong(userColumnPlayTime));
data.setLoginTimes(set.getInt(userColumnLoginTimes));
}
set.close();
statement.close();
String userId = ""+getUserId(uuid.toString());
statement = connection.prepareStatement("SELECT * FROM " + locationName + " WHERE UPPER(" + locationColumnUserID + ") LIKE UPPER(?)");
statement.setString(1, userId);
set = statement.executeQuery();
List<Location> locations = new ArrayList<>();
while (set.next()) {
locations.add(new Location(Bukkit.getWorld(set.getString(locationColumnWorld)), set.getInt(locationColumnCoordinatesX), 0, set.getInt(locationColumnCoordinatesZ)));
}
set.close();
statement.close();
data.addLocations(locations);
if (locations.isEmpty()) {
plugin.logToFile("DATABASE-SQLDB\nLocations list is empty");
} else {
data.setLocation(locations.get(locations.size() - 1));
}
statement = connection.prepareStatement("SELECT * FROM " + nicknamesName + " WHERE UPPER(" + nicknamesColumnUserID + ") LIKE UPPER(?)");
statement.setString(1, userId);
set = statement.executeQuery();
List<String> nicknames = new ArrayList<>();
while (set.next()) {
nicknames.add(set.getString(nicknamesColumnNick));
}
set.close();
statement.close();
data.addNicknames(nicknames);
statement = connection.prepareStatement("SELECT * FROM " + ipsName + " WHERE UPPER(" + ipsColumnUserID + ") LIKE UPPER(?)");
statement.setString(1, userId);
set = statement.executeQuery();
List<InetAddress> ips = new ArrayList<>();
while (set.next()) {
try {
ips.add(InetAddress.getByName(set.getString(ipsColumnIP)));
} catch (SQLException | UnknownHostException e) {
}
}
set.close();
statement.close();
data.addIpAddresses(ips);
statement = connection.prepareStatement("SELECT * FROM " + gamemodetimesName + " WHERE UPPER(" + gamemodetimesColumnUserID + ") LIKE UPPER(?)");
statement.setString(1, userId);
set = statement.executeQuery();
HashMap<GameMode, Long> times = new HashMap<>();
while (set.next()) {
times.put(GameMode.valueOf(set.getString(gamemodetimesColumnGamemode)), set.getLong(gamemodetimesColumnTime));
}
set.close();
statement.close();
data.setGmTimes(times);
return data;
} catch (SQLException e) {
plugin.logToFile("DATABASE-SQLDB\n" + e + "\n" + e.getCause());
@ -535,7 +522,8 @@ public abstract class SQLDB extends Database {
int userId = getUserId(uuid.toString());
try {
int update = 0;
if (userId != -1) {
String sql = "UPDATE " + userName + " SET "
+ userColumnDemAge + "=?, "
+ userColumnDemGender + "=?, "
@ -560,9 +548,10 @@ public abstract class SQLDB extends Database {
statement.setLong(6, data.getPlayTime());
statement.setInt(7, data.getLoginTimes());
statement.setString(8, uuid.toString());
if (statement.executeUpdate() == 0) {
statement = connection.prepareStatement("INSERT INTO " + userName + " ("
update = statement.executeUpdate();
}
if (update == 0) {
PreparedStatement statement = connection.prepareStatement("INSERT INTO " + userName + " ("
+ userColumnUUID + ", "
+ userColumnDemAge + ", "
+ userColumnDemGender + ", "
@ -577,6 +566,7 @@ public abstract class SQLDB extends Database {
statement.setInt(2, data.getDemData().getAge());
statement.setString(3, data.getDemData().getGender().toString().toLowerCase());
statement.setString(4, data.getDemData().getGeoLocation());
GameMode gm = data.getLastGamemode();
if (gm != null) {
statement.setString(5, data.getLastGamemode().name());
} else {
@ -589,7 +579,7 @@ public abstract class SQLDB extends Database {
statement.execute();
statement.close();
userId = getUserId(uuid.toString());
}
}
saveLocationList(userId, data.getLocations());
saveNickList(userId, data.getNicknames());
saveIPList(userId, data.getIps());

View File

@ -5,7 +5,7 @@ import com.djrapitops.plan.database.UserData;
import java.util.Date;
import java.util.UUID;
import org.bukkit.entity.Player;
import org.bukkit.event.player.PlayerLoginEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerQuitEvent;
public class ActivityHandler {
@ -28,21 +28,24 @@ public class ActivityHandler {
data.setLastPlayed(timeNow);
}
public void handleLogIn(PlayerLoginEvent event, UserData data) {
public void handleLogIn(PlayerJoinEvent event, UserData data) {
data.setLastPlayed(new Date().getTime());
Player player = event.getPlayer();
data.updateBanned(player);
data.setLoginTimes(data.getLoginTimes()+1);
handler.getLocationHandler().addLocation(player.getUniqueId(), player.getLocation());
}
public void handleLogOut(PlayerQuitEvent event, UserData data) {
Player player = event.getPlayer();
data.setPlayTime(data.getPlayTime() + (new Date().getTime() - data.getLastPlayed()));
data.setLastPlayed(player.getLastPlayed());
long now = new Date().getTime();
data.setPlayTime(data.getPlayTime() + (now - data.getLastPlayed()));
data.setLastPlayed(now);
}
void handleReload(Player player, UserData data) {
data.setPlayTime(data.getPlayTime() + (new Date().getTime() - data.getLastPlayed()));
data.setLastPlayed(player.getLastPlayed());
long now = new Date().getTime();
data.setPlayTime(data.getPlayTime() + (now - data.getLastPlayed()));
data.setLastPlayed(now);
}
}

View File

@ -2,11 +2,8 @@ package com.djrapitops.plan.datahandlers;
import com.djrapitops.plan.Plan;
import com.djrapitops.plan.database.UserData;
import java.util.Date;
import java.util.UUID;
import org.bukkit.entity.Player;
import org.bukkit.event.player.PlayerLoginEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.event.player.PlayerJoinEvent;
public class BasicInfoHandler {
@ -16,14 +13,10 @@ public class BasicInfoHandler {
this.handler = h;
}
public void save(Player player) {
}
public void handleLogIn(PlayerLoginEvent event, UserData data) {
public void handleLogIn(PlayerJoinEvent event, UserData data) {
Player player = event.getPlayer();
data.addNickname(player.getDisplayName());
data.addIpAddress(event.getAddress());
data.addIpAddress(player.getAddress().getAddress());
}
void handleReload(Player player, UserData data) {

View File

@ -8,11 +8,8 @@ import com.djrapitops.plan.database.ServerData;
import java.util.HashMap;
import java.util.UUID;
import org.bukkit.Bukkit;
import static org.bukkit.Bukkit.getOfflinePlayer;
import org.bukkit.GameMode;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
import org.bukkit.event.player.PlayerLoginEvent;
public class DataHandler {
@ -28,6 +25,7 @@ public class DataHandler {
private final ServerDataHandler serverDataHandler;
private final PlanLiteHandler planLiteHandler;
private final Database db;
private final NewPlayerCreator newPlayerCreator;
private int timesSaved;
@ -44,6 +42,7 @@ public class DataHandler {
serverData = db.getNewestServerData();
serverDataHandler = new ServerDataHandler(serverData);
planLiteHandler = new PlanLiteHandler(plugin);
newPlayerCreator = new NewPlayerCreator(plugin, this);
timesSaved = 0;
@ -136,19 +135,7 @@ public class DataHandler {
}
public void newPlayer(Player player) {
UserData data = new UserData(player, new DemographicsData(), db);
saveCachedData(player.getUniqueId());
GameMode defaultGM = Bukkit.getServer().getDefaultGameMode();
if (defaultGM != null) {
data.setLastGamemode(defaultGM);
} else {
data.setLastGamemode(GameMode.SURVIVAL);
}
data.setPlayTime(Long.parseLong("0"));
data.setTimesKicked(0);
data.setLoginTimes(1);
data.setLastGmSwapTime(Long.parseLong("0"));
dataCache.put(player.getUniqueId(), data);
newPlayerCreator.createNewPlayer(player);
}
public HashMap<UUID, UserData> getDataCache() {
@ -184,6 +171,7 @@ public class DataHandler {
}
public ServerData getServerData() {
serverData.updatePlayerCount();
return serverData;
}

View File

@ -12,7 +12,7 @@ import java.util.Scanner;
import java.util.Set;
import org.bukkit.entity.Player;
import org.bukkit.event.player.AsyncPlayerChatEvent;
import org.bukkit.event.player.PlayerLoginEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import static org.bukkit.plugin.java.JavaPlugin.getPlugin;
public class DemographicsHandler {
@ -100,8 +100,8 @@ public class DemographicsHandler {
}
}
public void handleLogIn(PlayerLoginEvent event, UserData data) {
InetAddress address = event.getAddress();
public void handleLogIn(PlayerJoinEvent event, UserData data) {
InetAddress address = event.getPlayer().getAddress().getAddress();
try {
Scanner locationScanner = new Scanner("http://ip-api.com/line/" + address.getHostAddress());
List<String> results = new ArrayList<>();

View File

@ -6,7 +6,7 @@ import java.util.HashMap;
import org.bukkit.GameMode;
import org.bukkit.entity.Player;
import org.bukkit.event.player.PlayerGameModeChangeEvent;
import org.bukkit.event.player.PlayerLoginEvent;
import org.bukkit.event.player.PlayerJoinEvent;
public class GamemodeTimesHandler {
@ -18,7 +18,7 @@ public class GamemodeTimesHandler {
handler = h;
}
public void handleLogin(PlayerLoginEvent event, UserData data) {
public void handleLogin(PlayerJoinEvent event, UserData data) {
data.setLastGamemode(event.getPlayer().getGameMode());
}
@ -27,14 +27,14 @@ public class GamemodeTimesHandler {
handler.getActivityHandler().saveToCache(event.getPlayer(), data);
long lastSwap = data.getLastGmSwapTime();
long now = data.getPlayTime();
long playTime = data.getPlayTime();
GameMode oldGM = data.getLastGamemode();
data.setGMTime(oldGM, times.get(oldGM) + (now - lastSwap));
data.setGMTime(oldGM, times.get(oldGM) + (playTime - lastSwap));
GameMode newGM = event.getNewGameMode();
data.setLastGamemode(newGM);
data.setLastGmSwapTime(now);
data.setLastGmSwapTime(playTime);
}
void saveToCache(Player p, UserData data) {
@ -42,11 +42,11 @@ public class GamemodeTimesHandler {
handler.getActivityHandler().saveToCache(p, data);
long lastSwap = data.getLastGmSwapTime();
long now = data.getPlayTime();
long playtime = data.getPlayTime();
GameMode currentGM = p.getGameMode();
data.setGMTime(currentGM, times.get(currentGM) + (now - lastSwap));
data.setGMTime(currentGM, times.get(currentGM) + (playtime - lastSwap));
data.setLastGmSwapTime(now);
data.setLastGmSwapTime(playtime);
}
void handleReload(Player p, UserData data) {
@ -54,11 +54,11 @@ public class GamemodeTimesHandler {
handler.getActivityHandler().saveToCache(p, data);
long lastSwap = data.getLastGmSwapTime();
long now = data.getPlayTime();
long playTime = data.getPlayTime();
GameMode currentGM = p.getGameMode();
data.setGMTime(currentGM, times.get(currentGM) + (now - lastSwap));
data.setGMTime(currentGM, times.get(currentGM) + (playTime - lastSwap));
data.setLastGmSwapTime(now);
data.setLastGmSwapTime(playTime);
}
}

View File

@ -0,0 +1,43 @@
package com.djrapitops.plan.datahandlers;
import com.djrapitops.plan.Plan;
import com.djrapitops.plan.database.Database;
import com.djrapitops.plan.database.DemographicsData;
import com.djrapitops.plan.database.UserData;
import org.bukkit.Bukkit;
import org.bukkit.GameMode;
import org.bukkit.entity.Player;
public class NewPlayerCreator {
private Plan plugin;
private Database db;
private DataHandler handler;
public NewPlayerCreator(Plan plugin, DataHandler h) {
this.plugin = plugin;
db = plugin.getDB();
handler = h;
}
public void createNewPlayer(Player p) {
UserData data = new UserData(p, new DemographicsData(), db);
if (p.getGameMode() == null) {
GameMode defaultGM = Bukkit.getServer().getDefaultGameMode();
if (defaultGM != null) {
data.setLastGamemode(defaultGM);
} else {
data.setLastGamemode(GameMode.SURVIVAL);
}
} else {
data.setLastGamemode(p.getGameMode());
}
long zero = Long.parseLong("0");
data.setPlayTime(zero);
data.setTimesKicked(0);
data.setLoginTimes(1);
data.setLastGmSwapTime(zero);
db.saveUserData(p.getUniqueId(), data);
}
}

View File

@ -15,8 +15,8 @@ import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerKickEvent;
import org.bukkit.event.player.PlayerLoginEvent;
import org.bukkit.event.player.PlayerLoginEvent.Result;
import org.bukkit.event.player.PlayerQuitEvent;
@ -43,15 +43,14 @@ public class PlanPlayerListener implements Listener {
}
@EventHandler(priority = EventPriority.MONITOR)
public void onPlayerLogin(PlayerLoginEvent event) {
if (!event.getResult().equals(Result.ALLOWED)) {
return;
}
public void onPlayerLogin(PlayerJoinEvent event) {
Player player = event.getPlayer();
UUID uuid = player.getUniqueId();
boolean newPlayer = activityH.isFirstTimeJoin(uuid);
handler.newPlayer(player);
serverHandler.handleLogin(newPlayer);
boolean isNewPlayer = activityH.isFirstTimeJoin(uuid);
if (isNewPlayer) {
handler.newPlayer(player);
}
serverHandler.handleLogin(isNewPlayer);
UserData data = handler.getCurrentData(uuid);
activityH.handleLogIn(event, data);
basicInfoH.handleLogIn(event, data);

View File

@ -7,7 +7,6 @@ import com.djrapitops.plan.command.hooks.OnTimeHook;
import com.djrapitops.plan.api.Hook;
import com.djrapitops.plan.command.hooks.PlaceholderAPIHook;
import com.djrapitops.plan.command.hooks.SuperbVoteHook;
//import com.djrapitops.plan.command.hooks.McMMOHook;
import com.djrapitops.plan.command.hooks.TownyHook;
import com.djrapitops.plan.command.hooks.VaultHook;
import com.djrapitops.plan.command.hooks.AdvancedAchievementsHook;
@ -169,6 +168,11 @@ public class PlanLite extends JavaPlugin {
return api;
}
/**
*
* @param name
* @param hook
*/
public void addExtraHook(String name, Hook hook) {
try {
this.extraHooks.put(name, hook);