Commit 3b1accc3 authored by mercury233's avatar mercury233

test windbot server

parent 9c6d6fd5
...@@ -55,12 +55,7 @@ namespace WindBot.Game.AI ...@@ -55,12 +55,7 @@ namespace WindBot.Game.AI
{ {
_game = game; _game = game;
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(DialogsData)); DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(DialogsData));
string dialogfilename = "zh-CN"; string dialogfilename = game.Dialog;
string envdialogfilename = Environment.GetEnvironmentVariable("YGOPRO_DIALOG");
if (envdialogfilename != null)
{
dialogfilename = envdialogfilename;
}
using (FileStream fs = File.OpenRead("Dialogs/" + dialogfilename + ".json")) using (FileStream fs = File.OpenRead("Dialogs/" + dialogfilename + ".json"))
{ {
DialogsData data = (DialogsData)serializer.ReadObject(fs); DialogsData data = (DialogsData)serializer.ReadObject(fs);
......
...@@ -74,6 +74,7 @@ namespace WindBot.Game ...@@ -74,6 +74,7 @@ namespace WindBot.Game
_packets.Add(StocMessage.DuelEnd, OnDuelEnd); _packets.Add(StocMessage.DuelEnd, OnDuelEnd);
_packets.Add(StocMessage.Chat, OnChat); _packets.Add(StocMessage.Chat, OnChat);
_messages.Add(GameMessage.Retry, OnRetry);
_messages.Add(GameMessage.Start, OnStart); _messages.Add(GameMessage.Start, OnStart);
_messages.Add(GameMessage.Win, OnWin); _messages.Add(GameMessage.Win, OnWin);
_messages.Add(GameMessage.Draw, OnDraw); _messages.Add(GameMessage.Draw, OnDraw);
...@@ -227,6 +228,11 @@ namespace WindBot.Game ...@@ -227,6 +228,11 @@ namespace WindBot.Game
packet.ReadUnicode(256); // message packet.ReadUnicode(256); // message
} }
private void OnRetry(BinaryReader packet)
{
throw new Exception("Got MSG_RETRY.");
}
private void OnStart(BinaryReader packet) private void OnStart(BinaryReader packet)
{ {
int type = packet.ReadByte(); int type = packet.ReadByte();
......
...@@ -12,17 +12,20 @@ namespace WindBot.Game ...@@ -12,17 +12,20 @@ namespace WindBot.Game
public YGOClient Connection { get; private set; } public YGOClient Connection { get; private set; }
public string Username; public string Username;
public string Deck; public string Deck;
public string Dialog;
private string _serverHost; private string _serverHost;
private int _serverPort; private int _serverPort;
private string _roomInfos; private string _roomInfos;
private GameBehavior _behavior; private GameBehavior _behavior;
public GameClient(string username, string deck, string serverHost, int serverPort, string roomInfos = "") public GameClient(string username = "Windbot", string deck = "Blue-Eyes", string serverHost = "127.0.0.1", int serverPort = 7911, string dialog = "default", string roomInfos = "")
{ {
Username = username; Username = username;
Deck = deck; Deck = deck;
Dialog = dialog;
_serverHost = serverHost; _serverHost = serverHost;
_serverPort = serverPort; _serverPort = serverPort;
_roomInfos = roomInfos; _roomInfos = roomInfos;
......
...@@ -8,5 +8,9 @@ namespace WindBot ...@@ -8,5 +8,9 @@ namespace WindBot
{ {
Console.WriteLine("[" + DateTime.Now.ToString("HH:mm:ss") + "] " + message); Console.WriteLine("[" + DateTime.Now.ToString("HH:mm:ss") + "] " + message);
} }
public static void WriteErrorLine(string message)
{
Console.Error.WriteLine("[" + DateTime.Now.ToString("HH:mm:ss") + "] " + message);
}
} }
} }
\ No newline at end of file
...@@ -4,29 +4,82 @@ using System.IO; ...@@ -4,29 +4,82 @@ using System.IO;
using System.Threading; using System.Threading;
using WindBot.Game; using WindBot.Game;
using WindBot.Game.AI; using WindBot.Game.AI;
using System.Net;
using System.Web;
namespace WindBot namespace WindBot
{ {
public class WindBotInfo
{
public string Name { get; set; }
public string Deck { get; set; }
public string Host { get; set; }
public string Dialog { get; set; }
public int Port { get; set; }
public int Version { get; set; }
}
public class Program public class Program
{ {
public static short ProVersion = 0x133A; public static short ProVersion = 0x133A;
public static int PlayerNameSize = 20; public static int PlayerNameSize = 20;
internal static Random Rand; internal static Random Rand;
internal static void Main() internal static void Main()
{ {
#if !DEBUG Init("cards.cdb");
try using (HttpListener MainServer = new HttpListener())
{
Run();
}
catch (Exception ex)
{ {
Console.Error.WriteLine("Error: " + ex); MainServer.AuthenticationSchemes = AuthenticationSchemes.Anonymous;
MainServer.Prefixes.Add("http://127.0.0.1:2399/");
MainServer.Start();
Console.WriteLine("Windbot Server Start Successed.");
while (true)
{
try
{
HttpListenerContext ctx = MainServer.GetContext();
WindBotInfo Info = new WindBotInfo();
string RawUrl = Path.GetFileName(ctx.Request.RawUrl);
Info.Name = HttpUtility.ParseQueryString(RawUrl).Get("name");
Info.Deck = HttpUtility.ParseQueryString(RawUrl).Get("deck");
Info.Host = HttpUtility.ParseQueryString(RawUrl).Get("host");
Info.Dialog = HttpUtility.ParseQueryString(RawUrl).Get("dialog");
string port = HttpUtility.ParseQueryString(RawUrl).Get("port");
if (port != null)
Info.Port = Int32.Parse(port);
string version = HttpUtility.ParseQueryString(RawUrl).Get("version");
if (version != null)
Info.Version = Int16.Parse(version);
if (Info.Name == null || Info.Deck == null || Info.Host == null || Info.Dialog == null || port == null || version == null)
{
ctx.Response.StatusCode = 400;
ctx.Response.Close();
}
else
{
try
{
Thread workThread = new Thread(new ParameterizedThreadStart(Run));
workThread.Start(Info);
}
catch (Exception ex)
{
Logger.WriteErrorLine("Start Thread Error: " + ex);
}
ctx.Response.StatusCode = 200;
ctx.Response.Close();
}
}
catch (Exception ex)
{
Logger.WriteErrorLine("Parse Http Request Error: " + ex);
}
}
} }
#else
Run();
#endif
} }
public static void Init(string databasePath) public static void Init(string databasePath)
...@@ -36,33 +89,52 @@ namespace WindBot ...@@ -36,33 +89,52 @@ namespace WindBot
InitCardsManager(databasePath); InitCardsManager(databasePath);
} }
private static void Run() private static void InitCardsManager(string databasePath)
{ {
Init("cards.cdb"); string currentPath = Path.GetFullPath(".");
GameClient client; string absolutePath = Path.Combine(currentPath, databasePath);
string EnvName = Environment.GetEnvironmentVariable("YGOPRO_NAME"); NamedCardsManager.Init(absolutePath);
if (EnvName != null) }
private static void Run(object o)
{
#if !DEBUG
try
{ {
ProVersion = Int16.Parse(Environment.GetEnvironmentVariable("YGOPRO_VERSION")); WindBotInfo Info = (WindBotInfo)o;
client = new GameClient(EnvName, Environment.GetEnvironmentVariable("YGOPRO_DECK"), Environment.GetEnvironmentVariable("YGOPRO_HOST"), Int32.Parse(Environment.GetEnvironmentVariable("YGOPRO_PORT"))); GameClient client = new GameClient(Info.Name, Info.Deck, Info.Host, Info.Port, Info.Dialog);
client.Start();
Logger.WriteLine(client.Username + " started.");
while (client.Connection.IsConnected)
{
try
{
client.Tick();
Thread.Sleep(30);
}
catch (Exception ex)
{
Logger.WriteErrorLine("Tick Error: " + ex);
}
}
Logger.WriteLine(client.Username + " end.");
} }
else catch (Exception ex)
{ {
client = new GameClient("谜之剑士LV4", "Blue-Eyes", "127.0.0.1", 7911); Logger.WriteErrorLine("Run Error: " + ex);
} }
#else
WindBotInfo Info = (WindBotInfo)o;
GameClient client = new GameClient(Info.Name, Info.Deck, Info.Host, Info.Port, Info.Dialog);
client.Start(); client.Start();
Logger.WriteLine(client.Username + " started.");
while (client.Connection.IsConnected) while (client.Connection.IsConnected)
{ {
client.Tick(); client.Tick();
Thread.Sleep(30); Thread.Sleep(30);
} }
} Logger.WriteLine(client.Username + " end.");
#endif
private static void InitCardsManager(string databasePath)
{
string currentPath = Path.GetFullPath(".");
string absolutePath = Path.Combine(currentPath, databasePath);
NamedCardsManager.Init(absolutePath);
} }
} }
} }
...@@ -42,6 +42,7 @@ ...@@ -42,6 +42,7 @@
<Reference Include="System.Core" /> <Reference Include="System.Core" />
<Reference Include="System.Data" /> <Reference Include="System.Data" />
<Reference Include="System.Runtime.Serialization" /> <Reference Include="System.Runtime.Serialization" />
<Reference Include="System.Web" />
<Reference Include="System.Xml" /> <Reference Include="System.Xml" />
<Reference Include="YGOSharp.Network"> <Reference Include="YGOSharp.Network">
<HintPath>.\YGOSharp.Network.dll</HintPath> <HintPath>.\YGOSharp.Network.dll</HintPath>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment