コード例 #1
0
ファイル: Maestro.cs プロジェクト: uvbs/LeagueClient-v2
        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);
        }
コード例 #2
0
ファイル: Maestro.cs プロジェクト: uvbs/LeagueClient-v2
        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");
                    }
                }
        }