/// <summary> /// Occurs when someone executes an alias command /// </summary> internal void ChatCommand_AliasExecuted(TShockAPI.CommandArgs e) { string commandIdentifier = e.Message; if (!string.IsNullOrEmpty(e.Message)) { commandIdentifier = e.Message.Split(' ').FirstOrDefault(); } if (AliasExecuted != null) { AliasExecutedEventArgs args = new AliasExecutedEventArgs() { CommandIdentifier = commandIdentifier, CommandArgs = e }; AliasExecuted(this, args); } }
internal async void JistAlias_AliasExecuted(object sender, AliasExecutedEventArgs e) { //Get the corresponding alias in the config that matches what the user typed. foreach (JScriptAliasCommand alias in jsAliases.Where(i => i.CommandAlias == e.CommandIdentifier)) { DateTime canRunNext = DateTime.MinValue; Money commandCost = 0; IBankAccount account; if (alias == null) { continue; } //cooldown key is a pair of the user's character name, and the command they have called. KeyValuePair <string, AliasCommand> cooldownReference = new KeyValuePair <string, AliasCommand>(e.CommandArgs.Player.Name, alias); if (CooldownList.ContainsKey(cooldownReference)) { //UTC time so we don't get any daylight saving shit cuntery canRunNext = CooldownList[cooldownReference]; } //has the time elapsed greater than the cooldown period? if (DateTime.UtcNow <= canRunNext && e.CommandArgs.Player.Group.HasPermission("aliascmd.bypasscooldown") == false) { e.CommandArgs.Player.SendErrorMessage("{0}: You need to wait {1:0} more seconds to be able to use that.", alias.CommandAlias, canRunNext.Subtract(DateTime.UtcNow).TotalSeconds); return; } if (string.IsNullOrEmpty(alias.Cost) == true || e.CommandArgs.Player.Group.HasPermission("aliascmd.bypasscost") == true || Money.TryParse(alias.Cost, out commandCost) == false || commandCost == 0) { if (Jist.JistPlugin.Instance == null) { return; } try { /* * Populate cooldown list first before the function's * called, because the function might override it to * something else. */ PopulateCooldownList(cooldownReference); Jist.JistPlugin.Instance.CallFunction(alias.func, alias, e.CommandArgs.Player, e.CommandArgs.Parameters); return; } catch { /* * Command failed. */ } } /* * SEconomy may be null. * If this is the case and the command is * not free, bail out. */ if (SEconomyPlugin.Instance == null) { return; } if ((account = SEconomyPlugin.Instance.GetBankAccount(e.CommandArgs.Player)) == null) { e.CommandArgs.Player.SendErrorMessage("This command costs money and you don't have a bank account. Please log in first."); return; } if (account.IsAccountEnabled == false) { e.CommandArgs.Player.SendErrorMessage("This command costs money and your account is disabled."); return; } if (account.Balance < commandCost) { Money difference = commandCost - account.Balance; if (e.CommandArgs.Player == TSPlayer.Server) { e.CommandArgs.Player.SendErrorMessage("This command costs {0}. You need {1} more to be able to use this.", commandCost.ToLongString(), difference.ToLongString()); } else { e.CommandArgs.Player.SendErrorMessage("This command costs {0}. You need {1} more to be able to use this.", commandCost.ToString(), difference.ToString()); } } try { /* * Take money off the player, and indicate * that this is a payment for something * tangible. */ Journal.BankTransferEventArgs trans = await account.TransferToAsync(SEconomyPlugin.Instance.WorldAccount, commandCost, Journal.BankAccountTransferOptions.AnnounceToSender | Journal.BankAccountTransferOptions.IsPayment, "", string.Format("AC: {0} cmd {1}", e.CommandArgs.Player.Name, alias.CommandAlias)); if (trans.TransferSucceeded == false) { e.CommandArgs.Player.SendErrorMessage("Your payment failed."); return; } if (Jist.JistPlugin.Instance == null) { return; } try { /* * Populate cooldown list first before the function's * called, because the function might override it to * something else. */ PopulateCooldownList(cooldownReference); Jist.JistPlugin.Instance.CallFunction(alias.func, alias, e.CommandArgs.Player.Name, e.CommandArgs.Parameters); } catch (Exception) { /* * Command failed but the person paid money for it. * Refund the full cost of the command if an * exception happens. */ Jist.ScriptLog.ErrorFormat("alias", "{0} paid {1} for alias {2} but it failed and was refunded.", e.CommandArgs.Player.Name, commandCost.ToString(), alias.CommandAlias); RefundAlias(commandCost, e.CommandArgs.Player); } } catch (Exception ex) { e.CommandArgs.Player.SendErrorMessage("An error occured in the alias."); TShock.Log.ConsoleError("aliascmd error: {0} tried to execute alias {1} which failed with error {2}: {3}", e.CommandArgs.Player.Name, e.CommandIdentifier, ex.Message, ex.ToString()); return; } } }