using System;
using System.Data;
using System.Data.Common;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Net;
using System.Xml;
using System.IO;
//using System.Data.SqlClient;
using System.Text;
using System.Linq;
using MySql.Data.MySqlClient;
using AHSoftware.CubeMon;
using AHSoftware.CubeMon.Games.ActionCube.v094;
///
/// Summary description for CubeMS
///
public class CubeMasterDAL
{
string connectionString;
//DbProviderFactory factory;
public string ConnectionString
{
get { return connectionString; }
set { connectionString = value; }
}
public CubeMasterDAL()
{
// factory = new MySql.Data.MySqlClient.MySqlClientFactory();
}
IDbConnection CreateConnection()
{
IDbConnection con = new MySqlConnection(); //factory.CreateConnection();
con.ConnectionString = ConnectionString;
//con.Open();
return con;
}
private void AddServer(IPEndPoint address, string name, string description)
{
//SqlConnection con = new SqlConnection(connectionString);
//SqlCommand cmd = new SqlCommand("AddServer", con);
IDbConnection con = CreateConnection();
IDbCommand cmd = con.CreateCommand();
cmd.CommandText = "DELETE FROM Servers WHERE IP=@IP AND Port=@Port; INSERT INTO Servers VALUES(@IP, @Port, @Name, @Description, @Date)";
var param = cmd.CreateParameter();
param.ParameterName = "IP";
param.Value = IPTools.IPToInt(address.Address);
cmd.Parameters.Add(param);
param = cmd.CreateParameter();
param.ParameterName = "Port";
param.Value = address.Port;
cmd.Parameters.Add(param);
param = cmd.CreateParameter();
param.ParameterName = "Name";
param.Value = name;
cmd.Parameters.Add(param);
param = cmd.CreateParameter();
param.ParameterName = "Description";
param.Value = description;
cmd.Parameters.Add(param);
param = cmd.CreateParameter();
param.ParameterName = "Date";
param.Value = DateTime.Now;
cmd.Parameters.Add(param);
Console.WriteLine("opening");
con.Open();
cmd.ExecuteNonQuery();
Console.WriteLine("done");
}
public void Register(IPEndPoint address)
{
Client c = new Client();
c.Socket = new IPEndPoint(address.Address, address.Port + 1);
ServerInfo info = null;
try
{
info = (ServerInfo)c.RequestInfo();
}
catch
{
throw new ApplicationException("Could not ping you. Make sure your server is accessible from the internet.");
}
string name = string.Empty;
try
{
name = Dns.GetHostEntry(info.Socket.Address).HostName;
}
catch { };
if (info.MaxClients > 20)
{
throw new ApplicationException("Your server must have a maxclients setting of 20 or less. Check your configuration.");
}
AddServer(address, name, info.Description);
}
public string GetServers(bool xml)
{
System.Diagnostics.Debug.Assert(xml == false);
IDbConnection con = CreateConnection();
IDbCommand cmd = con.CreateCommand(); //new SqlCommand(xml ? "GetServersXML" : "GetServers", con);
cmd.CommandText = "DELETE FROM Servers WHERE LastModified + INTERVAL 70 MINUTE < NOW(); SELECT * FROM Servers;"; // fixme, xml
try
{
con.Open();
IDataReader r = cmd.ExecuteReader();
StringBuilder sb = new StringBuilder();
if(xml)
{
// sql server handles xml conversion for us, just embed in a new xmldoc
sb.AppendLine("");
sb.AppendLine("");
if(r.Read())
{
sb.AppendLine(r[0] as string);
}
sb.AppendLine("");
}
else
{
// construct server list as cubescript
while(r.Read())
{
sb.AppendFormat("addserver {0} {1};{2}", IPTools.IntToIp((int)r["IP"]).ToString(), r["Port"], Environment.NewLine);
}
}
return sb.ToString();
}
catch
{
return null;
}
finally
{
con.Close();
}
}
public string GetClientScript(string HTTPAgent)
{
IDbConnection con = CreateConnection();
IDbCommand cmd = con.CreateCommand(); // new SqlCommand("GetClientScript", con);
//cmd.Parameters.AddWithValue("HTTPAgent", HTTPAgent);
cmd.CommandText = "SELECT * FROM ClientScripts WHERE HTTPAgent = @HTTPAgent";
var param = cmd.CreateParameter();
param.ParameterName = "HTTPAgent";
param.Value = HTTPAgent;
cmd.Parameters.Add(param);
try
{
con.Open();
IDataReader r = cmd.ExecuteReader();
r.Read();
return r["Script"] as string;
}
catch
{
return null;
}
finally
{
con.Close();
}
}
public enum EventType : int
{
RegistrationFailed = 0,
RegistrationSuceeeded,
RetrieveServers,
Exception,
}
public void AddEvent(EventType type, string data, IPEndPoint address)
{
IDbConnection con = CreateConnection();
IDbCommand cmd = con.CreateCommand(); //new SqlCommand("AddEvent", con);
cmd.CommandText = "INSERT INTO Events (Type, Data, IP, Time) VALUES (@Type, @Data, @IP, @Time)";
var param = cmd.CreateParameter();
param.ParameterName = "Type";
param.Value = type;
cmd.Parameters.Add(param);
param = cmd.CreateParameter();
param.ParameterName = "Data";
param.Value = data;
cmd.Parameters.Add(param);
param = cmd.CreateParameter();
param.ParameterName = "IP";
param.Value = IPTools.IPToInt(address.Address);
cmd.Parameters.Add(param);
param = cmd.CreateParameter();
param.ParameterName = "Time";
param.Value = DateTime.Now;
cmd.Parameters.Add(param);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
}
}