@Override
 public boolean execute(
     KarmicLives plugin, CommandSender sender, Command command, String label, String[] args) {
   String name = plugin.expandName(args[0]);
   if (name == null) {
     // Just use as is, as they might be an offline player
     name = args[0];
   }
   if (!plugin.hasPermissionNode(sender, PermissionNode.VIEW) && !sender.getName().equals(name)) {
     sender.sendMessage(
         ChatColor.GRAY
             + plugin.getTag()
             + ChatColor.RED
             + " Lack permission: "
             + PermissionNode.VIEW.getNode());
     return true;
   }
   if (!plugin.getLivesConfig().playerExists(name)) {
     sender.sendMessage(
         ChatColor.GRAY
             + plugin.getTag()
             + ChatColor.RED
             + " Could not find player with name: "
             + name);
     return false;
   }
   final int lives = plugin.getLivesConfig().getLives(name);
   ChatColor status = ChatColor.GOLD;
   if (plugin.getCooldowns().containsKey(name)) {
     status = ChatColor.DARK_RED;
   }
   sender.sendMessage(
       ChatColor.GRAY
           + plugin.getTag()
           + " "
           + ChatColor.AQUA
           + name
           + ChatColor.WHITE
           + "'s lives: "
           + status
           + lives);
   return true;
 }
 @Override
 public boolean execute(
     final KarmicLives plugin,
     CommandSender sender,
     Command command,
     String label,
     String[] args) {
   if (!(sender instanceof Player)) {
     sender.sendMessage(
         ChatColor.GRAY + plugin.getTag() + ChatColor.RED + " Cannot buy lives as a non-player.");
     return true;
   }
   // Check permissions
   if (!plugin.hasPermissionNode(sender, PermissionNode.USE)) {
     sender.sendMessage(
         ChatColor.GRAY
             + plugin.getTag()
             + ChatColor.RED
             + " Lack Permission: "
             + ChatColor.WHITE
             + PermissionNode.USE.getNode());
     return true;
   } else if (!plugin.hasPermissionNode(sender, PermissionNode.SELL)) {
     sender.sendMessage(
         ChatColor.GRAY
             + plugin.getTag()
             + ChatColor.RED
             + " Lack Permission: "
             + ChatColor.WHITE
             + PermissionNode.SELL.getNode());
     return true;
   }
   // determine amount to buy
   int amount = plugin.getRootConfig().getInt(RootConfigNode.LIVES_BUNDLE);
   if (args.length > 0) {
     try {
       amount = Integer.parseInt(args[0]);
     } catch (NumberFormatException e) {
       sender.sendMessage(
           ChatColor.GRAY
               + plugin.getTag()
               + ChatColor.RED
               + " Invalid number: "
               + ChatColor.WHITE
               + args[0]);
       return true;
     }
   }
   final int current = plugin.getLivesConfig().getLives(sender.getName());
   // Check if player has enough lives to sell
   if (current < amount) {
     sender.sendMessage(
         ChatColor.GRAY + plugin.getTag() + ChatColor.YELLOW + " Lack lives. Setting to max");
     amount = current;
   }
   if (amount <= 0) {
     // No lives to sell
     sender.sendMessage(ChatColor.GRAY + plugin.getTag() + ChatColor.RED + " No lives to sell.");
     return true;
   }
   // check if player ignores cost
   if (plugin.hasPermissionNode(sender, PermissionNode.IGNORE_COST)) {
     // skip to giving player amount
     plugin.getLivesConfig().set(sender.getName(), current - amount);
     return true;
   } else if (plugin.getEconomy() == null) {
     sender.sendMessage(
         ChatColor.GRAY
             + plugin.getTag()
             + ChatColor.DARK_RED
             + " Economy not found! Check your economy plugin or Vault.");
     return true;
   }
   // determine cost
   final double cost = plugin.getRootConfig().getDouble(RootConfigNode.LIVES_COST) * amount;
   // confirm sell lives
   final Map<Object, Object> map = new HashMap<Object, Object>();
   map.put("amount", amount);
   map.put("current", current);
   map.put("name", sender.getName());
   map.put("source", sender.getName());
   map.put("cost", cost);
   Conversation conv =
       plugin
           .getFactory()
           .withFirstPrompt(new SellConfirmConversation(plugin))
           .withPrefix(
               new ConversationPrefix() {
                 @Override
                 public String getPrefix(ConversationContext context) {
                   return ChatColor.GRAY + plugin.getTag();
                 }
               })
           .withInitialSessionData(map)
           .withLocalEcho(false)
           .buildConversation((Player) sender);
   conv.begin();
   return true;
 }