summaryrefslogtreecommitdiff
path: root/src/main/java/net/uomc/mineshaft/RobCommand.java
blob: ace95e7239142aaac49cb503dcf04b4b64aa5689 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
package net.uomc.mineshaft;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import java.util.Random;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;

import org.jetbrains.annotations.NotNull;

import com.mouldycheerio.dbot.commands.CommandDetails;
import com.mouldycheerio.dbot.commands.cooldowns.CooldownCommand;
import com.mouldycheerio.dbot.util.PeelingUtils;
import com.mouldycheerio.dbot.util.EventWaiter;
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.entities.channel.middleman.MessageChannel;
import net.dv8tion.jda.api.entities.emoji.Emoji;
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;

public class RobCommand extends CooldownCommand {

    private static final long DROP_DURATION_SECONDS = 90;
    private static final String LOOT_STRING = "loot";

    private static final long MAX_DAMAGE = 20;

    private Mineshaft bot;
    private @NotNull String embedTitle;
    private @NotNull String pvpEmoji;

    protected RobCommand(Mineshaft bot) {
        super(bot);
        setCooldown(60l * 30l * 1000l);
        this.bot = bot;
        setDetails(CommandDetails.from("kill,pvp,rob", "kill another player"));
        embedTitle = EmojiParser.parseToUnicode(":crossed_swords:");
        pvpEmoji = EmojiParser.parseToUnicode(":crossed_swords:");
    }

    @Override
    public boolean trigger(MessageReceivedEvent e) {
        String[] args = e.getMessage().getContentRaw().split(" ");
        if (args.length < 2) {
            e.getMessage().reply(":x: Please specify a target! `kill @user`").queue();
            return false;
        }

        Optional<Member> mentionToMember = PeelingUtils.mentionToMember(args[1], e.getGuild());
        if (!mentionToMember.isPresent()) {
            e.getMessage().reply(":x: Invalid Target! `kill @user`").queue();
            return false;
        }
        Member target = mentionToMember.get();

        if (bot.getPickaxes().isNether(target) != bot.getPickaxes().isNether(e.getMember())) {
            e.getMessage().reply(":x: You tried to kill " + target.getAsMention() + " but they were in a different dimension!").queue();
            return false;
        }

        e.getMessage().addReaction(Emoji.fromUnicode(pvpEmoji)).queue();

        EmbedBuilder eb = new EmbedBuilder();
        eb.setTitle(pvpEmoji);
        eb.getDescriptionBuilder().append(e.getAuthor().getAsMention() + " is fighting " + target.getAsMention() + "..." );
        eb.setColor(bot.color);

        long damage = getDamage(e.getMember());
        String damageString = " (" + PlayerHealths.getHPString(-damage) + ")";
        e.getMessage().replyEmbeds(eb.build()).delay(5, TimeUnit.SECONDS, e.getJDA().getRateLimitPool()).flatMap(m -> {
            String deathMessage = pvpEmoji + target.getAsMention() + " was slain by " + e.getAuthor().getAsMention()
                    + damageString;
            long hp = bot.getHealths().damage(m, target, damage, deathMessage);
            return hp > 0;
        }, m -> {
                    eb.setDescription(e.getAuthor().getAsMention() + " attacked " + target.getAsMention() + damageString
                            + "\n\n" + "They are now on " + bot.getHealths().getHPString(target));
                    return m.editMessageEmbeds(eb.build());
                }).queue();

        return true;
    }

    private long getDamage(Member member) {
        return (long) Math.ceil(MAX_DAMAGE * Math.random());
    }
}