private async Task WaitInQueue() { int id = -1; int current = -1; using (IEnumerator <Ticker> enumerator = AuthResult.Tickers.Where(ticker => ticker.Node == AuthResult.Node).GetEnumerator()) { if (enumerator.MoveNext()) { Ticker current1 = enumerator.Current; id = current1.Id; current = current1.Current; } } int cycleNum = 1; double averageMillisPerCycle = 0.0; while (id - current > 0) { DateTime cycleStartTime = DateTime.Now; HttpResponseMessage httpResponseMessage = await _httpClient.GetAsync(_tickerUrl + AuthResult.Champ).ConfigureAwait(false); if (httpResponseMessage.StatusCode == HttpStatusCode.OK) { try { current = int.Parse((string)JsonConvert.DeserializeObject <Dictionary <string, object> >(await httpResponseMessage.Content.ReadAsStringAsync().ConfigureAwait(false))[AuthResult.Node.ToString()], NumberStyles.HexNumber); int num = Math.Max(0, id - current); if (num == 0) { break; } OnLoginQueueUpdate?.Invoke(num); OnUpdateStatusMessage?.Invoke(this, string.Format("In login queue at position {0}", num)); } catch (Exception ex) { Tools.Log(ex.StackTrace); } await Task.Delay(this.AuthResult.Delay).ConfigureAwait(false); } double totalMilliseconds = (DateTime.Now - cycleStartTime).TotalMilliseconds; averageMillisPerCycle = averageMillisPerCycle > 0.0 ? (averageMillisPerCycle + totalMilliseconds) / 2.0 : totalMilliseconds; if (cycleNum == 2) { double num = averageMillisPerCycle / (1 / AuthResult.Rate * 60); if ((int)(averageMillisPerCycle * (num / (1.0 - num)) * ((1.0 + Math.Pow(1.333, 2.0)) / 2.0) / 1000.0) > this.TimeoutSeconds) { throw new TimeoutException(); } } ++cycleNum; } }
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 (Exception ex) { Console.WriteLine("Found Exception:" + ex.Message); } } } OnLoginQueueUpdate?.Invoke(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 \n" + e, ErrorType.AuthKey); Disconnect(); } return(false); } }