From 99d15d3ece97e67da6eda5e84942a164c5ba08d0 Mon Sep 17 00:00:00 2001 From: Jonathan Williams Date: Thu, 21 Aug 2014 15:55:09 -0500 Subject: [PATCH] Work on Customer support server. --- Plugins/BuildFiles/common.xml | 31 ++ .../core/common/util/UUIDFetcher.java | 103 ++++ .../.externalToolBuilders/asdf.launch | 6 +- .../core/account/CoreClientManager.java | 18 +- .../src/mineplex/core/donation/Donor.java | 22 + .../token/CoinTransactionToken.java | 8 + .../donation/repository/token/DonorToken.java | 1 + .../.externalToolBuilders/StaffBuilder.launch | 17 + Plugins/Mineplex.StaffServer/.project | 10 + Plugins/Mineplex.StaffServer/plugin.yml | 3 + .../src/mineplex/staffServer/StaffServer.java | 10 + .../customerSupport/CustomerSupport.java | 45 +- .../staffServer/password/Password.java | 4 +- .../staffServer/password/PasswordCommand.java | 2 +- .../salespackages/MonthlyUltra.java | 6 + Website/LOC.Core/LOC.Core.csproj | 1 + Website/LOC.Core/Tokens/Client/ClientToken.cs | 3 +- .../Tokens/Client/CoinTransactionToken.cs | 23 + Website/LOC.Core/Tokens/Client/DonorToken.cs | 2 + .../Models/AccountAdministrator.cs | 13 +- .../Models/IAccountAdministrator.cs | 2 +- .../Controllers/PlayerAccountController.cs | 4 +- .../LOC.Website.Web.Publish.xml | 460 +++++++++--------- Website/LOCWebsite.suo | Bin 474624 -> 474624 bytes 24 files changed, 537 insertions(+), 257 deletions(-) create mode 100644 Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UUIDFetcher.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/donation/repository/token/CoinTransactionToken.java create mode 100644 Plugins/Mineplex.StaffServer/.externalToolBuilders/StaffBuilder.launch create mode 100644 Plugins/Mineplex.StaffServer/plugin.yml create mode 100644 Plugins/Mineplex.StaffServer/src/mineplex/staffServer/salespackages/MonthlyUltra.java create mode 100644 Website/LOC.Core/Tokens/Client/CoinTransactionToken.cs diff --git a/Plugins/BuildFiles/common.xml b/Plugins/BuildFiles/common.xml index 5e65d8bae..07ff689c8 100644 --- a/Plugins/BuildFiles/common.xml +++ b/Plugins/BuildFiles/common.xml @@ -73,6 +73,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UUIDFetcher.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UUIDFetcher.java new file mode 100644 index 000000000..001a71d19 --- /dev/null +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UUIDFetcher.java @@ -0,0 +1,103 @@ +package mineplex.core.common.util; + +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; +import org.json.simple.parser.JSONParser; + +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.ByteBuffer; +import java.util.*; + +public class UUIDFetcher +{ + private static UUIDFetcher _instance = new UUIDFetcher(); + + private static final String PROFILE_URL = "https://api.mojang.com/profiles/minecraft"; + + private final JSONParser _jsonParser = new JSONParser(); + + public UUID getPlayerUUID(String name) + { + UUID uuid = null; + List nameList = new ArrayList(); + nameList.add(name); + + try + { + HttpURLConnection connection = createConnection(); + String body = JSONArray.toJSONString(nameList.subList(0, Math.min(100, 1))); + writeBody(connection, body); + JSONArray array = (JSONArray) _jsonParser.parse(new InputStreamReader(connection.getInputStream())); + + for (Object profile : array) + { + JSONObject jsonProfile = (JSONObject) profile; + String id = (String) jsonProfile.get("id"); + uuid = UUIDFetcher.getUUID(id); + } + } + catch (Exception exception) + { + exception.printStackTrace(); + } + + return uuid; + } + + private static void writeBody(HttpURLConnection connection, String body) throws Exception + { + OutputStream stream = connection.getOutputStream(); + stream.write(body.getBytes()); + stream.flush(); + stream.close(); + } + + private static HttpURLConnection createConnection() throws Exception + { + URL url = new URL(PROFILE_URL); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod("POST"); + connection.setRequestProperty("Content-Type", "application/json"); + connection.setUseCaches(false); + connection.setDoInput(true); + connection.setDoOutput(true); + return connection; + } + + private static UUID getUUID(String id) + { + return UUID.fromString(id.substring(0, 8) + "-" + id.substring(8, 12) + "-" + id.substring(12, 16) + "-" + + id.substring(16, 20) + "-" + id.substring(20, 32)); + } + + public static byte[] toBytes(UUID uuid) + { + ByteBuffer byteBuffer = ByteBuffer.wrap(new byte[16]); + byteBuffer.putLong(uuid.getMostSignificantBits()); + byteBuffer.putLong(uuid.getLeastSignificantBits()); + return byteBuffer.array(); + } + + public static UUID fromBytes(byte[] array) + { + if (array.length != 16) + { + throw new IllegalArgumentException("Illegal byte array length: " + array.length); + } + ByteBuffer byteBuffer = ByteBuffer.wrap(array); + long mostSignificant = byteBuffer.getLong(); + long leastSignificant = byteBuffer.getLong(); + return new UUID(mostSignificant, leastSignificant); + } + + public static UUID getUUIDOf(String name) + { + if (_instance == null) + _instance = new UUIDFetcher(); + + return _instance.getPlayerUUID(name); + } +} \ No newline at end of file diff --git a/Plugins/Mineplex.Core/.externalToolBuilders/asdf.launch b/Plugins/Mineplex.Core/.externalToolBuilders/asdf.launch index c531d22bb..e7208b92f 100644 --- a/Plugins/Mineplex.Core/.externalToolBuilders/asdf.launch +++ b/Plugins/Mineplex.Core/.externalToolBuilders/asdf.launch @@ -1,8 +1,8 @@ - - - + + + diff --git a/Plugins/Mineplex.Core/src/mineplex/core/account/CoreClientManager.java b/Plugins/Mineplex.Core/src/mineplex/core/account/CoreClientManager.java index f55c95510..fffa1202c 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/account/CoreClientManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/account/CoreClientManager.java @@ -18,6 +18,7 @@ import mineplex.core.account.repository.token.ClientToken; import mineplex.core.common.Rank; import mineplex.core.common.util.Callback; import mineplex.core.common.util.NautHashMap; +import mineplex.core.common.util.UUIDFetcher; import mineplex.core.common.util.UtilPlayer; import mineplex.core.logger.Logger; import mineplex.core.timing.TimingManager; @@ -37,8 +38,6 @@ import org.bukkit.event.player.PlayerLoginEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.plugin.java.JavaPlugin; -import com.google.common.base.Charsets; - public class CoreClientManager extends MiniPlugin { private JavaPlugin _plugin; @@ -154,13 +153,24 @@ public class CoreClientManager extends MiniPlugin public void loadClientByName(final String playerName, final Runnable runnable) { final CoreClient client = Add(playerName); - final UUID uuid = UUID.nameUUIDFromBytes((playerName).getBytes(Charsets.UTF_8)); + final UUID uuid = UUIDFetcher.getUUIDOf(playerName); Bukkit.getServer().getScheduler().runTaskAsynchronously(GetPlugin(), new Runnable() { public void run() { - LoadClient(client, uuid, "null"); + ClientToken token = null; + Gson gson = new Gson(); + + String response = _repository.getClientByUUID(uuid); + token = gson.fromJson(response, ClientToken.class); + + client.SetAccountId(token.AccountId); + client.SetRank(Rank.valueOf(token.Rank)); + + // JSON sql response + Bukkit.getServer().getPluginManager().callEvent(new ClientWebResponseEvent(response)); + Bukkit.getServer().getScheduler().runTask(GetPlugin(), new Runnable() { public void run() diff --git a/Plugins/Mineplex.Core/src/mineplex/core/donation/Donor.java b/Plugins/Mineplex.Core/src/mineplex/core/donation/Donor.java index 6678de58e..50e9954cc 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/donation/Donor.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/donation/Donor.java @@ -4,7 +4,9 @@ import java.util.ArrayList; import java.util.List; import mineplex.core.common.CurrencyType; +import mineplex.core.donation.repository.token.CoinTransactionToken; import mineplex.core.donation.repository.token.DonorToken; +import mineplex.core.donation.repository.token.TransactionToken; public class Donor { @@ -13,6 +15,8 @@ public class Donor private boolean _donated; private List _salesPackagesOwned; private List _unknownSalesPackagesOwned; + private List _transactions; + private List _coinTransactions; private boolean _update = true; @@ -24,6 +28,9 @@ public class Donor _salesPackagesOwned = token.SalesPackages; _unknownSalesPackagesOwned = token.UnknownSalesPackages; + _transactions = token.Transactions; + _coinTransactions = token.CoinRewards; + if (_salesPackagesOwned == null) { @@ -34,6 +41,11 @@ public class Donor { _unknownSalesPackagesOwned = new ArrayList(); } + + if (_unknownSalesPackagesOwned == null) + { + _transactions = new ArrayList(); + } } public int GetGems() @@ -117,6 +129,11 @@ public class Donor { _unknownSalesPackagesOwned.add(packageName); } + + public List getTransactions() + { + return _transactions; + } public boolean OwnsUltraPackage() { @@ -138,4 +155,9 @@ public class Donor { _coins += amount; } + + public List getCoinTransactions() + { + return _coinTransactions; + } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/donation/repository/token/CoinTransactionToken.java b/Plugins/Mineplex.Core/src/mineplex/core/donation/repository/token/CoinTransactionToken.java new file mode 100644 index 000000000..30a1b3b74 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/donation/repository/token/CoinTransactionToken.java @@ -0,0 +1,8 @@ +package mineplex.core.donation.repository.token; + +public class CoinTransactionToken +{ + public long Date; + public String Source; + public int Amount; +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/donation/repository/token/DonorToken.java b/Plugins/Mineplex.Core/src/mineplex/core/donation/repository/token/DonorToken.java index 8eec45471..918d1f18c 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/donation/repository/token/DonorToken.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/donation/repository/token/DonorToken.java @@ -9,5 +9,6 @@ public class DonorToken public List SalesPackages; public List UnknownSalesPackages; public List Transactions; + public List CoinRewards; public int Coins; } diff --git a/Plugins/Mineplex.StaffServer/.externalToolBuilders/StaffBuilder.launch b/Plugins/Mineplex.StaffServer/.externalToolBuilders/StaffBuilder.launch new file mode 100644 index 000000000..6eb51c35e --- /dev/null +++ b/Plugins/Mineplex.StaffServer/.externalToolBuilders/StaffBuilder.launch @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/Plugins/Mineplex.StaffServer/.project b/Plugins/Mineplex.StaffServer/.project index 89a8d6d8e..055073ad3 100644 --- a/Plugins/Mineplex.StaffServer/.project +++ b/Plugins/Mineplex.StaffServer/.project @@ -10,6 +10,16 @@ + + org.eclipse.ui.externaltools.ExternalToolBuilder + auto,full,incremental, + + + LaunchConfigHandle + <project>/.externalToolBuilders/StaffBuilder.launch + + + org.eclipse.jdt.core.javanature diff --git a/Plugins/Mineplex.StaffServer/plugin.yml b/Plugins/Mineplex.StaffServer/plugin.yml new file mode 100644 index 000000000..24ee14bdd --- /dev/null +++ b/Plugins/Mineplex.StaffServer/plugin.yml @@ -0,0 +1,3 @@ +name: StaffServer +main: mineplex.staffServer.StaffServer +version: 0.1 \ No newline at end of file diff --git a/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/StaffServer.java b/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/StaffServer.java index 699afe207..e5f9677a2 100644 --- a/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/StaffServer.java +++ b/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/StaffServer.java @@ -3,14 +3,19 @@ package mineplex.staffServer; import mineplex.core.account.CoreClientManager; import mineplex.core.chat.Chat; import mineplex.core.command.CommandCenter; +import mineplex.core.creature.Creature; import mineplex.core.donation.DonationManager; import mineplex.core.memory.MemoryFix; import mineplex.core.monitor.LagMeter; +import mineplex.core.npc.NpcManager; import mineplex.core.playerTracker.PlayerTracker; import mineplex.core.portal.Portal; import mineplex.core.preferences.PreferencesManager; +import mineplex.core.recharge.Recharge; import mineplex.core.status.ServerStatusManager; import mineplex.core.updater.FileUpdater; +import mineplex.staffServer.customerSupport.CustomerSupport; +import mineplex.staffServer.password.Password; import org.bukkit.plugin.java.JavaPlugin; @@ -31,9 +36,11 @@ public class StaffServer extends JavaPlugin CommandCenter.Initialize(this); CoreClientManager clientManager = new CoreClientManager(this, webServerAddress); CommandCenter.Instance.setClientManager(clientManager); + Recharge.Initialize(this); DonationManager donationManager = new DonationManager(this, webServerAddress); + new NpcManager(this, new Creature(this)); ServerStatusManager serverStatusManager = new ServerStatusManager(this, new LagMeter(this, clientManager)); new PlayerTracker(this, serverStatusManager.getCurrentServerName(), serverStatusManager.getUs()); PreferencesManager preferenceManager = new PreferencesManager(this, clientManager, donationManager); @@ -43,5 +50,8 @@ public class StaffServer extends JavaPlugin new Chat(this, clientManager, preferenceManager, serverStatusManager.getCurrentServerName()); new MemoryFix(this); new FileUpdater(this, portal); + + new CustomerSupport(this, clientManager, donationManager); + new Password(this); } } diff --git a/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/customerSupport/CustomerSupport.java b/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/customerSupport/CustomerSupport.java index d9d311bc4..c7a45c398 100644 --- a/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/customerSupport/CustomerSupport.java +++ b/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/customerSupport/CustomerSupport.java @@ -1,34 +1,40 @@ package mineplex.staffServer.customerSupport; +import java.text.SimpleDateFormat; import java.util.HashSet; -import java.util.List; import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.plugin.java.JavaPlugin; import mineplex.core.MiniPlugin; import mineplex.core.account.CoreClient; import mineplex.core.account.CoreClientManager; +import mineplex.core.common.util.C; import mineplex.core.common.util.F; import mineplex.core.common.util.NautHashMap; import mineplex.core.donation.DonationManager; import mineplex.core.donation.Donor; +import mineplex.core.donation.repository.token.CoinTransactionToken; +import mineplex.core.donation.repository.token.TransactionToken; public class CustomerSupport extends MiniPlugin { private CoreClientManager _clientManager; private DonationManager _donationManager; - + private NautHashMap> _agentCacheMap = new NautHashMap>(); - + private SimpleDateFormat _date = new SimpleDateFormat("MM/dd/yy HH:mm"); + public CustomerSupport(JavaPlugin plugin, CoreClientManager clientManager, DonationManager donationManager) { super("Customer Support", plugin); - + _clientManager = clientManager; _donationManager = donationManager; } - + @Override public void AddCommands() { @@ -44,7 +50,7 @@ public class CustomerSupport extends MiniPlugin { if (!_agentCacheMap.containsKey(caller)) _agentCacheMap.put(caller, new HashSet()); - + _agentCacheMap.get(caller).add(playerName); } @@ -52,10 +58,29 @@ public class CustomerSupport extends MiniPlugin { CoreClient client = _clientManager.Get(playerName); Donor donor = _donationManager.Get(playerName); - + caller.sendMessage(C.cDGreen + C.Strike + "============================================="); caller.sendMessage(F.main(GetName(), "Name : " + F.elem(playerName))); - caller.sendMessage(F.main(GetName(), "Rank : " + F.elem(client.GetRank().Name))); - - //for (donor.GetUnknownSalesPackagesOwned()) + caller.sendMessage(F.main(GetName(), + "Rank : " + F.elem(client.GetRank().Name.isEmpty() ? "Regular" : client.GetRank().Name))); + + for (CoinTransactionToken transaction : donor.getCoinTransactions()) + { + if (transaction.Source.equalsIgnoreCase("purchase")) + caller.sendMessage("[" + _date.format(transaction.Date) + "] " + C.cYellow + transaction.Amount + " Coins"); + } + + for (TransactionToken transaction : donor.getTransactions()) + { + if (transaction.Coins == 0 && transaction.Gems == 0 && transaction.SalesPackageName.contains("Gem Booster")) + caller.sendMessage("[" + _date.format(transaction.Date) + "] " + C.cGreen + + transaction.SalesPackageName); + } + caller.sendMessage(C.cDGreen + C.Strike + "============================================="); + } + + @EventHandler + public void removeMapping(PlayerQuitEvent event) + { + _agentCacheMap.remove(event.getPlayer()); } } diff --git a/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/password/Password.java b/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/password/Password.java index 0fe95546b..7cd6a7c09 100644 --- a/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/password/Password.java +++ b/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/password/Password.java @@ -28,7 +28,7 @@ public class Password extends MiniPlugin @EventHandler public void promptForPassword(final PlayerJoinEvent event) { - event.getPlayer().sendMessage(F.main(GetName(), "Please enter the server password within 5 seconds.")); + event.getPlayer().sendMessage(F.main(GetName(), "Please enter the server password within 10 seconds.")); GetPlugin().getServer().getScheduler().scheduleSyncDelayedTask(GetPlugin(), new Runnable() { @@ -37,7 +37,7 @@ public class Password extends MiniPlugin if (!_accepted.contains(event.getPlayer())) event.getPlayer().kickPlayer("You don't know the password little twerp."); } - }, 100L); + }, 200L); } public void checkPassword(Player caller, String attempt) diff --git a/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/password/PasswordCommand.java b/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/password/PasswordCommand.java index 29b0f96b8..eedca6380 100644 --- a/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/password/PasswordCommand.java +++ b/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/password/PasswordCommand.java @@ -15,7 +15,7 @@ public class PasswordCommand extends CommandBase @Override public void Execute(Player caller, String[] args) { - if (args.length == 1) + if (args != null && args.length == 1) { Plugin.checkPassword(caller, args[0]); } diff --git a/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/salespackages/MonthlyUltra.java b/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/salespackages/MonthlyUltra.java new file mode 100644 index 000000000..c61569235 --- /dev/null +++ b/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/salespackages/MonthlyUltra.java @@ -0,0 +1,6 @@ +package mineplex.staffServer.salespackages; + +public class MonthlyUltra +{ + +} diff --git a/Website/LOC.Core/LOC.Core.csproj b/Website/LOC.Core/LOC.Core.csproj index 89d688b85..e83cfeeab 100644 --- a/Website/LOC.Core/LOC.Core.csproj +++ b/Website/LOC.Core/LOC.Core.csproj @@ -83,6 +83,7 @@ + diff --git a/Website/LOC.Core/Tokens/Client/ClientToken.cs b/Website/LOC.Core/Tokens/Client/ClientToken.cs index a73a187ee..c06400e72 100644 --- a/Website/LOC.Core/Tokens/Client/ClientToken.cs +++ b/Website/LOC.Core/Tokens/Client/ClientToken.cs @@ -43,6 +43,7 @@ SalesPackages = new List(), UnknownSalesPackages = new List(), Transactions = new List(), + CoinRewards = new List(), CustomBuilds = new List(), Pets = new List(), PetNameTagCount = account.PetNameTagCount @@ -82,7 +83,7 @@ } if (account.AccountTransactions == null) - account.AccountTransactions = new List(); + account.AccountTransactions = new List(); foreach (var transaction in account.AccountTransactions) { diff --git a/Website/LOC.Core/Tokens/Client/CoinTransactionToken.cs b/Website/LOC.Core/Tokens/Client/CoinTransactionToken.cs new file mode 100644 index 000000000..d9e9361f3 --- /dev/null +++ b/Website/LOC.Core/Tokens/Client/CoinTransactionToken.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace LOC.Core.Tokens.Client +{ + public class CoinTransactionToken + { + public long Date { get; set; } + + public int Amount { get; set; } + + public string Source { get; set; } + + public CoinTransactionToken(Model.Sales.CoinTransaction transaction) + { + Amount = transaction.Amount; + Date = transaction.Date; + Source = transaction.Source; + } + } +} diff --git a/Website/LOC.Core/Tokens/Client/DonorToken.cs b/Website/LOC.Core/Tokens/Client/DonorToken.cs index 4e636c181..f45c969fc 100644 --- a/Website/LOC.Core/Tokens/Client/DonorToken.cs +++ b/Website/LOC.Core/Tokens/Client/DonorToken.cs @@ -1,6 +1,7 @@ namespace LOC.Core.Tokens.Client { using System.Collections.Generic; + using LOC.Core.Model.Sales; public class DonorToken { @@ -10,6 +11,7 @@ public List SalesPackages { get; set; } public List UnknownSalesPackages { get; set; } public List Transactions { get; set; } + public List CoinRewards { get; set; } public List CustomBuilds { get; set; } public List Pets { get; set; } public int PetNameTagCount { get; set; } diff --git a/Website/LOC.Website.Common/Models/AccountAdministrator.cs b/Website/LOC.Website.Common/Models/AccountAdministrator.cs index 39faa04ff..34bf7c40f 100644 --- a/Website/LOC.Website.Common/Models/AccountAdministrator.cs +++ b/Website/LOC.Website.Common/Models/AccountAdministrator.cs @@ -687,7 +687,7 @@ repository.CommitChanges(); } - public Account GetAccountByUUID(string uuid) + public ClientToken GetAccountByUUID(string uuid) { using (var repository = _repositoryFactory.CreateRepository()) { @@ -698,7 +698,16 @@ account.LoadNavigationProperties(repository.Context); - return account; + ClientToken clientToken = null; + + clientToken = new ClientToken(account); + + foreach (var trans in repository.Where(x => x.Account.AccountId == account.AccountId).ToList()) + { + clientToken.DonorToken.CoinRewards.Add(new CoinTransactionToken(trans)); + } + + return clientToken; } } } diff --git a/Website/LOC.Website.Common/Models/IAccountAdministrator.cs b/Website/LOC.Website.Common/Models/IAccountAdministrator.cs index 8391389a9..9f1dfccd5 100644 --- a/Website/LOC.Website.Common/Models/IAccountAdministrator.cs +++ b/Website/LOC.Website.Common/Models/IAccountAdministrator.cs @@ -39,6 +39,6 @@ bool CoinReward(GemRewardToken token); - Account GetAccountByUUID(string uuid); + ClientToken GetAccountByUUID(string uuid); } } diff --git a/Website/LOC.Website.Web/Controllers/PlayerAccountController.cs b/Website/LOC.Website.Web/Controllers/PlayerAccountController.cs index d0c85c5aa..6713bef16 100644 --- a/Website/LOC.Website.Web/Controllers/PlayerAccountController.cs +++ b/Website/LOC.Website.Web/Controllers/PlayerAccountController.cs @@ -42,9 +42,7 @@ [HttpPost] public ActionResult GetAccountByUUID(string uuid) { - var account = _accountAdministrator.GetAccountByUUID(uuid); - - var json = JsonConvert.SerializeObject(new ClientToken(account)); + var json = JsonConvert.SerializeObject(_accountAdministrator.GetAccountByUUID(uuid)); return Content(json, "application/json"); } diff --git a/Website/LOC.Website.Web/LOC.Website.Web.Publish.xml b/Website/LOC.Website.Web/LOC.Website.Web.Publish.xml index 9b78888fc..bd2a0d731 100644 --- a/Website/LOC.Website.Web/LOC.Website.Web.Publish.xml +++ b/Website/LOC.Website.Web/LOC.Website.Web.Publish.xml @@ -1,12 +1,12 @@  - + @@ -19,31 +19,27 @@ - - + - - - + - + - @@ -51,18 +47,18 @@ - - + - - + + + @@ -73,24 +69,25 @@ - - + - - + + + + + - @@ -98,7 +95,6 @@ - @@ -107,42 +103,42 @@ - - + - + + - - + - + + - + @@ -153,57 +149,62 @@ - + - + + + + + + - + + - + - + - + + - - - + - + - + @@ -211,63 +212,60 @@ - + - - + + + - + - + - - + - - + + - - + - - + + - + - - + + - - + + - + - - @@ -281,15 +279,17 @@ - + - + + + @@ -303,25 +303,26 @@ + + - + - - + @@ -332,21 +333,21 @@ + - + + + - - - @@ -354,8 +355,6 @@ - - @@ -363,43 +362,44 @@ + - + + - - + - + - + + - - + + + - - @@ -410,127 +410,125 @@ - + - - - - + - - + - + + - + - + - + + - + + - + - - + + - + - + - + - + - + - + + - - + + - + - - + + - + - - - - - + + + + + - + - - @@ -546,47 +544,49 @@ - + + - + + - + - + - + - + - + - + @@ -597,74 +597,70 @@ + - + + - - + - - + - - + + - + - + - - - + - - + - - + + - - + @@ -675,33 +671,32 @@ - + - - - - + - - + - - - + + + + + + @@ -709,91 +704,94 @@ - + + - + + - + + - + - + - - + + - + - + - + + - + - + - + + - - + + - + - - + + - + - - - - - + + + + + - + - - @@ -809,37 +807,39 @@ - + + - + + - + - + - + - + @@ -849,7 +849,7 @@ - + @@ -860,29 +860,29 @@ + - + + - - + - - + @@ -890,44 +890,40 @@ - + - + - - - + - - + - - + + - - + @@ -938,33 +934,32 @@ - + - - - - + - - + - + + + + @@ -972,84 +967,89 @@ - + + - + + - + + - + - + - - + + - + - + - + + - + - + + - - + + - + - - + + - + - - - - - + + + + + - + \ No newline at end of file diff --git a/Website/LOCWebsite.suo b/Website/LOCWebsite.suo index 5a10b5f6672955a1dae35d0c71fcd3ee3204ae64..aff2fcd81f56192e714692b9c44a0a2c1db29751 100644 GIT binary patch delta 13314 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 delta 12815 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