using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; using Windows.Devices.Geolocation; using YJMPD_UWP.Helpers; using YJMPD_UWP.Views; namespace YJMPD_UWP.Model { public class ApiHandler { public enum Command { Hi, Name, Picture, Msg, PlayerJoined, PlayerRemoved, PictureUrl, DestinationReached, GameEnded, PlayerReady, StopGame } public ApiHandler() { } public void HandleMessage(JObject o) { Command c = (Command)Enum.Parse(typeof(Command), o["command"].ToString()); switch (c) { case Command.Hi: Debug.WriteLine("Keep alive message received!"); SendHi(); break; case Command.PlayerJoined: Debug.WriteLine("Played joined"); PlayerJoined(o[Command.PlayerJoined.ToString()].ToString()); break; case Command.PlayerRemoved: Debug.WriteLine("Played removed"); PlayerRemoved(o[Command.PlayerRemoved.ToString()].ToString()); break; case Command.Picture: if (o["selected"].ToObject() == true) { App.Game.SetSelected(true); App.Navigate(typeof(PhotoView)); } else App.Navigate(typeof(WaitingView), "Waiting on photo..."); App.Game.MoveToWaiting(); break; case Command.PictureUrl: if (!App.Game.Selected) App.Photo.SetPhoto(o[Command.PictureUrl.ToString()].ToString()); double lat = (double)o["lat"]; double lon = (double)o["lon"]; BasicGeoposition bgps = new BasicGeoposition() { Latitude = lat, Longitude = lon }; App.Game.MoveToStarted(bgps); break; case Command.GameEnded: string winner = o["winner"].ToString(); if (winner == Settings.Username) winner = "You"; Util.ShowToastNotification(winner + " won!", "Press Ready or Leave"); foreach(var i in (JObject) o["players"]) { Debug.WriteLine(i.Key); Debug.WriteLine(i.Value["points"]); string username = i.Key; double points = i.Value["points"].ToObject(); double pointstotal = i.Value["pointstotal"].ToObject(); App.Game.UpdatePlayer(username, pointstotal, points); } App.Game.StopMatch(); break; case Command.StopGame: if (App.Game.Status != GameHandler.GameStatus.STOPPED) { Util.ShowToastNotification("Game stopped", "A player has left the game."); App.Game.StopGame(); } break; default: //Do nothing break; } } private void PlayerJoined(string username) { //Event will be handled by the game manager App.Game.AddPlayer(username); } private void PlayerRemoved(string username) { //Event will be handled by the game manager App.Game.RemovePlayer(username); } public JObject Message(Command c, string msg) { return JObject.FromObject(new { command = c.ToString(), msg = msg }); } public async Task SendHi() { JObject obj = JObject.FromObject(new { command = Command.Hi.ToString() }); await App.Network.Write(obj.ToString(Formatting.None)); } //API stuff public async Task JoinGame() { JObject obj = JObject.FromObject(new { command = Command.Name.ToString(), name = Settings.Username, lon = App.Geo.Position.Coordinate.Point.Position.Longitude, lat = App.Geo.Position.Coordinate.Point.Position.Latitude }); await App.Network.Write(obj.ToString(Formatting.None)); return true; } public async Task LeaveGame() { JObject obj = JObject.FromObject(new { command = Command.PlayerRemoved.ToString(), name = Settings.Username }); await App.Network.Write(obj.ToString(Formatting.None)); return true; } public async Task SendPhoto(string url) { JObject obj = JObject.FromObject(new { command = Command.PictureUrl.ToString(), PictureUrl = url, lon = App.Geo.Position.Coordinate.Point.Position.Longitude, lat = App.Geo.Position.Coordinate.Point.Position.Latitude }); await App.Network.Write(obj.ToString(Formatting.None)); return true; } public async Task DestinationReached() { JObject obj = JObject.FromObject(new { command = Command.DestinationReached.ToString(), username = Settings.Username }); await App.Network.Write(obj.ToString(Formatting.None)); return true; } public async Task Ready() { JObject obj = JObject.FromObject(new { command = Command.PlayerReady.ToString(), ready = true }); await App.Network.Write(obj.ToString(Formatting.None)); return true; } } }