Beispiel #1
0
        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;
            }
        }
Beispiel #2
0
        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;
 }
Beispiel #4
0
 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)));
        }
Beispiel #6
0
        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");
        }