public void Update100() { FillAirDensity(); if (m_grid.IsStatic || m_airDensity == 0f) { return; } if (m_profileAt <= Globals.UpdateCount) { Log.DebugLog("Starting profile task", Logger.severity.DEBUG); m_profileAt = ulong.MaxValue; m_profileTask = new ProfileTask(m_grid.EntityId); RemoteTask.StartTask(m_profileTask, ((MyCubeGrid)m_grid).CubeBlocks.Count < 100); return; } if (m_profileTask != null && m_profileTask.CurrentStatus > RemoteTask.Status.Started) { if (m_profileTask.CurrentStatus == RemoteTask.Status.Success) { DragCoefficient = m_profileTask.DragCoefficient; for (int i = 0; i < 6; ++i) { Log.DebugLog("Direction: " + (Base6Directions.Direction)i + ", DragCoefficient: " + DragCoefficient[i], Logger.severity.DEBUG); } } m_profileTask = null; } }
private void RemoveTask(ProfileTask task) { CloudBlobContainer container = this.BlobClient.GetContainerReference(ComicConfigSectionGroup.Blob.TaskContainer); CloudBlobDirectory directory = container.GetDirectoryReference(ComicConfigSectionGroup.Blob.ProfileTaskDirectory); CloudBlob blob = directory.GetBlobReference(task.TaskId.ToString()); blob.DeleteIfExists(); }
public ClientProfileTask(ProfileTask source) { this.TaskId = source.TaskId; this.Status = source.Status; this.OwnerUid = source.OwnerUid; this.Effect = source.Effect; this.RenderUrl = ComicUrlHelper.GetProfileRenderUrl(source.StorageKey); this.Intensity = source.Intensity; }
private void UpdateTask(ProfileTask task) { try { CloudBlobContainer container = this.BlobClient.GetContainerReference(ComicConfigSectionGroup.Blob.TaskContainer); CloudBlobDirectory directory = container.GetDirectoryReference(ComicConfigSectionGroup.Blob.ProfileTaskDirectory); CloudBlob progressBlob = directory.GetBlobReference(task.TaskId.ToString()); progressBlob.UploadText(task.ToXml()); } catch (Exception x) { this.Log.Error("Unable to update render progress", x); } }
public ActionResult QueueRender(ComicEffectType effect, int intensity) { // Generate render task ProfileTask task = new ProfileTask(); task.TaskId = Guid.NewGuid(); task.Status = TaskStatus.Queued; task.Effect = effect; task.Intensity = intensity; task.OwnerUid = this.ActiveUser.Uid; task.FacebookToken = this.Facebook.AccessToken; task.StorageKey = this.ActiveUser.Uid.ToString(); // Queue the task up using Azure Queue services. Store full task information using Blob storage. Only the task id is queued. // This is done because we need public visibility on render tasks before, during and after the task completes. // Save task to storage CloudBlobContainer container = this.BlobClient.GetContainerReference(ComicConfigSectionGroup.Blob.TaskContainer); CloudBlobDirectory directory = container.GetDirectoryReference(ComicConfigSectionGroup.Blob.ProfileTaskDirectory); CloudBlob blob = directory.GetBlobReference(task.TaskId.ToString()); blob.UploadText(task.ToXml()); // Queue up task CloudQueue queue = this.QueueClient.GetQueueReference(ComicConfigSectionGroup.Queue.ProfileTaskQueue); CloudQueueMessage message = new CloudQueueMessage(task.TaskId.ToString()); queue.AddMessage(message, TimeSpan.FromMinutes(5)); //Session autoshare bool autoShareFeed = false; if (this.Session[SESSION_AUTO_SHARE] == null) { autoShareFeed = true; this.Session[SESSION_AUTO_SHARE] = true; } return(this.View("Render", new ViewFacebookRender(new ClientProfileTask(task), autoShareFeed))); }
private void ExecuteTask(object state) { CloudQueueMessage queueMessage = (CloudQueueMessage)state; this.Log.DebugFormat("Executing facebook task {0}", queueMessage.AsString); string connectionString = ConfigurationManager.ConnectionStrings["ComicModelContext"].ConnectionString; ComicModelContext entityContext = new ComicModelContext(connectionString); ProfileTask task = null; try { // Read task details from storage CloudBlobContainer container = this.BlobClient.GetContainerReference(ComicConfigSectionGroup.Blob.TaskContainer); CloudBlobDirectory directory = container.GetDirectoryReference(ComicConfigSectionGroup.Blob.ProfileTaskDirectory); CloudBlob blob = directory.GetBlobReference(queueMessage.AsString); XmlSerializer serializer = new XmlSerializer(typeof(ProfileTask)); using (MemoryStream stream = new MemoryStream()) { blob.DownloadToStream(stream); stream.Seek(0, SeekOrigin.Begin); task = (ProfileTask)serializer.Deserialize(stream); task.Status = TaskStatus.Executing; this.UpdateTask(task); } User user = entityContext.TryGetUser(task.OwnerUid); FacebookClient facebook = new FacebookClient(task.FacebookToken); // Get profile image from facebook string imageUrl = String.Format("https://graph.facebook.com/{0}/picture?access_token={1}&type=large", user.Uid, facebook.AccessToken); Bitmap image = this.GetImage(imageUrl); // Apply render effect RenderHelper effectHelper = new RenderHelper(image.Size); // Translate intensity to render parameters using min / max range Dictionary <string, object> parameters = new Dictionary <string, object>(); foreach (RenderParameter p in effectHelper.GetRenderParameters(task.Effect)) { if (task.Intensity == 0) { parameters.Add(p.Name, p.MinValue); } else if (task.Intensity == 1) { parameters.Add(p.Name, p.DefaultValue); } else if (task.Intensity == 2) { parameters.Add(p.Name, p.MaxValue); } } ImageRenderData renderResult = effectHelper.RenderEffect(image, task.Effect, parameters); image = new Bitmap(renderResult.RenderStream); // Read raw photo into memory MemoryStream imageStream = new MemoryStream(); image.Save(imageStream, System.Drawing.Imaging.ImageFormat.Jpeg); imageStream.Seek(0, SeekOrigin.Begin); // Save to storage ProfileRender render = new ProfileRender(); render.CreateTime = DateTime.Now; render.User = user; render.StorageKey = task.StorageKey; entityContext.AddToProfileRender(render); entityContext.SaveChanges(); CloudBlobContainer imageContainer = this.BlobClient.GetContainerReference(ComicConfigSectionGroup.Blob.RenderContainer); CloudBlobDirectory imageDirectory = imageContainer.GetDirectoryReference(ComicConfigSectionGroup.Blob.ProfileDirectory); CloudBlob imageBlob = imageDirectory.GetBlobReference(task.StorageKey); imageBlob.Properties.ContentType = "image/jpeg"; imageBlob.UploadFromStream(imageStream); // Mark task as completed task.Status = TaskStatus.Complete; this.UpdateTask(task); this.Log.DebugFormat("Completed facebook task {0}", task.TaskId); } catch (Exception x) { this.Log.Error("Unable to complete facebook task.", x); if (task != null) { task.Status = TaskStatus.Failed; this.UpdateTask(task); } } }
public ActionResult RenderProgress(string taskId) { CloudBlobContainer container = this.BlobClient.GetContainerReference(ComicConfigSectionGroup.Blob.TaskContainer); CloudBlobDirectory directory = container.GetDirectoryReference(ComicConfigSectionGroup.Blob.ProfileTaskDirectory); CloudBlob blob = directory.GetBlobReference(taskId); XmlSerializer serializer = new XmlSerializer(typeof(ProfileTask)); using (MemoryStream stream = new MemoryStream()) { blob.DownloadToStream(stream); stream.Seek(0, SeekOrigin.Begin); ProfileTask task = (ProfileTask)serializer.Deserialize(stream); if (task.OwnerUid != this.ActiveUser.Uid) { throw new Exception("Unknown task"); } ClientProfileTask clientTask = new ClientProfileTask(task); // Email re-engagement after successfull render if (task.Status == TaskStatus.Complete) { try { this.EntityContext.TryAttach(this.ActiveUser); Data.UserEngage engage = this.GetUserEngage(this.ActiveUser); Data.UserEngageHistory history = this.ActiveUser.UserEngageHistory .OrderByDescending(h => h.EngageTime) .FirstOrDefault(h => h.Engagement == Data.UserEngageHistory.EngagementType.ProfileRender); if (!engage.Unsubscribe && engage.ComicCreate && (history == null || history.EngageTime <= DateTime.Now.AddDays(-1))) { // create & save history history = new Data.UserEngageHistory(); history.Engagement = Data.UserEngageHistory.EngagementType.ProfileRender; history.EngageTime = DateTime.Now; history.User = this.ActiveUser; this.EntityContext.AddToUserEngageHistory(history); this.EntityContext.SaveChanges(); // Generate email message EmailManager email = new EmailManager(this.Server); Dictionary <string, string> data = new Dictionary <string, string>(); data.Add("id", history.EngageHistoryId.ToString()); data.Add("title", "Comic Mashup Profile Photo"); data.Add("to.render", clientTask.RenderUrl); // Send email email.SendEmail(this.ActiveUser, "ProfileRender.html", data); } } finally { this.EntityContext.TryDetach(this.ActiveUser); } } return(this.Json(clientTask, JsonRequestBehavior.AllowGet)); } throw new Exception("Unknown task"); }