예제 #1
0
        private void run()
        {
            while (!cancellationToken.IsCancellationRequested)
            {
                switch (State)
                {
                case APIState.Failing:
                    //todo: replace this with a ping request.
                    Thread.Sleep(5000);

                    if (!isLoggedIn)
                    {
                        goto case APIState.Connecting;
                    }

                    break;

                case APIState.Offline:
                case APIState.Connecting:

                    if (registrableUser != null)
                    {
                        handleRequest(registrableUser);
                        registrableUser = null;
                        continue;
                    }

                    if (!hasLogin)
                    {
                        State = APIState.Offline;
                        Thread.Sleep(50);
                        continue;
                    }

                    State = APIState.Connecting;

                    int userID = 0;
                    if (!hasValidToken && (userID = authenticate()) < 0)
                    {
                        Token = null;
                        continue;
                    }

                    var userReq = new GetUserRequest(userID);
                    userReq.Success += u =>
                    {
                        LocalUser.Value = u;

                        failureCount = 0;

                        State = APIState.Online;
                    };

                    if (!handleRequest(userReq))
                    {
                        if (State == APIState.Connecting)
                        {
                            State = APIState.Failing;
                        }
                        continue;
                    }

                    while (State > APIState.Offline && State < APIState.Online)
                    {
                        Thread.Sleep(500);
                    }

                    break;
                }

                if (!hasValidToken)
                {
                    Logout();
                    continue;
                }

                while (true)
                {
                    APIRequest req;

                    lock (queue)
                    {
                        if (queue.Count == 0)
                        {
                            break;
                        }

                        req = queue.Dequeue();
                    }

                    handleRequest(req);
                }

                Thread.Sleep(50);
            }
        }
예제 #2
0
 public void Register(AddUserRequest userRequest)
 {
     registrableUser = userRequest;
 }