コード例 #1
0
 public void StartExternalTask(DataspinWebRequest request)
 {
     #if UNITY_ANDROID && !UNITY_EDITOR
     LogInfo("Starting external task: " + request.URL);
     helperInstance.Call("MakeConnection", request.URL, (int)request.DataspinMethod, (int)request.HttpMethod, Json.Serialize(request.PostData), request.ExternalTaskPid);
     #endif
 }
コード例 #2
0
        //Create json based on DataspinWebRequest and then put into session
        public void PutRequestOnBacklog(DataspinWebRequest request)
        {
            Log("Putting " + (pidCounter - 1).ToString() + " PID request on backlog: " + request.ToString());
            pidCounter--;

            if (isOfflineSession)
            {
                request.PostData["dt"]      = (int)(GetTimestamp() - offlineSessionStart);
                request.PostData["session"] = offlineSessionId;
            }
            else
            {
                request.PostData["dt"]      = (int)(GetTimestamp() - DataspinManager.Instance.sessionTimestamp);
                request.PostData["session"] = DataspinManager.Instance.SessionId;
            }

            Dictionary <string, object> requestDict = new Dictionary <string, object>();

            requestDict["url"]             = request.URL;
            requestDict["dataspin_method"] = (int)request.DataspinMethod;
            requestDict["http_method"]     = (int)request.HttpMethod;
            requestDict["post_data"]       = request.PostData;
            requestDict["task_pid"]        = pidCounter;
            //backlogRequestsList.Add(requestDict);

            backlogRequestsList.Add(requestDict);

            ResetFlushTimer();
        }
コード例 #3
0
        public void ExternalTaskCompleted(string json)
        {
            Dictionary <string, object> dict = (Dictionary <string, object>)Json.Deserialize(json);

            json = json.Replace("\\", "");
            json = json.Replace("\\\\", "");
            DataspinWebRequest task = SearchOnGoingTask((string)dict["pid"]);

            LogInfo("External task data received: " + json);

            if (dict.ContainsKey("response"))
            {
                LogInfo("Response: " + dict["response"]);
                if (task != null)
                {
                    task.ProcessResponse((string)dict["response"], dict.ContainsKey("error") ? (string)dict["error"] : null);
                }
                else
                {
                    LogError("DataspinWebRequest for pid " + (string)dict["pid"] + " not found!");
                }
            }
            else
            {
                LogError("Task doesn't have response field!");
                DataspinBacklog.Instance.PutRequestOnBacklog(task);
            }
        }
コード例 #4
0
        public DataspinError(ErrorTypeEnum errorType, string message, string stackTrace = null, DataspinWebRequest request = null)
        {
            this.errorType  = errorType;
            this.message    = message;
            this.stackTrace = stackTrace;
            this.request    = request;

            DataspinManager.Instance.LogError(this.ToString());
            DataspinManager.Instance.FireErrorEvent(this);
        }
コード例 #5
0
        //Basing on JSON, create tasks queue in following order: Session->requests[]->Session->requests-> ... -> raw_requests
        private void CreateTasksQueue()
        {
            tasksListIterator = 0;
            tasksArray        = new DataspinWebRequest[backlogSessionsList.Count + backlogRequestsList.Count];

            for (int i = 0; i < backlogSessionsList.Count; i++)
            {
                Dictionary <string, object> oldSessionDataDict = new Dictionary <string, object>();
                oldSessionDataDict["end_user_device"] = DataspinManager.Instance.Device_UUID;
                oldSessionDataDict["app_version"]     = DataspinManager.Instance.CurrentConfiguration.AppVersion;
                oldSessionDataDict["dt"]     = (int)(GetTimestamp() - (double)backlogSessionsList[i]["start_timestamp"]);
                oldSessionDataDict["length"] = (double)backlogSessionsList[i]["end_timestamp"] - (double)backlogSessionsList[i]["start_timestamp"];

                try {
                    Log("Adding Offline session with fake id = " + (int)(long)backlogSessionsList[i]["fake_id"] + " to tasksArray");
                    tasksArray[i] = new DataspinWebRequest(DataspinRequestMethod.Dataspin_RegisterOldSession,
                                                           HttpRequestMethod.HttpMethod_Post, oldSessionDataDict,
                                                           (int)(long)backlogSessionsList[i]["fake_id"], (string)backlogSessionsList[i]["url"]);

                    DataspinManager.Instance.CreateTask(tasksArray[i]);
                }
                catch (Exception e) {
                    Log("Error while creating tasksArray: " + e.Message + ", \nStack: " + e.StackTrace);
                }
            }

            // Session Enqueued. Now execute all requests. If request is executed,
            // remove it from backlogSessionsList[i][requests] list.
            // If all requests are executed, remove session also

            // After this request is executed, session id is retrieved.
            // Assign this session id into all subrequests and then

            for (int j = 0; j < backlogRequestsList.Count; j++)
            {
                Dictionary <string, object> dict = (Dictionary <string, object>)backlogRequestsList[j]["post_data"];
                if (dict.ContainsKey("end_user_device"))
                {
                    dict["end_user_device"] = DataspinManager.Instance.Device_UUID;                                                     //Replace device uuid with proper one in case when user played offline his first session
                }
                tasksArray[j + backlogSessionsList.Count] = new DataspinWebRequest((DataspinRequestMethod)(int)(long)backlogRequestsList[j]["dataspin_method"],
                                                                                   (HttpRequestMethod)(int)(long)backlogRequestsList[j]["http_method"], (Dictionary <string, object>)backlogRequestsList[j]["post_data"],
                                                                                   (int)(long)backlogRequestsList[j]["task_pid"], (string)backlogRequestsList[j]["url"]);

                DataspinManager.Instance.CreateTask(tasksArray[j + backlogSessionsList.Count]);
            }

            Log("TasksArray Length: " + tasksArray.Length);
            ExecuteNextTask();
        }
コード例 #6
0
        private void ExecuteNextTask()
        {
            // Execute all offline sessions.
            // Once one session is executed, find all requests with corresponding,
            // negative ID and replace it with new, obtained from server.

            if (tasksArray.Length > tasksListIterator)
            {
                Log("Executing next task from queue: " + tasksArray[tasksListIterator].ToString());
                DataspinWebRequest req = tasksArray[tasksListIterator];
                req.Fire();
            }
            else
            {
                Log("All tasks from queue executed!");
            }
        }
コード例 #7
0
 public void ParseError(DataspinWebRequest request)
 {
     switch (request.DataspinMethod)
     {
     case DataspinRequestMethod.Dataspin_StartSession:
         if (request.Error.Contains("410"))
                #if UNITY_5
         { dataspinErrors.Add(new DataspinError(DataspinError.ErrorTypeEnum.USER_NOT_REGISTERED, request.Error + request.Body, null, request)); }
                #else
         { dataspinErrors.Add(new DataspinError(DataspinError.ErrorTypeEnum.USER_NOT_REGISTERED, request.Error, null, request)); }
                 #endif
         else
                 #if UNITY_5
         { dataspinErrors.Add(new DataspinError(DataspinError.ErrorTypeEnum.CONNECTION_ERROR, request.Error + request.Body, null, request)); }
                 #else
         { dataspinErrors.Add(new DataspinError(DataspinError.ErrorTypeEnum.CONNECTION_ERROR, request.Error, null, request)); }
                 #endif
         break;
コード例 #8
0
 public void AddError(DataspinError.ErrorTypeEnum errorType, string message, string stackTrace = null, DataspinWebRequest request = null)
 {
     dataspinErrors.Add(new DataspinError(errorType, message, stackTrace, request));
 }
コード例 #9
0
        // public bool CheckSessionValidity() {
        //     if(lastActivityTimestamp + currentConfiguration.sessionTimeout > GetTimestamp()) {
        //         lastActivityTimestamp = (int) GetTimestamp(); // Update session last activity timestamp
        //         return true;
        //     }
        //     else {
        //         LogInfo("Idle for more than " + currentConfiguration.sessionTimeout.ToString() + " sec, Invalidating session!");
        //         isSessionStarted = false;
        //         isSessionInvalidated = true;
        //         StartSession();
        //         return false;
        //     }
        // }

        private void RemoveFromOnGoingTasks(DataspinWebRequest request)
        {
            OnGoingTasks.Remove(request);
        }
コード例 #10
0
 public void CreateTask(DataspinWebRequest request)
 {
     OnGoingTasks.Add(request);
 }
コード例 #11
0
        public void OnRequestSuccessfullyExecuted(DataspinWebRequest request)
        {
            RemoveFromOnGoingTasks(request);
            LogInfo("Processing request " + request.DataspinMethod.ToString() + ", Response: " + request.Response + ".");
            try {
                Dictionary <string, object> responseDict = Json.Deserialize(request.Response) as Dictionary <string, object>;

                if (responseDict != null)
                {
                    switch (request.DataspinMethod)
                    {
                    case DataspinRequestMethod.Dataspin_RegisterUser:
                        this.uuid = (string)responseDict["uuid"];
                        PlayerPrefs.SetString(USER_UUID_PREFERENCE_KEY, this.uuid);
                        isUserRegistered = true;
                        if (OnUserRegistered != null)
                        {
                            OnUserRegistered(this.uuid);
                        }
                        LogInfo("User Registered! UUID: " + this.uuid);
                        break;

                    case DataspinRequestMethod.Dataspin_RegisterUserDevice:
                        PlayerPrefs.SetString(DEVICE_UUID_PREFERENCE_KEY, (string)responseDict["uuid"]);
                        isDeviceRegistered = true;
                        this.device_uuid   = (string)responseDict["uuid"];
                        if (OnDeviceRegistered != null)
                        {
                            OnDeviceRegistered();
                        }
                        LogInfo("Device registered! UUID: " + this.device_uuid);
                        break;

                    case DataspinRequestMethod.Dataspin_StartSession:
                        isSessionStarted           = true;
                        this.sessionTimestamp      = (int)GetTimestamp();
                        this.lastActivityTimestamp = (int)GetTimestamp();
                        sessionId = (int)(long)responseDict["id"];

                        if (OnSessionStarted != null)
                        {
                            OnSessionStarted();
                        }
                        DataspinBacklog.Instance.StopBacklogRefresh();
                        LogInfo("Session started!");

                        StartSendPingsCoroutine();
                        break;

                    case DataspinRequestMethod.Dataspin_EndSession:
                        isSessionStarted = false;
                        if (OnSessionEnded != null)
                        {
                            OnSessionEnded();
                        }
                        LogInfo("Session ended!");
                        break;

                    case DataspinRequestMethod.Dataspin_RegisterOldSession:
                        isSessionStarted = true;
                        break;

                    case DataspinRequestMethod.Dataspin_PurchaseItem:
                        DataspinItem item = FindItemById((string)request.PostData["item"]);
                        if (item != null)
                        {
                            if (OnItemPurchased != null)
                            {
                                OnItemPurchased(item);
                            }
                            LogInfo("Item " + item.FullName + " purchased.");
                        }
                        else
                        {
                            DataspinItem tempItem = new DataspinItem((string)request.PostData["item"]);
                            OnItemPurchased(tempItem);
                            LogInfo("Item " + (string)request.PostData["item"] + " purchased.");
                        }

                        if (responseDict.ContainsKey("is_valid") && request.Flags != null && request.Flags.ContainsKey("validation"))
                        {
                            LogInfo("OnItemPurchaseVerification");
                            if (OnItemPurchaseVerification != null)
                            {
                                OnItemPurchaseVerification((string)request.PostData["item"], (responseDict["is_valid"] == null || (bool)responseDict["is_valid"] == false) ? false : true);
                            }
                        }

                        StartSendPingsCoroutine();
                        break;

                    case DataspinRequestMethod.Dataspin_RegisterEvent:
                        if (OnEventRegistered != null)
                        {
                            OnEventRegistered((string)request.PostData["custom_event"]);
                        }
                        LogInfo("Event " + (string)request.PostData["custom_event"] + " registered!");
                        StartSendPingsCoroutine();
                        break;

                    case DataspinRequestMethod.Dataspin_GetItems:
                        dataspinItems = new List <DataspinItem>();
                        List <object> items = (List <object>)responseDict["results"];
                        for (int i = 0; i < items.Count; i++)
                        {
                            Dictionary <string, object> itemDict = (Dictionary <string, object>)items[i];
                            dataspinItems.Add(new DataspinItem(itemDict));
                        }
                        if (OnItemsRetrieved != null)
                        {
                            OnItemsRetrieved(dataspinItems);
                        }
                        break;

                    case DataspinRequestMethod.Dataspin_AlivePing:
                        LogInfo("Alive request success!");
                        StartSendPingsCoroutine();
                        break;

                    default:
                        break;
                    }
                }
                else
                {
                    dataspinErrors.Add(new DataspinError(DataspinError.ErrorTypeEnum.JSON_PROCESSING_ERROR, "Response dictionary is null!"));
                }
            }
            catch (System.Exception e) {
                dataspinErrors.Add(new DataspinError(DataspinError.ErrorTypeEnum.JSON_PROCESSING_ERROR, e.Message, e.StackTrace));
            }
        }
コード例 #12
0
        // !Signature parameters is permitted only on Android Platform
        public void PurchaseItem(string internal_id, int amount = 1, string payload = null, string signature = null)
        {
            Dictionary <string, object> parameters = new Dictionary <string, object>();

            parameters.Add("item", internal_id); //OR FindItemByName(item_name).InternalId
            parameters.Add("end_user_device", this.device_uuid);
            parameters.Add("app_version", CurrentConfiguration.AppVersion);
            parameters.Add("amount", amount);
            parameters.Add("session", SessionId);

            // For now In-App purchase verification is available only for Android & iOS platform
            #if !UNITY_EDITOR && (UNITY_ANDROID || UNITY_IPHONE)
            if (payload != null)
            {
                Dictionary <string, object> PurchaseValidationSerializer = new Dictionary <string, object>();
                PurchaseValidationSerializer.Add("payload", payload);

                #if UNITY_ANDROID
                if (signature == null)
                {
                    LogError("In order to verify purchases you must provide both signature and payload parameter!");
                }
                else
                {
                    PurchaseValidationSerializer.Add("signature", signature);
                }
                #endif

                parameters.Add("validate_purchase", PurchaseValidationSerializer);
            }
            #endif

            if (isSessionStarted)
            {
                if (!isSessionStarted)
                {
                    DataspinBacklog.Instance.CreateOfflineSession();
                }

                DataspinWebRequest r = new DataspinWebRequest(DataspinRequestMethod.Dataspin_PurchaseItem, HttpRequestMethod.HttpMethod_Post, parameters);

                if (payload != null)
                {
                    Dictionary <string, object> flags = new Dictionary <string, object>();
                    flags.Add("validation", true);
                    r.Flags = flags;

                    // If signature parameter was not provided, ignore veryfing process
                    #if UNITY_ANDROID || !UNITY_EDITOR
                    if (signature == null)
                    {
                        r.Flags = null;
                    }
                    #endif
                }

                CreateTask(r);
            }
            else
            {
                DataspinBacklog.Instance.PutRequestOnBacklog(new DataspinWebRequest(DataspinRequestMethod.Dataspin_PurchaseItem, HttpRequestMethod.HttpMethod_Post, parameters));
                dataspinErrors.Add(new DataspinError(DataspinError.ErrorTypeEnum.SESSION_NOT_STARTED, "Session not started!"));
            }
        }
コード例 #13
0
        public void ReportTaskCompletion(DataspinWebRequest request, bool succeded)
        {
            Log("Request " + request.DataspinMethod.ToString() + ", pid: " + (int)(long)request.TaskPid + ", Succeed? " + succeded);
            if (succeded)
            {
                if (request.DataspinMethod == DataspinRequestMethod.Dataspin_RegisterOldSession)                  //If it's session

                {
                    for (int i = 0; i < tasksArray.Length; i++)
                    {
                        if (tasksArray[i].PostData.ContainsKey("session"))                          //Find requests only with post_data["session"] key
                        {
                            Debug.Log("Entry with session key! " + tasksArray[i].ToString());
                            if (tasksArray[i].PostData["session"].ToString() == request.TaskPid.ToString())
                            {
                                tasksArray[i].PostData["session"] = GetIdFromResponse(request.Response);
                                tasksArray[i].UpdateWWW();
                            }
                            else
                            {
                                Debug.Log("Session != taskPid: " + request.TaskPid.ToString() + " vs " + tasksArray[i].PostData["session"].ToString());
                            }
                        }
                    }

                    for (int i = 0; i < backlogRequestsList.Count; i++)                      //Iterate through all requests, if(session.fake_id == backlogRequestsList[i].PostData["session"]) backlogRequestsList[i].PostData["session"] = session.
                    {
                        Dictionary <string, object> d = (Dictionary <string, object>)backlogRequestsList[i]["post_data"];
                        string sessionId = d["session"].ToString();
                        if (sessionId == request.TaskPid.ToString())
                        {
                            Debug.Log("Replacing " + request.TaskPid.ToString() + " with " + GetIdFromResponse(request.Response));
                            ((Dictionary <string, object>)backlogRequestsList[i]["post_data"])["session"] = GetIdFromResponse(request.Response);                             //Assign just got session id
                        }
                    }

                    //REMOVE THAT SESSION FROM LIST
                    for (int i = 0; i < backlogSessionsList.Count; i++)
                    {
                        if (request.TaskPid == (int)(long)backlogSessionsList[i]["fake_id"])
                        {
                            Log("Removing session at pos: " + i);
                            backlogSessionsList.RemoveAt(i);
                        }
                    }
                }
                else                   //It's request
                {
                    Log("Removing request! PID: " + request.TaskPid);
                    for (int i = 0; i < backlogRequestsList.Count; i++)
                    {
                        if (request.TaskPid == (int)(long)backlogRequestsList[i]["task_pid"])
                        {
                            Log("Removing request at pos: " + i);
                            backlogRequestsList.RemoveAt(i);
                        }
                    }
                }
            }

            tasksListIterator++;

            ExecuteNextTask();
            ResetFlushTimer();
        }