Skip to content

Commit f9c0a98

Browse files
committed
send mail command
1 parent 2df68a7 commit f9c0a98

File tree

6 files changed

+94
-1
lines changed

6 files changed

+94
-1
lines changed

src/main/java/pro/cloudnode/smp/cloudnodemsg/CloudnodeMSG.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@
55
import org.bukkit.entity.Player;
66
import org.bukkit.metadata.MetadataValue;
77
import org.bukkit.plugin.java.JavaPlugin;
8-
import org.bukkit.scheduler.BukkitRunnable;
98
import org.bukkit.scheduler.BukkitTask;
109
import org.jetbrains.annotations.NotNull;
1110
import org.jetbrains.annotations.Nullable;
1211
import pro.cloudnode.smp.cloudnodemsg.command.IgnoreCommand;
12+
import pro.cloudnode.smp.cloudnodemsg.command.MailCommand;
1313
import pro.cloudnode.smp.cloudnodemsg.command.MainCommand;
1414
import pro.cloudnode.smp.cloudnodemsg.command.MessageCommand;
1515
import pro.cloudnode.smp.cloudnodemsg.command.ReplyCommand;
@@ -49,6 +49,7 @@ public void onEnable() {
4949
Objects.requireNonNull(getCommand("ignore")).setExecutor(new IgnoreCommand());
5050
Objects.requireNonNull(getCommand("unignore")).setExecutor(new UnIgnoreCommand());
5151
Objects.requireNonNull(getCommand("togglemsg")).setExecutor(new ToggleMessageCommand());
52+
Objects.requireNonNull(getCommand("mail")).setExecutor(new MailCommand());
5253

5354
getServer().getPluginManager().registerEvents(new AsyncChatListener(), this);
5455
getServer().getPluginManager().registerEvents(new PlayerJoinListener(), this);

src/main/java/pro/cloudnode/smp/cloudnodemsg/Message.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,12 @@ public void send() throws InvalidPlayerError {
7272
return executor instanceof final @NotNull Player player ? player : console;
7373
}
7474

75+
public static @NotNull String name(final @NotNull OfflinePlayer player) {
76+
if (player.getUniqueId().equals(console.getUniqueId())) return CloudnodeMSG.getInstance().config().consoleName();
77+
final @NotNull Optional<@NotNull String> name = Optional.ofNullable(player.getName());
78+
return name.orElse("Unknown Player");
79+
}
80+
7581
public static void sendMessage(final @NotNull OfflinePlayer recipient, final @NotNull Component message) {
7682
if (recipient.getUniqueId() == console.getUniqueId())
7783
CloudnodeMSG.getInstance().getServer().getConsoleSender().sendMessage(message);

src/main/java/pro/cloudnode/smp/cloudnodemsg/PluginConfig.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import net.kyori.adventure.text.Component;
44
import net.kyori.adventure.text.minimessage.MiniMessage;
5+
import net.kyori.adventure.text.minimessage.tag.resolver.Formatter;
56
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
67
import org.bukkit.configuration.file.FileConfiguration;
78
import org.jetbrains.annotations.NotNull;
@@ -283,6 +284,28 @@ public int mailNotifyInterval() {
283284
);
284285
}
285286

287+
/**
288+
* Successfully sent mail
289+
* <p>Placeholders:</p>
290+
* <ul>
291+
* <li>{@code <sender>} - the username of the sender</li>
292+
* <li>{@code <recipient>} - the username of the recipient</li>
293+
* <li>{@code <message>} - the message</li>
294+
* <li>{@code <seen>} - whether the mail was read/opened by the recipient (see: <a href="https://docs.advntr.dev/minimessage/dynamic-replacements.html#insert-a-choice">Insert a choice</a>)</li>
295+
* <li>{@code <starred>} - whether the recipient has starred the mail (see: <a href="https://docs.advntr.dev/minimessage/dynamic-replacements.html#insert-a-choice">Insert a choice</a>)</li>
296+
* </ul>
297+
*
298+
* @param mail the mail
299+
*/
300+
public @NotNull Component mailSent(final @NotNull Mail mail) {
301+
return MiniMessage.miniMessage().deserialize(Objects.requireNonNull(config.getString("mail.sent"))
302+
.replace("<sender>", Message.name(mail.sender))
303+
.replace("<recipient>", Message.name(mail.recipient)),
304+
Formatter.booleanChoice("seen", mail.seen),
305+
Formatter.booleanChoice("starred", mail.starred)
306+
).replaceText(configurer -> configurer.matchLiteral("<message>").replacement(Component.text(mail.message)));
307+
}
308+
286309
/**
287310
* No permission
288311
*/
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package pro.cloudnode.smp.cloudnodemsg.command;
2+
3+
import org.bukkit.OfflinePlayer;
4+
import org.bukkit.command.CommandSender;
5+
import org.jetbrains.annotations.NotNull;
6+
import org.jetbrains.annotations.Nullable;
7+
import pro.cloudnode.smp.cloudnodemsg.CloudnodeMSG;
8+
import pro.cloudnode.smp.cloudnodemsg.Mail;
9+
import pro.cloudnode.smp.cloudnodemsg.Message;
10+
import pro.cloudnode.smp.cloudnodemsg.Permission;
11+
12+
import java.util.Arrays;
13+
import java.util.List;
14+
15+
public final class MailCommand extends Command {
16+
17+
@Override
18+
public boolean run(@NotNull CommandSender sender, @NotNull String label, @NotNull String[] args) {
19+
if (!sender.hasPermission(Permission.MAIL)) return sendMessage(sender, CloudnodeMSG.getInstance().config().noPermission());
20+
if (args.length == 0) return help(sender);
21+
final @NotNull String @NotNull [] subCommandArgs = Arrays.copyOfRange(args, 1, args.length);
22+
final @NotNull String subCommandLabel = label + " " + args[0];
23+
return switch (args[0]) {
24+
case "send", "new", "to" -> send(sender, subCommandLabel, subCommandArgs);
25+
default -> help(sender);
26+
};
27+
}
28+
29+
public static boolean help(final @NotNull CommandSender sender) {
30+
// TODO
31+
return false;
32+
}
33+
34+
public static boolean send(final @NotNull CommandSender sender, final @NotNull String label, final @NotNull String[] args) {
35+
if (args.length == 0) return sendMessage(sender, CloudnodeMSG.getInstance().config().usage(label, "<recipient> <message>"));
36+
if (args.length == 1) return sendMessage(sender, CloudnodeMSG.getInstance().config().usage(label, args[0] + " <message>"));
37+
final @NotNull String message = String.join(" ", Arrays.copyOfRange(args, 1, args.length));
38+
final @NotNull OfflinePlayer recipient = CloudnodeMSG.getInstance().getServer().getOfflinePlayer(args[0]);
39+
if (!recipient.hasPlayedBefore()) return sendMessage(sender, CloudnodeMSG.getInstance().config().playerNotFound(args[0]));
40+
final @NotNull Mail mail = new Mail(Message.offlinePlayer(sender), recipient, message);
41+
mail.insert();
42+
// TODO: notify recipient (if online)
43+
return sendMessage(sender, CloudnodeMSG.getInstance().config().mailSent(mail));
44+
}
45+
46+
@Override
47+
public @Nullable List<String> onTabComplete(@NotNull CommandSender sender, org.bukkit.command.@NotNull Command command, @NotNull String label, @NotNull String[] args) {
48+
return null;
49+
}
50+
}

src/main/resources/config.yml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,15 @@ mail:
110110
# <unread> - the number of unread mail messages
111111
notify: "<green>(!) You have <gray><unread></gray> unread messages.</green> <hover:show_text:'Click to view mail'><click:run_command:/mail read><gray>View mail</gray></click></hover>"
112112

113+
# Successfully sent mail
114+
# Placeholders:
115+
# <sender> - the username of the sender
116+
# <recipient> - the username of the recipient
117+
# <message> - the message
118+
# <seen> - whether the mail was read/opened by the recipient (see: https://docs.advntr.dev/minimessage/dynamic-replacements.html#insert-a-choice)
119+
# <starred> - whether the recipient has starred the mail (see: https://docs.advntr.dev/minimessage/dynamic-replacements.html#insert-a-choice)
120+
sent: "<green>(!) Successfully sent mail to <gray><recipient></gray>.</green>"
121+
113122
# Error messages
114123
errors:
115124
# No permission

src/main/resources/plugin.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,7 @@ commands:
2727
description: Toggles private messages from a player
2828
usage: /<command> <player>
2929
aliases: [ "toggledms", "togglepms" ]
30+
mail:
31+
description: Send and receive offline messages
32+
usage: /<command>
33+
aliases: [ "post" ]

0 commit comments

Comments
 (0)