public override void Synchronize() { AffiliateNetwork Network = base.Network; try { DataTable dt = new DataTable(); using (var bridge = ParserPool.Acquire(Database.Client)) { dt = bridge.Instance.ExecuteRawCommandToDataTable("SELECT * FROM CPAOffers WHERE NetworkName = '" + Network.Name + "' ORDER BY NetworkOfferIdInt ASC"); } XmlDocument doc = GetElement(Network.PublisherPassword, Network.PublisherUsername, ThrowExceptions); XmlElement root = doc.DocumentElement; var InterestingList = TableHelper.GetListFromDataTable <CPAOffer>(dt, 100, true); var idNodes = root.SelectNodes("/campaigns/campaign/id"); foreach (XmlNode node in idNodes) { string id = node.InnerText; //Check if already on the list CPAOffer ThisOffer = SyncedNetwork.HasThisOffer(InterestingList, id); if (ThisOffer != null) { //We have it ThisOffer.Status = Advertising.AdvertStatus.WaitingForAcceptance; } } //Now, remove the offers that shouldn't be on the list foreach (var elem in InterestingList) { if (elem.Status != AdvertStatus.WaitingForAcceptance) { //"Delete" it elem.Status = AdvertStatus.Rejected; elem.IsSyncWithNetwork = false; elem.Save(); } } Network.LastSyncDate = DateTime.Now; Network.Save(); } catch (Exception ex) { ErrorLogger.Log(ex); if (base.ThrowExceptions) { throw new MsgException("There was a problem with synchronizing " + Network.Name + ": " + ex.Message + ". Check your Affiliate Id/API Key and if the website is available"); } } }
public override void Download() { #region Universal AffiliateNetwork Network = base.Network; try { DataTable dt = new DataTable(); using (var bridge = ParserPool.Acquire(Database.Client)) { dt = bridge.Instance.ExecuteRawCommandToDataTable("SELECT * FROM CPAOffersOnHold WHERE NetworkName = '" + Network.Name + "' ORDER BY NetworkOfferIdInt ASC"); } var OnHoldList = TableHelper.GetListFromDataTable <CPAOfferOnHold>(dt, 100, true); #endregion Universal JObject element = GetElement(Network.PerformaUsername, ThrowExceptions); int TotalCount = Convert.ToInt32(element["number_offers"]); #region Universal //Lets process it in 1-1000 batches int BatchesCount = Convert.ToInt32(Math.Ceiling((double)TotalCount / (double)1000.0)); int MainIterator = 0; for (int i = 0; i < BatchesCount; ++i) { var Query = ConstructInsertQueryStart(); bool AreSomeRecordsInQuery = false; for (int j = 0; j < 1000 && MainIterator < TotalCount; j++) { try { #endregion Universal var offer = element["offers"][MainIterator]; string id = offer["campid"].ToString(); string name = offer["title"].ToString(); string url = offer["link"].ToString(); string description = offer["description"].ToString(); string rate = offer["amount"].ToString(); // e.g. 0.24 string countries = ""; try { countries = offer["country"].ToString(); // 'PL' 'US' } catch (Exception ex) { } string incent = "Yes"; // offer["incent"].ToString(); //'Yes' 'No' string banner = ""; // offer["banner"].ToString(); try { banner = offer["creatives"][0]["url"].ToString(); } catch (Exception ex) { } #region Universal SyncedNetwork.HandleAddition(name, description, rate, banner, url, incent, countries, base.Network, id, OnHoldList, ref AreSomeRecordsInQuery, ref Query); //Increase the iterator MainIterator++; } catch (Exception ex) { } } //Now execute the batch; if (AreSomeRecordsInQuery) { using (var bridge = ParserPool.Acquire(Database.Client)) { if (Query[Query.Length - 1] == ',') { Query[Query.Length - 1] = ';'; } bridge.Instance.ExecuteRawCommandNonQuery(Query.ToString()); } } } //Now, remove the offers that shouldn't be on the list foreach (var elem in OnHoldList) { if (elem.Status != AdvertStatus.WaitingForAcceptance) { elem.Delete(); } } Network.LastSyncDate = DateTime.Now; Network.Save(); } catch (Exception ex) { ErrorLogger.Log(ex); if (base.ThrowExceptions) { throw new MsgException("There was a problem with offers export/download " + Network.Name + ": " + ex.Message + ". Check your username/password and if the website is available"); } } #endregion Universal }
public override void Download() { AffiliateNetwork Network = base.Network; try { DataTable dt = new DataTable(); using (var bridge = ParserPool.Acquire(Database.Client)) { dt = bridge.Instance.ExecuteRawCommandToDataTable("SELECT * FROM CPAOffersOnHold WHERE NetworkName = '" + Network.Name + "' ORDER BY NetworkOfferIdInt ASC"); } XmlElement element = GetElement(Network.Name, Network.PerformaUsername, Network.PerformaPassword, Network.PerformaWebsiteId, ThrowExceptions); var OnHoldList = TableHelper.GetListFromDataTable <CPAOfferOnHold>(dt, 100, true); //Lets process it in 1-1000 batches int TotalCount = element.ChildNodes.Count; int BatchesCount = Convert.ToInt32(Math.Ceiling((double)TotalCount / (double)1000.0)); int MainIterator = 0; for (int i = 0; i < BatchesCount; ++i) { var Query = ConstructInsertQueryStart(); bool AreSomeRecordsInQuery = false; for (int j = 0; j < 1000 && MainIterator < TotalCount; j++) { XmlNode offer = element.ChildNodes[MainIterator]; string id = offer["id"].InnerText; string name = offer["name"].InnerText; string type = offer["type"].InnerText; string url = offer["url"].InnerText; string description = offer["description"].InnerText; string requirements = offer["requirements"].InnerText; string rate = offer["rate"].InnerText; // e.g. 0.24 string categoy = offer["categoy"].InnerText; string countries = offer["countries"].InnerText; string incent = offer["incent"].InnerText; //'Yes' 'No' string banner = offer["banner"].InnerText; CPAOfferOnHold ThisOffer = SyncedNetwork.HasThisOffer(OnHoldList, id, name); if (ThisOffer != null) { //We have it, just change the status ThisOffer.Status = Advertising.AdvertStatus.WaitingForAcceptance; } else { AreSomeRecordsInQuery = true; //Preparte the variables to fit database StringBuilder sb = new StringBuilder(); if (!string.IsNullOrEmpty(description)) { sb.Append(description); sb.Append("; "); } sb.Append(requirements); Money UserRate; if (rate.Contains(".")) { UserRate = Money.Parse(rate); } else { UserRate = Money.Parse(rate + ".0"); } UserRate = Money.MultiplyPercent(UserRate, Network.DefaultPercentForMembers); if (name.Length > 50) { name = name.Substring(0, 49); } if (!string.IsNullOrEmpty(banner) && banner.Length > 150) { banner = banner.Substring(0, 149); } string ParsedDescription = sb.ToString(); if (ParsedDescription.Length >= 4000) { ParsedDescription = ParsedDescription.Substring(0, 3998); } //We need to add it CPAOfferOnHold NewOffer = new CPAOfferOnHold(); NewOffer.IsFromAutomaticNetwork = true; NewOffer.NetworkOfferId = id; NewOffer.Title = name; NewOffer.ImageURL = banner; NewOffer.TargetURL = url; NewOffer.DateAdded = DateTime.Now; NewOffer.Status = Advertising.AdvertStatus.Active; NewOffer.AdvertiserUsername = Network.Name; NewOffer.LoginBoxRequired = false; NewOffer.EmailBoxRequired = false; NewOffer.LastCredited = OffersManager.DateTimeZero; NewOffer.Description = ParsedDescription; NewOffer.Category = new Titan.CPACategory(Titan.CPACategory.DEFAULT_CATEGORY_ID); NewOffer.BaseValue = UserRate; NewOffer.CreditsBought = 1000000; //Infinity NewOffer.NetworkName = Network.Name; NewOffer.NetworkRate = rate; NewOffer.IsSyncWithNetwork = false; // by default NewOffer.IsDaily = false; NewOffer.MaxDailyCredits = 1; //NewOffer.GeolocatedCountries = countries; if (incent.Trim() == "No") { NewOffer.CreditOfferAs = CreditOfferAs.NonCash; } else { NewOffer.CreditOfferAs = CreditOfferAs.NetworkDefault; } SyncedNetwork.ConstructInsertQuery(Query, NewOffer); } //Increase the iterator MainIterator++; } //Now execute the batch; if (AreSomeRecordsInQuery) { using (var bridge = ParserPool.Acquire(Database.Client)) { if (Query[Query.Length - 1] == ',') { Query[Query.Length - 1] = ';'; } bridge.Instance.ExecuteRawCommandNonQuery(Query.ToString()); } } } //Now, remove the offers that shouldn't be on the list foreach (var elem in OnHoldList) { if (elem.Status != AdvertStatus.WaitingForAcceptance) { elem.Delete(); } } Network.LastSyncDate = DateTime.Now; Network.Save(); } catch (Exception ex) { ErrorLogger.Log(ex); if (base.ThrowExceptions) { throw new MsgException("There was a problem with offers export/download " + Network.Name + ": " + ex.Message + ". Check your username/password and if the website is available"); } } }
public override void Download() { #region Universal AffiliateNetwork Network = base.Network; try { DataTable dt = new DataTable(); using (var bridge = ParserPool.Acquire(Database.Client)) { dt = bridge.Instance.ExecuteRawCommandToDataTable("SELECT * FROM CPAOffersOnHold WHERE NetworkName = '" + Network.Name + "' ORDER BY NetworkOfferIdInt ASC"); } var OnHoldList = TableHelper.GetListFromDataTable <CPAOfferOnHold>(dt, 100, true); #endregion Universal JArray element = GetElement(Network.PublisherPassword, ThrowExceptions); int TotalCount = element.Count; //Lets process it in 1-1000 batches int BatchesCount = Convert.ToInt32(Math.Ceiling((double)TotalCount / (double)400.0)); int MainIterator = 0; for (int i = 0; i < BatchesCount; ++i) { var Query = ConstructInsertQueryStart(); bool AreSomeRecordsInQuery = false; for (int j = 0; j < 400 && MainIterator < TotalCount; j++) { try { var offer = element[MainIterator]; string id = offer["offer_id"].ToString(); string name = offer["offer_name"].ToString(); string description = offer["offer_requirements"].ToString(); string rate = offer["offer_commission"].ToString(); string incent = offer["offer_allows_incent"].ToString(); string url = String.Empty; string banner = String.Empty; string countries = GetGeolocation(Network.PublisherPassword, id).Replace("UK", "GB"); var creatives = GetCreatives(Network.PublisherPassword, id); if (creatives["offer_creative_banners"].HasValues) { url = creatives["offer_creative_banners"][0]["banner_tracking_link"].ToString().Replace("&subid=&", "&subid=%USERNAME%&");; banner = creatives["offer_creative_banners"][0]["banner_creative_url"].ToString(); } else if (creatives["offer_text_creatives"].HasValues) { url = creatives["offer_text_creatives"][0]["creative_link"].ToString().Replace("&subid=&", "&subid=%USERNAME%&");; } if (!string.IsNullOrWhiteSpace(url) && !url.ToUpper().Contains("NOT APPROVED")) { SyncedNetwork.HandleAddition(name, description, rate, banner, url, incent, countries, base.Network, id, OnHoldList, ref AreSomeRecordsInQuery, ref Query); } //Increase the iterator MainIterator++; } catch (Exception ex) { ErrorLogger.Log(ex); } } //Now execute the batch; if (AreSomeRecordsInQuery) { using (var bridge = ParserPool.Acquire(Database.Client)) { if (Query[Query.Length - 1] == ',') { Query[Query.Length - 1] = ';'; } bridge.Instance.ExecuteRawCommandNonQuery(Query.ToString()); } } } //Now, remove the offers that shouldn't be on the list foreach (var elem in OnHoldList) { if (elem.Status != AdvertStatus.WaitingForAcceptance) { elem.Delete(); } } Network.LastSyncDate = DateTime.Now; Network.Save(); } catch (Exception ex) { ErrorLogger.Log(ex); if (base.ThrowExceptions) { throw new MsgException("There was a problem with offers export/download " + Network.Name + ": " + ex.Message + ". Check your username/password and if the website is available"); } } }
public override void Download() { #region Universal AffiliateNetwork Network = base.Network; try { DataTable dt = new DataTable(); using (var bridge = ParserPool.Acquire(Database.Client)) { dt = bridge.Instance.ExecuteRawCommandToDataTable("SELECT * FROM CPAOffersOnHold WHERE NetworkName = '" + Network.Name + "' ORDER BY NetworkOfferIdInt ASC"); } var OnHoldList = TableHelper.GetListFromDataTable <CPAOfferOnHold>(dt, 100, true); #endregion Universal XmlDocument doc = GetElement(Network.PublisherPassword, Network.PublisherUsername, ThrowExceptions); XmlElement root = doc.DocumentElement; XmlNodeList elemList = root.ChildNodes; int TotalCount = elemList.Count; XmlNodeList ids = root.SelectNodes("/offers/offer/offer_id"); XmlNodeList names = root.SelectNodes("/offers/offer/offer_name"); XmlNodeList descriptions = root.SelectNodes("/offers/offer/requirements"); XmlNodeList commissions = root.SelectNodes("/offers/offer/rate"); XmlNodeList countries = root.SelectNodes("/offers/offer/allowed_countries"); XmlNodeList incentives = root.SelectNodes("/offers/offer/cash_incentive_allowed"); XmlNodeList banners = root.SelectNodes("/offers/offer/creatives/image_url"); XmlNodeList urls = root.SelectNodes("/offers/offer/creatives/publisher_url"); //Lets process it in 1-1000 batches int BatchesCount = Convert.ToInt32(Math.Ceiling((double)TotalCount / (double)400.0)); int MainIterator = 0; for (int i = 0; i < BatchesCount; ++i) { var Query = ConstructInsertQueryStart(); bool AreSomeRecordsInQuery = false; for (int j = 0; j < 400 && MainIterator < TotalCount; j++) { try { var offer = elemList[MainIterator]; string id = ids[MainIterator].InnerText; string name = names[MainIterator].InnerText; string description = descriptions[MainIterator].InnerText; string incent = incentives[MainIterator].InnerText; string url = urls[MainIterator].InnerText.Replace("sid1/", "sid1/%USERNAME%"); string banner = banners[MainIterator].InnerText; string rate = commissions[MainIterator].InnerText; var countriesList = countries[MainIterator].SelectNodes("country"); string countriesString = ""; if (countriesList.Count == 1 && countriesList[0].InnerText.ToUpper() == "ALL") { countriesString = ""; } else { foreach (XmlElement country in countriesList) { countriesString += country.InnerText.Trim() + ", "; } if (countriesString.EndsWith(", ")) { countriesString = countriesString.Remove(countriesString.Length - 2); } } if (!string.IsNullOrWhiteSpace(url)) { SyncedNetwork.HandleAddition(name, description, rate, banner, url, incent, countriesString, base.Network, id, OnHoldList, ref AreSomeRecordsInQuery, ref Query); } //Increase the iterator MainIterator++; } catch (Exception ex) { ErrorLogger.Log(ex); } } //Now execute the batch; if (AreSomeRecordsInQuery) { using (var bridge = ParserPool.Acquire(Database.Client)) { if (Query[Query.Length - 1] == ',') { Query[Query.Length - 1] = ';'; } bridge.Instance.ExecuteRawCommandNonQuery(Query.ToString()); } } } //Now, remove the offers that shouldn't be on the list foreach (var elem in OnHoldList) { if (elem.Status != AdvertStatus.WaitingForAcceptance) { elem.Delete(); } } Network.LastSyncDate = DateTime.Now; Network.Save(); } catch (Exception ex) { ErrorLogger.Log(ex); if (base.ThrowExceptions) { throw new MsgException("There was a problem with offers export/download " + Network.Name + ": " + ex.Message + ". Check your username/password and if the website is available"); } } }
public override void Download() { AffiliateNetwork Network = base.Network; try { DataTable dt = new DataTable(); using (var bridge = ParserPool.Acquire(Database.Client)) { dt = bridge.Instance.ExecuteRawCommandToDataTable("SELECT * FROM CPAOffersOnHold WHERE NetworkName = '" + Network.Name + "' ORDER BY NetworkOfferIdInt ASC"); } JArray element = GetElement(Network.PublisherPassword, Network.PublisherUsername, ThrowExceptions); var OnHoldList = TableHelper.GetListFromDataTable <CPAOfferOnHold>(dt, 100, true); //Lets process it in 1-1000 batches int TotalCount = element.Count; int BatchesCount = Convert.ToInt32(Math.Ceiling((double)TotalCount / (double)1000.0)); int MainIterator = 0; for (int i = 0; i < BatchesCount; ++i) { var Query = ConstructInsertQueryStart(); bool AreSomeRecordsInQuery = false; for (int j = 0; j < 1000 && MainIterator < TotalCount; j++) { var offer = element[MainIterator]; string id = offer["id"].ToString(); string name = offer["name"].ToString(); string description = offer["description"].ToString(); string rate = offer["default_payout"].ToString(); CPAOfferOnHold ThisOffer = SyncedNetwork.HasThisOffer(OnHoldList, id, name); if (ThisOffer != null) { //We have it, just change the status ThisOffer.Status = Advertising.AdvertStatus.WaitingForAcceptance; } else { AreSomeRecordsInQuery = true; //Preparte the variables to fit database Money UserRate; if (rate.Contains(".")) { UserRate = Money.Parse(rate); } else { UserRate = Money.Parse(rate + ".0"); } UserRate = Money.MultiplyPercent(UserRate, Network.DefaultPercentForMembers); if (name.Length > 50) { name = name.Substring(0, 49); } string url = GetTrackingUrl(Network.PublisherPassword, Network.PublisherUsername, id); //if (string.IsNullOrEmpty(url)) //{ // System.Diagnostics.Debug.WriteLine(id); // MainIterator++; // continue; //} string countries = GetCountries(id, Network.PublisherPassword, Network.PublisherUsername); //We need to add it CPAOfferOnHold NewOffer = new CPAOfferOnHold(); NewOffer.IsFromAutomaticNetwork = true; NewOffer.NetworkOfferId = id; NewOffer.Title = name; NewOffer.TargetURL = url; NewOffer.DateAdded = DateTime.Now; NewOffer.Status = Advertising.AdvertStatus.Active; NewOffer.AdvertiserUsername = Network.Name; NewOffer.LoginBoxRequired = false; NewOffer.EmailBoxRequired = false; NewOffer.LastCredited = OffersManager.DateTimeZero; NewOffer.Description = description; NewOffer.Category = new Titan.CPACategory(Titan.CPACategory.DEFAULT_CATEGORY_ID); NewOffer.BaseValue = UserRate; NewOffer.CreditsBought = 1000000; //Infinity NewOffer.NetworkName = Network.Name; NewOffer.NetworkRate = rate; NewOffer.IsSyncWithNetwork = false; // by default NewOffer.IsDaily = false; NewOffer.MaxDailyCredits = 1; NewOffer.AddGeolocation(new GeolocationUnit(countries)); NewOffer.CreditOfferAs = CreditOfferAs.NetworkDefault; SyncedNetwork.ConstructInsertQuery(Query, NewOffer); } //Increase the iterator MainIterator++; } //Now execute the batch; if (AreSomeRecordsInQuery) { using (var bridge = ParserPool.Acquire(Database.Client)) { if (Query[Query.Length - 1] == ',') { Query[Query.Length - 1] = ';'; } bridge.Instance.ExecuteRawCommandNonQuery(Query.ToString()); } } } //Now, remove the offers that shouldn't be on the list foreach (var elem in OnHoldList) { if (elem.Status != AdvertStatus.WaitingForAcceptance) { elem.Delete(); } } Network.LastSyncDate = DateTime.Now; Network.Save(); } catch (Exception ex) { ErrorLogger.Log(ex); if (base.ThrowExceptions) { throw new MsgException("There was a problem with offers export/download " + Network.Name + ": " + ex.Message + ". Check your username/password and if the website is available"); } } }