public void Init()
    {
        if (DeleteExistingData)
        {
            if (File.Exists(_dataFilePath))
            {
                File.Delete(_dataFilePath);
            }
        }

        var existingDataFile = GetOfflineData();

        if (existingDataFile != null)
        {
            OfflineData migratedDataFile = StartMigrationExistingData(existingDataFile);
            if (migratedDataFile != null)
            {
                SaveDataFile(migratedDataFile);
            }
        }
        else
        {
            OfflineData newDataFile = GetCurrentLevelsDataShippedWithGame();
            if (newDataFile != null)
            {
                SaveDataFile(newDataFile);
            }
        }
    }
示例#2
0
        /// <summary>
        /// Creates the offline data row from the specified transaction time, transaction micro amount,
        /// transaction currency, conversion name and user identifier list.
        /// </summary>
        /// <param name="transactionTime">The transaction time.</param>
        /// <param name="transactionMicroAmount">The transaction micro amount.</param>
        /// <param name="transactionCurrency">The transaction currency.</param>
        /// <param name="conversionName">Name of the conversion.</param>
        /// <param name="userIdentifierList">The user identifier list.</param>
        /// <returns>The offline data row.</returns>
        private OfflineData CreateOfflineDataRow(DateTime transactionTime, long transactionMicroAmount,
                                                 string transactionCurrency, string conversionName, UserIdentifier[] userIdentifierList)
        {
            StoreSalesTransaction storeSalesTransaction = new StoreSalesTransaction();

            // For times use the format yyyyMMdd HHmmss [tz].
            // For details, see
            // https://developers.google.com/adwords/api/docs/appendix/codes-formats#date-and-time-formats
            storeSalesTransaction.transactionTime = transactionTime.ToString("yyyyMMdd HHmmss");
            storeSalesTransaction.conversionName  = conversionName;
            storeSalesTransaction.userIdentifiers = userIdentifierList;

            Money money = new Money();

            money.microAmount = transactionMicroAmount;
            RemarketingMoneyWithCurrency moneyWithCurrency = new RemarketingMoneyWithCurrency();

            moneyWithCurrency.money                 = money;
            moneyWithCurrency.currencyCode          = transactionCurrency;
            storeSalesTransaction.transactionAmount = moneyWithCurrency;

            OfflineData offlineData = new OfflineData();

            offlineData.Item = storeSalesTransaction;

            return(offlineData);
        }
示例#3
0
 public void Reset()
 {
     m_Crc            = 0;
     m_CloneObj       = null;
     m_bClear         = true;
     m_Guid           = 0;
     m_Already        = false;
     m_SetSceneParent = false;
     m_dealFinish     = null;
     m_OfflineData    = null;
 }
示例#4
0
 public void Reset()
 {
     m_Crc            = 0;
     m_ResItem        = null;
     m_GameObj        = null;
     m_IsClear        = true;
     m_Already        = false;
     m_LoadPriority   = LoadPriority.RES_LOWER;
     m_FinishCallBack = null;
     m_Param1         = m_Param2 = m_Param3 = null;
     m_OfflineData    = null;
 }
示例#5
0
        public static void CreateOfflineData(GameObject Obj)
        {
            OfflineData offlineData = Obj.GetComponent <OfflineData>();

            if (offlineData is null)
            {
                offlineData = Obj.AddComponent <OfflineData>();
            }
            offlineData.BindDataInEditor();
            EditorUtility.SetDirty(Obj); // 保存
            Debug.Log("修改了" + Obj.name + " prefab!");
        }
示例#6
0
    /// <summary>
    /// 根据实例化对象直接获取离线数据
    /// </summary>
    /// <param name="obj">GameObject</param>
    /// <returns></returns>
    public OfflineData FindOfflineData(GameObject obj)
    {
        OfflineData data   = null;
        ResourceObj resObj = null;

        m_ResourceObjDic.TryGetValue(obj.GetInstanceID(), out resObj);
        if (resObj != null)
        {
            data = resObj.m_OfflineData;
        }
        return(data);
    }
示例#7
0
    //保存预设时 自动挂载离线数据
    public static void BindOfflineData(GameObject go)
    {
        string     path = PrefabUtility.GetPrefabAssetPathOfNearestInstanceRoot(go);
        PrefabType type = PrefabType.None;

        if (path.Contains(PrefabStageListener.UIPrefabsPath))
        {
            type = PrefabType.UI;
        }
        else if (path.Contains(PrefabStageListener.EffectPrefabsPath))
        {
            type = PrefabType.Effect;
        }
        else if (path.Contains(PrefabStageListener.ModelPrefabsPath))
        {
            type = PrefabType.Default;
        }
        if (type != PrefabType.None)
        {
            OfflineData data = null;
            switch (type)
            {
            case PrefabType.UI:
                data = go.GetComponent <UIOfflineData>();
                if (data == null)
                {
                    data = go.AddComponent <UIOfflineData>();
                }
                break;

            case PrefabType.Effect:
                data = go.GetComponent <EffectOfflineData>();
                if (data == null)
                {
                    data = go.AddComponent <EffectOfflineData>();
                }
                break;

            case PrefabType.Default:
                data = go.GetComponent <OfflineData>();
                if (data == null)
                {
                    data = go.AddComponent <OfflineData>();
                }
                break;
            }
            data.BindData();
            EditorUtility.SetDirty(go);
            Resources.UnloadUnusedAssets();
        }
        LogTool.Log("预设以保存 prefab:", go.name);
    }
示例#8
0
            public async Task <int> SaveScanInstanceOrEditResult(ScanInstanceModel model)
            {
                try
                {
                    return(await RestClient.Instance.PostAsync <int>($"{KamajiScanActions.SaveScanInstanceOrEditResult}", model));
                }
                catch (Exception ex)
                {
                    await OfflineData.From(model, nameof(SaveScanInstanceOrEditResult), ex).SaveAsync();

                    return(-1);
                }
            }
示例#9
0
            public async Task <int> AddChildScans(AddChildScansModel model)
            {
                try
                {
                    return(await RestClient.Instance.PostAsync <int>($"{KamajiScanActions.AddChildScans}", model));
                }
                catch (Exception ex)
                {
                    await OfflineData.From(model, nameof(EditScan), ex).SaveAsync();

                    return(-1);
                }
            }
示例#10
0
 public void Reset()
 {
     m_Crc         = 0;
     m_CloneObj    = null;
     m_Guid        = 0;
     m_IsClear     = true;
     m_ResItem     = null;
     m_OfflineData = null;
     m_IsRecycle   = false;
     m_IsSceneObj  = false;
     m_Callback    = null;
     param1        = param2 = param3 = null;
 }
示例#11
0
 public void Reset()
 {
     m_Crc            = 0;
     m_CloneObj       = null;
     m_bClear         = true;
     m_Guid           = 0;
     m_ResItem        = null;
     m_Already        = false;
     m_SetSceneParent = false;
     m_DealFinis      = null;
     m_Param1         = m_Param2 = m_Param3 = null;
     m_OfflineData    = null;
 }
示例#12
0
 /// <summary>
 /// 上传离线数据
 /// </summary>
 /// <param name="playerData"></param>
 /// <param name="callBack"></param>
 /// <returns></returns>
 private bool UpLoadOffLineData(OfflineData playerData, Action <bool, PlayerDataMessage> callBack)
 {
     return(SendData(SAVE_OFF_LINE, playerData, (ret, res) => {
         if (res.isOK)
         {
             Debug.Log("===============【上传离线数据成功】==============");
         }
         else
         {
             Debug.Log("============【上传离线数据失败】==============" + GetMsgByErrorCode(res.err));
         }
         callBack(ret, res);
     }));
 }
示例#13
0
        /// <summary>
        /// 尝试进行同步
        /// </summary>
        private void SendOfflineData()
        {
            Queue <Dictionary <string, object> > localQueue = new Queue <Dictionary <string, object> >(LocalDatasManager.netBufferQueue);

            Debug.Log("提取离线数据:" + localQueue.Count);
            if (localQueue.Count > 0)
            {
                OfflineData offlineData = new OfflineData(GameMainManager.Instance.playerData);
                offlineData.offline = LocalDatasManager.netBufferQueue;
                UpLoadOffLineData(offlineData, (ret, res) => {
                    LocalDatasManager.netBufferQueue = null;
                });
            }
        }
示例#14
0
    public static void CreateOfflineData(GameObject obj)
    {
        OfflineData offlineData = obj.GetComponent <OfflineData>();

        if (offlineData == null)
        {
            offlineData = obj.AddComponent <OfflineData>();
            offlineData.BindData();
            EditorUtility.SetDirty(obj);
            Debug.Log("修改了" + obj.name + " Prefab!");
            Resources.UnloadUnusedAssets();
            AssetDatabase.Refresh();
        }
    }
    private OfflineData GetOfflineData()
    {
        bool dataFileExists = File.Exists(_dataFilePath);

        if (!dataFileExists)
        {
            return(null);
        }

        var         offlineDataString = File.ReadAllText(_dataFilePath);
        OfflineData offlineData       = JsonUtility.FromJson <OfflineData>(offlineDataString);

        return(offlineData);
    }
示例#16
0
 public virtual void Reset()
 {
     username    = "";
     password    = "";
     offlineData = new OfflineData();
     onlineData  = new OnlineData();
     for (int i = 0; i < ArchivesManager.MAX_ACCOUNTS; i++)
     {
         offlineData.battleMode.versusHuman.data[i] = new OfflineBattleDataEntry();
         offlineData.battleMode.versusHuman.noSwitchingVariant.data[i]     = new OfflineBattleDataEntry();
         offlineData.battleMode.versusHuman.switchPositionsVariant.data[i] = new OfflineBattleDataEntry();
         offlineData.battleMode.versusHuman.switchControlVariant.data[i]   = new OfflineBattleDataEntry();
     }
 }
示例#17
0
        public static void CreateOfflineUIData(GameObject obj)
        {
            obj.layer = LayerMask.NameToLayer("UI");
            OfflineData uiData = obj.GetComponent <OfflineUIData>();

            if (uiData is null)
            {
                uiData = obj.AddComponent <OfflineUIData>();
            }
            uiData.BindDataInEditor();
            EditorUtility.SetDirty(obj);
            Debug.Log("修改了" + obj.name + "UI Prefab!");
            Resources.UnloadUnusedAssets();
            AssetDatabase.Refresh();
        }
示例#18
0
        public static void CreateOfflineData(GameObject gameObject)
        {
            OfflineData offlineData = gameObject.GetComponent <OfflineData>();

            if (offlineData == null)
            {
                offlineData = gameObject.AddComponent <OfflineData>();
            }

            offlineData.BindData();
            EditorUtility.SetDirty(gameObject);
            Debug.Log($"修改了{gameObject.name} Prefab");
            Resources.UnloadUnusedAssets();
            AssetDatabase.Refresh();
        }
示例#19
0
    private static void BindOfflineData <T>(GameObject obj) where T : OfflineData
    {
        OfflineData offlineData = obj.GetComponent <T>();

        if (offlineData == null)
        {
            offlineData = obj.AddComponent <T>();
        }
        offlineData.BindData();
        //保存当前预制体
        EditorUtility.SetDirty(obj);
        Debug.Log("修改了:" + obj.name + " prefab!");
        Resources.UnloadUnusedAssets(); //卸载未使用的资源
        AssetDatabase.Refresh();        //更新编辑器
    }
    private OfflineData GetCurrentLevelsDataShippedWithGame()
    {
        var _gameOfflineData = new OfflineData();

        _gameOfflineData.PlayerInfo = new Player()
        {
            InstalledOn = DateTimeOffset.UtcNow.ToString()
        };

        _gameOfflineData.GameLevels = new List <Level>();

        var lessons = AssetDatabase.GetAllAssetPaths().Where(f => f.Contains("/Lessons/")).ToList();

        foreach (var item in lessons)
        {
            //ITEM Ex : Assets/Resources/Lessons/Socialmedia/twitter.png

            string category = string.Empty;
            string question = string.Empty;

            try
            {
                category = item.Split('/')[3];
                question = item.Split('/')[4];

                Level newLevel = new Level()
                {
                    Category = category,
                    Question = question,
                };

                _gameOfflineData.GameLevels.Add(newLevel);
            }
            catch
            {
                //Debug.LogException(ex);
                //This comes here when we get ITEM as :
                //Assets/Resources/Lessons/Socialmedia
                //Which is actually the folder for Category.
                //Simply supress here :)
            }
        }

        return(_gameOfflineData);
    }
        public static void CreateOfflineData(string path)
        {
            GameObject obj = PrefabUtility.LoadPrefabContents(path);

            OfflineData offlineData = obj.GetComponent <OfflineData>();

            if (offlineData == null)
            {
                offlineData = obj.AddComponent <OfflineData>();
            }
            offlineData.BindData();
            EditorUtility.SetDirty(obj);
            Debug.Log("修改了" + obj.name + "prefab!");
            if (PrefabUtility.SaveAsPrefabAsset(obj, path))
            {
                PrefabUtility.UnloadPrefabContents(obj);
            }
            Resources.UnloadUnusedAssets();
            AssetDatabase.Refresh();
        }
    private OfflineData StartMigrationExistingData(OfflineData existingDataFile)
    {
        OfflineData newData = GetCurrentLevelsDataShippedWithGame();

        newData.PlayerInfo.PlayerName  = existingDataFile.PlayerInfo.PlayerName;
        newData.PlayerInfo.InstalledOn = existingDataFile.PlayerInfo.InstalledOn;

        List <Level> ExistingUserPlayedLevels = existingDataFile.GameLevels.Where(f => f.Score >= 0).ToList();

        foreach (var level in ExistingUserPlayedLevels)
        {
            var sameLevelInNewData = newData.GameLevels.Where(f => f.Question == level.Question && f.Category == level.Category).FirstOrDefault();
            if (sameLevelInNewData != null)
            {
                sameLevelInNewData.Score = level.Score;
            }
            else
            {
                //Do nothing; probably that level is now removed in new version!
            }
        }

        return(newData);
    }
示例#23
0
        /// <summary>
        /// Runs the code example.
        /// </summary>
        /// <param name="user">The AdWords user.</param>
        /// <param name="conversionName">The conversion type name that you'd like to attribute this
        /// upload to.</param>
        /// <param name="externalUploadId">The external upload ID can be any number that you use to
        /// keep track of your uploads.</param>
        /// <param name="emailAddresses">The email addresses for creating user identifiers.</param>
        /// <param name="advertiserUploadTime">The advertiser upload time. For times, use the format
        /// yyyyMMdd HHmmss tz. For more details on formats, see:
        /// https://developers.google.com/adwords/api/docs/appendix/codes-formats#date-and-time-formats
        /// For time zones, see:
        /// https://developers.google.com/adwords/api/docs/appendix/codes-formats#timezone-ids</param>
        /// <param name="bridgeMapVersionId">The version ID of the bridge map.</param>
        /// <param name="uploadType">The type of data upload.</param>
        /// <param name="partnerId">The partner ID</param>
        public void Run(AdWordsUser user, string conversionName, long externalUploadId,
                        string[] emailAddresses, string advertiserUploadTime, string bridgeMapVersionId,
                        OfflineDataUploadType uploadType, int partnerId)
        {
            using (OfflineDataUploadService offlineDataUploadService =
                       (OfflineDataUploadService)user.GetService(
                           AdWordsService.v201802.OfflineDataUploadService)) {
                offlineDataUploadService.RequestHeader.partialFailure = true;

                // Create the first offline data row for upload.
                // This transaction occurred 7 days ago with amount of 200 USD.
                DateTime transactionTime1 = DateTime.Now;
                transactionTime1.AddDays(-7);
                long             transactionAmount1       = 200000000;
                string           transactionCurrencyCode1 = "USD";
                UserIdentifier[] userIdentifierList1      = new UserIdentifier[] {
                    CreateUserIdentifier(OfflineDataUploadUserIdentifierType.HASHED_EMAIL,
                                         emailAddresses[0]),
                    CreateUserIdentifier(OfflineDataUploadUserIdentifierType.STATE, "New York")
                };
                OfflineData offlineData1 = CreateOfflineDataRow(transactionTime1, transactionAmount1,
                                                                transactionCurrencyCode1, conversionName, userIdentifierList1);

                // Create the second offline data row for upload.
                // This transaction occurred 14 days ago with amount of 450 EUR.
                DateTime transactionTime2 = DateTime.Now;
                transactionTime2.AddDays(-14);
                long             transactionAmount2       = 450000000;
                string           transactionCurrencyCode2 = "EUR";
                UserIdentifier[] userIdentifierList2      = new UserIdentifier[] {
                    CreateUserIdentifier(OfflineDataUploadUserIdentifierType.HASHED_EMAIL,
                                         emailAddresses[1]),
                    CreateUserIdentifier(OfflineDataUploadUserIdentifierType.STATE, "California")
                };
                OfflineData offlineData2 = CreateOfflineDataRow(transactionTime2, transactionAmount2,
                                                                transactionCurrencyCode2, conversionName, userIdentifierList2);

                // Create offline data upload object.
                OfflineDataUpload offlineDataUpload = new OfflineDataUpload();
                offlineDataUpload.externalUploadId = externalUploadId;
                offlineDataUpload.offlineDataList  = new OfflineData[] { offlineData1, offlineData2 };

                // Set the type and metadata of this upload.
                offlineDataUpload.uploadType = uploadType;
                StoreSalesUploadCommonMetadata storeSalesMetaData = null;

                switch (uploadType)
                {
                case OfflineDataUploadType.STORE_SALES_UPLOAD_FIRST_PARTY:
                    storeSalesMetaData = new FirstPartyUploadMetadata()
                    {
                        loyaltyRate           = 1,
                        transactionUploadRate = 1
                    };
                    break;

                case OfflineDataUploadType.STORE_SALES_UPLOAD_THIRD_PARTY:
                    storeSalesMetaData = new ThirdPartyUploadMetadata()
                    {
                        loyaltyRate           = 1.0,
                        transactionUploadRate = 1.0,
                        advertiserUploadTime  = advertiserUploadTime,
                        validTransactionRate  = 1.0,
                        partnerMatchRate      = 1.0,
                        partnerUploadRate     = 1.0,
                        bridgeMapVersionId    = bridgeMapVersionId,
                        partnerId             = partnerId
                    };
                    break;
                }

                UploadMetadata uploadMetadata = new UploadMetadata();
                uploadMetadata.Item = storeSalesMetaData;
                offlineDataUpload.uploadMetadata = uploadMetadata;

                // Create an offline data upload operation.
                OfflineDataUploadOperation offlineDataUploadOperation = new OfflineDataUploadOperation();
                offlineDataUploadOperation.@operator = Operator.ADD;
                offlineDataUploadOperation.operand   = offlineDataUpload;

                // Keep the operations in an array, so it may be reused later for error processing.
                List <OfflineDataUploadOperation> operations = new List <OfflineDataUploadOperation>();
                operations.Add(offlineDataUploadOperation);

                try {
                    // Upload offline data to the server.
                    OfflineDataUploadReturnValue result = offlineDataUploadService.mutate(
                        operations.ToArray());
                    offlineDataUpload = result.value[0];

                    // Print the upload ID and status.
                    Console.WriteLine("Uploaded offline data with external upload ID {0}, " +
                                      "and upload status {1}.", offlineDataUpload.externalUploadId,
                                      offlineDataUpload.uploadStatus);

                    // Print any partial failure errors from the response.
                    if (result.partialFailureErrors != null)
                    {
                        foreach (ApiError apiError in result.partialFailureErrors)
                        {
                            // Get the index of the failed operation from the error's field path elements.
                            int operationIndex = apiError.GetOperationIndex();
                            if (operationIndex != -1)
                            {
                                OfflineDataUpload failedOfflineDataUpload = operations[operationIndex].operand;
                                // Get the index of the entry in the offline data list from the error's field path
                                // elements.
                                int offlineDataListIndex = apiError.GetFieldPathIndex("offlineDataList");
                                Console.WriteLine("Offline data list entry {0} in operation {1} with external " +
                                                  "upload ID {2} and type '{3}' has triggered a failure for the following " +
                                                  "reason: '{4}'.",
                                                  offlineDataListIndex,
                                                  operationIndex,
                                                  failedOfflineDataUpload.externalUploadId,
                                                  failedOfflineDataUpload.uploadType,
                                                  apiError.errorString);
                            }
                            else
                            {
                                Console.WriteLine("A failure has occurred for the following reason: {0}",
                                                  apiError.errorString);
                            }
                        }
                    }
                } catch (Exception e) {
                    throw new System.ApplicationException("Failed upload offline data conversions.", e);
                }
            }
        }
    private void SaveDataFile(OfflineData offlineData)
    {
        string gameDataString = JsonUtility.ToJson(offlineData);

        File.WriteAllText(_dataFilePath, gameDataString);
    }
示例#25
0
        /// <summary>
        /// Runs the code example.
        /// </summary>
        /// <param name="user">The AdWords user.</param>
        /// <param name="conversionName">The conversion type name that you'd like to attribute this
        /// upload to.</param>
        /// <param name="externalUploadId">The external upload ID can be any number that you use to
        /// keep track of your uploads.</param>
        /// <param name="emailAddresses">The email addresses for creating user identifiers.</param>
        public void Run(AdWordsUser user, string conversionName, long externalUploadId,
                        string[] emailAddresses)
        {
            // Get the OfflineDataUploadService.
            OfflineDataUploadService offlineDataUploadService =
                (OfflineDataUploadService)user.GetService(
                    AdWordsService.v201710.OfflineDataUploadService);

            // Create the first offline data row for upload.
            // This transaction occurred 7 days ago with amount of 200 USD.
            DateTime transactionTime1 = new DateTime();

            transactionTime1.AddDays(-7);
            long   transactionAmount1       = 200000000;
            string transactionCurrencyCode1 = "USD";

            UserIdentifier[] userIdentifierList1 = new UserIdentifier[] {
                CreateUserIdentifier(OfflineDataUploadUserIdentifierType.HASHED_EMAIL,
                                     emailAddresses[0]),
                CreateUserIdentifier(OfflineDataUploadUserIdentifierType.STATE, "New York")
            };
            OfflineData offlineData1 = CreateOfflineDataRow(transactionTime1, transactionAmount1,
                                                            transactionCurrencyCode1, conversionName, userIdentifierList1);

            // Create the second offline data row for upload.
            // This transaction occurred 14 days ago with amount of 450 EUR.
            DateTime transactionTime2 = new DateTime();

            transactionTime2.AddDays(-14);
            long   transactionAmount2       = 450000000;
            string transactionCurrencyCode2 = "EUR";

            UserIdentifier[] userIdentifierList2 = new UserIdentifier[] {
                CreateUserIdentifier(OfflineDataUploadUserIdentifierType.HASHED_EMAIL,
                                     emailAddresses[1]),
                CreateUserIdentifier(OfflineDataUploadUserIdentifierType.STATE, "California")
            };
            OfflineData offlineData2 = CreateOfflineDataRow(transactionTime2, transactionAmount2,
                                                            transactionCurrencyCode2, conversionName, userIdentifierList2);

            // Create offline data upload object.
            OfflineDataUpload offlineDataUpload = new OfflineDataUpload();

            offlineDataUpload.externalUploadId = externalUploadId;
            offlineDataUpload.offlineDataList  = new OfflineData[] { offlineData1, offlineData2 };

            // Optional: You can set the type of this upload.
            // offlineDataUpload.uploadType = OfflineDataUploadType.STORE_SALES_UPLOAD_FIRST_PARTY;

            // Create an offline data upload operation.
            OfflineDataUploadOperation offlineDataUploadOperation = new OfflineDataUploadOperation();

            offlineDataUploadOperation.@operator = Operator.ADD;
            offlineDataUploadOperation.operand   = offlineDataUpload;

            try {
                // Upload offline data to the server.
                OfflineDataUploadReturnValue result = offlineDataUploadService.mutate(
                    new OfflineDataUploadOperation[] { offlineDataUploadOperation });
                offlineDataUpload = result.value[0];

                // Print the upload ID and status.
                Console.WriteLine("Uploaded offline data with external upload ID {0}, " +
                                  "and upload status {1}.", offlineDataUpload.externalUploadId,
                                  offlineDataUpload.uploadStatus);

                // Print any partial data errors from the response. The order of the partial
                // data errors list is the same as the uploaded offline data list in the
                // request.
                if (offlineDataUpload.partialDataErrors != null)
                {
                    for (int i = 0; i < offlineDataUpload.partialDataErrors.Length; i++)
                    {
                        ApiError partialDataError = offlineDataUpload.partialDataErrors[i];
                        Console.WriteLine("Found a partial error for offline data {0} with error string: {1}.",
                                          i + 1, partialDataError.errorString);
                    }
                }
            } catch (Exception e) {
                throw new System.ApplicationException("Failed upload offline data conversions.", e);
            }
        }
示例#26
0
 public Task <IActionResult> DeleteOfflineData(int id)
 => this.ResultAsync(() => OfflineData.Delete(id));
示例#27
0
        /// <summary>
        /// Runs the code example.
        /// </summary>
        /// <param name="user">The AdWords user.</param>
        /// <param name="conversionName">The conversion type name that you'd like to attribute this
        /// upload to.</param>
        /// <param name="externalUploadId">The external upload ID can be any number that you use to
        /// keep track of your uploads.</param>
        /// <param name="emailAddresses">The email addresses for creating user identifiers.</param>
        /// <param name="advertiserUploadTime">The advertiser upload time. For times, use the format
        /// yyyyMMdd HHmmss tz. For more details on formats, see:
        /// https://developers.google.com/adwords/api/docs/appendix/codes-formats#date-and-time-formats
        /// For time zones, see:
        /// https://developers.google.com/adwords/api/docs/appendix/codes-formats#timezone-ids</param>
        /// <param name="bridgeMapVersionId">The version ID of the bridge map.</param>
        /// <param name="uploadType">The type of data upload.</param>
        /// <param name="partnerId">The partner ID</param>
        public void Run(AdWordsUser user, string conversionName, long externalUploadId,
                        string[] emailAddresses, string advertiserUploadTime, string bridgeMapVersionId,
                        OfflineDataUploadType uploadType, int partnerId)
        {
            using (OfflineDataUploadService offlineDataUploadService =
                       (OfflineDataUploadService)user.GetService(
                           AdWordsService.v201710.OfflineDataUploadService)) {
                // Create the first offline data row for upload.
                // This transaction occurred 7 days ago with amount of 200 USD.
                DateTime transactionTime1 = new DateTime();
                transactionTime1.AddDays(-7);
                long             transactionAmount1       = 200000000;
                string           transactionCurrencyCode1 = "USD";
                UserIdentifier[] userIdentifierList1      = new UserIdentifier[] {
                    CreateUserIdentifier(OfflineDataUploadUserIdentifierType.HASHED_EMAIL,
                                         emailAddresses[0]),
                    CreateUserIdentifier(OfflineDataUploadUserIdentifierType.STATE, "New York")
                };
                OfflineData offlineData1 = CreateOfflineDataRow(transactionTime1, transactionAmount1,
                                                                transactionCurrencyCode1, conversionName, userIdentifierList1);

                // Create the second offline data row for upload.
                // This transaction occurred 14 days ago with amount of 450 EUR.
                DateTime transactionTime2 = new DateTime();
                transactionTime2.AddDays(-14);
                long             transactionAmount2       = 450000000;
                string           transactionCurrencyCode2 = "EUR";
                UserIdentifier[] userIdentifierList2      = new UserIdentifier[] {
                    CreateUserIdentifier(OfflineDataUploadUserIdentifierType.HASHED_EMAIL,
                                         emailAddresses[1]),
                    CreateUserIdentifier(OfflineDataUploadUserIdentifierType.STATE, "California")
                };
                OfflineData offlineData2 = CreateOfflineDataRow(transactionTime2, transactionAmount2,
                                                                transactionCurrencyCode2, conversionName, userIdentifierList2);

                // Create offline data upload object.
                OfflineDataUpload offlineDataUpload = new OfflineDataUpload();
                offlineDataUpload.externalUploadId = externalUploadId;
                offlineDataUpload.offlineDataList  = new OfflineData[] { offlineData1, offlineData2 };

                // Set the type and metadata of this upload.
                offlineDataUpload.uploadType = uploadType;
                StoreSalesUploadCommonMetadata storeSalesMetaData = null;

                switch (uploadType)
                {
                case OfflineDataUploadType.STORE_SALES_UPLOAD_FIRST_PARTY:
                    storeSalesMetaData = new FirstPartyUploadMetadata()
                    {
                        loyaltyRate           = 1,
                        transactionUploadRate = 1
                    };
                    break;

                case OfflineDataUploadType.STORE_SALES_UPLOAD_THIRD_PARTY:
                    storeSalesMetaData = new ThirdPartyUploadMetadata()
                    {
                        loyaltyRate           = 1.0,
                        transactionUploadRate = 1.0,
                        advertiserUploadTime  = advertiserUploadTime,
                        validTransactionRate  = 1.0,
                        partnerMatchRate      = 1.0,
                        partnerUploadRate     = 1.0,
                        bridgeMapVersionId    = bridgeMapVersionId,
                        partnerId             = partnerId
                    };
                    break;
                }

                UploadMetadata uploadMetadata = new UploadMetadata();
                uploadMetadata.Item = storeSalesMetaData;
                offlineDataUpload.uploadMetadata = uploadMetadata;

                // Create an offline data upload operation.
                OfflineDataUploadOperation offlineDataUploadOperation = new OfflineDataUploadOperation();
                offlineDataUploadOperation.@operator = Operator.ADD;
                offlineDataUploadOperation.operand   = offlineDataUpload;

                try {
                    // Upload offline data to the server.
                    OfflineDataUploadReturnValue result = offlineDataUploadService.mutate(
                        new OfflineDataUploadOperation[] { offlineDataUploadOperation });
                    offlineDataUpload = result.value[0];

                    // Print the upload ID and status.
                    Console.WriteLine("Uploaded offline data with external upload ID {0}, " +
                                      "and upload status {1}.", offlineDataUpload.externalUploadId,
                                      offlineDataUpload.uploadStatus);

                    // Print any partial data errors from the response. The order of the partial
                    // data errors list is the same as the uploaded offline data list in the
                    // request.
                    if (offlineDataUpload.partialDataErrors != null)
                    {
                        for (int i = 0; i < offlineDataUpload.partialDataErrors.Length; i++)
                        {
                            ApiError partialDataError = offlineDataUpload.partialDataErrors[i];
                            Console.WriteLine("Found a partial error for offline data {0} with error " +
                                              "string: {1}.", i + 1, partialDataError.errorString);
                        }
                    }
                } catch (Exception e) {
                    throw new System.ApplicationException("Failed upload offline data conversions.", e);
                }
            }
        }