/// <summary> /// Registers a callback to the specified channel. callback argument is guaranteed to be a byte[] encoded MessagePackSerializableObject object /// Use SerializationUtilities to deserialize to the correct message, which should be paired to the channel /// </summary> public void Subscribe(MessageTypes channel, EventHandler <NetworkMessageContainer> callback) { _sub.Subscribe(channel.ToString(), (rc, rv) => { try { callback(this, SerializationUtilities.DeserializeMsgPack <NetworkMessageContainer>(rv)); } catch (Exception e) { ConsoleManager.WriteLine("Redis exception! " + e.Message, ConsoleMessageType.Error); ConsoleManager.WriteLine(e.StackTrace, ConsoleMessageType.Error); } }); }
protected T DeserializeMsgPack <T>(string key, RedisValue rawData) where T : MessagePackSerializableObject, new() { var encodedData = (byte[])rawData; if (encodedData == null) { _logError(new MsgPackMissingDataException("Data null when fetching from Redis"), key, rawData); return(null); } try { _logDebug("Deserializing Redis message", key, rawData); return(SerializationUtilities.DeserializeMsgPack <T>(encodedData)); } catch (Exception e) { _logError(e, key, rawData); return(null); } }
private void ProcessMessage(IGameTimeService gameTime, NetIncomingMessage msg) { var messageContainer = SerializationUtilities.DeserializeMsgPack <NetworkMessageContainer>(msg); if (messageContainer == null) { ConsoleManager.WriteLine("Corrupt message received", ConsoleMessageType.Warning); return; } #if DEBUG if (messageContainer.MessageType != MessageTypes.PositionUpdateData && messageContainer.MessageType != MessageTypes.FireRequestResponse) { //ConsoleManager.WriteLine(messageContainer.MessageType + " Message Received", ConsoleMessageType.NetworkMessageType); } #endif switch (messageContainer.MessageType) // Add new message types to this. { case MessageTypes.EnterColony: { ChangeGameState = true; NextState = GameStateType.Colony; break; } case MessageTypes.PortDockApproval: { ChangeGameState = true; NextState = GameStateType.Port; break; } case MessageTypes.PlanetLandApproval: { ChangeGameState = true; NextState = GameStateType.Planet; break; } case MessageTypes.StarSystemData: { ChangeGameState = true; NextState = GameStateType.Space; break; } case MessageTypes.WarpApproval: { ChangeGameState = true; NextState = GameStateType.Space; break; } #region Receive Port Ship case MessageTypes.ReceiveNewPortShip: { break; } #endregion #region Receive Heartbeat case (MessageTypes.ServerHeartbeat): _clientManager.LastSentServerTimeSync = gameTime.TotalMilliseconds; break; #endregion #region Chat Message case (MessageTypes.ChatMessage): { var data = messageContainer.MessageData as MessageChatMessage; _chatManager.AddChat(data.ChatMessageData.ChatJson, data.ChatMessageData.MetaJson); //Reads chat type and content, displays to chatbox break; } #endregion default: //Console.WriteLine("Unsupported message type " + (MessageTypes)messageHeader + " received"); break; } _networkingService.TriggerMessageReceived(messageContainer); }
public void UnSubscribe(ChannelTypes channelType, int channelID, EventHandler <NetworkMessageContainer> callback) { _sub.Unsubscribe(channelType.ToString() + channelID.ToString(), (rc, rv) => { callback(this, SerializationUtilities.DeserializeMsgPack <NetworkMessageContainer>(rv)); }); }