Ejemplo n.º 1
0
        public void HandleCommand(object sender, OnChatCommandReceivedArgs e)
        {
            if (e == null || e.Command == null || e.Command.ChatMessage == null)
            {
                Console.WriteLine($"{nameof(OnChatCommandReceivedArgs)} or its Command or ChatMessage is null! Not parsing command");
                return;
            }

            string userToLower = e.Command.ChatMessage.DisplayName.ToLower();

            //Don't handle certain users (Ex. MrMacroBot)
            if (ExemptUsers.Contains(userToLower) == true)
            {
                Console.WriteLine($"User {e.Command.ChatMessage.DisplayName} is exempt and I won't take commands from them");
                return;
            }

            User user = BotProgram.GetOrAddUser(userToLower);

            string commandToLower = e.Command.CommandText.ToLower();

            if (CommandDict.TryGetValue(commandToLower, out BaseCommand command) == true)
            {
                //Handle permissions
                if (user.Level >= command.AccessLevel)
                {
                    command.ExecuteCommand(sender, e);
                }
                else
                {
                    BotProgram.QueueMessage(INVALID_ACCESS_MESSAGE);
                }
            }
        }
Ejemplo n.º 2
0
        public override void ExecuteCommand(EvtChatCommandArgs e)
        {
            string name        = e.Command.ChatMessage.DisplayName;
            string nameToLower = name.ToLower();

            User user = BotProgram.GetOrAddUser(nameToLower);

            if (user == null)
            {
                return;
            }

            if (user.OptedOut == false)
            {
                user.SetOptOut(true);

                BotProgram.SaveBotData();
                BotProgram.MsgHandler.QueueMessage("Opted out of bot stats!");
                return;
            }
            else if (user.OptedOut == true)
            {
                user.SetOptOut(false);

                BotProgram.SaveBotData();
                BotProgram.MsgHandler.QueueMessage("Opted back into bot stats!");
                return;
            }
        }
Ejemplo n.º 3
0
        public override void ExecuteCommand(object sender, OnChatCommandReceivedArgs e)
        {
            List <string> amount = e.Command.ArgumentsAsList;

            if (amount.Count != 1)
            {
                BotProgram.QueueMessage($"Sorry, please enter a valid bet amount!");
                return;
            }

            if (long.TryParse(amount[0], out long creditBet) == true)
            {
                if (creditBet <= 0)
                {
                    BotProgram.QueueMessage("Bet amount must be greater than 0!");
                    return;
                }

                string name        = e.Command.ChatMessage.DisplayName;
                string nameToLower = name.ToLower();

                User user = BotProgram.GetOrAddUser(nameToLower);

                long credits = user.Credits;

                if (creditBet > credits)
                {
                    BotProgram.QueueMessage("Bet amount is greater than credits!");
                }
                else
                {
                    bool   success = (Rand.Next(0, 2) == 0);
                    string message = string.Empty;

                    if (success)
                    {
                        credits += creditBet;
                        message  = $"{name} won {creditBet} credits :D !";
                    }
                    else
                    {
                        credits -= creditBet;
                        message  = $"{name} lost {creditBet} credits :(";
                    }

                    BotProgram.QueueMessage(message);

                    user.Credits = credits;
                    BotProgram.SaveBotData();
                }
            }
            else
            {
                BotProgram.QueueMessage($"Sorry, please enter a valid bet amount!");
            }
        }
Ejemplo n.º 4
0
        private void OnReSubscriber(object sender, OnReSubscriberArgs e)
        {
            User user = BotProgram.GetOrAddUser(e.ReSubscriber.DisplayName, false);

            EvtOnReSubscriptionArgs reSubArgs = new EvtOnReSubscriptionArgs
            {
                ReSubscriptionData = new EvtReSubscriptionData(e.ReSubscriber.UserId, e.ReSubscriber.DisplayName,
                                                               e.ReSubscriber.DisplayName, e.ReSubscriber.Months)
            };

            UserReSubscribedEvent?.Invoke(user, reSubArgs);
        }
Ejemplo n.º 5
0
        private void OnNewSubscriber(object sender, OnNewSubscriberArgs e)
        {
            User user = BotProgram.GetOrAddUser(e.Subscriber.DisplayName, false);

            EvtOnSubscriptionArgs subArgs = new EvtOnSubscriptionArgs
            {
                SubscriptionData = new EvtSubscriptionData(e.Subscriber.UserId, e.Subscriber.DisplayName,
                                                           e.Subscriber.DisplayName)
            };

            UserNewlySubscribedEvent?.Invoke(user, subArgs);
        }
        public override void ExecuteCommand(object sender, OnChatCommandReceivedArgs e)
        {
            List <string> args = e.Command.ArgumentsAsList;

            if (args == null || args.Count != 2)
            {
                BotProgram.QueueMessage("Please specify a single user followed by the amount of credits you wish to transfer!");
                return;
            }

            string giver        = e.Command.ChatMessage.DisplayName;
            string giverToLower = giver.ToLower();

            string receiver        = args[0];
            string receiverToLower = receiver.ToLower();

            if (giverToLower == receiverToLower)
            {
                BotProgram.QueueMessage("You cannot transfer points to yourself!");
                return;
            }

            //If the user transferring points isn't in the database, add them
            User giverUser    = BotProgram.GetOrAddUser(giverToLower);
            User receiverUser = BotProgram.GetUser(receiverToLower);

            if (receiverUser == null)
            {
                BotProgram.QueueMessage($"{receiver} is not in the database!");
                return;
            }

            long transferAmount = -1L;
            bool success        = long.TryParse(args[1], out transferAmount);

            if (success == false || transferAmount <= 0)
            {
                BotProgram.QueueMessage("Please specify a positive whole number of credits greater than 0!");
                return;
            }

            if (giverUser.Credits < transferAmount)
            {
                BotProgram.QueueMessage("The transfer amount is greater than your credits!");
                return;
            }

            giverUser.Credits    -= transferAmount;
            receiverUser.Credits += transferAmount;
            BotProgram.SaveBotData();

            BotProgram.QueueMessage($"{giver} has transferred {transferAmount} points to {receiver} :D !");
        }
Ejemplo n.º 7
0
        public override void ExecuteCommand(EvtChatCommandArgs e)
        {
            List <string> args = e.Command.ArgumentsAsList;

            if (args.Count == 0)
            {
                BotProgram.MsgHandler.QueueMessage($"The max pause duration is {BotProgram.BotData.MaxPauseHoldDuration} milliseconds.");
                return;
            }

            User user = BotProgram.GetOrAddUser(e.Command.ChatMessage.Username, false);

            //Disallow setting the duration if the user doesn't have a sufficient access level
            if (user.Level < SetAccessLevel)
            {
                BotProgram.MsgHandler.QueueMessage(CommandHandler.INVALID_ACCESS_MESSAGE);
                return;
            }

            if (args.Count > 1)
            {
                BotProgram.MsgHandler.QueueMessage("Usage: \"duration (ms) (-1 to disable)\"");
                return;
            }

            string value = args[0];

            if (int.TryParse(value, out int duration) == false)
            {
                BotProgram.MsgHandler.QueueMessage("Invalid value! Usage: \"duration (ms) (-1 to disable)\"");
                return;
            }

            if (duration < 0)
            {
                duration = -1;
            }

            BotProgram.BotData.MaxPauseHoldDuration = duration;
            BotProgram.SaveBotData();

            if (BotProgram.BotData.MaxPauseHoldDuration > 0)
            {
                BotProgram.MsgHandler.QueueMessage($"Set max pause duration to {duration} milliseconds!");
            }
            else
            {
                BotProgram.MsgHandler.QueueMessage("Disabled max pause duration!");
            }
        }
Ejemplo n.º 8
0
        //Break up much of the message handling by sending events
        private void OnMessageReceived(object sender, OnMessageReceivedArgs e)
        {
            User user = BotProgram.GetOrAddUser(e.ChatMessage.DisplayName, false);

            EvtUserMessageArgs umArgs = new EvtUserMessageArgs()
            {
                UsrMessage = new EvtUserMsgData(e.ChatMessage.UserId, e.ChatMessage.Username,
                                                e.ChatMessage.DisplayName, e.ChatMessage.Channel, e.ChatMessage.Message)
            };

            UserSentMessageEvent?.Invoke(user, umArgs);

            //Attempt to parse the message as an input
            ProcessMsgAsInput(user, umArgs);
        }
Ejemplo n.º 9
0
        public override void ExecuteCommand(EvtChatCommandArgs e)
        {
            List <string> args = e.Command.ArgumentsAsList;

            if (args.Count == 0)
            {
                BotProgram.MsgHandler.QueueMessage($"The default duration of an input is {BotProgram.BotData.DefaultInputDuration} milliseconds!");
                return;
            }

            User user = BotProgram.GetOrAddUser(e.Command.ChatMessage.Username, false);

            //Disallow setting the duration if the user doesn't have a sufficient access level
            if (user.Level < SetAccessLevel)
            {
                BotProgram.MsgHandler.QueueMessage(CommandHandler.INVALID_ACCESS_MESSAGE);
                return;
            }

            if (args.Count > 1)
            {
                BotProgram.MsgHandler.QueueMessage($"Usage: \"duration (ms)\"");
                return;
            }

            if (int.TryParse(args[0], out int newDefaultDur) == false)
            {
                BotProgram.MsgHandler.QueueMessage("Please enter a valid number!");
                return;
            }

            if (newDefaultDur < 0)
            {
                BotProgram.MsgHandler.QueueMessage("Cannot set a negative duration!");
                return;
            }

            if (newDefaultDur == BotProgram.BotData.DefaultInputDuration)
            {
                BotProgram.MsgHandler.QueueMessage("The duration is already this value!");
                return;
            }

            BotProgram.BotData.DefaultInputDuration = newDefaultDur;
            BotProgram.SaveBotData();

            BotProgram.MsgHandler.QueueMessage($"Set default input duration to {newDefaultDur} milliseconds!");
        }
Ejemplo n.º 10
0
        private void OnChatCommandReceived(object sender, OnChatCommandReceivedArgs e)
        {
            User user = BotProgram.GetOrAddUser(e.Command.ChatMessage.DisplayName, false);

            ChatMessage cMsg = e.Command.ChatMessage;

            EvtUserMsgData msgData = new EvtUserMsgData(cMsg.UserId, cMsg.Username, cMsg.DisplayName,
                                                        cMsg.Channel, cMsg.Message);

            EvtChatCommandArgs chatCmdArgs = new EvtChatCommandArgs
            {
                Command = new EvtChatCommandData(e.Command.ArgumentsAsList, e.Command.ArgumentsAsString,
                                                 msgData, e.Command.CommandIdentifier, e.Command.CommandText)
            };

            ChatCommandReceivedEvent?.Invoke(user, chatCmdArgs);
        }
Ejemplo n.º 11
0
        public override void ExecuteCommand(EvtChatCommandArgs e)
        {
            //Have to do this on first execute since not every command would have been initialized by the time Initialize is called
            if (Sorted == false)
            {
                Array.Sort <KeyValuePair <string, BaseCommand> >(CommandCache, CompareCmdKVPair);
                Sorted = true;
            }

            User user = BotProgram.GetOrAddUser(e.Command.ChatMessage.Username, false);

            MultiMessageCache.Clear();
            StrBuilder.Clear();

            for (int i = 0; i < CommandCache.Length; i++)
            {
                ref KeyValuePair <string, BaseCommand> cmd = ref CommandCache[i];

                //Ignore if the command is hidden from the help menu
                if (cmd.Value.HiddenFromHelp == true)
                {
                    continue;
                }

                //Show the command only if the user has access to it
                if (user.Level >= cmd.Value.AccessLevel)
                {
                    int newLength = StrBuilder.Length + cmd.Key.Length + 3;
                    int maxLength = BotProgram.BotSettings.BotMessageCharLimit;
                    if (MultiMessageCache.Count == 0)
                    {
                        maxLength -= InitMessage.Length;
                    }

                    //Send in multiple messages if it exceeds the length
                    //NOTE: Do the same thing for memes and macros
                    if (newLength >= maxLength)
                    {
                        MultiMessageCache.Add(StrBuilder.ToString());
                        StrBuilder.Clear();
                    }

                    StrBuilder.Append(Globals.CommandIdentifier).Append(cmd.Key).Append(", ");
                }
            }
        public override void ExecuteCommand(object sender, OnChatCommandReceivedArgs e)
        {
            List <string> args = e.Command.ArgumentsAsList;

            if (args.Count == 0 || args.Count > 1)
            {
                BotProgram.QueueMessage("Usage: \"controllerPort (starting from 1)\"");
                return;
            }

            if (int.TryParse(args[0], out int portNum) == false)
            {
                BotProgram.QueueMessage("That is not a valid number!");
                return;
            }

            if (portNum <= 0 || portNum > VJoyController.Joysticks.Length)
            {
                BotProgram.QueueMessage($"Please specify a number in the range of 1 through the current controller count ({VJoyController.Joysticks.Length}).");
                return;
            }

            //Change to zero-based index for referencing
            int controllerNum = portNum - 1;

            User user = BotProgram.GetOrAddUser(e.Command.ChatMessage.Username, false);

            if (user.Team == controllerNum)
            {
                BotProgram.QueueMessage("You're already on this controller port!");
                return;
            }

            //Change team and save data
            user.Team = controllerNum;

            BotProgram.SaveBotData();

            BotProgram.QueueMessage($"Changed controller port to {portNum}!");
        }
Ejemplo n.º 13
0
        public override void ExecuteCommand(EvtChatCommandArgs e)
        {
            List <string> amount = e.Command.ArgumentsAsList;

            if (amount.Count != 1)
            {
                BotProgram.MsgHandler.QueueMessage($"Sorry, please enter a valid bet amount!");
                return;
            }

            if (long.TryParse(amount[0], out long creditBet) == true)
            {
                if (creditBet <= 0)
                {
                    BotProgram.MsgHandler.QueueMessage("Bet amount must be greater than 0!");
                    return;
                }

                string name        = e.Command.ChatMessage.DisplayName;
                string nameToLower = name.ToLower();

                User user = BotProgram.GetOrAddUser(nameToLower);
                if (user == null)
                {
                    return;
                }

                if (user.OptedOut == true)
                {
                    BotProgram.MsgHandler.QueueMessage("You cannot bet while opted out of bot stats.");
                    return;
                }

                if (creditBet > user.Credits)
                {
                    BotProgram.MsgHandler.QueueMessage("Bet amount is greater than credits!");
                }
                else
                {
                    bool   success = (Rand.Next(0, 2) == 0);
                    string message = string.Empty;

                    if (success)
                    {
                        user.AddCredits(creditBet);
                        message = $"{name} won {creditBet} credits :D !";
                    }
                    else
                    {
                        user.SubtractCredits(creditBet);
                        message = $"{name} lost {creditBet} credits :(";
                    }

                    BotProgram.MsgHandler.QueueMessage(message);

                    BotProgram.SaveBotData();
                }
            }
            else
            {
                BotProgram.MsgHandler.QueueMessage($"Sorry, please enter a valid bet amount!");
            }
        }
Ejemplo n.º 14
0
        public override void ExecuteCommand(EvtChatCommandArgs e)
        {
            List <string> args = e.Command.ArgumentsAsList;

            if (args == null || args.Count != 2)
            {
                BotProgram.MsgHandler.QueueMessage("Please specify a single user to duel followed by the bet amount!");
                return;
            }

            string dueler        = e.Command.ChatMessage.DisplayName;
            string duelerToLower = dueler.ToLower();

            string user        = args[0];
            string usertoLower = user.ToLower();

            if (duelerToLower == usertoLower)
            {
                BotProgram.MsgHandler.QueueMessage("You cannot duel yourself!");
                return;
            }

            //If the user dueling isn't in the database, add them
            User duelerUser = BotProgram.GetOrAddUser(duelerToLower);

            User cmdUser = BotProgram.GetUser(usertoLower);

            if (cmdUser == null)
            {
                BotProgram.MsgHandler.QueueMessage($"{user} is not in the database!");
                return;
            }

            if (duelerUser.OptedOut == true)
            {
                BotProgram.MsgHandler.QueueMessage("You can't duel if you're opted out of bot stats!");
                return;
            }

            if (cmdUser.OptedOut == true)
            {
                BotProgram.MsgHandler.QueueMessage("The one you're attempting to duel is opted out of bot stats!");
                return;
            }

            //Check if the duel expired and replace it with this one if so
            if (DuelRequests.ContainsKey(usertoLower) == true)
            {
                DuelData data = DuelRequests[usertoLower];
                TimeSpan diff = DateTime.Now - data.CurDuelTime;
                if (diff.TotalMinutes >= DUEL_MINUTES)
                {
                    DuelRequests.Remove(usertoLower);
                }
                else
                {
                    BotProgram.MsgHandler.QueueMessage($"You're still waiting on a duel response from {user}!");
                    return;
                }
            }

            long betAmount = -1L;
            bool success   = long.TryParse(args[1], out betAmount);

            if (success == false || betAmount <= 0)
            {
                BotProgram.MsgHandler.QueueMessage("Please specify a positive whole number of credits greater than 0!");
                return;
            }

            if (duelerUser.Credits < betAmount || cmdUser.Credits < betAmount)
            {
                BotProgram.MsgHandler.QueueMessage("Either you or the one you're dueling does not have enough credits for this duel!");
                return;
            }

            //Add to the duel requests
            DuelRequests.Add(usertoLower, new DuelData(dueler, betAmount, DateTime.Now));

            BotProgram.MsgHandler.QueueMessage($"{dueler} has requested to duel {user} for {betAmount} credit(s)! Type {Globals.CommandIdentifier}accept to duel or {Globals.CommandIdentifier}deny to refuse. The duel expires in {DUEL_MINUTES} minute(s)!");
        }
        public override void ExecuteCommand(object sender, OnChatCommandReceivedArgs e)
        {
            List <string> args = e.Command.ArgumentsAsList;

            if (args.Count != 1)
            {
                BotProgram.QueueMessage("Please specify a bet amount!");
                return;
            }

            string displayName  = e.Command.ChatMessage.DisplayName;
            string displayLower = displayName.ToLower();

            //If the user participating in the group duel isn't in the database, add them
            User user = BotProgram.GetOrAddUser(displayLower, true);

            //Check if we can parse the bet amount
            long betAmount = -1L;
            bool success   = long.TryParse(args[0], out betAmount);

            if (success == false || betAmount <= 0)
            {
                BotProgram.QueueMessage("Please specify a positive whole number of credits greater than 0!");
                return;
            }

            if (user.Credits < betAmount)
            {
                BotProgram.QueueMessage("You don't have enough credits to bet this much!");
                return;
            }

            string message = string.Empty;

            bool prevStarted = DuelStarted;

            //Check if the user isn't in the duel
            if (UsersInDuel.ContainsKey(displayLower) == false)
            {
                //Add them
                UsersInDuel.Add(displayLower, betAmount);
                message = $"{displayName} entered the group duel with {betAmount} credit(s)!";

                int count = UsersInDuel.Count;
                if (count < MinUsersForDuel)
                {
                    int diff = MinUsersForDuel - count;

                    message += $" {diff} more user(s) are required to start the group duel!";
                }
                else
                {
                    //Start duel
                    if (DuelStarted == false)
                    {
                        StartGroupDuel();
                    }
                }
            }
            //The user is already in the group duel, so adjust their bet
            else
            {
                long prevBet = UsersInDuel[displayLower];

                message = $"{displayName} adjusted their group duel bet from {prevBet} to {betAmount} credit(s)!";

                UsersInDuel[displayLower] = betAmount;
            }

            BotProgram.QueueMessage(message);

            if (prevStarted == false && DuelStarted == true)
            {
                BotProgram.QueueMessage($"The group duel has enough participants and will start in {GroupDuelMinutes} minute(s), so join before then if you want in!");
            }
        }
Ejemplo n.º 16
0
        public override void ExecuteCommand(EvtChatCommandArgs e)
        {
            List <string> args = e.Command.ArgumentsAsList;

            if (args.Count < 1)
            {
                BotProgram.MsgHandler.QueueMessage("Usage: state #");
                return;
            }

            string stateNumStr = args[0];

            if (int.TryParse(stateNumStr, out int stateNum) == false)
            {
                BotProgram.MsgHandler.QueueMessage("Invalid state number.");
                return;
            }

            string saveStateStr = $"ss{stateNum}";

            if (InputGlobals.CurrentConsole.ButtonInputMap.ContainsKey(saveStateStr) == false)
            {
                BotProgram.MsgHandler.QueueMessage("Invalid state number.");
                return;
            }

            User user = BotProgram.GetOrAddUser(e.Command.ChatMessage.Username, false);

            //Check if the user can perform this input
            ParserPostProcess.InputValidation inputValidation = ParserPostProcess.CheckInputPermissions(user.Level, saveStateStr, BotProgram.BotData.InputAccess.InputAccessDict);

            //If the input isn't valid, exit
            if (inputValidation.IsValid == false)
            {
                if (string.IsNullOrEmpty(inputValidation.Message) == false)
                {
                    BotProgram.MsgHandler.QueueMessage(inputValidation.Message);
                }

                return;
            }

            //Savestates are always performed on the first controller
            IVirtualController joystick = InputGlobals.ControllerMngr.GetController(0);

            joystick.PressButton(InputGlobals.CurrentConsole.ButtonInputMap[saveStateStr]);
            joystick.UpdateController();

            //Track the time of the savestate
            DateTime curTime = DateTime.UtcNow;

            //Add a new savestate log
            GameLog newStateLog = new GameLog();

            newStateLog.User = e.Command.ChatMessage.Username;

            string date = curTime.ToShortDateString();
            string time = curTime.ToLongTimeString();

            newStateLog.DateTimeString = $"{date} at {time}";

            newStateLog.User       = e.Command.ChatMessage.Username;
            newStateLog.LogMessage = string.Empty;

            //Add the message if one was specified
            if (args.Count > 1)
            {
                string message = e.Command.ArgumentsAsString.Remove(0, stateNumStr.Length + 1);
                newStateLog.LogMessage = message;
            }

            //Add or replace the log and save the bot data
            BotProgram.BotData.SavestateLogs[stateNum] = newStateLog;
            BotProgram.SaveBotData();

            BotProgram.MsgHandler.QueueMessage($"Saved state {stateNum}!");

            //Wait a bit before releasing the input
            const float wait = 50f;
            Stopwatch   sw   = Stopwatch.StartNew();

            while (sw.ElapsedMilliseconds < wait)
            {
            }

            joystick.ReleaseButton(InputGlobals.CurrentConsole.ButtonInputMap[saveStateStr]);
            joystick.UpdateController();
        }
Ejemplo n.º 17
0
        public override void ExecuteCommand(EvtChatCommandArgs e)
        {
            List <string> args = e.Command.ArgumentsAsList;

            if (args.Count != 1)
            {
                BotProgram.MsgHandler.QueueMessage("Usage: state #");
                return;
            }

            string stateNumStr = args[0];

            if (int.TryParse(stateNumStr, out int stateNum) == false)
            {
                BotProgram.MsgHandler.QueueMessage($"Invalid state number.");
                return;
            }

            string loadStateStr = $"ls{stateNum}";

            if (InputGlobals.CurrentConsole.ButtonInputMap.ContainsKey(loadStateStr) == false)
            {
                BotProgram.MsgHandler.QueueMessage($"Invalid state number.");
                return;
            }

            User user = BotProgram.GetOrAddUser(e.Command.ChatMessage.Username, false);

            //Check if the user can perform this input
            ParserPostProcess.InputValidation inputValidation = ParserPostProcess.CheckInputPermissions(user.Level, loadStateStr, BotProgram.BotData.InputAccess.InputAccessDict);

            //If the input isn't valid, exit
            if (inputValidation.IsValid == false)
            {
                if (string.IsNullOrEmpty(inputValidation.Message) == false)
                {
                    BotProgram.MsgHandler.QueueMessage(inputValidation.Message);
                }

                return;
            }

            //Load states are always performed on the first controller
            IVirtualController joystick = InputGlobals.ControllerMngr.GetController(0);

            joystick.PressButton(InputGlobals.CurrentConsole.ButtonInputMap[loadStateStr]);
            joystick.UpdateController();

            BotProgram.MsgHandler.QueueMessage($"Loaded state {stateNum}!");

            //Wait a bit before releasing the input
            const float wait = 50f;
            Stopwatch   sw   = Stopwatch.StartNew();

            while (sw.ElapsedMilliseconds < wait)
            {
            }

            joystick.ReleaseButton(InputGlobals.CurrentConsole.ButtonInputMap[loadStateStr]);
            joystick.UpdateController();
        }