private void SendUpdate(Stream dst) { var str = new StringBuilder(); str.Append("<>"); str.Append("<type>updBuddyList</type>"); foreach (var friend in chat.Friends) { str.Append($"<buddy>{friend.Name}</buddy>"); } str.Append("</>"); var header = new MaestroMessageHeader(MaestroMessageType.CHATMESSAGE_TO_GAME, str.Length); var payload = str.ToString().GetBytes(); dst.WriteStruct(header); dst.Write(payload); str.Clear(); str.Append("<>"); str.Append("<type>updIgnoreList</type>"); str.Append("</>"); header = new MaestroMessageHeader(MaestroMessageType.CHATMESSAGE_TO_GAME, str.Length); payload = str.ToString().GetBytes(); dst.WriteStruct(header); dst.Write(payload); }
private void ConnectLoop() { server.Start(); using (var socket = server.AcceptSocket()) using (var stream = new NetworkStream(socket)) { Session.Log("Maestro connected"); try { while (socket.Connected) { var header = stream.ReadStruct <MaestroMessageHeader>(); var payload = new byte[header.Size]; stream.ReadFully(payload, 0, payload.Length); switch (header.Type) { case MaestroMessageType.HEARTBEAT: var beat = new MaestroMessageHeader(MaestroMessageType.HEARTBEAT, 0); stream.WriteStruct(beat); break; case MaestroMessageType.ACK: //ignore? break; case MaestroMessageType.CHATMESSAGE_FROM_GAME: var str = Encoding.UTF8.GetString(payload); var xml = new XmlDocument(); xml.LoadXml($"<root>{str}</root>"); var type = xml.SelectSingleNode("/root/type").InnerText; switch (type) { case "rqUpdate": SendUpdate(stream); break; case "sndMessage": var name = xml.SelectSingleNode("/root/summoner").InnerText; var msg = xml.SelectSingleNode("/root/message").InnerText; var friend = chat.Friends.SingleOrDefault(f => f.Name == name); chat.SendMessage(friend.User, msg); break; default: Session.Log($"Unknown Maestro message type: {type}"); break; } goto default; default: var ack = new MaestroMessageHeader(MaestroMessageType.ACK, 0); stream.WriteStruct(ack); break; } Debug.WriteLine(header.Type + " (GAME): "); if (payload.Any()) { Debug.WriteLine(" " + Encoding.UTF8.GetString(payload)); } } } catch { this.GameClientClosed?.Invoke(this, EventArgs.Empty); Session.Log("Maestro disconnected"); } } }