public static void TryGetToken()
 {
     if (Disabled || InitRunning)
     {
         return;
     }
     CanTryToken = false;
     ApplicationManager.GetOAuth2Token((Result result, ref OAuth2Token token) => {
         try {
             if (result == Result.Ok) // You may now use this token against Discord's HTTP API
             {
                 Token = token;
                 Randomizer.Log($"Token for the user: {token.AccessToken}. Expires in {token.Expires}. Session ID: {WebSocketClient.SessionId}", false);
             }
             else
             {
                 Randomizer.Log($"Got: {result}, token is ${token.AccessToken}", false);
                 Token = token;
             }
         }
         catch (Exception e) {
             if (e is ResultException re)
             {
                 Randomizer.Debug($"Got result {re.Result} when grabbing token");
             }
             else
             {
                 Randomizer.Error("appManager", e);
             }
         }
     });
 }
 public static User?GetUser()
 {
     if (Disabled || InitRunning)
     {
         return(null);
     }
     try {
         return(UserManager.GetCurrentUser());
     }
     catch (Exception e) {
         if (e is ResultException re)
         {
             if (re.Result != Result.NotFound)
             {
                 Randomizer.Log($"Result {re.Result} on GetUser, returning null", false);
             }
             if (CanTryToken)
             {
                 Randomizer.Debug("Discord user not found. Attempting to get token...");
                 new Thread(() => TryGetToken()).Start();
             }
             return(null);
         }
         Randomizer.Error("GetUser", e, false);
         return(null);
     }
 }
        public static void ResolveUberStateChange(UberState state, UberValue old)
        {
            try {
                UberId key = state.GetUberId();
                if (!UberStates.TryGetValue(key, out UberState oldState))
                {
                    oldState       = state.Clone();
                    oldState.Value = old;
                    UberStates.Add(key, oldState);
                }

                UberValue value = state.Value;
                if (value.Int == old.Int)
                {
                    return;
                }

                var oldValFmt = old.FmtVal(state.Type); // get this now because we overwrite the value by reference
                if (ShouldRevert(state))
                {
                    Randomizer.Log($"Reverting state change of {state.Name} from {oldValFmt} to {state.FmtVal()}", false);
                    oldState.Write();
                    return;
                }

                HandleSpecial(state);
                UberStates[key].Value = state.Value;
                var  pos   = InterOp.get_position();
                bool found = false;
                if (value.Int > 0)
                {
                    var id = state.GetUberId();
                    if (SkipUberStateMapCount.GetOrElse(key, 0) > 0)
                    {
                        var p = id.toCond().Pickup().Concat(id.toCond(state.ValueAsInt()).Pickup());
                        if (p.NonEmpty)
                        {
                            SkipUberStateMapCount[key] -= 1;
                            Randomizer.Log($"Suppressed granting {p} from {id}={state.ValueAsInt()}. Will suppress {SkipUberStateMapCount[key]} more times", false, "DEBUG");
                            return;
                        }
                    }
                    found = SeedController.OnUberState(state);
                }

                if (SyncedUberStates.Contains(key))
                {
                    Randomizer.Client.SendUpdate(key, state.ValueAsFloat());
                }

                BonusItemController.OnUberState(state);
                var zone = ZoneType.Void;
                if (InterOp.get_game_state() == GameState.Game)
                {
                    zone = InterOp.get_player_area().toZone();
                }
                if (!NeedsNewGameInit && (value.Int == 0 || !found) && !(state.GroupName == "statsUberStateGroup" || state.GroupName == "achievementsGroup" || state.GroupID == 8 || state.GroupID == 10))
                {
                    Randomizer.Debug($"State change: {state.GroupName}.{state.Name} ({state.GroupID}|{state.ID}) {state.Type} {oldValFmt}->{state.FmtVal()} at ({Math.Round(pos.X)}, {Math.Round(pos.Y)}) in {zone}");
                }
                //Randomizer.Debug($"{state.GroupName}.{state.Name}, {state.GroupID}, {state.ID}, {state.Type}, {oldValFmt}, {state.FmtVal()}, {zone}, {Math.Round(pos.X)},{Math.Round(pos.Y)}");
            }
            catch (Exception e) {
                Randomizer.Error($"USC.Update {state}", e);
            }
        }