Skip to content

Commit

Permalink
Add rich mail messages
Browse files Browse the repository at this point in the history
  • Loading branch information
JRoy committed Jun 9, 2021
1 parent bd9540c commit 03ebcbb
Show file tree
Hide file tree
Showing 24 changed files with 608 additions and 68 deletions.
7 changes: 7 additions & 0 deletions Essentials/src/main/java/com/earth2me/essentials/Console.java
Expand Up @@ -6,6 +6,8 @@
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;

import java.util.UUID;

import static com.earth2me.essentials.I18n.tl;

public final class Console implements IMessageRecipient {
Expand Down Expand Up @@ -46,6 +48,11 @@ public String getName() {
return Console.NAME;
}

@Override
public UUID getUUID() {
return null;
}

@Override
public String getDisplayName() {
return Console.DISPLAY_NAME;
Expand Down
11 changes: 11 additions & 0 deletions Essentials/src/main/java/com/earth2me/essentials/Essentials.java
Expand Up @@ -78,6 +78,7 @@
import net.ess3.provider.providers.PaperRecipeBookListener;
import net.ess3.provider.providers.PaperServerStateProvider;
import net.essentialsx.api.v2.services.BalanceTop;
import net.essentialsx.api.v2.services.mail.Mail;
import org.bukkit.Bukkit;
import org.bukkit.Server;
import org.bukkit.World;
Expand Down Expand Up @@ -142,6 +143,7 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials {
private transient UserMap userMap;
private transient BalanceTopImpl balanceTop;
private transient ExecuteTimer execTimer;
private transient Mail mail;
private transient I18n i18n;
private transient MetricsWrapper metrics;
private transient EssentialsTimer timer;
Expand Down Expand Up @@ -198,6 +200,7 @@ public void setupForTesting(final Server server) throws IOException, InvalidDesc
LOGGER.log(Level.INFO, tl("usingTempFolderForTesting"));
LOGGER.log(Level.INFO, dataFolder.toString());
settings = new Settings(this);
mail = new MailImpl(this);
userMap = new UserMap(this);
balanceTop = new BalanceTopImpl(this);
permissionsHandler = new PermissionsHandler(this, false);
Expand Down Expand Up @@ -271,6 +274,9 @@ public void onEnable() {
confList.add(settings);
execTimer.mark("Settings");

mail = new MailImpl(this);
execTimer.mark("Init(Mail)");

userMap = new UserMap(this);
confList.add(userMap);
execTimer.mark("Init(Usermap)");
Expand Down Expand Up @@ -1064,6 +1070,11 @@ public EssentialsTimer getTimer() {
return timer;
}

@Override
public Mail getMail() {
return mail;
}

@Override
public List<String> getVanishedPlayers() {
return Collections.unmodifiableList(new ArrayList<>(vanishedPlayers));
Expand Down
Expand Up @@ -358,8 +358,7 @@ public void run() {
}

if (!ess.getSettings().isCommandDisabled("mail") && user.isAuthorized("essentials.mail")) {
final List<String> mail = user.getMails();
if (mail.isEmpty()) {
if (user.getUnreadMailAmount() == 0) {
if (ess.getSettings().isNotifyNoNewMail()) {
user.sendMessage(tl("noNewMail")); // Only notify if they want us to.
}
Expand Down
Expand Up @@ -8,6 +8,7 @@
import com.google.common.base.Charsets;
import com.google.common.collect.Maps;
import net.ess3.api.IEssentials;
import net.essentialsx.api.v2.services.mail.MailMessage;
import org.bukkit.BanList;
import org.bukkit.Bukkit;
import org.bukkit.Location;
Expand Down Expand Up @@ -146,6 +147,45 @@ public static void uuidFileConvert(final IEssentials ess, final Boolean ignoreUF
ess.getLogger().info("To rerun the conversion type /essentials uuidconvert");
}

public void convertMailList() {
if (doneFile.getBoolean("updateUsersMailList", false)) {
return;
}

final File userdataFolder = new File(ess.getDataFolder(), "userdata");
if (!userdataFolder.exists() || !userdataFolder.isDirectory()) {
return;
}
final File[] userFiles = userdataFolder.listFiles();
for (File file : userFiles) {
if (!file.isFile() || !file.getName().endsWith(".yml")) {
continue;
}
final EssentialsConf config = new EssentialsConf(file);
try {
config.load();
if (config.hasProperty("mail") && config.isList("mail")) {
final ArrayList<MailMessage> messages = new ArrayList<>();
for (String mailStr : Collections.synchronizedList(config.getStringList("mail"))) {
if (mailStr == null) {
continue;
}
messages.add(new MailMessage(false, true, null, null, 0L, 0L, mailStr));
}
config.removeProperty("mail");
config.setProperty("mail", messages);
config.forceSave();
}
} catch (RuntimeException ex) {
LOGGER.log(Level.INFO, "File: " + file);
throw ex;
}
}
doneFile.setProperty("updateUsersMailList", true);
doneFile.save();
LOGGER.info("Done converting mail list.");
}

public void convertStupidCamelCaseUserdataKeys() {
if (doneFile.getBoolean("updateUsersLegacyPathNames", false)) {
return;
Expand Down Expand Up @@ -820,5 +860,6 @@ public void afterSettings() {
repairUserMap();
convertIgnoreList();
convertStupidCamelCaseUserdataKeys();
convertMailList();
}
}
Expand Up @@ -16,6 +16,7 @@
import net.ess3.provider.SpawnerItemProvider;
import net.ess3.provider.SyncCommandsProvider;
import net.essentialsx.api.v2.services.BalanceTop;
import net.essentialsx.api.v2.services.mail.Mail;
import org.bukkit.World;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
Expand Down Expand Up @@ -111,6 +112,8 @@ public interface IEssentials extends Plugin {

EssentialsTimer getTimer();

Mail getMail();

/**
* Get a list of players who are vanished.
*
Expand Down
15 changes: 15 additions & 0 deletions Essentials/src/main/java/com/earth2me/essentials/IUser.java
Expand Up @@ -6,12 +6,15 @@
import net.ess3.api.ITeleport;
import net.ess3.api.MaxMoneyException;
import net.ess3.api.events.AfkStatusChangeEvent;
import net.essentialsx.api.v2.services.mail.MailMessage;
import net.essentialsx.api.v2.services.mail.MailSender;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.entity.Player;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
Expand Down Expand Up @@ -148,10 +151,22 @@ public interface IUser {

String getFormattedJailTime();

@Deprecated
List<String> getMails();

@Deprecated
void addMail(String mail);

void sendMail(MailSender sender, String message);

void sendMail(MailSender sender, String message, long expireAt);

ArrayList<MailMessage> getMailMessages();

void setMailList(ArrayList<MailMessage> messages);

int getMailAmount();

boolean isAfk();

@Deprecated
Expand Down
53 changes: 53 additions & 0 deletions Essentials/src/main/java/com/earth2me/essentials/MailImpl.java
@@ -0,0 +1,53 @@
package com.earth2me.essentials;

import net.ess3.api.IUser;
import net.essentialsx.api.v2.services.mail.Mail;
import net.essentialsx.api.v2.services.mail.MailMessage;
import net.essentialsx.api.v2.services.mail.MailSender;
import org.bukkit.plugin.ServicePriority;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

import static com.earth2me.essentials.I18n.tl;

public class MailImpl implements Mail {
private final transient ThreadLocal<SimpleDateFormat> df = ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy/MM/dd HH:mm"));

public MailImpl(IEssentials ess) {
ess.getServer().getServicesManager().register(Mail.class, this, ess, ServicePriority.Normal);
}

@Override
public void sendMail(IUser recipient, MailSender sender, String message) {
sendMail(recipient, sender, message, 0L);
}

@Override
public void sendMail(IUser recipient, MailSender sender, String message, long expireAt) {
sendMail(recipient, new MailMessage(false, false, sender.getName(), sender.getUUID(), System.currentTimeMillis(), expireAt, message));
}

@Override
public void sendLegacyMail(IUser recipient, String message) {
sendMail(recipient, new MailMessage(false, true, null, null, 0L, 0L, message));
}

private void sendMail(IUser recipient, MailMessage message) {
final ArrayList<MailMessage> messages = recipient.getMailMessages();
messages.add(0, message);
recipient.setMailList(messages);
}

@Override
public String getMailLine(MailMessage mail) {
final String message = mail.getMessage();
if (mail.isLegacy()) {
return tl("mailMessage", message);
}

final String expire = mail.getTimeExpire() != 0 ? "Timed" : "";
return tl((mail.isRead() ? "mailFormatNewRead" : "mailFormatNew") + expire, df.get().format(new Date(mail.getTimeSent())), mail.getSenderUsername(), message);
}
}
Expand Up @@ -1282,7 +1282,7 @@ public double getMaxWalkSpeed() {
}

private int _getMailsPerMinute() {
return config.getInt("mails-per-minute", 1000);
return config.getInt("mail-per-minute", 1000);
}

@Override
Expand Down
30 changes: 26 additions & 4 deletions Essentials/src/main/java/com/earth2me/essentials/User.java
Expand Up @@ -5,11 +5,11 @@
import com.earth2me.essentials.economy.EconomyLayers;
import com.earth2me.essentials.messaging.IMessageRecipient;
import com.earth2me.essentials.messaging.SimpleMessageRecipient;
import com.earth2me.essentials.utils.TriState;
import com.earth2me.essentials.utils.DateUtil;
import com.earth2me.essentials.utils.EnumUtil;
import com.earth2me.essentials.utils.FormatUtil;
import com.earth2me.essentials.utils.NumberUtil;
import com.earth2me.essentials.utils.TriState;
import com.earth2me.essentials.utils.VersionUtil;
import com.google.common.collect.Lists;
import net.ess3.api.IEssentials;
Expand All @@ -19,6 +19,7 @@
import net.ess3.api.events.MuteStatusChangeEvent;
import net.ess3.api.events.UserBalanceUpdateEvent;
import net.essentialsx.api.v2.events.TransactionEvent;
import net.essentialsx.api.v2.services.mail.MailSender;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.Statistic;
Expand Down Expand Up @@ -983,6 +984,11 @@ public String getName() {
return this.getBase().getName();
}

@Override
public UUID getUUID() {
return getBase().getUniqueId();
}

@Override
public boolean isReachable() {
return getBase().isOnline();
Expand Down Expand Up @@ -1050,12 +1056,28 @@ public ItemStack getItemInHand() {
}
}

@Override
public void sendMail(MailSender sender, String message) {
sendMail(sender, message, 0);
}

@Override
public void sendMail(MailSender sender, String message, long expireAt) {
ess.getMail().sendMail(this, sender, message, expireAt);
}

@Override
@Deprecated
public void addMail(String mail) {
ess.getMail().sendLegacyMail(this, mail);
}

public void notifyOfMail() {
final List<String> mails = getMails();
if (mails != null && !mails.isEmpty()) {
final int unread = getUnreadMailAmount();
if (unread != 0) {
final int notifyPlayerOfMailCooldown = ess.getSettings().getNotifyPlayerOfMailCooldown() * 1000;
if (System.currentTimeMillis() - lastNotifiedAboutMailsMs >= notifyPlayerOfMailCooldown) {
sendMessage(tl("youHaveNewMail", mails.size()));
sendMessage(tl("youHaveNewMail", unread));
lastNotifiedAboutMailsMs = System.currentTimeMillis();
}
}
Expand Down
52 changes: 47 additions & 5 deletions Essentials/src/main/java/com/earth2me/essentials/UserData.java
Expand Up @@ -10,6 +10,7 @@
import com.google.common.base.Charsets;
import net.ess3.api.IEssentials;
import net.ess3.api.MaxMoneyException;
import net.essentialsx.api.v2.services.mail.MailMessage;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.entity.Player;
Expand Down Expand Up @@ -311,17 +312,58 @@ public void setJail(final String jail) {
config.save();
}

/**
* @deprecated Mails are no longer just strings, this method is therefore misleading.
*/
@Deprecated
public List<String> getMails() {
return holder.mails();
final List<String> list = new ArrayList<>();
if (getMailAmount() != 0) {
for (MailMessage mail : getMailMessages()) {
list.add(mail.getMessage());
}
}
return list;
}

/**
* @deprecated This method does not support the new mail system and will fail at runtime.
*/
@Deprecated
public void setMails(List<String> mails) {
holder.mails(mails);
config.save();
throw new UnsupportedOperationException("UserData#setMails(List<String>) is deprecated and can no longer be used. Please tell the plugin author to update this!");
}

public int getMailAmount() {
return holder.mail() == null ? 0 : holder.mail().size();
}

public int getUnreadMailAmount() {
if (holder.mail() == null || holder.mail().isEmpty()) {
return 0;
}

int unread = 0;
for (MailMessage element : holder.mail()) {
if (!element.isRead()) {
unread++;
}
}
return unread;
}

/**
* @deprecated This method does not support the new mail system and should not be used.
*/
@Deprecated
abstract void addMail(final String mail);

public ArrayList<MailMessage> getMailMessages() {
return new ArrayList<>(holder.mail());
}

public void addMail(final String mail) {
holder.mails().add(mail);
public void setMailList(ArrayList<MailMessage> messages) {
holder.mail(messages);
config.save();
}

Expand Down

0 comments on commit 03ebcbb

Please sign in to comment.