Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Rework Mail System #3710

Merged
merged 18 commits into from Jul 1, 2021
Merged
Show file tree
Hide file tree
Changes from 15 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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 @@ -80,6 +80,7 @@
import net.ess3.provider.providers.PaperSerializationProvider;
import net.ess3.provider.providers.PaperServerStateProvider;
import net.essentialsx.api.v2.services.BalanceTop;
import net.essentialsx.api.v2.services.mail.MailService;
import org.bukkit.Bukkit;
import org.bukkit.Server;
import org.bukkit.World;
Expand Down Expand Up @@ -144,6 +145,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 MailService mail;
private transient I18n i18n;
private transient MetricsWrapper metrics;
private transient EssentialsTimer timer;
Expand Down Expand Up @@ -201,6 +203,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 MailServiceImpl(this);
userMap = new UserMap(this);
balanceTop = new BalanceTopImpl(this);
permissionsHandler = new PermissionsHandler(this, false);
Expand Down Expand Up @@ -274,6 +277,9 @@ public void onEnable() {
confList.add(settings);
execTimer.mark("Settings");

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

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

@Override
public MailService 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 @@ -7,7 +7,9 @@
import com.earth2me.essentials.utils.StringUtil;
import com.google.common.base.Charsets;
import com.google.common.collect.Maps;
import com.google.gson.reflect.TypeToken;
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 +148,46 @@ 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 EssentialsConfiguration config = new EssentialsConfiguration(file);
try {
config.load();
if (config.hasProperty("mail") && config.isList("mail")) {
final ArrayList<MailMessage> messages = new ArrayList<>();
for (String mailStr : Collections.synchronizedList(config.getList("mail", String.class))) {
if (mailStr == null) {
continue;
}
messages.add(new MailMessage(false, true, null, null, 0L, 0L, mailStr));
}

config.removeProperty("mail");
config.setExplicitList("mail", messages, new TypeToken<List<MailMessage>>() {}.getType());
config.blockingSave();
}
} 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 +862,6 @@ public void afterSettings() {
repairUserMap();
convertIgnoreList();
convertStupidCamelCaseUserdataKeys();
convertMailList();
}
}
Expand Up @@ -17,6 +17,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.MailService;
import org.bukkit.World;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
Expand Down Expand Up @@ -112,6 +113,8 @@ public interface IEssentials extends Plugin {

EssentialsTimer getTimer();

MailService 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
@@ -0,0 +1,53 @@
package com.earth2me.essentials;

import net.ess3.api.IUser;
import net.essentialsx.api.v2.services.mail.MailService;
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 MailServiceImpl implements MailService {
private final transient ThreadLocal<SimpleDateFormat> df = ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy/MM/dd HH:mm"));

public MailServiceImpl(IEssentials ess) {
ess.getServer().getServicesManager().register(MailService.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);
}
}
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
54 changes: 49 additions & 5 deletions Essentials/src/main/java/com/earth2me/essentials/UserData.java
Expand Up @@ -10,6 +10,8 @@
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.ChatColor;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.entity.Player;
Expand Down Expand Up @@ -313,17 +315,59 @@ 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.mail();
final List<String> list = new ArrayList<>();
if (getMailAmount() != 0) {
for (MailMessage mail : getMailMessages()) {
// I hate this code btw
list.add(mail.isLegacy() ? mail.getMessage() : ChatColor.GOLD + "[" + ChatColor.RESET + mail.getSenderUsername() + ChatColor.GOLD + "] " + ChatColor.RESET + mail.getMessage());
JRoy marked this conversation as resolved.
Show resolved Hide resolved
}
}
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.mail(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
JRoy marked this conversation as resolved.
Show resolved Hide resolved
abstract void addMail(final String mail);

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

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

Expand Down