From bedfc060e207ea4c0ae31336d8081d3e8e90a5be Mon Sep 17 00:00:00 2001 From: high Date: Mon, 5 Sep 2011 21:52:41 -0400 Subject: [PATCH] Changed Status/UserList to use linq and RestObject instead. --- TShockAPI/Rest/RestManager.cs | 97 ++++++++++++----------------------- TShockAPI/Rest/RestObject.cs | 2 + TShockAPI/Rest/RestVerbs.cs | 2 + 3 files changed, 38 insertions(+), 63 deletions(-) diff --git a/TShockAPI/Rest/RestManager.cs b/TShockAPI/Rest/RestManager.cs index f0d9d46a..b7f2eef7 100644 --- a/TShockAPI/Rest/RestManager.cs +++ b/TShockAPI/Rest/RestManager.cs @@ -6,7 +6,8 @@ using HttpServer; using Rests; using Terraria; -namespace TShockAPI { +namespace TShockAPI +{ public class RestManager { @@ -18,19 +19,19 @@ namespace TShockAPI { public void RegisterRestfulCommands() { - Rest.Register(new RestCommand("/status", Status) {RequiesToken = false}); + Rest.Register(new RestCommand("/status", Status) { RequiesToken = false }); Rest.Register(new RestCommand("/tokentest", TokenTest) { RequiesToken = true }); - Rest.Register(new RestCommand("/users/read/{user}/info", UserInfo) {RequiesToken = true}); - Rest.Register(new RestCommand("/users/destroy/{user}", UserDestroy) {RequiesToken = true}); - Rest.Register(new RestCommand("/users/update/{user}", UserUpdate) {RequiesToken = true}); + Rest.Register(new RestCommand("/users/read/{user}/info", UserInfo) { RequiesToken = true }); + Rest.Register(new RestCommand("/users/destroy/{user}", UserDestroy) { RequiesToken = true }); + Rest.Register(new RestCommand("/users/update/{user}", UserUpdate) { RequiesToken = true }); Rest.Register(new RestCommand("/bans/create", BanCreate) { RequiesToken = true }); Rest.Register(new RestCommand("/bans/read/{user}/info", BanInfo) { RequiesToken = true }); Rest.Register(new RestCommand("/bans/destroy/{user}", BanDestroy) { RequiesToken = true }); - - Rest.Register(new RestCommand("/lists/players", UserList) {RequiesToken = true}); + + Rest.Register(new RestCommand("/lists/players", UserList) { RequiesToken = true }); Rest.Register(new RestCommand("/world/read", WorldRead) { RequiesToken = true }); Rest.Register(new RestCommand("/world/meteor", WorldMeteor) { RequiesToken = true }); @@ -47,63 +48,33 @@ namespace TShockAPI { object Status(RestVerbs verbs, IParameterCollection parameters) { - var returnBlock = new Dictionary(); - if (TShock.Config.EnableTokenEndpointAuthentication) - { - returnBlock.Add("status", "403"); - returnBlock.Add("error", "Server settings require a token for this API call."); - return returnBlock; - } - string currentPlayers = ""; - int playerCount = 0; - for (int i = 0; i < Main.player.Length; i++) - { - if (Main.player[i].active) - { - if (i == 0) - { - currentPlayers += Main.player[i].name; - } - else - { - currentPlayers += ", " + Main.player[i].name; - } - playerCount++; - } - } - returnBlock.Add("status", "200"); - returnBlock.Add("name", TShock.Config.ServerNickname); - returnBlock.Add("port", Convert.ToString(TShock.Config.ServerPort)); - returnBlock.Add("playercount", Convert.ToString(playerCount)); - returnBlock.Add("players", currentPlayers); - return returnBlock; + if (TShock.Config.EnableTokenEndpointAuthentication) + return new RestObject("403") { Error = "Server settings require a token for this API call." }; + + var activeplayers = Main.player.Where(p => p != null && p.active).ToList(); + string currentPlayers = string.Join(", ", activeplayers.Select(p => p.name)); + + var ret = new RestObject("200"); + ret["name"] = TShock.Config.ServerNickname; + ret["port"] = Convert.ToString(TShock.Config.ServerPort); + ret["playercount"] = Convert.ToString(activeplayers.Count()); + ret["players"] = currentPlayers; + + return ret; } #endregion #region RestUserMethods - + object UserList(RestVerbs verbs, IParameterCollection parameters) { - string players = ""; - for (int i = 0; i < Main.player.Length; i++ ) - { - if (Main.player[i].active) - { - if (i == 0) - { - players += Main.player[i].name; - } else - { - players += ", " + Main.player[i].name; - } - } - } - var returnBlock = new Dictionary(); - returnBlock.Add("status", "200"); - returnBlock.Add("players", players); - return returnBlock; + var activeplayers = Main.player.Where(p => p != null && p.active).ToList(); + string currentPlayers = string.Join(", ", activeplayers.Select(p => p.name)); + var ret = new RestObject("200"); + ret["players"] = currentPlayers; + return ret; } object UserUpdate(RestVerbs verbs, IParameterCollection parameters) @@ -154,7 +125,8 @@ namespace TShockAPI { try { TShock.Users.RemoveUser(user); - } catch (Exception) + } + catch (Exception) { returnBlock.Add("status", "400"); returnBlock.Add("error", "The specified user was unable to be removed."); @@ -170,8 +142,7 @@ namespace TShockAPI { var user = TShock.Users.GetUserByName(verbs["user"]); if (user == null) { - return new Dictionary - {{"status", "400"}, {"error", "The specified user account does not exist."}}; + return new Dictionary { { "status", "400" }, { "error", "The specified user account does not exist." } }; } var returnBlock = new Dictionary(); @@ -226,7 +197,7 @@ namespace TShockAPI { } returnBlock.Add("status", "200"); returnBlock.Add("response", "Ban created successfully."); - return returnBlock; + return returnBlock; } object BanDestroy(RestVerbs verbs, IParameterCollection parameters) @@ -253,7 +224,7 @@ namespace TShockAPI { { return new Dictionary { { "status", "400" }, { "error", "The specified ban does not exist." } }; } - + try { TShock.Bans.RemoveBan(ban.IP); @@ -354,8 +325,8 @@ namespace TShockAPI { public void RegisterExamples() { - Rest.Register(new RestCommand("/HelloWorld/name/{username}", UserTest) {RequiesToken = false}); - Rest.Register(new RestCommand("/wizard/{username}", Wizard) {RequiesToken = false}); + Rest.Register(new RestCommand("/HelloWorld/name/{username}", UserTest) { RequiesToken = false }); + Rest.Register(new RestCommand("/wizard/{username}", Wizard) { RequiesToken = false }); } //The Wizard example, for demonstrating the response convention: diff --git a/TShockAPI/Rest/RestObject.cs b/TShockAPI/Rest/RestObject.cs index b7db5d2c..fcc21e6a 100644 --- a/TShockAPI/Rest/RestObject.cs +++ b/TShockAPI/Rest/RestObject.cs @@ -1,7 +1,9 @@ +using System; using System.Collections.Generic; namespace Rests { + [Serializable] public class RestObject : Dictionary { public string Status diff --git a/TShockAPI/Rest/RestVerbs.cs b/TShockAPI/Rest/RestVerbs.cs index b75c59c6..bbad41d3 100644 --- a/TShockAPI/Rest/RestVerbs.cs +++ b/TShockAPI/Rest/RestVerbs.cs @@ -1,7 +1,9 @@ +using System; using System.Collections.Generic; namespace Rests { + [Serializable] public class RestVerbs : Dictionary { ///