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 }
//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(); }
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); } }
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); }
//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(); }
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!"); } }
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;
public void AddError(DataspinError.ErrorTypeEnum errorType, string message, string stackTrace = null, DataspinWebRequest request = null) { dataspinErrors.Add(new DataspinError(errorType, message, stackTrace, request)); }
// 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); }
public void CreateTask(DataspinWebRequest request) { OnGoingTasks.Add(request); }
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)); } }
// !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!")); } }
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(); }