private async Task <UseItemResult> UseItem(string itemId, string target = null) { var url = "/items/use/" + itemId; if (target != null) { url += "?target=" + target; } var response = await Post(url); var result = response.StartsWith("No", StringComparison.Ordinal) || response.Contains("Invalid item GUID") ? null : JsonConvert.DeserializeObject <UseItemResult>(response); if (result == null) { result = UseItemResult.NullObject; } result.Messages = CthulhuStateProcessor.ProcessMessages(result.Messages).ToList(); if (result.BonusItems.Any()) { _state.Items.AddRange(result.BonusItems); } result.LogMessages(); return(result); }
public async Task <PollResponse> PostForPoints() { for (int i = 0; i < 3; i++) { var result = await Post("/points"); var response = JsonConvert.DeserializeObject <PollResponse>(result); if (response == null) { Log.Write("Got empty reponse from /points. Trying again (1/3)"); await Task.Delay(100); continue; } response.Messages = CthulhuStateProcessor.ProcessMessages(response.Messages).ToList(); response.LogMessages(); if (response.Item != null) { _state.Items.AddRange(response.ExtractItems()); } return(response); } Log.Write("Could not load points"); throw new Exception("Could not load points"); }
public async Task Tick() { _state.LastMessages.Clear(); // DONT TOUCH ANY FORM CONTROLS IN HERE try { if (_strategy.CanPollPoints(_state)) { if (!ReadOnlyMode && _state.PollingEnabled) { var response = await PostForPoints(); _state.Points = response.Points; _state.LastMessages = response.Messages; CthulhuStateProcessor.ProcessState(_state); } _state.Effects = await GetEffects(); _state.Leaderboard = await GetLeaderboard(); } else { _state.LastMessages = new List <string>() { "Don't want to poll right now." }; } _state.LastTick = DateTime.UtcNow; } catch (Exception e) { e.Log("Global Catch"); } if (_state.NextMove == null || _state.NextMove.Mode == ItemMode.Automatic) { _state.NextAutomaticMove = _strategy.GetMove(_state); } if (_rules.CanUseItem() && _state.NextMove != null && !ReadOnlyMode) { try { var nextMove = _state.NextMove; var useResult = await UseItem(nextMove.Item, nextMove.Target); _state.LastMessages.Insert(0, $"{nextMove.Mode}ly used {nextMove.Item.Name} on '{nextMove.Target}'"); _state.LastMessages.InsertRange(0, useResult.Messages); if (nextMove.Mode == ItemMode.Manual) { _state.MoveQueue.Pop(); } else { _state.NextAutomaticMove = null; } } catch (AggregateException e) { e.Log("Using Item"); _state.NextAutomaticMove = null; } } TooManyVotesStateProcessor.ProcessState(_state); //ExpiredItemRemover.ProcessState(_state); }