fix user leaving guild npe

This commit is contained in:
Lee 2024-07-01 19:40:32 +01:00
parent a6e490dbe5
commit 20c5f71cd4
4 changed files with 28 additions and 5 deletions

@ -38,10 +38,10 @@ public abstract class ProfileHolder {
Serializable profile = getProfiles().get(clazz.getSimpleName()); Serializable profile = getProfiles().get(clazz.getSimpleName());
if (profile == null) { if (profile == null) {
T newProfile = clazz.cast(clazz.getDeclaredConstructors()[0].newInstance()); T newProfile = clazz.cast(clazz.getDeclaredConstructors()[0].newInstance());
org.bson.Document profiles = document.get("profiles", new org.bson.Document()); Document profiles = document.get("profiles", new org.bson.Document());
org.bson.Document profileDocument = profiles.isEmpty() ? new org.bson.Document() : profiles.get(clazz.getSimpleName(), new org.bson.Document()); Document profileDocument = (Document) profiles.get(clazz.getSimpleName());
newProfile.load(profileDocument, BatApplication.GSON); newProfile.load(profileDocument == null ? new Document() : profileDocument, BatApplication.GSON);
getProfiles().put(clazz.getSimpleName(), newProfile); getProfiles().put(clazz.getSimpleName(), newProfile);
return newProfile; return newProfile;
} }

@ -43,6 +43,11 @@ public class BatUser extends ProfileHolder {
@Id @Id
private final String id; private final String id;
/**
* The global name of the user
*/
private String globalName;
/** /**
* The time this user was created * The time this user was created
*/ */
@ -53,13 +58,18 @@ public class BatUser extends ProfileHolder {
this.document = document; this.document = document;
boolean newAccount = this.document.isEmpty(); boolean newAccount = this.document.isEmpty();
this.createdAt = newAccount ? new Date() : document.getDate("createdAt"); this.createdAt = newAccount ? new Date() : document.getDate("createdAt");
User user = DiscordService.JDA.getUserById(id);
if (user != null) {
this.globalName = user.getGlobalName();
}
} }
/** /**
* The name of the user * The name of the user
*/ */
public String getName() { public String getName() {
return getDiscordUser().getEffectiveName(); return this.getGlobalName();
} }
/** /**

@ -50,6 +50,12 @@ public class GuildService extends ListenerAdapter implements EventListener {
DiscordService.JDA.addEventListener(this); DiscordService.JDA.addEventListener(this);
} }
/**
* Validates the premium status of all guilds
* <p>
* This method is scheduled to run every day at midnight
* </p>
*/
@Scheduled(cron = "0 0 0 * * *") @Scheduled(cron = "0 0 0 * * *")
private void validatePremiumStatus() { private void validatePremiumStatus() {
for (BatGuild guild : guilds.values()) { for (BatGuild guild : guilds.values()) {
@ -83,7 +89,7 @@ public class GuildService extends ListenerAdapter implements EventListener {
if (document != null) { if (document != null) {
BatGuild guild = new BatGuild(id, document); BatGuild guild = new BatGuild(id, document);
guilds.put(id, guild); guilds.put(id, guild);
log.info("Loaded guild \"{}\" in {}ms", guild.getName(),System.currentTimeMillis() - before); log.info("Loaded guild \"{}\" in {}ms", guild.getName(), System.currentTimeMillis() - before);
return guild; return guild;
} }
// New guild // New guild

@ -7,6 +7,7 @@ import com.mongodb.client.model.Filters;
import lombok.Getter; import lombok.Getter;
import lombok.NonNull; import lombok.NonNull;
import lombok.extern.log4j.Log4j2; import lombok.extern.log4j.Log4j2;
import net.dv8tion.jda.api.events.user.update.UserUpdateGlobalNameEvent;
import org.bson.Document; import org.bson.Document;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.DependsOn; import org.springframework.context.annotation.DependsOn;
@ -81,4 +82,10 @@ public class UserService implements EventListener {
} }
log.info("Saved all users."); log.info("Saved all users.");
} }
@Override
public void onUserUpdateGlobalName(@NonNull BatUser user, String oldName, String newName, @NonNull UserUpdateGlobalNameEvent event) {
log.info("User \"{}\" changed their name from \"{}\" to \"{}\"", user.getName(), oldName, newName);
user.setGlobalName(newName);
}
} }