From b058665e93a2419405f5da26a9f31132465e9359 Mon Sep 17 00:00:00 2001 From: Jonathan Williams Date: Thu, 3 Jul 2014 11:18:11 -0700 Subject: [PATCH] Fixed sync db calls for PlayerTracker Fixed name update with new UUID Skeleton work for Friends --- .../repository/MysqlAccountRepository.java | 2 +- .../mineplex/core/friend/FriendManager.java | 19 ++++++++++ .../core/friend/data/FriendRepository.java | 33 ++++++++++++++++++ .../core/friend/data/FriendStatus.java | 8 +++++ .../mineplex/core/friend/ui/FriendPage.java | 6 ++++ .../mineplex/core/friend/ui/FriendShop.java | 6 ++++ .../mineplex/core/friend/ui/InvitesPage.java | 6 ++++ .../core/playerTracker/PlayerTracker.java | 21 ++++++++--- .../Models/AccountAdministrator.cs | 7 ++++ Website/LOCWebsite.suo | Bin 474624 -> 474624 bytes 10 files changed, 103 insertions(+), 5 deletions(-) create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/friend/FriendManager.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/friend/data/FriendRepository.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/friend/data/FriendStatus.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/friend/ui/FriendPage.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/friend/ui/FriendShop.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/friend/ui/InvitesPage.java diff --git a/Plugins/Mineplex.Core/src/mineplex/core/account/repository/MysqlAccountRepository.java b/Plugins/Mineplex.Core/src/mineplex/core/account/repository/MysqlAccountRepository.java index cf1962af4..4721d3a54 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/account/repository/MysqlAccountRepository.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/account/repository/MysqlAccountRepository.java @@ -6,7 +6,7 @@ import mineplex.core.mysql.RepositoryBase; public class MysqlAccountRepository extends RepositoryBase { - private static String CREATE_ACCOUNT_TABLE = "CREATE TABLE IF NOT EXISTS Accounts (id INT NOT NULL AUTO_INCREMENT, name VARCHAR(40), gems INT, rank VARCHAR(40), rankPerm BOOL, rankExpire LONG, lastLogin LONG, totalPlayTime LONG, PRIMARY KEY (id));"; + private static String CREATE_ACCOUNT_TABLE = "CREATE TABLE IF NOT EXISTS Accounts (id INT NOT NULL AUTO_INCREMENT, uuid VARCHAR(100), name VARCHAR(40), gems INT, rank VARCHAR(40), rankPerm BOOL, rankExpire LONG, lastLogin LONG, totalPlayTime LONG, PRIMARY KEY (id), );"; public MysqlAccountRepository(JavaPlugin plugin) { diff --git a/Plugins/Mineplex.Core/src/mineplex/core/friend/FriendManager.java b/Plugins/Mineplex.Core/src/mineplex/core/friend/FriendManager.java new file mode 100644 index 000000000..3d4f82cf2 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/friend/FriendManager.java @@ -0,0 +1,19 @@ +package mineplex.core.friend; + +import org.bukkit.plugin.java.JavaPlugin; + +import mineplex.core.MiniPlugin; +import mineplex.core.friend.data.FriendRepository; + +public class FriendManager extends MiniPlugin +{ + private FriendRepository _repository; + + public FriendManager(JavaPlugin plugin) + { + super("Friends", plugin); + + _repository = new FriendRepository(); + _repository.initialize(); + } +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/friend/data/FriendRepository.java b/Plugins/Mineplex.Core/src/mineplex/core/friend/data/FriendRepository.java new file mode 100644 index 000000000..f7b5f4d82 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/friend/data/FriendRepository.java @@ -0,0 +1,33 @@ +package mineplex.core.friend.data; + +import java.util.ArrayList; +import java.util.List; + +public class FriendRepository +{ + public void initialize() + { + + } + + public boolean addFriend(String name) + { + boolean success = true; + + return success; + } + + public boolean removeFriend(String name) + { + boolean success = true; + + return success; + } + + public List getFriends(String uuid) + { + List friends = new ArrayList(); + + return friends; + } +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/friend/data/FriendStatus.java b/Plugins/Mineplex.Core/src/mineplex/core/friend/data/FriendStatus.java new file mode 100644 index 000000000..e5e600833 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/friend/data/FriendStatus.java @@ -0,0 +1,8 @@ +package mineplex.core.friend.data; + +public class FriendStatus +{ + public String Name; + public String ServerName; + public long LastSeenOnline; +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/friend/ui/FriendPage.java b/Plugins/Mineplex.Core/src/mineplex/core/friend/ui/FriendPage.java new file mode 100644 index 000000000..21d0f5501 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/friend/ui/FriendPage.java @@ -0,0 +1,6 @@ +package mineplex.core.friend.ui; + +public class FriendPage +{ + +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/friend/ui/FriendShop.java b/Plugins/Mineplex.Core/src/mineplex/core/friend/ui/FriendShop.java new file mode 100644 index 000000000..180cfa08c --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/friend/ui/FriendShop.java @@ -0,0 +1,6 @@ +package mineplex.core.friend.ui; + +public class FriendShop +{ + +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/friend/ui/InvitesPage.java b/Plugins/Mineplex.Core/src/mineplex/core/friend/ui/InvitesPage.java new file mode 100644 index 000000000..f9ee9d93b --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/friend/ui/InvitesPage.java @@ -0,0 +1,6 @@ +package mineplex.core.friend.ui; + +public class InvitesPage +{ + +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/playerTracker/PlayerTracker.java b/Plugins/Mineplex.Core/src/mineplex/core/playerTracker/PlayerTracker.java index 615521e89..28fcd7976 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/playerTracker/PlayerTracker.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/playerTracker/PlayerTracker.java @@ -1,5 +1,6 @@ package mineplex.core.playerTracker; +import org.bukkit.Bukkit; import org.bukkit.event.EventHandler; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.plugin.java.JavaPlugin; @@ -20,14 +21,26 @@ public class PlayerTracker extends MiniPlugin } @EventHandler - public void trackPlayer(PlayerJoinEvent event) + public void trackPlayer(final PlayerJoinEvent event) { - _repository.updatePlayerServer(event.getPlayer().getName()); + Bukkit.getServer().getScheduler().runTaskAsynchronously(GetPlugin(), new Runnable() + { + public void run() + { + _repository.updatePlayerServer(event.getPlayer().getName()); + } + }); } @EventHandler - public void untrackPlayer(ClientUnloadEvent event) + public void untrackPlayer(final ClientUnloadEvent event) { - _repository.deleteServerTransfers(event.GetName()); + Bukkit.getServer().getScheduler().runTaskAsynchronously(GetPlugin(), new Runnable() + { + public void run() + { + _repository.deleteServerTransfers(event.GetName()); + } + }); } } diff --git a/Website/LOC.Website.Common/Models/AccountAdministrator.cs b/Website/LOC.Website.Common/Models/AccountAdministrator.cs index 2e7543c43..a9f4d8da5 100644 --- a/Website/LOC.Website.Common/Models/AccountAdministrator.cs +++ b/Website/LOC.Website.Common/Models/AccountAdministrator.cs @@ -88,6 +88,13 @@ edited = true; } + // Update account name if changed + if (!String.Equals(account.Name, loginToken.Name)) + { + account.Name = loginToken.Name; + edited = true; + } + // Expire ranks if ((account.Rank.Name == "ULTRA") && !account.RankPerm && DateTime.Now.CompareTo(account.RankExpire) >= 0) { diff --git a/Website/LOCWebsite.suo b/Website/LOCWebsite.suo index c0ee1bc8b613e7dfe67d444e5e9fc7079f4fe902..4ac012ac5eb8cbe2fe9320ab6826136620b71a6a 100644 GIT binary patch delta 12019 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