package tc.oc.commons.bukkit.whisper; import javax.inject.Inject; import com.sk89q.minecraft.util.commands.Command; import com.sk89q.minecraft.util.commands.CommandContext; import com.sk89q.minecraft.util.commands.CommandException; import com.sk89q.minecraft.util.commands.CommandPermissions; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import tc.oc.api.bukkit.users.BukkitUserStore; import tc.oc.api.docs.User; import tc.oc.api.docs.Whisper; import tc.oc.api.exceptions.NotFound; import tc.oc.api.whispers.WhisperService; import tc.oc.commons.bukkit.chat.Audiences; import tc.oc.commons.bukkit.commands.CommandUtils; import tc.oc.commons.bukkit.commands.UserFinder; import tc.oc.commons.bukkit.nick.Identity; import tc.oc.commons.bukkit.nick.IdentityProvider; import tc.oc.minecraft.scheduler.MainThreadExecutor; import tc.oc.commons.core.chat.Audience; import tc.oc.commons.core.commands.CommandFutureCallback; import tc.oc.commons.core.commands.Commands; public class WhisperCommands implements Commands { private final BukkitUserStore userStore; private final IdentityProvider identityProvider; private final UserFinder userFinder; private final MainThreadExecutor executor; private final Audiences audiences; private final WhisperService whisperService; private final WhisperSender whisperSender; private final WhisperFormatter formatter; @Inject WhisperCommands(BukkitUserStore userStore, IdentityProvider identityProvider, UserFinder userFinder, MainThreadExecutor executor, Audiences audiences, WhisperSender whisperSender, WhisperService whisperService, WhisperFormatter formatter) { this.userStore = userStore; this.identityProvider = identityProvider; this.userFinder = userFinder; this.executor = executor; this.audiences = audiences; this.whisperSender = whisperSender; this.whisperService = whisperService; this.formatter = formatter; } @Command( aliases = {"msg", "message", "whisper", "pm", "tell", "dm"}, usage = "<target> <message...>", desc = "Private message a user", min = 2, max = -1 ) @CommandPermissions("projectares.msg") public void message(final CommandContext args, final CommandSender sender) throws CommandException { final Player player = CommandUtils.senderToPlayer(sender); final Identity from = identityProvider.currentIdentity(player); final String content = args.getJoinedStrings(1); executor.callback( userFinder.findUser(sender, args, 0), CommandFutureCallback.onSuccess(sender, args, response -> { whisperSender.send(sender, from, identityProvider.createIdentity(response), content); }) ); } @Command( aliases = {"reply", "r"}, usage = "<message...>", desc = "Reply to last user", min = 1, max = -1 ) @CommandPermissions("projectares.msg") public void reply(final CommandContext args, final CommandSender sender) throws CommandException { final Player player = CommandUtils.senderToPlayer(sender); final User user = userStore.getUser(player); final Audience audience = audiences.get(sender); final String content = args.getJoinedStrings(0); executor.callback( whisperService.forReply(user), CommandFutureCallback.<Whisper>onSuccess(sender, args, original -> { final Identity from, to; if(user.equals(original.sender_uid())) { // Follow-up of previously sent message from = formatter.senderIdentity(original); to = formatter.recipientIdentity(original); } else { // Reply to received message from = formatter.recipientIdentity(original); to = formatter.senderIdentity(original); } whisperSender.send(sender, from, to, content); }).onFailure(NotFound.class, e -> formatter.noReply(sender)) ); } }