public List <SerializedPlayerItems> DownloadBuddyItems(List <long> buddies) { List <SerializedPlayerItems> result = new List <SerializedPlayerItems>(); if (_downloadCooldown.IsReady) { _downloadCooldown.Reset(); List <string> compressedJsonData = DownloadBuddyData(buddies); List <string> jsonData = compressedJsonData .Select(GzipCompressionHandler.DecodeBase64AndDecompress) // For some reason the string result is quoted, strip them. .ToList(); foreach (string json in jsonData) { if (!string.IsNullOrEmpty(json)) { result.Add(JObject.Parse(json).ToObject <SerializedPlayerItems>()); } } } return(result); }
public void Start() { if (_t != null) { throw new ArgumentException("Max one thread running per instance"); } _t = new Thread(() => { ExceptionReporter.EnableLogUnhandledOnThread(); while (!_isShuttingDown) { if (_cooldown.IsReady) { Process(); _cooldown.Reset(); } Thread.Sleep(1); } }); _t.Start(); }
private void bw_DoWork(object sender, DoWorkEventArgs e) { if (Thread.CurrentThread.Name == null) { Thread.CurrentThread.Name = "BuddyBackground"; } BackgroundWorker worker = sender as BackgroundWorker; Serializer serializer = new Serializer(_buddyItemDao, _playerItemDao, _settings); Synchronizer synchronizer = new Synchronizer(_settings); worker?.ReportProgress(ProgressSetUid, synchronizer.CreateUserId()); while (!worker.CancellationPending) { try { Thread.Sleep(10); if (_cooldown.IsReady) { // Sync up, if UI thread has sent us any data. SerializedPlayerItems element = serializer.Serialize(); if (element != null) { if (!synchronizer.UploadBuddyData(element)) { Logger.Warn("Buddy items upload failed"); } } else { Logger.Warn("Buddy Items upload NULL!?"); } // Sync down, and pass data to UI thread List <SerializedPlayerItems> syncdownData = synchronizer.DownloadBuddyItems(_subscribers); if (syncdownData != null && syncdownData.Count > 0) { Logger.InfoFormat("Downloaded itemdata for {0} buddies.", syncdownData.Count); var deserializer = new Serializer(_buddyItemDao, _playerItemDao, _settings); foreach (var item in syncdownData) { if (item.UserId > 0) { deserializer.DeserializeAndSave(item); } } worker.ReportProgress(ProgressStoreBuddydata); } _cooldown.Reset(); } } catch (NullReferenceException ex) { Logger.Info("The following exception is logged, but can safely be ignored:"); Logger.Warn(ex.Message); Logger.Warn(ex.StackTrace); } catch (Exception ex) { Logger.Error(ex.Message); Logger.Error(ex.StackTrace); ExceptionReporter.ReportException(ex); } } }
private BuddyUploadResponse UploadBuddyData(string postData, string url, bool forced = false) { if (_uploadCooldown.IsOnCooldown && !forced) { Logger.Info("Buddy data not uploaded, still on cooldown.."); return(null); } HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest; if (request == null) { Logger.Warn("Could not create HttpWebRequest"); return(null); } var encoding = new UTF8Encoding(); byte[] data = encoding.GetBytes(postData); request.Method = "POST"; request.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip, deflate"); request.Headers.Add(HttpRequestHeader.ContentEncoding, "gzip"); request.ContentType = "application/x-www-form-urlencoded"; //request.ContentLength = data.Length; try { using (Stream stream = request.GetRequestStream()) { stream.Write(data, 0, data.Length); } // threshold using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) { if (response.StatusCode != HttpStatusCode.OK) { Logger.Info("Failed to upload buddy item data."); return(new BuddyUploadResponse { Status = (int)response.StatusCode }); } string responseString = new StreamReader(response.GetResponseStream()).ReadToEnd(); Logger.Debug(responseString); Logger.Info("Uploaded buddy item data."); _uploadCooldown.Reset(); return(new BuddyUploadResponse { Content = responseString, Status = 200 }); } } catch (WebException ex) { Logger.Info("Failed to upload buddy item data."); using (WebResponse response = ex.Response) { HttpWebResponse httpResponse = (HttpWebResponse)response; if (httpResponse.StatusCode == HttpStatusCode.Unauthorized) { return(new BuddyUploadResponse { Status = (int)httpResponse.StatusCode }); } } if (ex.Status != WebExceptionStatus.NameResolutionFailure && ex.Status != WebExceptionStatus.Timeout) { Logger.Warn(ex.Message); Logger.Warn(ex.StackTrace); ExceptionReporter.ReportException(ex); } else { Logger.Info("Could not resolve DNS for buddy server, skipping upload."); } } catch (IOException ex) { Logger.Warn(ex.Message); Logger.Warn(ex.StackTrace); } catch (Exception ex) { Logger.Error(ex.Message); Logger.Error(ex.StackTrace); ExceptionReporter.ReportException(ex); } return(null); }