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); } } }
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; } }
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!"); } }
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); }
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 !"); }
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!"); } }
//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); }
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!"); }
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); }
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}!"); }
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!"); } }
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!"); } }
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(); }
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(); }