示例#1
0
        public async Task <ActionResult> Submit(int postId, int groupId, string content, string postTitle, bool isDraft, bool isNSFW, bool postQuietly, string language)
        {
            var userId = User.Identity.GetUserId();

            if (userId == null)
            {
                Response.StatusCode = (int)HttpStatusCode.InternalServerError;
                return(Json(new { success = false, message = "Error finding user account." }));
            }

            using (var db = new ZapContext())
            {
                var user = await db.Users.Where(u => u.AppId == userId)
                           .FirstOrDefaultAsync().ConfigureAwait(true); // Note ConfigureAwait must be true since we need to preserve context for the mailer

                // Cleanup post HTML
                string contentStr = CleanContent(content);

                var postGroup = await db.Groups
                                .Include(g => g.Banished)
                                .FirstOrDefaultAsync(g => g.GroupId == groupId).ConfigureAwait(true);

                if (postGroup.Banished.Where(b => b.User.AppId == userId).Any())
                {
                    Response.StatusCode = (int)HttpStatusCode.Unauthorized;
                    return(Json(new { success = false, message = "You are banished from this group and can not post to it." }));
                }

                string postLanguage = LanguageHelpers.NameToISO(language);

                Post post = null;
                if (postId > 0)
                {
                    // Updated post
                    post = await db.Posts
                           .Include(pst => pst.UserId)
                           .Where(pst => pst.PostId == postId)
                           .FirstOrDefaultAsync().ConfigureAwait(true);

                    // Ensure user owns this post (or is site admin)
                    if (post.UserId.Id != user.Id && !User.IsInRole("Administrator"))
                    {
                        // Editing another user's post.
                        Response.StatusCode = (int)HttpStatusCode.Unauthorized;
                        return(Json(new { result = "failure", success = false, message = "User mismatch" }));
                    }

                    post.PostTitle = postTitle == null ? "Post" : postTitle.CleanUnicode().SanitizeXSS()
                                     .Replace("&amp;", "&");
                    post.Group    = postGroup;
                    post.Content  = contentStr;
                    post.Language = postLanguage ?? post.Language;
                    post.IsNSFW   = isNSFW;

                    if (post.IsDraft) // Post was or is draft - set timestamp.
                    {
                        post.TimeStamp = DateTime.UtcNow;
                    }
                    else // Post has been published, don't update timestamp, update edit timestamp.
                    {
                        post.TimeStampEdited = DateTime.UtcNow;
                    }

                    if (post.IsDraft && !isDraft) // Post was a draft, now published
                    {
                        post.IsDraft = isDraft;
                        await db.SaveChangesAsync().ConfigureAwait(true);

                        if (!isDraft && !postQuietly && !post.TimeStampEdited.HasValue)
                        {
                            await eventService.OnNewPostAsync(post.PostId).ConfigureAwait(true);

                            // Old version:
                            //// Send alerts to users subscribed to users
                            //try
                            //{
                            //    var mailer = DependencyResolver.Current.GetService<MailerController>();
                            //    mailer.ControllerContext = new ControllerContext(this.Request.RequestContext, mailer);
                            //    string emailBody = await mailer.GenerateNewPostEmailBody(post.PostId).ConfigureAwait(true);
                            //    BackgroundJob.Enqueue<MailingService>(
                            //        methodCall: x => x.MailNewPostToFollowers(post.PostId, emailBody));
                            //}
                            //catch (Exception)
                            //{
                            //    // noted.
                            //}
                        }
                    }
                    else if (!post.IsDraft && isDraft) // Editing a previously published post
                    {
                        // Just save final version
                        await db.SaveChangesAsync().ConfigureAwait(true);
                    }
                    else
                    {
                        //post.IsDraft = isDraft; // Don't set draft again after published
                        await db.SaveChangesAsync().ConfigureAwait(true);

                        return(Json(new { result = "success", success = true, postId = post.PostId, HTMLContent = contentStr }));
                    }
                }
                else
                {
                    // New post
                    post = new Post()
                    {
                        Content     = contentStr,
                        UserId      = user,
                        TotalEarned = 0,
                        IsDeleted   = false,
                        Score       = 1,
                        Group       = postGroup,
                        TimeStamp   = DateTime.UtcNow,
                        VotesUp     = new List <User>()
                        {
                            user
                        },
                        PostTitle = postTitle == null ? "" : postTitle.CleanUnicode().SanitizeXSS().Replace("&amp;", "&"),
                        IsDraft   = isDraft,
                        Language  = postLanguage,
                        IsNSFW    = isNSFW,
                    };

                    db.Posts.Add(post);
                    await db.SaveChangesAsync().ConfigureAwait(true);

                    if (!isDraft && !postQuietly)
                    {
                        try
                        {
                            await eventService.OnNewPostAsync(post.PostId).ConfigureAwait(true);

                            // Old version:
                            //var mailer = DependencyResolver.Current.GetService<MailerController>();
                            //mailer.ControllerContext = new ControllerContext(this.Request.RequestContext, mailer);
                            //string emailBody = await mailer.GenerateNewPostEmailBody(post.PostId).ConfigureAwait(true);

                            //BackgroundJob.Enqueue<MailingService>(
                            //    methodCall: x => x.MailNewPostToFollowers(post.PostId, emailBody));
                        }
                        catch (Exception)
                        {
                            // noted.
                        }
                    }
                }
                return(Json(new { success = true, postId = post.PostId }));
            }
        }
        public override bool FindAllComponents()
        {
            #region Canvas

            var canvasGameObject = gameObject.GetComponentInChildren <Canvas>()?.gameObject;

            if (canvasGameObject == null)
            {
                QuickLogger.Error("Canvas not found.");
                return(false);
            }

            #endregion

            // == Canvas Elements == //

            #region Navigation Dock
            var navigationDock = canvasGameObject.transform.Find("Navigation_Dock")?.gameObject;
            if (navigationDock == null)
            {
                QuickLogger.Error("Dock: Navigation_Dock not found.");
                return(false);
            }
            #endregion

            // == Navigation Button Elements == //

            #region Screen Holder

            GameObject screenHolder = canvasGameObject.transform.Find("Screens")?.gameObject;

            if (screenHolder == null)
            {
                QuickLogger.Error("Screen Holder GameObject not found.");
                return(false);
            }

            #endregion

            // == Screen Holder Elements == //

            #region Welcome Screen

            var welcomeScreen = screenHolder.FindChild("WelcomePage")?.gameObject;
            if (welcomeScreen == null)
            {
                QuickLogger.Error("Screen: WelcomeScreen not found.");
                return(false);
            }

            #endregion

            #region Version Label
            var versionLbl = welcomeScreen.FindChild("Logo_Intro").FindChild("Version_Text")?.gameObject;

            if (versionLbl == null)
            {
                QuickLogger.Error("Cannot find Version_Text Game Object");
            }

            string assemblyVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString();

            versionLbl.GetComponent <Text>().text = $"V{assemblyVersion}";
            #endregion

            #region Settings Screen

            var settingsScreen = screenHolder.FindChild("SettingsPage")?.gameObject;
            if (settingsScreen == null)
            {
                QuickLogger.Error("Screen: SettingsPage not found.");
                return(false);
            }

            #endregion

            #region Battery Monitor Page
            var batteryMonitorPage = screenHolder.FindChild("BatteryMonitorPage")?.gameObject;
            if (batteryMonitorPage == null)
            {
                QuickLogger.Error("Screen: BatteryMonitorPage not found.");
                return(false);
            }

            QuickLogger.Info("Finding Meters");
            #endregion

            #region Battery Grid
            _batteryGrid = batteryMonitorPage.FindChild("Grid")?.gameObject;
            if (_batteryGrid == null)
            {
                QuickLogger.Error("Screen: BatteryMonitorPage not found.");
                return(false);
            }

            QuickLogger.Debug($"Meter Count {_batteryGrid.transform.childCount}");


            for (int i = 0; i < _mono.BatteryCount; i++)
            {
                QuickLogger.Info($"Meter {i}");
                var powercell = _mono.PowerManager.GetPowerCell(i);
                QuickLogger.Debug($"Battery {powercell.GetName()}");
                powercell.SetMeter(_batteryGrid.transform.GetChild(i).gameObject);
            }
            #endregion

            #region Power Off Page
            var powerOffPage = screenHolder.FindChild("PowerOffPage")?.gameObject;
            if (powerOffPage == null)
            {
                QuickLogger.Error("Screen: PowerOffPage not found.");
                return(false);
            }
            #endregion

            #region Boot Page
            var bootingPage = screenHolder.FindChild("BootingPage")?.gameObject;
            if (bootingPage == null)
            {
                QuickLogger.Error("Screen: BootingPage not found.");
                return(false);
            }
            #endregion

            // == Powered off Elements
            #region PoweredOff LBL

            var poweredOffLbl = powerOffPage.FindChild("Powered_Off_LBL").GetComponent <Text>();
            if (poweredOffLbl == null)
            {
                QuickLogger.Error("Screen: Powered_Off_LBL  not found.");
                return(false);
            }
            poweredOffLbl.text = LanguageHelpers.GetLanguage(FCSPowerStorageBuildable.PoweredOffKey);

            #endregion


            // == Battery MonitorPage Elements

            #region Battery Monitor Power Amount Label
            _batteryMonitorAmountLbl = batteryMonitorPage.FindChild("Battery_Monitor_Amount_LBL").GetComponent <Text>();
            if (_batteryMonitorAmountLbl == null)
            {
                QuickLogger.Error("Screen: Battery_Monitor_Amount_LBL not found.");
                return(false);
            }
            #endregion

            #region Battery Monitor Label

            var batteryMonitorLbl = batteryMonitorPage.FindChild("Battery_Monitor_LBL").GetComponent <Text>();
            if (batteryMonitorLbl == null)
            {
                QuickLogger.Error("Screen: Battery_Monitor_LBL not found.");
                return(false);
            }
            batteryMonitorLbl.text = LanguageHelpers.GetLanguage(FCSPowerStorageBuildable.BatteryMetersKey);

            #endregion

            #region Trickle Mode BTN
            var trickleModeBtn = batteryMonitorPage.FindChild("Trickle_Mode")?.gameObject;
            if (trickleModeBtn == null)
            {
                QuickLogger.Error("Screen: Trickle_Mode not found.");
                return(false);
            }

            InterfaceButton trickleBTN = trickleModeBtn.AddComponent <InterfaceButton>();
            trickleBTN.OnButtonClick += OnButtonClick;
            trickleBTN.ButtonMode     = InterfaceButtonMode.None;
            trickleBTN.BtnName        = "TrickleModeBTN";

            #endregion

            #region Charge Mode BTN
            var chargeModeBtn = batteryMonitorPage.FindChild("Charge_Mode")?.gameObject;
            if (chargeModeBtn == null)
            {
                QuickLogger.Error("Screen: Charge_Mode not found.");
                return(false);
            }

            InterfaceButton chargeBTN = chargeModeBtn.AddComponent <InterfaceButton>();
            chargeBTN.ButtonMode     = InterfaceButtonMode.None;
            chargeBTN.OnButtonClick += OnButtonClick;
            chargeBTN.BtnName        = "ChargeModeBTN";
            #endregion


            // == Boot Page Elements == //

            #region Booting LBL

            var bootingLbl = bootingPage.FindChild("Booting_TXT").GetComponent <Text>();
            if (bootingLbl == null)
            {
                QuickLogger.Error("Screen: _bootingLBL  not found.");
                return(false);
            }
            bootingLbl.text = LanguageHelpers.GetLanguage(FCSPowerStorageBuildable.BootingKey);

            #endregion

            // == Settings Page Elements == //
            #region Color Picker
            var colorPicker = settingsScreen.FindChild("Color_Picker")?.gameObject;
            if (colorPicker == null)
            {
                QuickLogger.Error("Screen: _color_Picker not found.");
                return(false);
            }

            InterfaceButton colorPickerBTN = colorPicker.AddComponent <InterfaceButton>();
            colorPickerBTN.OnButtonClick += OnButtonClick;
            colorPickerBTN.ButtonMode     = InterfaceButtonMode.None;
            colorPickerBTN.BtnName        = "ColorPickerBTN";
            #endregion

            #region Color Picker LBL

            var colorPickerLbl = colorPicker.FindChild("Label").GetComponent <Text>();
            if (colorPickerLbl == null)
            {
                QuickLogger.Error("Screen: Color Picker Label not found.");
                return(false);
            }
            colorPickerLbl.text = LanguageHelpers.GetLanguage(FCSPowerStorageBuildable.ColorPickerKey);

            #endregion

            #region Settings LBL

            var settingsLbl = settingsScreen.FindChild("Setting_LBL").GetComponent <Text>();
            if (settingsLbl == null)
            {
                QuickLogger.Error("Screen: Settings Page Label not found.");
                return(false);
            }
            settingsLbl.text = LanguageHelpers.GetLanguage(FCSPowerStorageBuildable.SettingsKey);

            #endregion

            #region System Settings LBL

            var storageModeLbl = settingsScreen.FindChild("System_Settings_LBL").GetComponent <Text>();
            if (storageModeLbl == null)
            {
                QuickLogger.Error("Screen: Storage Mode Label not found.");
                return(false);
            }
            storageModeLbl.text = LanguageHelpers.GetLanguage(FCSPowerStorageBuildable.SystemSettingsLblKey);

            #endregion

            #region Grid
            var grid = settingsScreen.FindChild("Grid")?.gameObject;
            if (grid == null)
            {
                QuickLogger.Error("Screen: Grid not found.");
                return(false);
            }
            #endregion

            #region Auto Activate BTN
            var autoActivateBtn = grid.FindChild("Auto_Activate")?.gameObject;
            if (autoActivateBtn == null)
            {
                QuickLogger.Error("Screen: Auto_Activate not found.");
                return(false);
            }

            var autoActivateTxt = autoActivateBtn.FindChild("Label").GetComponent <Text>();

            if (autoActivateTxt == null)
            {
                QuickLogger.Error("Screen: Auto_Activate text not found.");
                return(false);
            }

            autoActivateTxt.text = LanguageHelpers.GetLanguage(FCSPowerStorageBuildable.AutoActivateKey);

            InterfaceButton autoABTN = autoActivateBtn.AddComponent <InterfaceButton>();
            autoABTN.ButtonMode     = InterfaceButtonMode.None;
            autoABTN.OnButtonClick += OnButtonClick;
            autoABTN.BtnName        = "AutoActivateBTN";

            #endregion

            #region Sync BTN
            var syncBtn = grid.FindChild("Sync")?.gameObject;
            if (syncBtn == null)
            {
                QuickLogger.Error("Screen: Sync not found.");
                return(false);
            }

            var syncAllBtnTxt = syncBtn.FindChild("Label").GetComponent <Text>();

            if (syncAllBtnTxt == null)
            {
                QuickLogger.Error("Screen: Sync All text not found.");
                return(false);
            }

            syncAllBtnTxt.text = LanguageHelpers.GetLanguage(FCSPowerStorageBuildable.SyncAllKey);

            InterfaceButton syncBTN = syncBtn.AddComponent <InterfaceButton>();
            syncBTN.ButtonMode     = InterfaceButtonMode.None;
            syncBTN.OnButtonClick += OnButtonClick;
            syncBTN.BtnName        = "SyncBTN";

            #endregion

            #region Auto Activate Limit
            var autoActivateLimitBtn = grid.FindChild("Auto_Activate_Limit")?.gameObject;
            if (autoActivateLimitBtn == null)
            {
                QuickLogger.Error("Screen: Auto_Activate_Limit not found.");
                return(false);
            }

            var autoActivateLimitTxt = autoActivateLimitBtn.FindChild("Label").GetComponent <Text>();

            if (autoActivateLimitTxt == null)
            {
                QuickLogger.Error("Screen: Auto_Activate_limit text not found.");
                return(false);
            }

            autoActivateLimitTxt.text = LanguageHelpers.GetLanguage(FCSPowerStorageBuildable.AutoActivateAtKey);

            var autoActivateLimitTextBox = autoActivateLimitBtn.FindChild("Background").FindChild("Text")?.gameObject;

            if (autoActivateLimitTextBox == null)
            {
                QuickLogger.Error("Screen:btnName Text not found.");
                return(false);
            }

            _autoActivateTextB      = autoActivateLimitTextBox.GetComponent <Text>();
            _autoActivateTextB.text = _mono.GetAutoActivateAt().ToString();

            var autoActivateResult = CreateSystemButton(autoActivateLimitTextBox,
                                                        LanguageHelpers.GetLanguage(FCSPowerStorageBuildable.AutoActivateDescKey), LanguageHelpers.GetLanguage(FCSPowerStorageBuildable.AutoActivateOnHoverKey),
                                                        _mono.GetAutoActivateAt, _mono.ValidateAutoConfigUnits);

            if (!autoActivateResult)
            {
                return(false);
            }

            #endregion

            #region Base Drain Protection BTN
            var baseDrainProtectionBtn = grid.FindChild("Base_Drain_Protection")?.gameObject;
            if (baseDrainProtectionBtn == null)
            {
                QuickLogger.Error("Screen: Base_Drain_Protection not found.");
                return(false);
            }

            var baseDrianProtectionTxt = baseDrainProtectionBtn.FindChild("Label").GetComponent <Text>();

            if (baseDrianProtectionTxt == null)
            {
                QuickLogger.Error("Screen: Base_Drain_protection text not found.");
                return(false);
            }

            baseDrianProtectionTxt.text = LanguageHelpers.GetLanguage(FCSPowerStorageBuildable.BaseDrainProtectionKey);

            InterfaceButton bDPBTN = baseDrainProtectionBtn.AddComponent <InterfaceButton>();
            bDPBTN.ButtonMode     = InterfaceButtonMode.None;
            bDPBTN.OnButtonClick += OnButtonClick;
            bDPBTN.BtnName        = "BaseDrainBTN";
            #endregion

            #region Base Drain Limit
            var baseDrainlimitBtn = grid.FindChild("Base_Drain_Limit")?.gameObject;

            if (baseDrainlimitBtn == null)
            {
                QuickLogger.Error("Screen: Base_Drain_Limit not found.");
                return(false);
            }

            var baseDrianLimitTxt = baseDrainlimitBtn.FindChild("Label").GetComponent <Text>();

            if (baseDrianLimitTxt == null)
            {
                QuickLogger.Error("Screen: Base_Drain_Limit  text not found.");
                return(false);
            }

            baseDrianLimitTxt.text = LanguageHelpers.GetLanguage(FCSPowerStorageBuildable.BaseDrainLimitKey);

            var baseDrainlimitTextBox = baseDrainlimitBtn.FindChild("Background").FindChild("Text")?.gameObject;

            if (baseDrainlimitTextBox == null)
            {
                QuickLogger.Error("Screen:baseDrainlimitTextBox Text not found.");
                return(false);
            }

            _baseDrainLimitTextB      = baseDrainlimitTextBox.GetComponent <Text>();
            _baseDrainLimitTextB.text = _mono.GetBasePowerProtectionGoal().ToString();

            var baseDrainResult = CreateSystemButton(baseDrainlimitTextBox,
                                                     LanguageHelpers.GetLanguage(FCSPowerStorageBuildable.BaseDrainLimitDescKey), LanguageHelpers.GetLanguage(FCSPowerStorageBuildable.BaseDrainLimitOnHoverKey),
                                                     _mono.GetBasePowerProtectionGoal, _mono.ValidateBaseProtectionUnits);

            if (!baseDrainResult)
            {
                return(false);
            }
            #endregion


            //TODO Add langugae for btns

            #region Discharge Mode LBL
            var trickleModeLbl = trickleModeBtn.FindChild("Label").GetComponent <Text>();
            if (trickleModeLbl == null)
            {
                QuickLogger.Error("Screen: TrickleModeLabel not found.");
                return(false);
            }
            trickleModeLbl.text = LanguageHelpers.GetLanguage(FCSPowerStorageBuildable.DischargeKey);

            #endregion

            #region Charge Mode LBL

            var chargeModeLbl = chargeModeBtn.FindChild("Label").GetComponent <Text>();
            if (chargeModeLbl == null)
            {
                QuickLogger.Error("Screen: Charge Mode LBL not found.");
                return(false);
            }
            chargeModeLbl.text = LanguageHelpers.GetLanguage(FCSPowerStorageBuildable.ChargeKey);

            #endregion

            // == Color Picker Elements == //

            #region Color Picker Page
            var colorPickerPage = screenHolder.FindChild("ColorPickerPage")?.gameObject;
            if (colorPickerPage == null)
            {
                QuickLogger.Error("Screen: ColorPicker not found.");
                return(false);
            }
            #endregion

            _colorPicker = colorPickerPage.FindChild("ColorPicker")?.gameObject;
            if (_colorPicker == null)
            {
                QuickLogger.Error("GameObject: ColorPicker not found.");
                return(false);
            }

            #region Color Picker Previous Page BTN
            _previousPageGameObject = colorPickerPage.FindChild("Back_Arrow_BTN")?.gameObject;
            if (_previousPageGameObject == null)
            {
                QuickLogger.Error("Screen: Back_Arrow_BTN not found.");
                return(false);
            }

            var prevPageBTN = _previousPageGameObject.AddComponent <PaginatorButton>();
            prevPageBTN.AmountToChangePageBy = -1;
            prevPageBTN.ChangePageBy         = ChangePageBy;
            #endregion

            #region Color Picker Next Page BTN
            _nextPageGameObject = colorPickerPage.FindChild("Forward_Arrow_BTN")?.gameObject;
            if (_nextPageGameObject == null)
            {
                QuickLogger.Error("Screen: Forward_Arrow_BTN not found.");
                return(false);
            }

            var nextPageBTN = _nextPageGameObject.AddComponent <PaginatorButton>();
            nextPageBTN.ChangePageBy         = ChangePageBy;
            nextPageBTN.AmountToChangePageBy = 1;
            #endregion

            #region Color Picker Page Counter
            _pageCounter = colorPickerPage.FindChild("Page_Number")?.gameObject;
            if (_pageCounter == null)
            {
                QuickLogger.Error("Screen: Page_Number not found.");
                return(false);
            }

            _pageCounterText = _pageCounter.GetComponent <Text>();
            if (_pageCounterText == null)
            {
                QuickLogger.Error("Screen: _pageCounterText not found.");
                return(false);
            }
            #endregion

            // == Navigation Dock Elements == //

            #region Settings Button
            var settingButton = navigationDock.transform.Find("Settings_BTN")?.gameObject;
            if (settingButton == null)
            {
                QuickLogger.Error("Dock: Settings_BTN not found.");
                return(false);
            }


            InterfaceButton settingsBTN = settingButton.AddComponent <InterfaceButton>();
            settingsBTN.OnButtonClick = OnButtonClick;
            settingsBTN.BtnName       = "SettingsBTN";
            settingsBTN.ButtonMode    = InterfaceButtonMode.Background;
            #endregion

            #region Home Button
            var homeButton = navigationDock.transform.Find("Home_BTN")?.gameObject;
            if (homeButton == null)
            {
                QuickLogger.Error("Dock: Home_BTN not found.");
                return(false);
            }

            InterfaceButton home = homeButton.AddComponent <InterfaceButton>();
            home.OnButtonClick = OnButtonClick;
            home.BtnName       = "HomeBTN";
            home.ButtonMode    = InterfaceButtonMode.Background;
            #endregion

            #region Power Button
            var powerButton = navigationDock.transform.Find("Power_BTN")?.gameObject;
            if (powerButton == null)
            {
                QuickLogger.Error("Dock: Power_BTN not found.");
                return(false);
            }

            InterfaceButton power = powerButton.AddComponent <InterfaceButton>();
            power.OnButtonClick = OnButtonClick;
            power.BtnName       = "PowerBTN";
            power.ButtonMode    = InterfaceButtonMode.Background;

            #endregion

            return(true);
        }
 private void UpdateLanguage()
 {
     _healthSlider.FindChild("Heath_LBL").GetComponent <Text>().text = LanguageHelpers.GetLanguage(DisplayLanguagePatching.HealthKey);
     _powerSlider.FindChild("Power_LBL").GetComponent <Text>().text  = LanguageHelpers.GetLanguage(DisplayLanguagePatching.PowerKey);
 }