public override void ExecuteCommand(EvtChatCommandArgs args)
        {
            List <string> arguments = args.Command.ArgumentsAsList;

            int argCount = arguments.Count;

            //Ignore with not enough arguments
            if (argCount != 2)
            {
                QueueMessage(UsageMessage);
                return;
            }

            string consoleStr = arguments[0].ToLowerInvariant();
            string inputName  = arguments[1].ToLowerInvariant();

            using (BotDBContext context = DatabaseManager.OpenContext())
            {
                GameConsole console = context.Consoles.FirstOrDefault(c => c.Name == consoleStr);

                if (console == null)
                {
                    QueueMessage($"No console named \"{consoleStr}\" found.");
                    return;
                }

                //Check if the input exists
                InputData existingInput = console.InputList.FirstOrDefault((inpData) => inpData.Name == inputName);

                if (existingInput == null)
                {
                    QueueMessage($"No input named \"{inputName}\" exists for the \"{console.Name}\" console!");
                    return;
                }

                //Check if it's already in the invalid input combo
                InvalidCombo existingCombo = console.InvalidCombos.FirstOrDefault((inpCombo) => inpCombo.Input.ID == existingInput.ID);

                if (existingCombo != null)
                {
                    QueueMessage($"Input \"{inputName}\" is already part of the invalid input combo for the \"{console.Name}\" console!");
                    return;
                }

                //Add the input to the invalid input combo for this console and save
                console.InvalidCombos.Add(new InvalidCombo(existingInput));

                context.SaveChanges();
            }

            QueueMessage($"Successfully added \"{inputName}\" to the invalid input combo for the \"{consoleStr}\" console!");
        }
Example #2
0
        private static void AddOldBotDataToNewDB(BotData oldBotData)
        {
            /* Macros */
            Console.WriteLine("Begin importing macros...");
            int macroCount = 0;

            foreach (KeyValuePair <string, string> macros in oldBotData.Macros)
            {
                Console.WriteLine($"Importing macro \"{macros.Key}\" to new data.");

                using (BotDBContext context = DatabaseManager.OpenContext())
                {
                    InputMacro newMacro = context.Macros.FirstOrDefault(m => m.MacroName == macros.Key);
                    if (newMacro == null)
                    {
                        newMacro = new InputMacro();
                        context.Macros.Add(newMacro);
                    }

                    newMacro.MacroName  = macros.Key;
                    newMacro.MacroValue = macros.Value;

                    context.SaveChanges();
                }

                macroCount++;
            }

            Console.WriteLine($"Completed importing {macroCount} macros!");

            /* Memes */
            Console.WriteLine("Begin importing memes...");
            int memeCount = 0;


            foreach (KeyValuePair <string, string> memes in oldBotData.Memes)
            {
                Console.WriteLine($"Importing meme \"{memes.Key}\" to new data.");

                using (BotDBContext context = DatabaseManager.OpenContext())
                {
                    Meme newMeme = context.Memes.FirstOrDefault(m => m.MemeName == memes.Key);
                    if (newMeme == null)
                    {
                        newMeme = new Meme();
                        context.Memes.Add(newMeme);
                    }

                    newMeme.MemeName  = memes.Key;
                    newMeme.MemeValue = memes.Value;

                    context.SaveChanges();
                }

                memeCount++;
            }

            Console.WriteLine($"Completed importing {memeCount} memes!");

            /* Users */
            Console.WriteLine("Begin importing user data...");
            int userCount = 0;

            //Migrate users
            foreach (KeyValuePair <string, TRBotDataMigrationTool.User> oldUser in oldBotData.Users)
            {
                string oldUserName = oldUser.Key;
                TRBotDataMigrationTool.User oldUserObj = oldUser.Value;

                Console.WriteLine($"Importing user \"{oldUserName}\" to new data.");

                using (BotDBContext context = DatabaseManager.OpenContext())
                {
                    TRBot.Data.User newUser = DataHelper.GetUserNoOpen(oldUserName, context);
                    if (newUser == null)
                    {
                        newUser = new TRBot.Data.User(oldUserName);
                        context.Users.Add(newUser);

                        //Save changes here so the navigation properties are applied
                        context.SaveChanges();
                    }

                    //Migrate the user data
                    MigrateUserFromOldToNew(oldUserObj, newUser);

                    context.SaveChanges();
                }

                //Update user abilities
                DataHelper.UpdateUserAutoGrantAbilities(oldUserName);

                userCount++;
            }

            Console.WriteLine($"Completed importing {userCount} users!");

            /* Game Logs */
            Console.WriteLine("Begin importing game logs...");

            int logCount = 0;

            foreach (TRBotDataMigrationTool.GameLog log in oldBotData.Logs)
            {
                //The DateTime in the old logs were not standardized, so we have to parse them manually
                int separatorLength = DATETIME_AT_PARSE.Length;

                if (string.IsNullOrEmpty(log.DateTimeString) == true)
                {
                    continue;
                }

                int middleIndex = log.DateTimeString.IndexOf(DATETIME_AT_PARSE);
                if (middleIndex < 0)
                {
                    continue;
                }

                //Parse date
                string date = log.DateTimeString.Substring(0, middleIndex + 1);
                int.TryParse(date.Substring(0, 2), out int month);
                int.TryParse(date.Substring(3, 2), out int day);
                int.TryParse(date.Substring(6, 4), out int year);

                int endIndex = middleIndex + separatorLength;

                //Parse time
                string time = log.DateTimeString.Substring(endIndex, log.DateTimeString.Length - endIndex);
                int.TryParse(time.Substring(0, 2), out int hour);
                int.TryParse(time.Substring(3, 2), out int minute);
                int.TryParse(time.Substring(6, 2), out int seconds);

                DateTime newDateTime = new DateTime(year, month, day, hour, minute, seconds);

                TRBot.Data.GameLog newLog = new TRBot.Data.GameLog();
                newLog.LogDateTime = newDateTime;
                newLog.LogMessage  = log.LogMessage;
                newLog.User        = log.User;

                using (BotDBContext context = DatabaseManager.OpenContext())
                {
                    context.GameLogs.Add(newLog);
                    context.SaveChanges();
                }

                logCount++;
            }

            Console.WriteLine($"Completed importing {logCount} game logs!");

            /* Savestate Logs */
            Console.WriteLine("Skipping importing savestate logs, as they don't exist in TRBot 2.0+.");

            /* Silenced Users */
            Console.WriteLine($"Skipping importing silenced users, as TRBot 2.0+ has a new ability system (see the \"{TRBot.Permissions.PermissionConstants.SILENCED_ABILITY}\" ability).");

            /* Input Callbacks */
            Console.WriteLine("Skipping importing input callbacks, as they don't exist in TRBot 2.0+.");

            /* Input Access */
            Console.WriteLine("Skipping importing InputAccess, as input access is console-specific in TRBot 2.0+.");

            /* Invalid Button Combos */
            Console.WriteLine("Begin importing invalid button combos...");
            int invalidButtonCombos = 0;

            foreach (KeyValuePair <int, List <string> > kvPair in oldBotData.InvalidBtnCombos.InvalidCombos)
            {
                int           oldConsoleId  = kvPair.Key;
                List <string> invalidCombos = kvPair.Value;

                if (EnumUtility.TryParseEnumValue(oldConsoleId.ToString(), out InputConsoles inputConsole) == true)
                {
                    //Find a console with this name
                    string consoleName = inputConsole.ToString().ToLowerInvariant();

                    using (BotDBContext context = DatabaseManager.OpenContext())
                    {
                        GameConsole console = context.Consoles.FirstOrDefault(c => c.Name == consoleName);

                        //Couldn't find the console
                        if (console == null)
                        {
                            continue;
                        }

                        List <InvalidCombo> newInvalidCombo = new List <InvalidCombo>();

                        for (int i = 0; i < invalidCombos.Count; i++)
                        {
                            string inputName = invalidCombos[i];

                            //Try to find a valid input containing this name
                            InputData inpData = console.InputList.FirstOrDefault(inp => inp.Name == inputName);
                            if (inpData == null)
                            {
                                continue;
                            }

                            //Check if this button is already in an invalid combo and ignore if so
                            InvalidCombo existing = console.InvalidCombos.FirstOrDefault(ivc => ivc.InputID == inpData.ID);
                            if (existing != null)
                            {
                                continue;
                            }

                            //Add the invalid combo
                            console.InvalidCombos.Add(new InvalidCombo(inpData));

                            context.SaveChanges();

                            invalidButtonCombos++;
                        }
                    }
                }
            }

            Console.WriteLine($"Completed importing {invalidButtonCombos} invalid button combos!");

            /* Input Synonyms */
            Console.WriteLine("Begin importing input synonyms...");
            int importedSynonyms = 0;

            foreach (KeyValuePair <InputConsoles, Dictionary <string, string> > kvPair in oldBotData.InputSynonyms.SynonymDict)
            {
                //Skip if there are none for this console
                if (kvPair.Value.Count == 0)
                {
                    continue;
                }

                string consoleName = kvPair.Key.ToString();
                Dictionary <string, string> synonyms = kvPair.Value;

                using (BotDBContext context = DatabaseManager.OpenContext())
                {
                    GameConsole console = context.Consoles.FirstOrDefault(c => c.Name == consoleName);

                    //Couldn't find the console
                    if (console == null)
                    {
                        continue;
                    }

                    //Add all synonyms if they don't exist
                    foreach (KeyValuePair <string, string> synonymKV in synonyms)
                    {
                        string       synonymName = synonymKV.Key;
                        InputSynonym synonym     = context.InputSynonyms.FirstOrDefault(s => s.SynonymName == synonymName);

                        if (synonym != null)
                        {
                            continue;
                        }

                        InputSynonym newSyn = new InputSynonym(console.ID, synonymName, synonymKV.Value);
                        context.InputSynonyms.Add(newSyn);

                        context.SaveChanges();
                    }
                }

                importedSynonyms++;
            }

            Console.WriteLine($"Completed importing {importedSynonyms} input synonyms!");

            /* Other changes */
            Console.WriteLine("Now importing remaining bot data...");

            AddSettingStrHelper(SettingsConstants.GAME_MESSAGE, oldBotData.GameMessage);
            AddSettingStrHelper(SettingsConstants.INFO_MESSAGE, oldBotData.InfoMessage);
            AddSettingIntHelper(SettingsConstants.LAST_CONSOLE, oldBotData.LastConsole);
            AddSettingIntHelper(SettingsConstants.DEFAULT_INPUT_DURATION, oldBotData.DefaultInputDuration);
            AddSettingIntHelper(SettingsConstants.MAX_INPUT_DURATION, oldBotData.MaxInputDuration);
            AddSettingIntHelper(SettingsConstants.JOYSTICK_COUNT, oldBotData.JoystickCount);

            Console.WriteLine($"Skipping importing the last virtual controller type, as the values don't line up with 2.0+.");

            AccessLevels.Levels inputPermLvl = (AccessLevels.Levels)oldBotData.InputPermissions;
            long finalPermVal = oldBotData.InputPermissions;

            if (AccessLvlMap.TryGetValue(inputPermLvl, out PermissionLevels permLvl) == true)
            {
                finalPermVal = (long)permLvl;
            }

            AddSettingIntHelper(SettingsConstants.GLOBAL_INPUT_LEVEL, finalPermVal);

            Console.WriteLine("Finished importing all bot data!");
        }