Merge branch 'general-devel' of github.com:TShock/TShock

Conflicts:
	TShockAPI/PacketBufferer.cs
	TShockAPI/Properties/AssemblyInfo.cs
This commit is contained in:
high 2011-08-09 18:42:31 -04:00
commit ceefbfdb03
21 changed files with 537 additions and 335 deletions

View file

@ -166,7 +166,7 @@ namespace TShockAPI
ChatCommands.Add(new Command(PasswordUser, "password") { DoLog = false }); ChatCommands.Add(new Command(PasswordUser, "password") { DoLog = false });
ChatCommands.Add(new Command(RegisterUser, "register") { DoLog = false }); ChatCommands.Add(new Command(RegisterUser, "register") { DoLog = false });
ChatCommands.Add(new Command("root-only", ManageUsers, "user") { DoLog = false }); ChatCommands.Add(new Command("root-only", ManageUsers, "user") { DoLog = false });
ChatCommands.Add(new Command("root-only", GrabUserIP, "ip")); ChatCommands.Add(new Command("root-only", GrabUserUserInfo, "userinfo", "ui"));
ChatCommands.Add(new Command("root-only", AuthVerify, "auth-verify")); ChatCommands.Add(new Command("root-only", AuthVerify, "auth-verify"));
ChatCommands.Add(new Command(AttemptLogin, "login") { DoLog = false }); ChatCommands.Add(new Command(AttemptLogin, "login") { DoLog = false });
ChatCommands.Add(new Command("cfg", Broadcast, "broadcast", "bc")); ChatCommands.Add(new Command("cfg", Broadcast, "broadcast", "bc"));
@ -316,28 +316,31 @@ namespace TShockAPI
try try
{ {
string encrPass = Tools.HashPassword(args.Parameters[1]); string encrPass = Tools.HashPassword(args.Parameters[1]);
string[] exr = TShock.Users.FetchHashedPasswordAndGroup(args.Parameters[0]); var user = TShock.Users.GetUserByName(args.Parameters[0]);
if (exr[0].ToUpper() == encrPass.ToUpper()) if (user == null)
{ {
args.Player.Group = Tools.GetGroup(exr[1]); args.Player.SendMessage("User by that name does not exist");
}
else if (user.Password.ToUpper() == encrPass.ToUpper())
{
args.Player.Group = Tools.GetGroup(user.Group);
args.Player.UserAccountName = args.Parameters[0]; args.Player.UserAccountName = args.Parameters[0];
args.Player.UserID = TShock.Users.GetUserID(args.Player.UserAccountName); args.Player.UserID = TShock.Users.GetUserID(args.Player.UserAccountName);
args.Player.IsLoggedIn = true; args.Player.IsLoggedIn = true;
args.Player.SendMessage("Authenticated as " + args.Parameters[0] + " successfully.", Color.LimeGreen); args.Player.SendMessage("Authenticated as " + args.Parameters[0] + " successfully.", Color.LimeGreen);
Log.ConsoleInfo(args.Player.Name + " authenticated successfully as user: " + args.Parameters[0]); Log.ConsoleInfo(args.Player.Name + " authenticated successfully as user: " + args.Parameters[0]);
return;
} }
else else
{ {
args.Player.SendMessage("Incorrect password", Color.LimeGreen);
Log.Warn(args.Player.IP + " failed to authenticate as user: " + args.Parameters[0]); Log.Warn(args.Player.IP + " failed to authenticate as user: " + args.Parameters[0]);
args.Player.LoginAttempts++; args.Player.LoginAttempts++;
return;
} }
} }
catch (Exception) catch (Exception ex)
{ {
args.Player.SendMessage("There was an error processing your request. Maybe your account doesn't exist?", Color.Red); args.Player.SendMessage("There was an error processing your request.", Color.Red);
return; Log.Error(ex.ToString());
} }
} }
@ -351,8 +354,7 @@ namespace TShockAPI
{ {
var user = TShock.Users.GetUserByName(args.Player.UserAccountName); var user = TShock.Users.GetUserByName(args.Player.UserAccountName);
string encrPass = Tools.HashPassword(args.Parameters[0]); string encrPass = Tools.HashPassword(args.Parameters[0]);
string[] exr = TShock.Users.FetchHashedPasswordAndGroup(args.Player.UserAccountName); if (user.Password.ToUpper() == encrPass.ToUpper())
if (exr[0].ToUpper() == encrPass.ToUpper())
{ {
args.Player.SendMessage("You changed your password!", Color.Green); args.Player.SendMessage("You changed your password!", Color.Green);
TShock.Users.SetUserPassword(user, args.Parameters[1]); // SetUserPassword will hash it for you. TShock.Users.SetUserPassword(user, args.Parameters[1]); // SetUserPassword will hash it for you.
@ -383,7 +385,7 @@ namespace TShockAPI
if (args.Parameters.Count == 2) if (args.Parameters.Count == 2)
{ {
var user = new User(); var user = new User();
user.Name = args.Parameters[0].ToLower(); user.Name = args.Parameters[0];
user.Password = args.Parameters[1]; user.Password = args.Parameters[1];
user.Group = TShock.Config.DefaultRegistrationGroupName; // FIXME -- we should get this from the DB. user.Group = TShock.Config.DefaultRegistrationGroupName; // FIXME -- we should get this from the DB.
@ -439,7 +441,7 @@ namespace TShockAPI
{ {
if (namepass.Length == 2) if (namepass.Length == 2)
{ {
user.Name = namepass[0].ToLower(); user.Name = namepass[0];
user.Password = namepass[1]; user.Password = namepass[1];
user.Group = args.Parameters[2]; user.Group = args.Parameters[2];
} }
@ -577,11 +579,11 @@ namespace TShockAPI
#region Player Management Commands #region Player Management Commands
private static void GrabUserIP(CommandArgs args) private static void GrabUserUserInfo(CommandArgs args)
{ {
if (args.Parameters.Count < 1) if (args.Parameters.Count < 1)
{ {
args.Player.SendMessage("Invalid syntax! Proper syntax: /ip <player>", Color.Red); args.Player.SendMessage("Invalid syntax! Proper syntax: /userinfo <player>", Color.Red);
return; return;
} }
@ -593,7 +595,7 @@ namespace TShockAPI
} }
try try
{ {
args.Player.SendMessage(players[0].IP, Color.Green); args.Player.SendMessage("IP Address: " + players[0].IP + " Logged In As: " + players[0].UserAccountName, Color.Green);
} }
catch (Exception) catch (Exception)
{ {
@ -797,9 +799,10 @@ namespace TShockAPI
{ {
if (args.Parameters.Count == 1) if (args.Parameters.Count == 1)
{ {
TextWriter tw = new StreamWriter(FileTools.WhitelistPath, true); using (var tw = new StreamWriter(FileTools.WhitelistPath, true))
{
tw.WriteLine(args.Parameters[0]); tw.WriteLine(args.Parameters[0]);
tw.Close(); }
args.Player.SendMessage("Added " + args.Parameters[0] + " to the whitelist."); args.Player.SendMessage("Added " + args.Parameters[0] + " to the whitelist.");
} }
} }
@ -862,31 +865,38 @@ namespace TShockAPI
ThreadPool.QueueUserWorkItem(UpdateManager.CheckUpdate); ThreadPool.QueueUserWorkItem(UpdateManager.CheckUpdate);
} }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope")]
private static void UpdateNow(CommandArgs args) private static void UpdateNow(CommandArgs args)
{ {
Process TServer = Process.GetCurrentProcess(); Process TServer = Process.GetCurrentProcess();
StreamWriter sw = new StreamWriter("pid"); using (var sw = new StreamWriter("pid"))
{
sw.Write(TServer.Id); sw.Write(TServer.Id);
sw.Close(); }
sw = new StreamWriter("pn"); using (var sw = new StreamWriter("pn"))
{
sw.Write(TServer.ProcessName + " " + Environment.CommandLine); sw.Write(TServer.ProcessName + " " + Environment.CommandLine);
sw.Close(); }
WebClient client = new WebClient(); using (var client = new WebClient())
{
client.Headers.Add("user-agent", "TShock"); client.Headers.Add("user-agent", "TShock");
byte[] updatefile = client.DownloadData("http://tsupdate.shankshock.com/UpdateTShock.exe"); byte[] updatefile = client.DownloadData("http://tsupdate.shankshock.com/UpdateTShock.exe");
BinaryWriter bw = new BinaryWriter(new FileStream("UpdateTShock.exe", FileMode.Create)); using (var bw = new BinaryWriter(new FileStream("UpdateTShock.exe", FileMode.Create)))
{
bw.Write(updatefile); bw.Write(updatefile);
bw.Close(); }
}
Process.Start(new ProcessStartInfo("UpdateTShock.exe")); Process.Start(new ProcessStartInfo("UpdateTShock.exe"));
Tools.ForceKickAll("Server shutting down for update!"); Tools.ForceKickAll("Server shutting down for update!");
WorldGen.saveWorld(); WorldGen.saveWorld();
Netplay.disconnect = true; Netplay.disconnect = true;
} }
#endregion Server Maintenence Commands #endregion Server Maintenence Commands
@ -1286,7 +1296,7 @@ namespace TShockAPI
//Add up to pagelimit names to a list //Add up to pagelimit names to a list
var nameslist = new List<string>(); var nameslist = new List<string>();
for (int i = 0; i < pagelimit && i + (page * pagelimit) < warps.Count; i++) for (int i = (page * pagelimit); (i < ((page * pagelimit) + pagelimit)) && i < warps.Count; i++)
{ {
nameslist.Add(warps[i].WarpName); nameslist.Add(warps[i].WarpName);
} }
@ -1300,7 +1310,7 @@ namespace TShockAPI
if (page < pagecount) if (page < pagecount)
{ {
args.Player.SendMessage(string.Format("Type /warp list {0} for more warps.", (page + 1)), Color.Yellow); args.Player.SendMessage(string.Format("Type /warp list {0} for more warps.", (page + 2)), Color.Yellow);
} }
} }
else else
@ -1330,10 +1340,10 @@ namespace TShockAPI
{ {
String groupname = args.Parameters[0]; String groupname = args.Parameters[0];
args.Parameters.RemoveAt(0); args.Parameters.RemoveAt(0);
String permissions = String.Join(",", args.Parameters ); String permissions = String.Join(",", args.Parameters);
String response = TShock.Groups.AddGroup(groupname, permissions); String response = TShock.Groups.AddGroup(groupname, permissions);
if( response.Length > 0 ) if (response.Length > 0)
args.Player.SendMessage(response, Color.Green); args.Player.SendMessage(response, Color.Green);
} }
else else
@ -1495,7 +1505,8 @@ namespace TShockAPI
private static void Reload(CommandArgs args) private static void Reload(CommandArgs args)
{ {
FileTools.SetupConfig(); FileTools.SetupConfig();
args.Player.SendMessage("Configuration reload complete. Some changes may require server restart."); TShock.Groups.LoadPermisions();
args.Player.SendMessage("Configuration & Permissions reload complete. Some changes may require server restart.");
} }
private static void ServerPassword(CommandArgs args) private static void ServerPassword(CommandArgs args)
@ -1673,25 +1684,25 @@ namespace TShockAPI
{ {
if (args.Parameters[1] == "1") if (args.Parameters[1] == "1")
{ {
args.Player.TempArea.X = args.Player.TileX; if (!args.Player.AwaitingTemp2)
args.Player.TempArea.Y = args.Player.TileY; {
args.Player.SendMessage("Set Temp Point 1", Color.Yellow); args.Player.SendMessage("Hit a block to Set Point 1", Color.Yellow);
args.Player.AwaitingTemp1 = true;
}
else
args.Player.SendMessage("Awaiting you to Set Point 2", Color.Yellow);
} }
else if (args.Parameters[1] == "2") else if (args.Parameters[1] == "2")
{ {
if (args.Player.TempArea.X != 0) if (args.Player.TempArea.X != 0)
{ {
if (args.Player.TileX > args.Player.TempArea.X && args.Player.TileY > args.Player.TempArea.Y) if (!args.Player.AwaitingTemp1)
{ {
args.Player.TempArea.Width = args.Player.TileX - args.Player.TempArea.X; args.Player.SendMessage("Hit a block to Set Point 2", Color.Yellow);
args.Player.TempArea.Height = (args.Player.TileY + 3) - args.Player.TempArea.Y; args.Player.AwaitingTemp2 = true;
args.Player.SendMessage("Set Temp Point 2", Color.Yellow);
} }
else else
{ args.Player.SendMessage("Awaiting you to Set Point 1", Color.Yellow);
args.Player.SendMessage("Point 2 must be below and right of Point 1", Color.Yellow);
args.Player.SendMessage("Use /region clear to start again", Color.Yellow);
}
} }
else else
{ {
@ -1775,6 +1786,8 @@ namespace TShockAPI
{ {
args.Player.TempArea = Rectangle.Empty; args.Player.TempArea = Rectangle.Empty;
args.Player.SendMessage("Cleared temp area", Color.Yellow); args.Player.SendMessage("Cleared temp area", Color.Yellow);
args.Player.AwaitingTemp1 = false;
args.Player.AwaitingTemp2 = false;
break; break;
} }
case "allow": case "allow":
@ -1856,7 +1869,7 @@ namespace TShockAPI
//Add up to pagelimit names to a list //Add up to pagelimit names to a list
var nameslist = new List<string>(); var nameslist = new List<string>();
for (int i = 0; i < pagelimit && i + (page * pagelimit) < regions.Count; i++) for (int i = (page * pagelimit); (i < ((page * pagelimit) + pagelimit)) && i < regions.Count; i++)
{ {
nameslist.Add(regions[i].Name); nameslist.Add(regions[i].Name);
} }
@ -1870,7 +1883,7 @@ namespace TShockAPI
if (page < pagecount) if (page < pagecount)
{ {
args.Player.SendMessage(string.Format("Type /region list {0} for more regions.", (page + 1)), Color.Yellow); args.Player.SendMessage(string.Format("Type /region list {0} for more regions.", (page + 2)), Color.Yellow);
} }
break; break;
@ -2231,7 +2244,7 @@ namespace TShockAPI
args.Parameters.RemoveAt(0); args.Parameters.RemoveAt(0);
string plStr = args.Parameters[0]; string plStr = args.Parameters[0];
args.Parameters.RemoveAt(0); args.Parameters.RemoveAt(0);
if( args.Parameters.Count > 0 ) if (args.Parameters.Count > 0)
int.TryParse(args.Parameters[args.Parameters.Count - 1], out itemAmount); int.TryParse(args.Parameters[args.Parameters.Count - 1], out itemAmount);

View file

@ -166,7 +166,7 @@ namespace TShockAPI.DB
try try
{ {
using (var reader = database.QueryReader("SELECT * FROM Grouplist")) using (var reader = database.QueryReader("SELECT * FROM GroupList"))
{ {
while (reader.Read()) while (reader.Read())
{ {

View file

@ -16,6 +16,7 @@ namespace TShockAPI.DB
string UpdateValue(string table, List<SqlValue> values, List<SqlValue> wheres); string UpdateValue(string table, List<SqlValue> values, List<SqlValue> wheres);
string InsertValues(string table, List<SqlValue> values); string InsertValues(string table, List<SqlValue> values);
string ReadColumn(string table, List<SqlValue> wheres); string ReadColumn(string table, List<SqlValue> wheres);
string DeleteRow(string table, List<SqlValue> wheres);
} }
public class SqliteQueryCreator : IQueryBuilder public class SqliteQueryCreator : IQueryBuilder
@ -51,6 +52,22 @@ namespace TShockAPI.DB
* Twitchy - Oh. I get it! * Twitchy - Oh. I get it!
*/ */
} }
public string DeleteRow(string table, List<SqlValue> wheres)
{
var sbwheres = new StringBuilder();
int count = 0;
foreach (SqlValue where in wheres)
{
sbwheres.Append(where.Name + "=" + where.Value.ToString());
if (count != wheres.Count - 1)
sbwheres.Append(" AND ");
count++;
}
if (wheres.Count > 0)
return "DELETE FROM '{0}' WHERE {1} ".SFormat(table, sbwheres.ToString());
else
return "DELETE FROM '{0}'".SFormat(table, sbwheres.ToString());
}
public string UpdateValue(string table, List<SqlValue> values, List<SqlValue> wheres) public string UpdateValue(string table, List<SqlValue> values, List<SqlValue> wheres)
{ {
var sbvalues = new StringBuilder(); var sbvalues = new StringBuilder();
@ -68,7 +85,7 @@ namespace TShockAPI.DB
{ {
sbwheres.Append(where.Name + "=" + where.Value.ToString()); sbwheres.Append(where.Name + "=" + where.Value.ToString());
if (count != wheres.Count - 1) if (count != wheres.Count - 1)
sbvalues.Append(" AND "); sbwheres.Append(" AND ");
count++; count++;
} }
@ -99,7 +116,6 @@ namespace TShockAPI.DB
sbvalues.Append(", "); sbvalues.Append(", ");
count++; count++;
} }
return "INSERT INTO '{0}' ({1}) VALUES ({2})".SFormat(table, sbnames.ToString(), sbvalues.ToString()); return "INSERT INTO '{0}' ({1}) VALUES ({2})".SFormat(table, sbnames.ToString(), sbvalues.ToString());
} }
public string ReadColumn(string table, List<SqlValue> wheres) public string ReadColumn(string table, List<SqlValue> wheres)
@ -165,6 +181,22 @@ namespace TShockAPI.DB
var drop = "DROP TABLE {0}_{1}".SFormat(rstr, from.Name); var drop = "DROP TABLE {0}_{1}".SFormat(rstr, from.Name);
return "{0}; {1}; {2}; {3};".SFormat(alter, create, insert, drop); return "{0}; {1}; {2}; {3};".SFormat(alter, create, insert, drop);
} }
public string DeleteRow(string table, List<SqlValue> wheres)
{
var sbwheres = new StringBuilder();
int count = 0;
foreach (SqlValue where in wheres)
{
sbwheres.Append(where.Name + "=" + where.Value.ToString());
if (count != wheres.Count - 1)
sbwheres.Append(" AND ");
count++;
}
if (wheres.Count > 0)
return "DELETE FROM {0} WHERE {1} ".SFormat(table, sbwheres.ToString());
else
return "DELETE FROM {0}".SFormat(table, sbwheres.ToString());
}
public string UpdateValue(string table, List<SqlValue> values, List<SqlValue> wheres) public string UpdateValue(string table, List<SqlValue> values, List<SqlValue> wheres)
{ {
var sbvalues = new StringBuilder(); var sbvalues = new StringBuilder();
@ -182,7 +214,7 @@ namespace TShockAPI.DB
{ {
sbwheres.Append(where.Name + "=" + where.Value.ToString()); sbwheres.Append(where.Name + "=" + where.Value.ToString());
if (count != wheres.Count - 1) if (count != wheres.Count - 1)
sbvalues.Append(" AND "); sbwheres.Append(" AND ");
count++; count++;
} }

View file

@ -20,6 +20,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Data; using System.Data;
using System.IO; using System.IO;
using System.Linq;
using System.Xml; using System.Xml;
using Microsoft.Xna.Framework; using Microsoft.Xna.Framework;
using MySql.Data.MySqlClient; using MySql.Data.MySqlClient;
@ -54,6 +55,7 @@ namespace TShockAPI.DB
} }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope")]
public void ImportOld() public void ImportOld()
{ {
String file = Path.Combine(TShock.SavePath, "regions.xml"); String file = Path.Combine(TShock.SavePath, "regions.xml");
@ -62,9 +64,8 @@ namespace TShockAPI.DB
Region region; Region region;
Rectangle rect; Rectangle rect;
using (var sr = new StreamReader(file))
{ using (var reader = XmlReader.Create(new StreamReader(file), new XmlReaderSettings { CloseInput = true }))
using (var reader = XmlReader.Create(sr))
{ {
// Parse the file and display each of the nodes. // Parse the file and display each of the nodes.
while (reader.Read()) while (reader.Read())
@ -120,8 +121,6 @@ namespace TShockAPI.DB
} }
region.Area = rect; region.Area = rect;
using (var com = database.CreateCommand())
{
string query = (TShock.Config.StorageType.ToLower() == "sqlite") ? string query = (TShock.Config.StorageType.ToLower() == "sqlite") ?
"INSERT OR IGNORE INTO Regions VALUES (@0, @1, @2, @3, @4, @5, @6, @7);" : "INSERT OR IGNORE INTO Regions VALUES (@0, @1, @2, @3, @4, @5, @6, @7);" :
"INSERT IGNORE INTO Regions SET X1=@0, Y1=@1, height=@2, width=@3, RegionName=@4, WorldID=@5, UserIds=@6, Protected=@7;"; "INSERT IGNORE INTO Regions SET X1=@0, Y1=@1, height=@2, width=@3, RegionName=@4, WorldID=@5, UserIds=@6, Protected=@7;";
@ -129,10 +128,10 @@ namespace TShockAPI.DB
//Todo: What should this be? We don't really have a way to go from ips to userids //Todo: What should this be? We don't really have a way to go from ips to userids
/*string.Join(",", region.AllowedIDs)*/ /*string.Join(",", region.AllowedIDs)*/
} }
} }
}
}
String path = Path.Combine(TShock.SavePath, "old_configs"); String path = Path.Combine(TShock.SavePath, "old_configs");
String file2 = Path.Combine(path, "regions.xml"); String file2 = Path.Combine(path, "regions.xml");
if (!Directory.Exists(path)) if (!Directory.Exists(path))
@ -171,31 +170,30 @@ namespace TShockAPI.DB
int height = reader.Get<int>("height"); int height = reader.Get<int>("height");
int width = reader.Get<int>("width"); int width = reader.Get<int>("width");
int Protected = reader.Get<int>("Protected"); int Protected = reader.Get<int>("Protected");
string MergedIDs = reader.Get<string>("UserIds"); string mergedids = reader.Get<string>("UserIds");
string name = reader.Get<string>("RegionName"); string name = reader.Get<string>("RegionName");
string[] SplitIDs = MergedIDs.Split(','); string[] splitids = mergedids.Split(new [] { ',' }, StringSplitOptions.RemoveEmptyEntries);
Region r = new Region(new Rectangle(X1, Y1, width, height), name, Protected != 0, Main.worldID.ToString()); Region r = new Region(new Rectangle(X1, Y1, width, height), name, Protected != 0, Main.worldID.ToString());
try try
{ {
for (int i = 0; i < SplitIDs.Length; i++) for (int i = 0; i < splitids.Length; i++)
{ {
int id; int id;
if (Int32.TryParse(SplitIDs[i], out id)) // if unparsable, it's not an int, so silently skip if (Int32.TryParse(splitids[i], out id)) // if unparsable, it's not an int, so silently skip
r.AllowedIDs.Add(id); r.AllowedIDs.Add(id);
else if (SplitIDs[i] == "") // Split gotcha, can return an empty string with certain conditions else
// but we only want to let the user know if it's really a nonparsable integer. Log.Warn("One of your UserIDs is not a usable integer: " + splitids[i]);
Log.Warn("One of your UserIDs is not a usable integer: " + SplitIDs[i]);
} }
} }
catch (Exception e) catch (Exception e)
{ {
Log.Error("Your database contains invalid UserIDs (they should be ints)."); Log.Error("Your database contains invalid UserIDs (they should be ints).");
Log.Error("A lot of things will fail because of this. You must manually delete and re-create the allowed field."); Log.Error("A lot of things will fail because of this. You must manually delete and re-create the allowed field.");
Log.Error(e.Message); Log.Error(e.ToString());
Log.Error(e.StackTrace); Log.Error(e.StackTrace);
} }
@ -346,29 +344,7 @@ namespace TShockAPI.DB
public static List<string> ListIDs(string MergedIDs) public static List<string> ListIDs(string MergedIDs)
{ {
List<string> SplitIDs = new List<string>(); return MergedIDs.Split(new []{','}, StringSplitOptions.RemoveEmptyEntries).ToList();
/*var sb = new StringBuilder();
for (int i = 0; i < MergedIDs.Length; i++)
{
char c = MergedIDs[i];
if (c != ',')
{
sb.Append(c);
}
else if (sb.Length > 0)
{
SplitIDs.Add(sb.ToString());
sb.Clear();
}
}*/
String[] s = MergedIDs.Split(',');
for (int i = 0; i < s.Length; i++)
{
if (!s[i].Equals(""))
SplitIDs.Add(s[i]);
}
return SplitIDs;
} }
public bool AddNewUser(string regionName, String userName) public bool AddNewUser(string regionName, String userName)
@ -382,7 +358,7 @@ namespace TShockAPI.DB
MergedIDs = reader.Get<string>("UserIds"); MergedIDs = reader.Get<string>("UserIds");
} }
if (MergedIDs == string.Empty) if (string.IsNullOrEmpty(MergedIDs))
MergedIDs = Convert.ToString(TShock.Users.GetUserID(userName)); MergedIDs = Convert.ToString(TShock.Users.GetUserID(userName));
else else
MergedIDs = MergedIDs + "," + Convert.ToString(TShock.Users.GetUserID(userName)); MergedIDs = MergedIDs + "," + Convert.ToString(TShock.Users.GetUserID(userName));

View file

@ -76,5 +76,10 @@ namespace TShockAPI.DB
return ret; return ret;
} }
public void DeleteRow(string table, List<SqlValue> wheres)
{
database.Query(creator.DeleteRow(table, wheres));
}
} }
} }

View file

@ -35,9 +35,9 @@ namespace TShockAPI.DB
var table = new SqlTable("Users", var table = new SqlTable("Users",
new SqlColumn("ID", MySqlDbType.Int32) { Primary = true, AutoIncrement = true }, new SqlColumn("ID", MySqlDbType.Int32) { Primary = true, AutoIncrement = true },
new SqlColumn("Username", MySqlDbType.VarChar, 32) { Unique = true }, new SqlColumn("Username", MySqlDbType.VarChar, 32) { Unique = true },
new SqlColumn("Password", MySqlDbType.VarChar, 64), new SqlColumn("Password", MySqlDbType.VarChar, 128),
new SqlColumn("Usergroup", MySqlDbType.Text), new SqlColumn("Usergroup", MySqlDbType.Text),
new SqlColumn("IP", MySqlDbType.VarChar, 32) new SqlColumn("IP", MySqlDbType.VarChar, 16)
); );
var creator = new SqlTableCreator(db, db.GetSqlType() == SqlType.Sqlite ? (IQueryBuilder)new SqliteQueryCreator() : new MysqlQueryCreator()); var creator = new SqlTableCreator(db, db.GetSqlType() == SqlType.Sqlite ? (IQueryBuilder)new SqliteQueryCreator() : new MysqlQueryCreator());
creator.EnsureExists(table); creator.EnsureExists(table);
@ -178,34 +178,6 @@ namespace TShockAPI.DB
} }
} }
/// <summary>
/// Fetches the hashed password and group for a given username
/// </summary>
/// <param name="username">string username</param>
/// <returns>string[] {password, group}</returns>
public string[] FetchHashedPasswordAndGroup(string username)
{
string[] returndata = new string[2];
try
{
using (var reader = database.QueryReader("SELECT * FROM Users WHERE Username=@0", username))
{
if (reader.Read())
{
returndata[0] = reader.Get<string>("Password");
returndata[1] = reader.Get<string>("UserGroup");
return returndata;
}
}
}
catch (Exception ex)
{
Log.ConsoleError("FetchHashedPasswordAndGroup SQL returned an error: " + ex);
}
return returndata;
}
public int GetUserID(string username) public int GetUserID(string username)
{ {
try try
@ -314,6 +286,9 @@ namespace TShockAPI.DB
{ {
user.ID = reader.Get<int>("ID"); user.ID = reader.Get<int>("ID");
user.Group = reader.Get<string>("Usergroup"); user.Group = reader.Get<string>("Usergroup");
user.Password = reader.Get<string>("Password");
user.Name = reader.Get<string>("Username");
user.Address = reader.Get<string>("IP");
return user; return user;
} }
} }
@ -350,6 +325,7 @@ namespace TShockAPI.DB
} }
} }
[Serializable]
public class UserManagerException : Exception public class UserManagerException : Exception
{ {
public UserManagerException(string message) public UserManagerException(string message)
@ -363,6 +339,7 @@ namespace TShockAPI.DB
} }
} }
[Serializable]
public class UserExistsException : UserManagerException public class UserExistsException : UserManagerException
{ {
public UserExistsException(string name) public UserExistsException(string name)
@ -370,6 +347,7 @@ namespace TShockAPI.DB
{ {
} }
} }
[Serializable]
public class UserNotExistException : UserManagerException public class UserNotExistException : UserManagerException
{ {
public UserNotExistException(string name) public UserNotExistException(string name)
@ -377,7 +355,7 @@ namespace TShockAPI.DB
{ {
} }
} }
[Serializable]
public class GroupNotExistsException : UserManagerException public class GroupNotExistsException : UserManagerException
{ {
public GroupNotExistsException(string group) public GroupNotExistsException(string group)

View file

@ -31,12 +31,13 @@ namespace TShockAPI.DB
{ {
private IDbConnection database; private IDbConnection database;
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope")]
public WarpManager(IDbConnection db) public WarpManager(IDbConnection db)
{ {
database = db; database = db;
var table = new SqlTable("Warps", var table = new SqlTable("Warps",
new SqlColumn("WarpName", MySqlDbType.VarChar, 50) { Primary = true}, new SqlColumn("WarpName", MySqlDbType.VarChar, 50) { Primary = true },
new SqlColumn("X", MySqlDbType.Int32), new SqlColumn("X", MySqlDbType.Int32),
new SqlColumn("Y", MySqlDbType.Int32), new SqlColumn("Y", MySqlDbType.Int32),
new SqlColumn("WorldID", MySqlDbType.Text), new SqlColumn("WorldID", MySqlDbType.Text),
@ -50,10 +51,10 @@ namespace TShockAPI.DB
String world = ""; String world = "";
int x1 = 0; int x1 = 0;
int y1 = 0; int y1 = 0;
if (File.Exists(file)) if (!File.Exists(file))
{ return;
XmlReader reader;
using (reader = XmlReader.Create(new StreamReader(file))) using (var reader = XmlReader.Create(new StreamReader(file), new XmlReaderSettings { CloseInput = true }))
{ {
// Parse the file and display each of the nodes. // Parse the file and display each of the nodes.
while (reader.Read()) while (reader.Read())
@ -102,9 +103,9 @@ namespace TShockAPI.DB
case XmlNodeType.EndElement: case XmlNodeType.EndElement:
if (reader.Name.Equals("Warp")) if (reader.Name.Equals("Warp"))
{ {
string query = (TShock.Config.StorageType.ToLower() == "sqlite") ? string query = (TShock.Config.StorageType.ToLower() == "sqlite")
"INSERT OR IGNORE INTO Warps VALUES (@0, @1,@2, @3);" : ? "INSERT OR IGNORE INTO Warps VALUES (@0, @1,@2, @3);"
"INSERT IGNORE INTO Warps SET X=@0, Y=@1, WarpName=@2, WorldID=@3;"; : "INSERT IGNORE INTO Warps SET X=@0, Y=@1, WarpName=@2, WorldID=@3;";
database.Query(query, x1, y1, name, world); database.Query(query, x1, y1, name, world);
} }
break; break;
@ -112,16 +113,14 @@ namespace TShockAPI.DB
} }
} }
reader.Close();
String path = Path.Combine(TShock.SavePath, "old_configs"); String path = Path.Combine(TShock.SavePath, "old_configs");
String file2 = Path.Combine(path, "warps.xml"); String file2 = Path.Combine(path, "warps.xml");
if (!Directory.Exists(path)) if (!Directory.Exists(path))
Directory.CreateDirectory(path); Directory.CreateDirectory(path);
if (File.Exists(file2)) if (File.Exists(file2))
File.Delete(file2); File.Delete(file2);
//File.Move(file, file2); File.Move(file, file2);
}
} }
public void ConvertDB() public void ConvertDB()

View file

@ -14,6 +14,7 @@ namespace TShockAPI.DB
/// <param name="query">Query string with parameters as @0, @1, etc.</param> /// <param name="query">Query string with parameters as @0, @1, etc.</param>
/// <param name="args">Parameters to be put in the query</param> /// <param name="args">Parameters to be put in the query</param>
/// <returns>Rows affected by query</returns> /// <returns>Rows affected by query</returns>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Security", "CA2100:Review SQL queries for security vulnerabilities")]
public static int Query(this IDbConnection olddb, string query, params object[] args) public static int Query(this IDbConnection olddb, string query, params object[] args)
{ {
using (var db = olddb.CloneEx()) using (var db = olddb.CloneEx())
@ -36,6 +37,7 @@ namespace TShockAPI.DB
/// <param name="query">Query string with parameters as @0, @1, etc.</param> /// <param name="query">Query string with parameters as @0, @1, etc.</param>
/// <param name="args">Parameters to be put in the query</param> /// <param name="args">Parameters to be put in the query</param>
/// <returns>Query result as IDataReader</returns> /// <returns>Query result as IDataReader</returns>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Security", "CA2100:Review SQL queries for security vulnerabilities")]
public static QueryResult QueryReader(this IDbConnection olddb, string query, params object[] args) public static QueryResult QueryReader(this IDbConnection olddb, string query, params object[] args)
{ {
var db = olddb.CloneEx(); var db = olddb.CloneEx();
@ -125,10 +127,32 @@ namespace TShockAPI.DB
Reader = reader; Reader = reader;
} }
~QueryResult()
{
Dispose(false);
}
public void Dispose() public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
if (Reader != null)
{ {
Reader.Dispose(); Reader.Dispose();
Reader = null;
}
if (Connection != null)
{
Connection.Dispose(); Connection.Dispose();
Connection = null;
}
}
} }
public bool Read() public bool Read()

View file

@ -88,14 +88,13 @@ namespace TShockAPI
return true; return true;
} }
CreateIfNot(WhitelistPath, "127.0.0.1"); CreateIfNot(WhitelistPath, "127.0.0.1");
TextReader tr = new StreamReader(WhitelistPath); using (var tr = new StreamReader(WhitelistPath))
{
string whitelist = tr.ReadToEnd(); string whitelist = tr.ReadToEnd();
ip = Tools.GetRealIP(ip); ip = Tools.GetRealIP(ip);
bool contains = whitelist.Contains(ip); bool contains = whitelist.Contains(ip);
if (!contains) if (!contains)
{ {
var char2 = Environment.NewLine.ToCharArray();
var array = whitelist.Split(Environment.NewLine.ToCharArray());
foreach (var line in whitelist.Split(Environment.NewLine.ToCharArray())) foreach (var line in whitelist.Split(Environment.NewLine.ToCharArray()))
{ {
if (string.IsNullOrWhiteSpace(line)) if (string.IsNullOrWhiteSpace(line))
@ -106,8 +105,8 @@ namespace TShockAPI
} }
return false; return false;
} }
else
return true; return true;
} }
} }
}
} }

View file

@ -256,6 +256,37 @@ namespace TShockAPI
int x = args.Data.ReadInt32(); int x = args.Data.ReadInt32();
int y = args.Data.ReadInt32(); int y = args.Data.ReadInt32();
byte tiletype = args.Data.ReadInt8(); byte tiletype = args.Data.ReadInt8();
if (args.Player.AwaitingTemp1)
{
args.Player.TempArea.X = x;
args.Player.TempArea.Y = y;
args.Player.SendMessage("Set Temp Point 1", Color.Yellow);
args.Player.SendTileSquare(x, y);
args.Player.AwaitingTemp1 = false;
return true;
}
if (args.Player.AwaitingTemp2)
{
if (x > args.Player.TempArea.X && y > args.Player.TempArea.Y)
{
args.Player.TempArea.Width = x - args.Player.TempArea.X;
args.Player.TempArea.Height = y - args.Player.TempArea.Y;
args.Player.SendMessage("Set Temp Point 2", Color.Yellow);
args.Player.SendTileSquare(x, y);
args.Player.AwaitingTemp2 = false;
}
else
{
args.Player.SendMessage("Point 2 must be below and right of Point 1", Color.Yellow);
args.Player.SendMessage("Use /region clear to start again", Color.Yellow);
args.Player.SendTileSquare(x, y);
args.Player.AwaitingTemp2 = false;
}
return true;
}
if (!args.Player.Group.HasPermission("canbuild")) if (!args.Player.Group.HasPermission("canbuild"))
{ {
if (!args.Player.HasBeenSpammedWithBuildMessage) if (!args.Player.HasBeenSpammedWithBuildMessage)
@ -547,6 +578,36 @@ namespace TShockAPI
if (tilex < 0 || tilex >= Main.maxTilesX || tiley < 0 || tiley >= Main.maxTilesY) if (tilex < 0 || tilex >= Main.maxTilesX || tiley < 0 || tiley >= Main.maxTilesY)
return false; return false;
if (args.Player.AwaitingTemp1)
{
args.Player.TempArea.X = tilex;
args.Player.TempArea.Y = tiley;
args.Player.SendMessage("Set Temp Point 1", Color.Yellow);
args.Player.SendTileSquare(tilex, tiley);
args.Player.AwaitingTemp1 = false;
return true;
}
if (args.Player.AwaitingTemp2)
{
if (tilex > args.Player.TempArea.X && tiley > args.Player.TempArea.Y)
{
args.Player.TempArea.Width = tilex - args.Player.TempArea.X;
args.Player.TempArea.Height = tiley - args.Player.TempArea.Y;
args.Player.SendMessage("Set Temp Point 2", Color.Yellow);
args.Player.SendTileSquare(tilex, tiley);
args.Player.AwaitingTemp2 = false;
}
else
{
args.Player.SendMessage("Point 2 must be below and right of Point 1", Color.Yellow);
args.Player.SendMessage("Use /region clear to start again", Color.Yellow);
args.Player.SendTileSquare(tilex, tiley);
args.Player.AwaitingTemp2 = false;
}
return true;
}
if (Main.tile[tilex, tiley].type != 0x15 && (!Tools.MaxChests() && Main.tile[tilex, tiley].type != 0)) //Chest if (Main.tile[tilex, tiley].type != 0x15 && (!Tools.MaxChests() && Main.tile[tilex, tiley].type != 0)) //Chest
{ {
Log.Debug(string.Format("TileKill(TileXY:{0}_{1}, Type:{2})", Log.Debug(string.Format("TileKill(TileXY:{0}_{1}, Type:{2})",

View file

@ -24,8 +24,10 @@ namespace TShockAPI
int[] Packets = new int[52]; int[] Packets = new int[52];
int[] Compressed = new int[52]; int[] Compressed = new int[52];
#if DEBUG_NET
Command dump; Command dump;
Command flush; Command flush;
#endif
public PacketBufferer() public PacketBufferer()
{ {
@ -45,8 +47,21 @@ namespace TShockAPI
GameHooks.PostUpdate += GameHooks_Update; GameHooks.PostUpdate += GameHooks_Update;
} }
~PacketBufferer()
{
Dispose(false);
}
public void Dispose() public void Dispose()
{ {
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
#if DEBUG_NET #if DEBUG_NET
Commands.ChatCommands.Remove(dump); Commands.ChatCommands.Remove(dump);
Commands.ChatCommands.Remove(flush); Commands.ChatCommands.Remove(flush);
@ -55,6 +70,7 @@ namespace TShockAPI
ServerHooks.SocketReset -= ServerHooks_SocketReset; ServerHooks.SocketReset -= ServerHooks_SocketReset;
GameHooks.PostUpdate -= GameHooks_Update; GameHooks.PostUpdate -= GameHooks_Update;
} }
}
void Dump(CommandArgs args) void Dump(CommandArgs args)
{ {
@ -120,7 +136,10 @@ namespace TShockAPI
Bytes[pt] += size; Bytes[pt] += size;
Compressed[pt] += Compress(buffer, offset, count); Compressed[pt] += Compress(buffer, offset, count);
#endif #endif
buffers[socket.whoAmI].AddRange(new MemoryStream(buffer, offset, count).ToArray()); using (var ms = new MemoryStream(buffer, offset, count))
{
buffers[socket.whoAmI].AddRange(ms.ToArray());
}
} }
} }
#if DEBUG_NET #if DEBUG_NET

View file

@ -24,6 +24,7 @@ using System.Net.Sockets;
using System.Text; using System.Text;
using System.Threading; using System.Threading;
using Terraria; using Terraria;
using XNAHelpers;
namespace TShockAPI namespace TShockAPI
{ {
@ -116,12 +117,14 @@ namespace TShockAPI
try try
{ {
var EP = new IPEndPoint(IPAddress.Any, port); var EP = new IPEndPoint(IPAddress.Any, port);
UdpClient client = new UdpClient(); using (var client = new UdpClient())
{
client.Connect(hostname, port); client.Connect(hostname, port);
client.Client.ReceiveTimeout = 500; client.Client.ReceiveTimeout = 500;
client.Send(bytes, bytes.Length); client.Send(bytes, bytes.Length);
response = Encoding.UTF8.GetString(client.Receive(ref EP)); response = Encoding.UTF8.GetString(client.Receive(ref EP));
} }
}
catch (Exception e) catch (Exception e)
{ {
Log.Error(e.ToString()); Log.Error(e.ToString());
@ -244,7 +247,7 @@ namespace TShockAPI
if (player != null && player.Active) if (player != null && player.Active)
{ {
count++; count++;
TSPlayer.Server.SendMessage(string.Format("{0} ({1}) [{2}]", player.Name, player.IP, player.Group.Name)); TSPlayer.Server.SendMessage(string.Format("{0} ({1}) [{2}] <{3}>", player.Name, player.IP, player.Group.Name, player.UserAccountName));
} }
} }
TSPlayer.Server.SendMessage(string.Format("{0} players connected.", count)); TSPlayer.Server.SendMessage(string.Format("{0} players connected.", count));
@ -259,7 +262,7 @@ namespace TShockAPI
if (player != null && player.Active) if (player != null && player.Active)
{ {
count++; count++;
Response += (string.Format("{0} 0 0 {1}({2}) {3} {4} 0 0", count, player.Name, player.Group.Name, Netplay.serverSock[player.Index].tcpClient.Client.RemoteEndPoint)) + "\n"; Response += (string.Format("{0} 0 0 {1}({2}) {3} {4} 0 0", count, player.Name, player.Group.Name, Netplay.serverSock[player.Index].tcpClient.Client.RemoteEndPoint, "")) + "\n";
} }
} }
} }
@ -288,18 +291,19 @@ namespace TShockAPI
private static byte[] ConstructPacket(string response, bool print) private static byte[] ConstructPacket(string response, bool print)
{ {
var oob = new byte[] { 0xFF, 0xFF, 0xFF, 0xFF }; var oob = new byte[] { 0xFF, 0xFF, 0xFF, 0xFF };
MemoryStream stream = new MemoryStream(); using (var stream = new MemoryStream())
BinaryWriter writer = new BinaryWriter(stream); {
writer.Write(oob); stream.WriteBytes(oob);
if (print) if (print)
writer.Write(Encoding.UTF8.GetBytes(string.Format("print\n{0}", response))); stream.WriteBytes(Encoding.UTF8.GetBytes(string.Format("print\n{0}", response)));
else else
writer.Write(Encoding.UTF8.GetBytes(response)); stream.WriteBytes(Encoding.UTF8.GetBytes(response));
var trimmedpacket = new byte[(int)stream.Length]; var trimmedpacket = new byte[(int)stream.Length];
var packet = stream.GetBuffer(); var packet = stream.GetBuffer();
Array.Copy(packet, trimmedpacket, (int)stream.Length); Array.Copy(packet, trimmedpacket, (int)stream.Length);
return trimmedpacket; return trimmedpacket;
} }
}
private static byte[] PadPacket(byte[] packet) private static byte[] PadPacket(byte[] packet)
{ {

View file

@ -39,6 +39,8 @@ namespace TShockAPI
public int Index { get; protected set; } public int Index { get; protected set; }
public DateTime LastPvpChange { get; protected set; } public DateTime LastPvpChange { get; protected set; }
public Rectangle TempArea; public Rectangle TempArea;
public bool AwaitingTemp1 { get; set; }
public bool AwaitingTemp2 { get; set; }
public DateTime LastExplosive { get; set; } public DateTime LastExplosive { get; set; }
public DateTime LastTileChangeNotify { get; set; } public DateTime LastTileChangeNotify { get; set; }
public bool InitSpawn; public bool InitSpawn;
@ -178,10 +180,12 @@ namespace TShockAPI
}; };
var ms = new MemoryStream(); using (var ms = new MemoryStream())
{
msg.PackFull(ms); msg.PackFull(ms);
SendRawData(ms.ToArray()); SendRawData(ms.ToArray());
} }
}
public bool Teleport(int tilex, int tiley) public bool Teleport(int tilex, int tiley)
{ {

21
TShockAPI/TShock.cs Executable file → Normal file
View file

@ -94,6 +94,7 @@ namespace TShockAPI
Order = 0; Order = 0;
} }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Security", "CA2122:DoNotIndirectlyExposeMethodsWithLinkDemands")]
public override void Initialize() public override void Initialize()
{ {
if (!Directory.Exists(SavePath)) if (!Directory.Exists(SavePath))
@ -315,15 +316,17 @@ namespace TShockAPI
Console.WriteLine("This token will display until disabled by verification. (/auth-verify)"); Console.WriteLine("This token will display until disabled by verification. (/auth-verify)");
Console.ForegroundColor = ConsoleColor.Gray; Console.ForegroundColor = ConsoleColor.Gray;
FileTools.CreateFile(Path.Combine(SavePath, "authcode.txt")); FileTools.CreateFile(Path.Combine(SavePath, "authcode.txt"));
TextWriter tw = new StreamWriter(Path.Combine(SavePath, "authcode.txt")); using (var tw = new StreamWriter(Path.Combine(SavePath, "authcode.txt")))
{
tw.WriteLine(AuthToken); tw.WriteLine(AuthToken);
tw.Close(); }
} }
else if (File.Exists(Path.Combine(SavePath, "authcode.txt"))) else if (File.Exists(Path.Combine(SavePath, "authcode.txt")))
{ {
TextReader tr = new StreamReader(Path.Combine(SavePath, "authcode.txt")); using (var tr = new StreamReader(Path.Combine(SavePath, "authcode.txt")))
{
AuthToken = Convert.ToInt32(tr.ReadLine()); AuthToken = Convert.ToInt32(tr.ReadLine());
tr.Close(); }
Console.ForegroundColor = ConsoleColor.Yellow; Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine( Console.WriteLine(
"TShock Notice: authcode.txt is still present, and the AuthToken located in that file will be used."); "TShock Notice: authcode.txt is still present, and the AuthToken located in that file will be used.");
@ -445,6 +448,9 @@ namespace TShockAPI
private void OnChat(messageBuffer msg, int ply, string text, HandledEventArgs e) private void OnChat(messageBuffer msg, int ply, string text, HandledEventArgs e)
{ {
if (e.Handled)
return;
var tsplr = Players[msg.whoAmI]; var tsplr = Players[msg.whoAmI];
if (tsplr == null) if (tsplr == null)
{ {
@ -528,8 +534,8 @@ namespace TShockAPI
if (player != null && player.Active) if (player != null && player.Active)
{ {
count++; count++;
TSPlayer.Server.SendMessage(string.Format("{0} ({1}) [{2}]", player.Name, player.IP, TSPlayer.Server.SendMessage(string.Format("{0} ({1}) [{2}] <{3}>", player.Name, player.IP,
player.Group.Name)); player.Group.Name, player.UserAccountName));
} }
} }
TSPlayer.Server.SendMessage(string.Format("{0} players connected.", count)); TSPlayer.Server.SendMessage(string.Format("{0} players connected.", count));
@ -554,6 +560,9 @@ namespace TShockAPI
private void GetData(GetDataEventArgs e) private void GetData(GetDataEventArgs e)
{ {
if (e.Handled)
return;
PacketTypes type = e.MsgID; PacketTypes type = e.MsgID;
var player = Players[e.Msg.whoAmI]; var player = Players[e.Msg.whoAmI];
if (player == null) if (player == null)

View file

@ -428,7 +428,8 @@ namespace TShockAPI
public static void ShowFileToUser(TSPlayer player, string file) public static void ShowFileToUser(TSPlayer player, string file)
{ {
string foo = ""; string foo = "";
TextReader tr = new StreamReader(Path.Combine(TShock.SavePath, file)); using (var tr = new StreamReader(Path.Combine(TShock.SavePath, file)))
{
while ((foo = tr.ReadLine()) != null) while ((foo = tr.ReadLine()) != null)
{ {
foo = foo.Replace("%map%", Main.worldName); foo = foo.Replace("%map%", Main.worldName);
@ -437,14 +438,15 @@ namespace TShockAPI
{ {
string possibleColor = foo.Substring(0, 13); string possibleColor = foo.Substring(0, 13);
foo = foo.Remove(0, 13); foo = foo.Remove(0, 13);
float[] pC = { 0, 0, 0 }; float[] pC = {0, 0, 0};
possibleColor = possibleColor.Replace("%", ""); possibleColor = possibleColor.Replace("%", "");
string[] pCc = possibleColor.Split(','); string[] pCc = possibleColor.Split(',');
if (pCc.Length == 3) if (pCc.Length == 3)
{ {
try try
{ {
player.SendMessage(foo, (byte)Convert.ToInt32(pCc[0]), (byte)Convert.ToInt32(pCc[1]), (byte)Convert.ToInt32(pCc[2])); player.SendMessage(foo, (byte) Convert.ToInt32(pCc[0]), (byte) Convert.ToInt32(pCc[1]),
(byte) Convert.ToInt32(pCc[2]));
continue; continue;
} }
catch (Exception e) catch (Exception e)
@ -455,7 +457,7 @@ namespace TShockAPI
} }
player.SendMessage(foo); player.SendMessage(foo);
} }
tr.Close(); }
} }
/// <summary> /// <summary>

View file

@ -55,7 +55,8 @@ namespace TShockAPI
/// <returns></returns> /// <returns></returns>
private static bool ServerIsOutOfDate() private static bool ServerIsOutOfDate()
{ {
WebClient client = new WebClient(); using (var client = new WebClient())
{
client.Headers.Add("user-agent", client.Headers.Add("user-agent",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705;)"); "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705;)");
try try
@ -76,6 +77,7 @@ namespace TShockAPI
} }
return false; return false;
} }
}
private static void NotifyAdministrators(string[] changes) private static void NotifyAdministrators(string[] changes)
{ {

View file

@ -29,7 +29,7 @@ namespace UnitTests
} }
[TestMethod] [TestMethod]
public void TestDBNotNull() public void TestBansDBNotNull()
{ {
Assert.IsNotNull(Bans); Assert.IsNotNull(Bans);
} }

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<OrderedTest name="BanManagerTest" storage="c:\users\shank\dropbox\design and development\csharp\tshock\unittests\banmanagertest.orderedtest" id="f28695ef-8181-4996-8783-b5059ce904b1" xmlns="http://microsoft.com/schemas/VisualStudio/TeamTest/2010"> <OrderedTest name="banmanagertest" storage="c:\users\virus\git\tshock\unittests\banmanagertest.orderedtest" id="f28695ef-8181-4996-8783-b5059ce904b1" xmlns="http://microsoft.com/schemas/VisualStudio/TeamTest/2010">
<TestLinks> <TestLinks>
<TestLink id="58b9a622-39c1-640a-6713-3ee97b0d99e2" name="TestDBNotNull" storage="bin\debug\unittests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> <TestLink id="7cc70e31-eeb8-f6b8-afa2-17bf975873ed" name="TestBansDBNotNull" storage="bin\debug\unittests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<TestLink id="67a76536-c5c2-4d99-515a-498708451061" name="AddBanTest" storage="bin\debug\unittests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> <TestLink id="67a76536-c5c2-4d99-515a-498708451061" name="AddBanTest" storage="bin\debug\unittests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<TestLink id="9265845c-1bec-1156-2e22-1a64c5bd689f" name="FindBanTest" storage="bin\debug\unittests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> <TestLink id="9265845c-1bec-1156-2e22-1a64c5bd689f" name="FindBanTest" storage="bin\debug\unittests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
</TestLinks> </TestLinks>

View file

@ -0,0 +1,63 @@
using System;
using System.Data;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using Community.CsharpSqlite.SQLiteClient;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using TShockAPI;
using TShockAPI.DB;
namespace UnitTests
{
[TestClass]
public class GroupManagerTest
{
public static IDbConnection DB;
private GroupManager Groups;
[TestInitialize]
public void Initialize()
{
TShock.Config = new ConfigFile();
TShock.Config.StorageType = "sqlite";
DB = new SqliteConnection(string.Format("uri=file://{0},Version=3", "tshock.test.sqlite"));
DB.Open();
Groups = new GroupManager(DB);
TShock.Groups = this.Groups;
}
[TestMethod]
public void TestGroupsDBNotNull()
{
Assert.IsNotNull(Groups);
}
[TestMethod]
public void CreateGroup()
{
Assert.IsTrue(Groups.AddGroup("test1", "heal") != "");
Assert.IsTrue(Groups.GroupExists("test1"));
Assert.IsTrue(Tools.GetGroup("test1").HasPermission("heal"));
}
[TestMethod]
public void DeleteGroup()
{
Assert.IsTrue(Groups.AddGroup("test1", "heal") != "");
Assert.IsTrue(Groups.GroupExists("test1"));
Assert.IsTrue(Groups.DeleteGroup("test1") != "");
Assert.IsFalse( Groups.GroupExists( "test1") );
}
/*[TestMethod]
public void CreateGroup()
{
Assert.IsTrue(Groups.AddGroup("test1", "heal") != "");
Assert.IsTrue(Groups.GroupExists("test1"));
Assert.IsTrue(Tools.GetGroup("test1").HasPermission("heal"));
}*/
}
}

View file

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<OrderedTest name="groupmanagertest" storage="c:\users\virus\git\tshock\unittests\groupmanagertest.orderedtest" id="ec2aa146-8548-415b-a9f5-80472ce3c7d9" xmlns="http://microsoft.com/schemas/VisualStudio/TeamTest/2010">
<TestLinks>
<TestLink id="4b09514b-0cca-b305-b9af-a4ceaaaf12dd" name="TestGroupsDBNotNull" storage="bin\debug\unittests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<TestLink id="6ea1e597-9c3c-745b-5307-55ff47787810" name="DeleteGroup" storage="bin\debug\unittests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<TestLink id="a66f56ff-803a-ff91-0bca-9abde10363de" name="CreateGroup" storage="bin\debug\unittests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
</TestLinks>
</OrderedTest>

View file

@ -87,6 +87,7 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="BanManagerTest.cs" /> <Compile Include="BanManagerTest.cs" />
<Compile Include="GroupManagerTest.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="ItemManagerTest.cs" /> <Compile Include="ItemManagerTest.cs" />
<Compile Include="RegionManagerTest.cs" /> <Compile Include="RegionManagerTest.cs" />
@ -104,6 +105,9 @@
<None Include="ItemManagerTest.orderedtest"> <None Include="ItemManagerTest.orderedtest">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None> </None>
<None Include="GroupManagerTest.orderedtest">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="RegionManagerTest.orderedtest"> <None Include="RegionManagerTest.orderedtest">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None> </None>