public void DataMessageFromExchangeRequestAddresseeReceived()
        {
            InitGameMaster();
            var sender    = GetPlayer("testGUID-1111", 1, TeamColour.blue, ActionType.none);
            var addressee = GetPlayer("testGUID-9999", 9, TeamColour.blue, ActionType.none);

            sender.SetLocation(1, 3);
            addressee.SetLocation(2, 6);

            defaultGameMaster.RegisterPlayer(sender, sender.GUID, findFreeLocationAndPlacePlayer: false);
            defaultGameMaster.RegisterPlayer(addressee, addressee.GUID, findFreeLocationAndPlacePlayer: false);

            defaultGameMaster.exchangeRequestList.Add(new ExchengeRequestContainer(1, 9));
            defaultGameMaster.exchangeRequestList[0].SenderData = new DataMessage(9);

            var msg = new DataMessage(1);

            // action
            var result = defaultGameMaster.HandleData(msg);

            var message1 = (Data)MessageParser.Deserialize(result[0]);
            var message2 = (Data)MessageParser.Deserialize(result[1]);

            // assert
            Assert.AreEqual(typeof(string[]), result.GetType());
            Assert.IsTrue(result.Length == 2);
            Assert.IsTrue(defaultGameMaster.exchangeRequestList.Count == 0);
            Assert.AreEqual(1ul, message1.playerId);
            Assert.AreEqual(9ul, message2.playerId);
        }
Exemple #2
0
        // This is all a hack until VSSDK LanguageServer can handle workspace folders and dynamic registration
        private Tuple <StreamData, bool> OnSendToServer(StreamData data)
        {
            var message = MessageParser.Deserialize(data);

            if (message != null)
            {
                if (_isDebugging)
                {
                    System.Diagnostics.Debug.WriteLine($"*** Sending pylance: {message.ToString()}");
                }
                try {
                    // If this is the initialize method, add the workspace folders capability
                    if (message.Value <string>("method") == "initialize")
                    {
                        if (message.TryGetValue("params", out JToken messageParams))
                        {
                            var capabilities = messageParams["capabilities"];
                            if (capabilities != null)
                            {
                                if (capabilities["workspace"] == null)
                                {
                                    capabilities["workspace"] = JToken.FromObject(new { });
                                }
                                capabilities["workspace"]["workspaceFolders"] = true;
                                capabilities["workspace"]["didChangeWatchedFiles"]["dynamicRegistration"] = true;
                                capabilities["workspace"]["configuration"] = true;

                                // Root path and root URI should not be sent. They're deprecated and will
                                // just confuse pylance with respect to what is the root folder.
                                // https://microsoft.github.io/language-server-protocol/specifications/specification-current/#initialize
                                // Setting them to empty will make pylance think they're gone.
                                messageParams["rootPath"] = "";
                                messageParams["rootUri"]  = "";

                                // Need to rewrite the message now.
                                _modifiedInitialize = true;
                                return(Tuple.Create(MessageParser.Serialize(message), false));
                            }
                        }
                    }
                } catch {
                    // Don't care if this happens. Just skip the message
                }
            }

            // Return the tuple that indicates if we need to keep listening or not
            // We need to keep listening if debugging or haven't modified initialize yet
            return(Tuple.Create(data, !_modifiedInitialize || _isDebugging));
        }
Exemple #3
0
        public static IAgentMessage GetObjectFromXML(string message)
        {
            if (string.IsNullOrWhiteSpace(message))
            {
                ConsoleWriter.Show("Read empty or whitespace message.");
                return(null);
            }
            var xmlDoc = new XmlDocument();

            try
            {
                xmlDoc.LoadXml(message);
            }
            catch (Exception e)
            {
                ConsoleWriter.Error("Could not load message to XML. \nMessage content: \n" + message);
                return(new ErrorMessageAgent("ReadingMessage", "Error during proccessing XML, incorrect syntax\n Message read: " + message, "GetObjectFromXML", xmlDoc)); //xmlDoc as default for other actions
            }
            if (xmlDoc == null)
            {
                return(new ErrorMessageAgent("ReadingMessage", "Error during proccessing XML, incorrect syntax\n Message read: " + message, "GetObjectFromXML", xmlDoc)); //xmlDoc as default for other actions
            }

            switch (xmlDoc.DocumentElement.Name)
            {
            case nameof(RegisteredGames):
                var registeredGames = MessageParser.Deserialize <RegisteredGames>(message);
                return(new RegisteredGamesAgent(registeredGames.GameInfo?.Select(q => new GameArea.GameObjects.GameInfo(q.gameName, q.redTeamPlayers, q.blueTeamPlayers)).ToArray()));

            case nameof(ConfirmJoiningGame):
                var confirmJoin = MessageParser.Deserialize <ConfirmJoiningGame>(message);
                return(new ConfirmJoiningGameAgent(confirmJoin.gameId, new GameArea.GameObjects.Player(confirmJoin.PlayerDefinition.id,
                                                                                                       confirmJoin.PlayerDefinition.team,
                                                                                                       confirmJoin.PlayerDefinition.role),
                                                   confirmJoin.privateGuid,
                                                   confirmJoin.playerId));

            case nameof(RejectJoiningGame):
                var rejectJoin = MessageParser.Deserialize <RejectJoiningGame>(message);
                return(new RejectJoiningGameAgent(rejectJoin.gameName, rejectJoin.playerId));

            case nameof(Game):
                var game = MessageParser.Deserialize <Game>(message);

                GameArea.GameObjects.Player[] players;
                if (game.Players != null)
                {
                    players = game.Players.Select(q => new GameArea.GameObjects.Player(q.id, q.team, q.role)).ToArray();
                }
                else
                {
                    players = null;
                }

                return(new GameAgent(game.playerId)
                {
                    Board = new GameArea.GameObjects.GameBoard((int)game.Board.width,
                                                               (int)game.Board.tasksHeight,
                                                               (int)game.Board.goalsHeight),
                    PlayerLocation = new GameArea.GameObjects.Location((int)game.PlayerLocation.x,
                                                                       (int)game.PlayerLocation.y),
                    Players = players
                });

            case nameof(Messages.GameMasterDisconnectedMessage):
                var gmDisconnected = MessageParser.Deserialize <Messages.GameMasterDisconnectedMessage>(message);
                return(new GameMasterDisconnectedMessageAgent(gmDisconnected.gameId));

            case nameof(Data):
                var data = MessageParser.Deserialize <Data>(message);

                GameArea.GameObjects.GoalField[] goals;
                if (data.GoalFields != null)
                {
                    goals = data.GoalFields.Select(q => new GameArea.GameObjects.GoalField((int)q.x, (int)q.y,
                                                                                           DateTime.Now, q.team, q.type,
                                                                                           q.playerIdSpecified ? new GameArea.GameObjects.Player(q.playerId) : null)
                    {
                        PlayerId = q.playerIdSpecified ? (long)q.playerId : -1
                    }).ToArray();
                }
                else
                {
                    goals = null;
                }

                GameArea.GameObjects.Piece[] pieces;
                if (data.Pieces != null)
                {
                    pieces = data.Pieces.Select(q => new GameArea.GameObjects.Piece(q.id, q.timestamp, q.type, (q.playerIdSpecified ? (long)q.playerId : -1))).ToArray();
                }
                else
                {
                    pieces = null;
                }

                GameArea.GameObjects.TaskField[] tasks;
                if (data.TaskFields != null)
                {
                    tasks = data.TaskFields.Select(q => new GameArea.GameObjects.TaskField((int)q.x,
                                                                                           (int)q.y,
                                                                                           DateTime.Now,
                                                                                           q.distanceToPiece,
                                                                                           (q.pieceIdSpecified ? new GameArea.GameObjects.Piece(q.pieceId, DateTime.Now) : null),
                                                                                           (q.playerIdSpecified ? new GameArea.GameObjects.Player(q.playerId) : null))
                    {
                        PlayerId = q.playerIdSpecified ? (long)q.playerId : -1
                    }).ToArray();
                }
                else
                {
                    tasks = null;
                }

                return(new DataAgent(data.playerId)
                {
                    GameFinished = data.gameFinished,
                    Goals = goals,
                    Pieces = pieces,
                    PlayerGUID = data.playerGuid,
                    PlayerLocation = data.PlayerLocation != null ? new GameArea.GameObjects.Location((int)data.PlayerLocation.x, (int)data.PlayerLocation.y) : null,
                    Tasks = tasks
                });

            case nameof(Configuration.PlayerSettings):
                var settings = MessageParser.Deserialize <Configuration.PlayerSettings>(message);
                return(new PlayerSettingsAgent(settings));

            case nameof(Messages.KnowledgeExchangeRequest):
                var exchangeRequest = MessageParser.Deserialize <Messages.KnowledgeExchangeRequest>(message);
                return(new KnowledgeExchangeRequestAgent(exchangeRequest.playerId, exchangeRequest.senderPlayerId));

            case nameof(Messages.RejectKnowledgeExchange):
                var requestRejection = MessageParser.Deserialize <Messages.RejectKnowledgeExchange>(message);
                return(new RejectKnowledgeExchangeAgent(requestRejection.playerId, requestRejection.senderPlayerId, requestRejection.permanent, requestRejection.playerGuid));

            default:
                return(new ErrorMessageAgent("ReadingMessage", "Warning during reading message to server object, type not recognised\n Message read: " + message, "GetObjectFromXML", xmlDoc));    //xmlDoc as default for other actions
            }
        }
Exemple #4
0
        public static IGMMessage GetObjectFromXML(string message)
        {
            if (string.IsNullOrWhiteSpace(message))
            {
                ConsoleWriter.Show("Read empty or whitespace message.");
                return(null);
            }
            var xmlDoc = new XmlDocument();

            try
            {
                xmlDoc.LoadXml(message);
            }
            catch (Exception e)
            {
                ConsoleWriter.Error("Could not load message to XML. \nMessage content: \n" + message);
                return(new ErrorMessageGM("ReadingMessage", "Warning during reading message to server object, type not recognised\n Message read: " + message, "GetObjectFromXML", xmlDoc));
            }
            switch (xmlDoc.DocumentElement.Name)
            {
            case nameof(TestPiece):
                var test = MessageParser.Deserialize <TestPiece>(message);
                return(new TestPieceGM(test.playerGuid, test.gameId));

            case nameof(DestroyPiece):
                var destroy = MessageParser.Deserialize <DestroyPiece>(message);
                return(new DestroyPieceGM(destroy.playerGuid, destroy.gameId));

            case nameof(PlacePiece):
                var place = MessageParser.Deserialize <PlacePiece>(message);
                return(new PlacePieceGM(place.playerGuid, place.gameId));

            case nameof(PickUpPiece):
                var pick = MessageParser.Deserialize <PickUpPiece>(message);
                return(new PickUpPieceGM(pick.playerGuid, pick.gameId));

            case nameof(Move):
                var move = MessageParser.Deserialize <Move>(message);
                return(new MoveGM(move.playerGuid, move.gameId, (MoveType?)move.direction));

            case nameof(Discover):
                var discover = MessageParser.Deserialize <Discover>(message);
                return(new DiscoverGM(discover.playerGuid, discover.gameId));

            case nameof(RejectGameRegistration):
                var reject = MessageParser.Deserialize <RejectGameRegistration>(message);
                return(new RejectGameRegistrationGM(reject.gameName));

            case nameof(ConfirmGameRegistration):
                var confirm = MessageParser.Deserialize <ConfirmGameRegistration>(message);
                return(new ConfirmGameRegistrationGM(confirm.gameId));

            case nameof(JoinGame):
                var join = MessageParser.Deserialize <JoinGame>(message);
                return(new JoinGameGM(join.gameName, join.preferredTeam, join.preferredRole, (long)join.playerId));

            case nameof(PlayerDisconnected):
                var playerDisconnected = MessageParser.Deserialize <PlayerDisconnected>(message);
                return(new PlayerDisconnectedGM(playerDisconnected.playerId));

            case nameof(Configuration.GameMasterSettings):
                var settings = MessageParser.Deserialize <Configuration.GameMasterSettings>(message);
                return(new GameMasterSettingsGM(settings));

            case nameof(AuthorizeKnowledgeExchange):
                var authMsg = MessageParser.Deserialize <AuthorizeKnowledgeExchange>(message);
                return(new AuthorizeKnowledgeExchangeGM(authMsg.playerGuid, authMsg.gameId, authMsg.withPlayerId));

            case nameof(RejectKnowledgeExchange):
                var rejectExchange = MessageParser.Deserialize <RejectKnowledgeExchange>(message);
                return(new RejectKnowledgeExchangeGM(rejectExchange.playerId, rejectExchange.senderPlayerId, rejectExchange.permanent, rejectExchange.playerGuid));

            case nameof(AcceptExchangeRequest):
                var acceptMsg = MessageParser.Deserialize <AcceptExchangeRequest>(message);
                return(new AcceptExchangeRequestGM(acceptMsg.playerId, acceptMsg.senderPlayerId));

            // zalatwic roznice typow TaskField i GoalField nizej - najlepiej konstruktory biorace obiekt z namespace Messages
            case nameof(SuggestAction):
                var suggestMsg = MessageParser.Deserialize <SuggestAction>(message);
                List <GameArea.GameObjects.TaskField> tasks = new List <GameArea.GameObjects.TaskField>();
                List <GameArea.GameObjects.GoalField> goals = new List <GameArea.GameObjects.GoalField>();
                foreach (var t in suggestMsg.TaskFields)
                {
                    tasks.Add(new GameArea.GameObjects.TaskField(t));
                }
                foreach (var g in suggestMsg.GoalFields)
                {
                    goals.Add(new GameArea.GameObjects.GoalField(g));
                }

                return(new SuggestActionGM(suggestMsg.playerId, suggestMsg.senderPlayerId, suggestMsg.playerGuid, suggestMsg.gameId, tasks.ToArray(), goals.ToArray()));

            //case nameof(SuggestActionResponse):
            //    var answer = MessageParser.Deserialize<SuggestActionResponse>(message);
            //    List<GameArea.GameObjects.TaskField> task = new List<GameArea.GameObjects.TaskField>();
            //    List<GameArea.GameObjects.GoalField> goal = new List<GameArea.GameObjects.GoalField>();
            //    foreach (var t in answer.TaskFields)
            //        task.Add(new GameArea.GameObjects.TaskField(t));
            //    foreach (var g in answer.GoalFields)
            //        goal.Add(new GameArea.GameObjects.GoalField(g));
            //    return new SuggestActionResponseGM(answer.playerId, answer.senderPlayerId, answer.playerGuid, answer.gameId, task.ToArray(), goal.ToArray());
            case nameof(Data):
                var data = MessageParser.Deserialize <Data>(message);
                return(new DataGM(data));


            default:
                return(new ErrorMessageGM("ReadingMessage", "Warning during reading message to server object, type not recognised\n Message read: " + message, "GetObjectFromXML", xmlDoc));    //xmlDoc as default for other actions
            }
        }
Exemple #5
0
        public void Log(string message)
        {
            if (string.IsNullOrWhiteSpace(message))
            {
                ConsoleWriter.Show("Read empty or whitespace message.");
                return;
            }
            var xmlDoc = new XmlDocument();

            try
            {
                xmlDoc.LoadXml(message);
            }
            catch (Exception e)
            {
                ConsoleWriter.Error("Could not load message to XML. \nMessage content: \n" + message);
                return;
            }
            if (xmlDoc == null)
            {
                ConsoleWriter.Error("Could not load message to XML. \nMessage content: \n" + message);
            }


            var gameId = gameMaster.GameId;

            string playerGuid;
            ulong  playerId;

            Player.Player player = null;

            string nameMessage = xmlDoc.DocumentElement.Name;

            switch (nameMessage)
            {
            case nameof(TestPiece):
                var test = MessageParser.Deserialize <TestPiece>(message);
                playerGuid = test.playerGuid;
                player     = gameMaster.GetPlayerByGuid(playerGuid);
                break;

            case nameof(DestroyPiece):
                var destroy = MessageParser.Deserialize <DestroyPiece>(message);
                playerGuid = destroy.playerGuid;
                player     = gameMaster.GetPlayerByGuid(playerGuid);
                break;

            case nameof(PlacePiece):
                var place = MessageParser.Deserialize <PlacePiece>(message);
                playerGuid = place.playerGuid;
                player     = gameMaster.GetPlayerByGuid(playerGuid);
                break;

            case nameof(PickUpPiece):
                var pick = MessageParser.Deserialize <PickUpPiece>(message);
                playerGuid = pick.playerGuid;
                player     = gameMaster.GetPlayerByGuid(playerGuid);
                break;

            case nameof(Move):
                var move = MessageParser.Deserialize <Move>(message);
                playerGuid = move.playerGuid;
                player     = gameMaster.GetPlayerByGuid(playerGuid);
                break;

            case nameof(Discover):
                var discover = MessageParser.Deserialize <Discover>(message);
                playerGuid = discover.playerGuid;
                player     = gameMaster.GetPlayerByGuid(playerGuid);
                break;

            case nameof(RejectGameRegistration):
                var reject = MessageParser.Deserialize <RejectGameRegistration>(message);
                break;

            case nameof(ConfirmGameRegistration):
                var confirm = MessageParser.Deserialize <ConfirmGameRegistration>(message);
                break;

            case nameof(JoinGame):
                var join = MessageParser.Deserialize <JoinGame>(message);
                playerId = join.playerId;
                player   = gameMaster.GetPlayerById(playerId);
                break;

            case nameof(PlayerDisconnected):
                var playerDisconnected = MessageParser.Deserialize <PlayerDisconnected>(message);
                playerId = playerDisconnected.playerId;
                player   = gameMaster.GetPlayerById(playerId);
                break;

            case nameof(Configuration.GameMasterSettings):
                var settings = MessageParser.Deserialize <Configuration.GameMasterSettings>(message);
                break;

            case nameof(AuthorizeKnowledgeExchange):
                var authMsg = MessageParser.Deserialize <AuthorizeKnowledgeExchange>(message);
                playerGuid = authMsg.playerGuid;
                break;

            case nameof(RejectKnowledgeExchange):
                var rejectExchange = MessageParser.Deserialize <RejectKnowledgeExchange>(message);
                playerGuid = rejectExchange.playerGuid;
                player     = gameMaster.GetPlayerByGuid(playerGuid);
                break;

            case nameof(AcceptExchangeRequest):
                var acceptMsg = MessageParser.Deserialize <AcceptExchangeRequest>(message);
                playerId = acceptMsg.playerId;
                player   = gameMaster.GetPlayerById(playerId);
                break;

            // zalatwic roznice typow TaskField i GoalField nizej - najlepiej konstruktory biorace obiekt z namespace Messages
            //case nameof(SuggestAction):
            //    var suggestMsg = MessageParser.Deserialize<SuggestAction>(message);
            //    return new SuggestActionGM(suggestMsg.playerId, suggestMsg.senderPlayerId, suggestMsg.playerGuid, suggestMsg.gameId, suggestMsg.TaskFields, suggestMsg.GoalFields);
            //case nameof(SuggestActionResponse):
            //    var answer = MessageParser.Deserialize<SuggestActionResponse>(message);
            //    return new SuggestActionResponseGM(answer.playerId, answer.senderPlayerId, answer.playerGuid, answer.TaskFields, answer.GoalFields);
            case nameof(Data):
                var data = MessageParser.Deserialize <Data>(message);
                playerGuid = data.playerGuid;
                player     = gameMaster.GetPlayerByGuid(playerGuid);
                break;

            default:
                ConsoleWriter.Error("Could not load message to XML. \nMessage content: \n" + message);
                break;
            }

            //mainLogger.Log(decision, description);

            StreamWriter sw        = new StreamWriter(nameGameMasterLogger, true);
            var          dt        = DateTime.Now;
            String       timestamp = String.Format("{0:yyyy-MM-dd}" + "T" + "{1:HH:mm:ss.fff}", dt, dt);

            string stringPlayerId     = "";
            string stringPlayerGuid   = "";
            string stringColourPlayer = "";
            string stringRole         = "";

            if (player != null)
            {
                stringPlayerId     = player.ID.ToString();
                stringPlayerGuid   = player.GUID.ToString();
                stringColourPlayer = player.Team.ToString();
                stringRole         = player.Role.ToString();
            }

            sw.WriteLine($"{nameMessage},{timestamp},{gameId},{stringPlayerId},{stringPlayerGuid},{stringColourPlayer},{stringRole}");
            sw.Close();
        }