Yorick Rommers 10 年之前
父節點
當前提交
0b2f333bab
共有 3 個文件被更改,包括 74 次插入31 次删除
  1. 1 0
      YJMPD-UWP/Helpers/Settings.cs
  2. 16 14
      YJMPD-UWP/Model/GameHandler.cs
  3. 57 17
      YJMPD-UWP/Model/NetworkHandler.cs

+ 1 - 0
YJMPD-UWP/Helpers/Settings.cs

@@ -14,6 +14,7 @@ namespace YJMPD_UWP.Helpers
         {
             //Define default settings here
             Values["hostname"] = "imegumii.space";
+            Values["port"] = "3333";
 
             if (Values["username"] == null)
                 Values["username"] = "Anon_" + Util.Random(5, Util.RandomType.ALPHANUMERIC);

+ 16 - 14
YJMPD-UWP/Model/GameHandler.cs

@@ -1,6 +1,9 @@
 using System;
 using System.Collections.Generic;
+using System.Diagnostics;
 using System.Threading.Tasks;
+using Windows.Foundation;
+using YJMPD_UWP.Helpers;
 using YJMPD_UWP.Helpers.EventArgs;
 using YJMPD_UWP.Model.Object;
 
@@ -70,17 +73,9 @@ namespace YJMPD_UWP.Model
         //Searching
 
         public async Task<bool> Search()
-        {
-            return await SearchGame();
-        }
-
-        private async Task<bool> SearchGame()
         {
             UpdateGameStatus(GameStatus.SEARCHING);
-
-            await App.Network.SearchGame();
-
-            return true;
+            return await App.Network.SearchGame(this, Settings.Username);
         }
 
         //Starting and Stopping
@@ -101,15 +96,22 @@ namespace YJMPD_UWP.Model
             //Do stuff
 
             UpdateGameStatus(GameStatus.SEARCHING);
+            Search();
 
-            await Task.Delay(TimeSpan.FromSeconds(2));
-            AddPlayer("Kenneth");
-            await Task.Delay(TimeSpan.FromSeconds(1));
-            AddPlayer("Yorick");
+            IAsyncAction asyncAction = Windows.System.Threading.ThreadPool.RunAsync((workItem) =>
+            {
+                while (true)
+                {
+                    App.Network.WaitingForPlayers(this);
+                 
+                    Debug.WriteLine("Searching");
+                    Task.Delay(TimeSpan.FromMilliseconds(50));
+                }
+            });
+            
 
             UpdateGameStatus(GameStatus.WAITING);
 
-            await Task.Delay(TimeSpan.FromSeconds(3));
 
             UpdateGameStatus(GameStatus.STARTED);
 

+ 57 - 17
YJMPD-UWP/Model/NetworkHandler.cs

@@ -5,11 +5,23 @@ using Windows.Networking.Sockets;
 using Windows.Storage.Streams;
 using YJMPD_UWP.Helpers;
 using YJMPD_UWP.Helpers.EventArgs;
+using Newtonsoft.Json.Linq;
+using Newtonsoft.Json;
+using System.Diagnostics;
+using System.IO;
 
 namespace YJMPD_UWP.Model
 {
     public class NetworkHandler
     {
+
+        public enum Commands
+        {
+            Hi,
+            Name,
+            Picture
+        }
+
         public delegate void OnStatusUpdatedHandler(object sender, NetworkStatusUpdatedEventArgs e);
         public event OnStatusUpdatedHandler OnStatusUpdate;
 
@@ -18,7 +30,7 @@ namespace YJMPD_UWP.Model
 
         private StreamSocket client;
         DataWriter dout;
-        DataReader din;
+        StreamReader din;
 
         private void UpdateNetworkStatus(NetworkStatus status)
         {
@@ -37,11 +49,44 @@ namespace YJMPD_UWP.Model
 
 
         //API stuff
-        public async Task<bool> SearchGame()
+        public async Task<bool> SearchGame(GameHandler g, string playername)
+        {
+            JObject obj = JObject.FromObject(new
+            {
+                command = Commands.Name.ToString(),
+                name = playername
+            });
+            Debug.WriteLine(obj.ToString(Formatting.None));
+            Write(obj.ToString(Formatting.None));
+
+            var response = await Read();
+            Debug.WriteLine(response);
+            JObject o = JObject.Parse(response);
+            if(o["msg"].ToString() == "ok")
+            {
+                g.AddPlayer(playername);
+                return true;
+            }
+
+            return false;
+        }
+
+        public async Task<bool> WaitingForPlayers(GameHandler g)
         {
-            Random r = new Random();
-            int l = r.Next(0, 2);
-            return l < 1;
+            bool added = false;
+
+            var response = await Read();
+            Debug.WriteLine(response);
+            JObject o = JObject.Parse(response);
+            try {
+                g.AddPlayer(o["player"].ToString());
+                added = true;
+            }
+            catch(Exception e)
+            {
+                Debug.WriteLine(e);
+            }
+            return added;
         }
 
 
@@ -58,17 +103,13 @@ namespace YJMPD_UWP.Model
 
         private async Task<string> ReadData()
         {
-            uint length = din.ReadUInt32();
-            string data = din.ReadString(length);
-
-            return data;
+            return din.ReadLine();
         }
 
         private async Task<bool> WriteData(string data)
         {
-            dout.WriteUInt32((uint)data.Length);
-            dout.WriteString(data);
-
+            dout.WriteString(data + Environment.NewLine);
+            await dout.StoreAsync();
             await dout.FlushAsync();
             
             return true;
@@ -91,21 +132,20 @@ namespace YJMPD_UWP.Model
             UpdateNetworkStatus(NetworkStatus.CONNECTING);
 
             UpdateNetworkStatus(NetworkStatus.CONNECTED);
-            return false;
 
             client = new StreamSocket();
 
             StreamSocketControl controller = client.Control;
             controller.KeepAlive = true;
 
-            await client.ConnectAsync(new HostName(Settings.Values["hostname"] as string), "YJMPD-UWP-Server");
+            await client.ConnectAsync(new HostName("imegumii.space"), "3333");
 
 
-            din = new DataReader(client.InputStream);
+            din = new StreamReader(client.InputStream.AsStreamForRead());
             dout = new DataWriter(client.OutputStream);
 
-            din.UnicodeEncoding = UnicodeEncoding.Utf8;
-            din.ByteOrder = ByteOrder.LittleEndian;
+            //din.UnicodeEncoding = UnicodeEncoding.Utf8;
+            //din.ByteOrder = ByteOrder.LittleEndian;
 
             dout.UnicodeEncoding = UnicodeEncoding.Utf8;
             dout.ByteOrder = ByteOrder.LittleEndian;