Sqlite added
BanManager now uses sqlite (imcomplete)
This commit is contained in:
parent
91abde27d2
commit
c644fcd45c
4 changed files with 84 additions and 86 deletions
|
|
@ -18,118 +18,92 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using Community.CsharpSqlite.SQLiteClient;
|
||||
|
||||
namespace TShockAPI
|
||||
{
|
||||
public class BanManager
|
||||
{
|
||||
private DateTime LastLoad;
|
||||
private string Path;
|
||||
private IDbConnection database;
|
||||
|
||||
/// <summary>
|
||||
/// IP - Name - Reason
|
||||
/// </summary>
|
||||
private List<Ban> Bans = new List<Ban>();
|
||||
|
||||
public BanManager(string path)
|
||||
public BanManager(IDbConnection db)
|
||||
{
|
||||
Path = path;
|
||||
database = db;
|
||||
|
||||
using (var com = database.CreateCommand())
|
||||
{
|
||||
com.CommandText =
|
||||
"CREATE TABLE IF NOT EXISTS \"Bans\" (\"IP\" VARCHAR(15) NOT NULL UNIQUE , \"Name\" VARCHAR(32) NOT NULL , \"Reason\" VARCHAR(255) NOT NULL );";
|
||||
com.ExecuteNonQuery();
|
||||
}
|
||||
}
|
||||
|
||||
public Ban GetBanByIp(string ip)
|
||||
{
|
||||
EnsureChanges();
|
||||
foreach (var ban in Bans)
|
||||
using (var com = database.CreateCommand())
|
||||
{
|
||||
if (ban.IP.Equals(ip))
|
||||
return ban;
|
||||
com.CommandText = "SELECT * FROM Bans WHERE IP=@ip";
|
||||
AddParameter(com, "@ip", ip);
|
||||
using (var reader = com.ExecuteReader())
|
||||
{
|
||||
if (reader.Read())
|
||||
return new Ban((string)reader["IP"], (string)reader["Name"], (string)reader["Reason"]);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
IDbDataParameter AddParameter(IDbCommand command, string name, object data)
|
||||
{
|
||||
var parm = command.CreateParameter();
|
||||
parm.ParameterName = name;
|
||||
parm.Value = data;
|
||||
command.Parameters.Add(parm);
|
||||
return parm;
|
||||
}
|
||||
|
||||
|
||||
public Ban GetBanByName(string name, bool casesensitive = true)
|
||||
{
|
||||
EnsureChanges();
|
||||
foreach (var ban in Bans)
|
||||
using (var com = database.CreateCommand())
|
||||
{
|
||||
if (ban.Name.Equals(name,
|
||||
casesensitive
|
||||
? StringComparison.Ordinal
|
||||
: StringComparison.InvariantCultureIgnoreCase))
|
||||
return ban;
|
||||
var namecol = casesensitive ? "Name" : "UPPER(Name)";
|
||||
if (!casesensitive)
|
||||
name = name.ToUpper();
|
||||
com.CommandText = "SELECT *, COUNT(*) FROM Bans WHERE " + namecol + "=@name LIMIT 5";
|
||||
AddParameter(com, "@name", name);
|
||||
using (var reader = com.ExecuteReader())
|
||||
{
|
||||
if (reader.Read())
|
||||
return new Ban((string)reader["IP"], (string)reader["Name"], (string)reader["Reason"]);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public void AddBan(string ip, string name = "", string reason = "")
|
||||
{
|
||||
if (GetBanByIp(ip) != null)
|
||||
return;
|
||||
Bans.Add(new Ban(ip, name, reason));
|
||||
SaveBans();
|
||||
using (var com = database.CreateCommand())
|
||||
{
|
||||
com.CommandText = "INSERT INTO Bans (IP, Name, Reason) VALUES (@ip, @name, @reason)";
|
||||
AddParameter(com, "@ip", ip);
|
||||
AddParameter(com, "@name", name);
|
||||
AddParameter(com, "@reason", reason);
|
||||
com.ExecuteNonQuery();
|
||||
}
|
||||
}
|
||||
|
||||
public void RemoveBan(Ban ban)
|
||||
{
|
||||
Bans.Remove(ban);
|
||||
SaveBans();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Reloads the file if it was changed
|
||||
/// </summary>
|
||||
public void EnsureChanges()
|
||||
{
|
||||
if (File.Exists(Path))
|
||||
{
|
||||
if (new FileInfo(Path).LastWriteTime > LastLoad)
|
||||
LoadBans();
|
||||
}
|
||||
else
|
||||
{
|
||||
Bans.Clear();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Removes | from the string
|
||||
/// </summary>
|
||||
/// <param name="str"></param>
|
||||
/// <returns></returns>
|
||||
public string MakeSafe(string str)
|
||||
{
|
||||
return str.Replace("|", " ");
|
||||
}
|
||||
|
||||
public void LoadBans()
|
||||
{
|
||||
Bans.Clear();
|
||||
|
||||
if (!File.Exists(Path))
|
||||
return;
|
||||
|
||||
LastLoad = new FileInfo(Path).LastWriteTime;
|
||||
|
||||
foreach (var line in File.ReadAllLines(Path))
|
||||
{
|
||||
var bansp = line.Split('|');
|
||||
if (bansp.Length != 3)
|
||||
continue;
|
||||
Bans.Add(new Ban(bansp[0], bansp[1], bansp[2]));
|
||||
}
|
||||
}
|
||||
|
||||
public void SaveBans()
|
||||
{
|
||||
var output = new StringBuilder();
|
||||
foreach (var ban in Bans)
|
||||
{
|
||||
output.AppendFormat("{0}|{1}|{2}\r\n", MakeSafe(ban.IP), MakeSafe(ban.Name), MakeSafe(ban.Reason));
|
||||
}
|
||||
|
||||
File.WriteAllText(Path, output.ToString());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue