private bool GetAuthKey() { try { StringBuilder sb = new StringBuilder(); string payload = "user="******",password="******"payload=" + payload; if (useGarena) { payload = reToken(garenaToken); query = "payload=8393%20" + payload; } WebRequest con = WebRequest.Create(loginQueue + "login-queue/rest/queue/authenticate"); con.Method = "POST"; Stream outputStream = con.GetRequestStream(); outputStream.Write(Encoding.ASCII.GetBytes(query), 0, Encoding.ASCII.GetByteCount(query)); WebResponse webresponse = con.GetResponse(); Stream inputStream = webresponse.GetResponseStream(); int c; while ((c = inputStream.ReadByte()) != -1) { sb.Append((char)c); } TypedObject result = serializer.Deserialize <TypedObject>(sb.ToString()); outputStream.Close(); inputStream.Close(); con.Abort(); if (!result.ContainsKey("token")) { int node = (int)result.GetInt("node"); string champ = result.GetString("champ"); int rate = (int)result.GetInt("rate"); int delay = (int)result.GetInt("delay"); int id = 0; int cur = 0; object[] tickers = result.GetArray("tickers"); foreach (object o in tickers) { Dictionary <string, object> to = (Dictionary <string, object>)o; int tnode = (int)to["node"]; if (tnode != node) { continue; } id = (int)to["id"]; cur = (int)to["current"]; break; } while (id - cur > rate) { sb.Clear(); if (OnLoginQueueUpdate != null) { OnLoginQueueUpdate(this, id - cur); } con = WebRequest.Create(loginQueue + "login-queue/rest/queue/ticker/" + champ); con.Method = "GET"; webresponse = con.GetResponse(); inputStream = webresponse.GetResponseStream(); int d; while ((d = inputStream.ReadByte()) != -1) { sb.Append((char)d); } result = serializer.Deserialize <TypedObject>(sb.ToString()); inputStream.Close(); con.Abort(); if (result == null) { continue; } cur = HexToInt(result.GetString(node.ToString())); } while (sb.ToString() == null || !result.ContainsKey("token")) { sb.Clear(); if (id - cur < 0) { if (OnLoginQueueUpdate != null) { OnLoginQueueUpdate(this, 0); } else if (OnLoginQueueUpdate != null) { OnLoginQueueUpdate(this, id - cur); } } con = WebRequest.Create(loginQueue + "login-queue/rest/queue/authToken/" + user.ToLower()); con.Method = "GET"; try { using (WebResponse nWebresponse = con.GetResponse()) { using (Stream nInputStream = nWebresponse.GetResponseStream()) { int f; while ((f = nInputStream.ReadByte()) != -1) { sb.Append((char)f); } result = serializer.Deserialize <TypedObject>(sb.ToString()); } } } catch (WebException e) { if (e.Status == WebExceptionStatus.ProtocolError && e.Response != null) { var response = (HttpWebResponse)e.Response; if (response.StatusCode == HttpStatusCode.NotFound) { Thread.Sleep(50); continue; } else { Debug.WriteLine(e.Message); } } } inputStream.Close(); con.Abort(); } } if (OnLoginQueueUpdate != null) { OnLoginQueueUpdate(this, 0); } authToken = result.GetString("token"); if (useGarena) { userID = result.GetString("token"); } return(true); } catch (Exception e) { if (e.Message == "The remote name could not be resolved: '" + loginQueue + "'") { Error("Please make sure you are connected the internet!", ErrorType.AuthKey); Disconnect(); } else if (e.Message == "The remote server returned an error: (403) Forbidden.") { Error("Your username or password is incorrect!", ErrorType.Password); Disconnect(); } else if (e.Message == "The given key was not present in the dictionary.") { Error("The given key was not present in the dictionary. Client version is wrong maybe?", ErrorType.AuthKey); Disconnect(); } else { Error("Unable to get Auth Key \n" + e, ErrorType.AuthKey); Disconnect(); } return(false); } }
private void BeginReceive() { decodeThread = new Thread(() => { try { Dictionary <int, Packet> previousReceivedPacket = new Dictionary <int, Packet>(); Dictionary <int, Packet> currentPackets = new Dictionary <int, Packet>(); while (true) { #region Basic Header byte basicHeader = (byte)sslStream.ReadByte(); List <byte> basicHeaderStorage = new List <byte>(); if ((int)basicHeader == 255) { Disconnect(); } int channel = 0; //1 Byte Header if ((basicHeader & 0x03) != 0) { channel = basicHeader & 0x3F; basicHeaderStorage.Add(basicHeader); } //2 Byte Header else if ((basicHeader & 0x01) != 0) { byte byte2 = (byte)sslStream.ReadByte(); channel = 64 + byte2; basicHeaderStorage.Add(basicHeader); basicHeaderStorage.Add(byte2); } //3 Byte Header else if ((basicHeader & 0x02) != 0) { byte byte2 = (byte)sslStream.ReadByte(); byte byte3 = (byte)sslStream.ReadByte(); basicHeaderStorage.Add(basicHeader); basicHeaderStorage.Add(byte2); basicHeaderStorage.Add(byte3); channel = 64 + byte2 + (256 * byte3); } #endregion Basic Header #region Message Header int headerType = (basicHeader & 0xC0); int headerSize = 0; if (headerType == 0x00) { headerSize = 12; } else if (headerType == 0x40) { headerSize = 8; } else if (headerType == 0x80) { headerSize = 4; } else if (headerType == 0xC0) { headerSize = 0; } // Retrieve the packet or make a new one if (!currentPackets.ContainsKey(channel)) { currentPackets.Add(channel, new Packet()); } Packet p = currentPackets[channel]; p.AddToRaw(basicHeaderStorage.ToArray()); if (headerSize == 12) { //Timestamp byte[] timestamp = new byte[3]; for (int i = 0; i < 3; i++) { timestamp[i] = (byte)sslStream.ReadByte(); p.AddToRaw(timestamp[i]); } //Message Length byte[] messageLength = new byte[3]; for (int i = 0; i < 3; i++) { messageLength[i] = (byte)sslStream.ReadByte(); p.AddToRaw(messageLength[i]); } int size = 0; for (int i = 0; i < 3; i++) { size = size * 256 + (messageLength[i] & 0xFF); } p.SetSize(size); //Message Type int messageType = sslStream.ReadByte(); p.AddToRaw((byte)messageType); p.SetType(messageType); //Message Stream ID byte[] messageStreamID = new byte[4]; for (int i = 0; i < 4; i++) { messageStreamID[i] = (byte)sslStream.ReadByte(); p.AddToRaw(messageStreamID[i]); } } else if (headerSize == 8) { //Timestamp byte[] timestamp = new byte[3]; for (int i = 0; i < 3; i++) { timestamp[i] = (byte)sslStream.ReadByte(); p.AddToRaw(timestamp[i]); } //Message Length byte[] messageLength = new byte[3]; for (int i = 0; i < 3; i++) { messageLength[i] = (byte)sslStream.ReadByte(); p.AddToRaw(messageLength[i]); } int size = 0; for (int i = 0; i < 3; i++) { size = size * 256 + (messageLength[i] & 0xFF); } p.SetSize(size); //Message Type int messageType = sslStream.ReadByte(); p.AddToRaw((byte)messageType); p.SetType(messageType); } else if (headerSize == 4) { //Timestamp byte[] timestamp = new byte[3]; for (int i = 0; i < 3; i++) { timestamp[i] = (byte)sslStream.ReadByte(); p.AddToRaw(timestamp[i]); } if (p.GetSize() == 0 && p.GetPacketType() == 0) { if (previousReceivedPacket.ContainsKey(channel)) { p.SetSize(previousReceivedPacket[channel].GetSize()); p.SetType(previousReceivedPacket[channel].GetPacketType()); } } } else if (headerSize == 0) { if (p.GetSize() == 0 && p.GetPacketType() == 0) { if (previousReceivedPacket.ContainsKey(channel)) { p.SetSize(previousReceivedPacket[channel].GetSize()); p.SetType(previousReceivedPacket[channel].GetPacketType()); } } } #endregion Message Header #region Message Body //DefaultChunkSize is 128 for (int i = 0; i < 128; i++) { byte b = (byte)sslStream.ReadByte(); p.Add(b); p.AddToRaw(b); if (p.IsComplete()) { break; } } if (!p.IsComplete()) { continue; } if (previousReceivedPacket.ContainsKey(channel)) { previousReceivedPacket.Remove(channel); } previousReceivedPacket.Add(channel, p); if (currentPackets.ContainsKey(channel)) { currentPackets.Remove(channel); } #endregion Message Body // Decode result TypedObject result; RTMPSDecoder decoder = new RTMPSDecoder(); if (p.GetPacketType() == 0x14) // Connect { result = decoder.DecodeConnect(p.GetData()); } else if (p.GetPacketType() == 0x11) // Invoke { result = decoder.DecodeInvoke(p.GetData()); } else if (p.GetPacketType() == 0x06) // Set peer bandwidth { byte[] data = p.GetData(); int windowSize = 0; for (int i = 0; i < 4; i++) { windowSize = windowSize * 256 + (data[i] & 0xFF); } int type = data[4]; continue; } else if (p.GetPacketType() == 0x05) // Window Acknowledgement Size { byte[] data = p.GetData(); int windowSize = 0; for (int i = 0; i < 4; i++) { windowSize = windowSize * 256 + (data[i] & 0xFF); } continue; } else if (p.GetPacketType() == 0x03) // Ack { byte[] data = p.GetData(); int ackSize = 0; for (int i = 0; i < 4; i++) { ackSize = ackSize * 256 + (data[i] & 0xFF); } continue; } else if (p.GetPacketType() == 0x02) //ABORT { byte[] data = p.GetData(); continue; } else if (p.GetPacketType() == 0x01) //MaxChunkSize { byte[] data = p.GetData(); continue; } else // Skip most messages { continue; } // Store result int?id = result.GetInt("invokeId"); //Check to see if the result is valid. //If it isn't, give an error and remove the callback if there is one. if (result["result"].Equals("_error")) { System.Diagnostics.Debug.WriteLine(result.GetTO("data")["faultString"]); Error(GetErrorMessage(result), GetErrorCode(result), ErrorType.Receive); } if (result["result"].Equals("receive")) { if (result.GetTO("data") != null) { TypedObject to = result.GetTO("data"); if (to.ContainsKey("body")) { if (to["body"] is TypedObject) { new Thread(new ThreadStart(() => { TypedObject body = (TypedObject)to["body"]; if (body.type.Equals("com.riotgames.platform.game.GameDTO")) { MessageReceived(new GameDTO(body)); } else if (body.type.Equals("com.riotgames.platform.game.PlayerCredentialsDto")) { MessageReceived(new PlayerCredentialsDto(body)); } else if ( body.type.Equals("com.riotgames.platform.gameinvite.contract.InvitationRequest")) { MessageReceived(new InvitationRequest(body)); } else if ( body.type.Equals("com.riotgames.platform.gameinvite.contract.InvitationRequest")) { MessageReceived(new Inviter(body)); } else if ( body.type.Equals("com.riotgames.platform.serviceproxy.dispatch.LcdsServiceProxyResponse")) { MessageReceived(new LcdsServiceProxyResponse(body)); } else if ( body.type.Equals( "com.riotgames.platform.game.message.GameNotification")) { MessageReceived(new GameNotification(body)); } else if ( body.type.Equals( "com.riotgames.platform.matchmaking.SearchingForMatchNotification")) { MessageReceived(new SearchingForMatchNotification(body)); } else if ( body.type.Equals( "com.riotgames.platform.broadcast.BroadcastNotification")) { MessageReceived(new BroadcastNotification(body)); } else if ( body.type.Equals( "com.riotgames.platform.messaging.StoreAccountBalanceNotification")) { MessageReceived(new StoreAccountBalanceNotification(body)); } else if ( body.type.Equals( "com.riotgames.platform.messaging.persistence.SimpleDialogMessage")) { MessageReceived(new SimpleDialogMessage(body)); } else if ( body.type.Equals( "com.riotgames.platform.trade.api.contract.TradeContractDTO")) { MessageReceived(new TradeContractDTO(body)); } else if ( body.type.Equals( "com.riotgames.platform.statistics.EndOfGameStats")) { MessageReceived(new EndOfGameStats(body)); } else if ( body.type.Equals( "com.riotgames.platform.harassment.HarassmentReport")) { MessageReceived(new LobbyStatus(body)); } else if ( body.type.Equals( "com.riotgames.platform.gameinvite.contract.LobbyStatus")) { MessageReceived(new LobbyStatus(body)); } else if (body.type.Equals( "com.riotgames.platform.messaging.ClientLoginKickNotification")) { MessageReceived(new ClientLoginKickNotification(body)); } //MessageReceived(to["body"]); })).Start(); } } } //MessageReceived( } if (id == null) { continue; } if (id == 0) { } else if (callbacks.ContainsKey((int)id)) { RiotGamesObject cb = callbacks[(int)id]; callbacks.Remove((int)id); if (cb != null) { TypedObject messageBody = result.GetTO("data").GetTO("body"); new Thread(() => { cb.DoCallback(messageBody); }).Start(); } } else { results.Add((int)id, result); } pendingInvokes.Remove((int)id); } } catch (Exception e) { if (IsConnected()) { Error(e.Message, ErrorType.Receive); } //Disconnect(); } }); decodeThread.IsBackground = true; decodeThread.Start(); }
private bool GetAuthKey() { try { StringBuilder sb = new StringBuilder(); string payload = "user="******",password="******"payload=" + payload; if (useGarena) payload = garenaToken; WebRequest con = WebRequest.Create(loginQueue + "login-queue/rest/queue/authenticate"); con.Method = "POST"; Stream outputStream = con.GetRequestStream(); outputStream.Write(Encoding.ASCII.GetBytes(query), 0, Encoding.ASCII.GetByteCount(query)); WebResponse webresponse = con.GetResponse(); Stream inputStream = webresponse.GetResponseStream(); int c; while ((c = inputStream.ReadByte()) != -1) sb.Append((char)c); TypedObject result = serializer.Deserialize<TypedObject>(sb.ToString()); outputStream.Close(); inputStream.Close(); con.Abort(); if (!result.ContainsKey("token")) { int node = (int)result.GetInt("node"); string champ = result.GetString("champ"); int rate = (int)result.GetInt("rate"); int delay = (int)result.GetInt("delay"); int id = 0; int cur = 0; object[] tickers = result.GetArray("tickers"); foreach (object o in tickers) { Dictionary<string, object> to = (Dictionary<string, object>)o; int tnode = (int)to["node"]; if (tnode != node) continue; id = (int)to["id"]; cur = (int)to["current"]; break; } while (id - cur > rate) { sb.Clear(); if (OnLoginQueueUpdate != null) OnLoginQueueUpdate(this, id - cur); Thread.Sleep(delay); con = WebRequest.Create(loginQueue + "login-queue/rest/queue/ticker/" + champ); con.Method = "GET"; webresponse = con.GetResponse(); inputStream = webresponse.GetResponseStream(); int d; while ((d = inputStream.ReadByte()) != -1) sb.Append((char)d); result = serializer.Deserialize<TypedObject>(sb.ToString()); inputStream.Close(); con.Abort(); if (result == null) continue; cur = HexToInt(result.GetString(node.ToString())); } while (sb.ToString() == null || !result.ContainsKey("token")) { try { sb.Clear(); if (id - cur < 0) if (OnLoginQueueUpdate != null) OnLoginQueueUpdate(this, 0); else if (OnLoginQueueUpdate != null) OnLoginQueueUpdate(this, id - cur); Thread.Sleep(delay / 10); con = WebRequest.Create(loginQueue + "login-queue/rest/queue/authToken/" + user.ToLower()); con.Method = "GET"; webresponse = con.GetResponse(); inputStream = webresponse.GetResponseStream(); int f; while ((f = inputStream.ReadByte()) != -1) sb.Append((char)f); result = serializer.Deserialize<TypedObject>(sb.ToString()); inputStream.Close(); con.Abort(); } catch { } } } if (OnLoginQueueUpdate != null) OnLoginQueueUpdate(this, 0); authToken = result.GetString("token"); return true; } catch (Exception e) { if (e.Message == "The remote name could not be resolved: '" + loginQueue + "'") { Error("Please make sure you are connected the internet!", ErrorType.AuthKey); Disconnect(); } else if (e.Message == "The remote server returned an error: (403) Forbidden.") { Error("Your username or password is incorrect!", ErrorType.Password); Disconnect(); } else { Error("Unable to get Auth Key", ErrorType.AuthKey); Disconnect(); } return false; } }