package net.uomc.mineshaft; import java.io.File; import java.sql.SQLException; import java.util.HashMap; import java.util.Map; import java.util.Optional; import com.mouldycheerio.dbot.commands.CommandDetails; import com.mouldycheerio.dbot.util.DatabaseUtils; import com.mouldycheerio.dbot.util.PeelingUtils; import com.vdurmont.emoji.EmojiManager; import com.vdurmont.emoji.EmojiParser; import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Message; import net.dv8tion.jda.api.entities.MessageEmbed; import net.dv8tion.jda.api.events.message.MessageReceivedEvent; public class PlayerHealths { private static final String HP_TABLE = "hp"; private static final String HP_EMOJI = "<:hp:1428837195329962115>"; private String healthDb; private Mineshaft bot; private static final long MAX_HP = 20; public PlayerHealths(Mineshaft bot) { this.bot = bot; healthDb = (new File(bot.getDatadir(), "players.db")).getPath(); initDB(); bot.getCommandController().addCommand(CommandDetails.from("hp,health"), (e, b, args) -> { Member member = PeelingUtils.getSingleMentionFromArgs(e); b.sendMessage(e, member.getEffectiveName() + "'s health", (member.equals(e.getMember()) ? "Your " : member.getEffectiveName() + "'s") + " health: " + getHPString(member)); }); } public void setHP(Member member, long value) { try { DatabaseUtils.putInKVtable(healthDb, HP_TABLE, member.getId() + ":" + member.getGuild().getId(), value); } catch (SQLException e) { e.printStackTrace(); } } private long getHP(String member, String guild) { try { return DatabaseUtils.getInKVtable(healthDb, HP_TABLE, member + ":" + guild); } catch (SQLException e) { e.printStackTrace(); } return MAX_HP; } public long getHP(Member member) { return getHP(member.getId(), member.getGuild().getId()); } public String getHPString(Member member) { return getHPString(getHP(member)); } public static String getHPString(long hp) { return "**" + hp + HP_EMOJI + "**"; } public long damage(MessageReceivedEvent event, Member member, long amount, String reason) { long hp = getHP(member); hp -= amount; if (hp <= 0) { killPlayer(event, member, reason); setHP(member, MAX_HP); } else { setHP(member, hp); } return hp; } public long damageAndDropIfKill(MessageReceivedEvent event, Member member, long amount, String reason, Map items) { long hp = getHP(member); hp -= amount; if (hp <= 0) { killPlayerAndDrop(event, member, reason, items); setHP(member, MAX_HP); } else { setHP(member, hp); } return hp; } public long damageAndDropIfKill(Message message, Member member, long amount, String reason, Map items) { long hp = getHP(member); hp -= amount; if (hp <= 0) { killPlayerAndDrop(message, member, reason, items); setHP(member, MAX_HP); } else { setHP(member, hp); } return hp; } public long damage(Message message, Member member, long amount, String reason) { long hp = getHP(member); hp -= amount; if (hp <= 0) { killPlayer(message, member, reason); setHP(member, MAX_HP); } else { setHP(member, hp); } return hp; } private void initDB() { try { DatabaseUtils.createSimpleKVtable(healthDb, HP_TABLE); } catch (SQLException e) { } } public void killPlayerAndDrop(Message message, Member member, String deathMessage, Map items) { Map drops = DropUtil.getDeathDrops(bot, member); drops = bot.sumItems(drops, items); bot.removeItems(member, drops); if (message != null && !message.getEmbeds().isEmpty()) { EmbedBuilder builder = new EmbedBuilder(message.getEmbeds().getFirst()); builder.appendDescription("\n" + deathMessage + "\n"); MessageEmbed embed = DropUtil.getDropEmbed(bot, drops, builder.build()); DropUtil.spawnDropEdit(bot, message, embed, drops); return; } String title = getDeathTitle(member, deathMessage); MessageEmbed embed = DropUtil.getDropEmbed(bot, drops, deathMessage, title); DropUtil.spawnDrop(bot, message.getChannel(), embed, drops); } public void killPlayerAndDrop(MessageReceivedEvent event, Member member, String deathMessage, Map items) { killPlayerAndDrop((Message) null, member, deathMessage, items); } public void killPlayer(MessageReceivedEvent event, Member member, String deathMessage ) { killPlayerAndDrop(event, member, deathMessage, new HashMap<>()); } public void killPlayer(Message message, Member member, String deathMessage ) { killPlayerAndDrop(message, member, deathMessage, new HashMap<>()); } private String getDeathTitle(Member member, String deathMessage) { String title = member.getEffectiveName() + " has died!"; if (EmojiManager.containsEmoji(deathMessage)) { title = EmojiParser.extractEmojis(deathMessage).getFirst(); } return title; } }