SendMailCommand.java 10.7 KB
Newer Older
1
2
package emu.grasscutter.command.commands;

3
import emu.grasscutter.Grasscutter;
4
5
import emu.grasscutter.command.Command;
import emu.grasscutter.command.CommandHandler;
Benjamin Elsdon's avatar
Benjamin Elsdon committed
6
import emu.grasscutter.database.DatabaseHelper;
Melledy's avatar
Melledy committed
7
8
import emu.grasscutter.game.mail.Mail;
import emu.grasscutter.game.player.Player;
9

Benjamin Elsdon's avatar
Benjamin Elsdon committed
10
import java.util.HashMap;
11
12
import java.util.List;

Benjamin Elsdon's avatar
Benjamin Elsdon committed
13
14
@Command(label = "sendmail", usage = "sendmail <userId|all|help> [templateId]",
        description = "Sends mail to the specified user. The usage of this command changes based on it's composition state.", permission = "server.sendmail")
KingRainbow44's avatar
KingRainbow44 committed
15
public final class SendMailCommand implements CommandHandler {
16

Benjamin Elsdon's avatar
Benjamin Elsdon committed
17
18
19
20
21
    // TODO: You should be able to do /sendmail and then just send subsequent messages until you finish
    //  However, due to the current nature of the command system, I don't think this is possible without rewriting
    //  the command system (again). For now this will do

    // Key = User that is constructing the mail.
KingRainbow44's avatar
KingRainbow44 committed
22
    private static final HashMap<Integer, MailBuilder> mailBeingConstructed = new HashMap<Integer, MailBuilder>();
Benjamin Elsdon's avatar
Benjamin Elsdon committed
23
24

    // Yes this is awful and I hate it.
25
    @Override
26
    public void execute(Player sender, List<String> args) {
Benjamin Elsdon's avatar
Benjamin Elsdon committed
27
28
29
30
31
32
33
34
35
        int senderId;
        if(sender != null) {
            senderId = sender.getUid();
        } else {
            senderId = -1;
        }

        if (!mailBeingConstructed.containsKey(senderId)) {
            switch (args.size()) {
36
                case 1 -> {
Benjamin Elsdon's avatar
Benjamin Elsdon committed
37
38
                    MailBuilder mailBuilder;
                    switch (args.get(0).toLowerCase()) {
39
                        case "help" -> {
Benjamin Elsdon's avatar
Benjamin Elsdon committed
40
41
                            CommandHandler.sendMessage(sender, this.getClass().getAnnotation(Command.class).description() + "\nUsage: " + this.getClass().getAnnotation(Command.class).usage());
                            return;
42
43
44
                        }
                        case "all" -> mailBuilder = new MailBuilder(true, new Mail());
                        default -> {
Benjamin Elsdon's avatar
Benjamin Elsdon committed
45
46
47
                            if (DatabaseHelper.getPlayerById(Integer.parseInt(args.get(0))) != null) {
                                mailBuilder = new MailBuilder(Integer.parseInt(args.get(0)), new Mail());
                            } else {
48
                                CommandHandler.sendMessage(sender, Grasscutter.getLanguage().SendMail_user_not_exist.replace("{id}", args.get(0)));
Benjamin Elsdon's avatar
Benjamin Elsdon committed
49
50
                                return;
                            }
51
                        }
Benjamin Elsdon's avatar
Benjamin Elsdon committed
52
53
                    }
                    mailBeingConstructed.put(senderId, mailBuilder);
方块君's avatar
方块君 committed
54
                    CommandHandler.sendMessage(sender, Grasscutter.getLanguage().SendMail_start_composition);
55
                }
方块君's avatar
方块君 committed
56
57
                case 2 -> CommandHandler.sendMessage(sender, Grasscutter.getLanguage().SendMail_templates);
                default -> CommandHandler.sendMessage(sender, Grasscutter.getLanguage().SendMail_invalid_arguments);
Benjamin Elsdon's avatar
Benjamin Elsdon committed
58
59
60
61
62
63
            }
        } else {
            MailBuilder mailBuilder = mailBeingConstructed.get(senderId);

            if (args.size() >= 1) {
                switch (args.get(0).toLowerCase()) {
64
                    case "stop" -> {
Benjamin Elsdon's avatar
Benjamin Elsdon committed
65
                        mailBeingConstructed.remove(senderId);
方块君's avatar
方块君 committed
66
                        CommandHandler.sendMessage(sender, Grasscutter.getLanguage().SendMail_send_cancel);
Benjamin Elsdon's avatar
Benjamin Elsdon committed
67
                        return;
68
69
                    }
                    case "finish" -> {
Benjamin Elsdon's avatar
Benjamin Elsdon committed
70
                        if (mailBuilder.constructionStage == 3) {
KingRainbow44's avatar
KingRainbow44 committed
71
                            if (!mailBuilder.sendToAll) {
Benjamin Elsdon's avatar
Benjamin Elsdon committed
72
                                Grasscutter.getGameServer().getPlayerByUid(mailBuilder.recipient, true).sendMail(mailBuilder.mail);
73
                                CommandHandler.sendMessage(sender, Grasscutter.getLanguage().SendMail_send_done.replace("{name}", Integer.toString(mailBuilder.recipient)));
Benjamin Elsdon's avatar
Benjamin Elsdon committed
74
                            } else {
75
                                for (Player player : DatabaseHelper.getAllPlayers()) {
76
                                    Grasscutter.getGameServer().getPlayerByUid(player.getUid(), true).sendMail(mailBuilder.mail);
Benjamin Elsdon's avatar
Benjamin Elsdon committed
77
                                }
方块君's avatar
方块君 committed
78
                                CommandHandler.sendMessage(sender, Grasscutter.getLanguage().SendMail_send_all_done);
Benjamin Elsdon's avatar
Benjamin Elsdon committed
79
80
81
                            }
                            mailBeingConstructed.remove(senderId);
                        } else {
82
                            CommandHandler.sendMessage(sender, Grasscutter.getLanguage().SendMail_not_composition_end.replace("{args}", getConstructionArgs(mailBuilder.constructionStage)));
Benjamin Elsdon's avatar
Benjamin Elsdon committed
83
84
                        }
                        return;
85
86
                    }
                    case "help" -> {
87
                        CommandHandler.sendMessage(sender, Grasscutter.getLanguage().SendMail_please_use.replace("{args}", getConstructionArgs(mailBuilder.constructionStage)));
Benjamin Elsdon's avatar
Benjamin Elsdon committed
88
                        return;
89
90
                    }
                    default -> {
Benjamin Elsdon's avatar
Benjamin Elsdon committed
91
                        switch (mailBuilder.constructionStage) {
92
                            case 0 -> {
Benjamin Elsdon's avatar
Benjamin Elsdon committed
93
94
                                String title = String.join(" ", args.subList(0, args.size()));
                                mailBuilder.mail.mailContent.title = title;
95
                                CommandHandler.sendMessage(sender, Grasscutter.getLanguage().SendMail_set_title.replace("{title}", title));
Benjamin Elsdon's avatar
Benjamin Elsdon committed
96
                                mailBuilder.constructionStage++;
97
98
                            }
                            case 1 -> {
Benjamin Elsdon's avatar
Benjamin Elsdon committed
99
100
                                String contents = String.join(" ", args.subList(0, args.size()));
                                mailBuilder.mail.mailContent.content = contents;
101
                                CommandHandler.sendMessage(sender, Grasscutter.getLanguage().SendMail_set_contents.replace("{contents}", contents));
Benjamin Elsdon's avatar
Benjamin Elsdon committed
102
                                mailBuilder.constructionStage++;
103
104
                            }
                            case 2 -> {
Benjamin Elsdon's avatar
Benjamin Elsdon committed
105
106
                                String msgSender = String.join(" ", args.subList(0, args.size()));
                                mailBuilder.mail.mailContent.sender = msgSender;
107
                                CommandHandler.sendMessage(sender, Grasscutter.getLanguage().SendMail_set_message_sender.replace("{send}", msgSender));
Benjamin Elsdon's avatar
Benjamin Elsdon committed
108
                                mailBuilder.constructionStage++;
109
110
                            }
                            case 3 -> {
Benjamin Elsdon's avatar
Benjamin Elsdon committed
111
112
113
                                // Literally just copy-pasted from the give command lol.
                                int item, lvl, amount = 1;
                                switch (args.size()) {
114
                                    default -> { // *No args*
方块君's avatar
方块君 committed
115
                                        CommandHandler.sendMessage(sender, Grasscutter.getLanguage().SendMail_usage);
Benjamin Elsdon's avatar
Benjamin Elsdon committed
116
                                        return;
117
118
                                    }
                                    case 1 -> { // <itemId|itemName>
Benjamin Elsdon's avatar
Benjamin Elsdon committed
119
120
121
122
123
                                        try {
                                            item = Integer.parseInt(args.get(0));
                                            lvl = 1;
                                        } catch (NumberFormatException ignored) {
                                            // TODO: Parse from item name using GM Handbook.
方块君's avatar
方块君 committed
124
                                            CommandHandler.sendMessage(sender, Grasscutter.getLanguage().Invalid_item_id);
Benjamin Elsdon's avatar
Benjamin Elsdon committed
125
126
                                            return;
                                        }
127
128
                                    }
                                    case 2 -> { // <itemId|itemName> [amount]
Benjamin Elsdon's avatar
Benjamin Elsdon committed
129
130
131
                                        lvl = 1;
                                        item = Integer.parseInt(args.get(0));
                                        amount = Integer.parseInt(args.get(1));
132
133
                                    }
                                    case 3 -> { // <itemId|itemName> [amount] [level]
Benjamin Elsdon's avatar
Benjamin Elsdon committed
134
135
136
137
138
139
140
                                        try {
                                            item = Integer.parseInt(args.get(0));
                                            amount = Integer.parseInt(args.get(1));
                                            lvl = Integer.parseInt(args.get(2));

                                        } catch (NumberFormatException ignored) {
                                            // TODO: Parse from item name using GM Handbook.
方块君's avatar
方块君 committed
141
                                            CommandHandler.sendMessage(sender, Grasscutter.getLanguage().Invalid_item_or_player_id);
Benjamin Elsdon's avatar
Benjamin Elsdon committed
142
143
                                            return;
                                        }
144
                                    }
Benjamin Elsdon's avatar
Benjamin Elsdon committed
145
146
                                }
                                mailBuilder.mail.itemList.add(new Mail.MailItem(item, amount, lvl));
147
                                CommandHandler.sendMessage(sender, Grasscutter.getLanguage().SendMail_send.replace("{amount}", Integer.toString(amount)).replace("{item}", Integer.toString(item)).replace("{lvl}", Integer.toString(lvl)));
148
                            }
Benjamin Elsdon's avatar
Benjamin Elsdon committed
149
                        }
150
                    }
Benjamin Elsdon's avatar
Benjamin Elsdon committed
151
152
                }
            } else {
153
                CommandHandler.sendMessage(sender, Grasscutter.getLanguage().SendMail_invalid_arguments_please_use.replace("{args}", getConstructionArgs(mailBuilder.constructionStage)));
Benjamin Elsdon's avatar
Benjamin Elsdon committed
154
155
156
157
            }
        }
    }

158
    private String getConstructionArgs(int stage) {
Benjamin Elsdon's avatar
Benjamin Elsdon committed
159
        switch (stage) {
160
            case 0 -> {
方块君's avatar
方块君 committed
161
                return Grasscutter.getLanguage().SendMail_title;
162
163
            }
            case 1 -> {
方块君's avatar
方块君 committed
164
                return Grasscutter.getLanguage().SendMail_message;
165
166
            }
            case 2 -> {
方块君's avatar
方块君 committed
167
                return Grasscutter.getLanguage().SendMail_sender;
168
169
170

            }
            case 3 -> {
方块君's avatar
方块君 committed
171
                return Grasscutter.getLanguage().SendMail_arguments;
172
173
            }
            default -> {
Benjamin Elsdon's avatar
Benjamin Elsdon committed
174
                Thread.dumpStack();
175
                return Grasscutter.getLanguage().SendMail_error.replace("{stage}", Integer.toString(stage));
176
            }
177
        }
Benjamin Elsdon's avatar
Benjamin Elsdon committed
178
179
180
181
182
183
184
    }

    public static class MailBuilder {
        public int recipient;
        public boolean sendToAll;
        public int constructionStage;
        public Mail mail;
185

Benjamin Elsdon's avatar
Benjamin Elsdon committed
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
        public MailBuilder(int recipient, Mail mail) {
            this.recipient = recipient;
            this.sendToAll = false;
            this.constructionStage = 0;
            this.mail = mail;
        }

        public MailBuilder(boolean sendToAll, Mail mail) {
            if (sendToAll) {
                this.recipient = 0;
                this.sendToAll = true;
                this.constructionStage = 0;
                this.mail = mail;
            } else {
                Grasscutter.getLogger().error("Please use MailBuilder(int, mail) when not sending to all");
                Thread.dumpStack();
            }
        }
204
205
    }
}