2024-06-23 21:37:24 +01:00
|
|
|
package cc.fascinated.bat.service;
|
|
|
|
|
2024-07-01 01:12:32 +01:00
|
|
|
import cc.fascinated.bat.common.TimerUtils;
|
2024-07-01 01:33:52 +01:00
|
|
|
import cc.fascinated.bat.event.EventListener;
|
2024-06-25 11:55:26 +01:00
|
|
|
import cc.fascinated.bat.model.BatGuild;
|
2024-07-01 01:12:32 +01:00
|
|
|
import cc.fascinated.bat.premium.PremiumProfile;
|
|
|
|
import com.mongodb.client.model.Filters;
|
2024-06-27 13:00:45 +01:00
|
|
|
import lombok.Getter;
|
2024-06-23 21:37:24 +01:00
|
|
|
import lombok.NonNull;
|
|
|
|
import lombok.extern.log4j.Log4j2;
|
|
|
|
import net.dv8tion.jda.api.events.guild.GuildJoinEvent;
|
2024-07-01 01:12:32 +01:00
|
|
|
import net.dv8tion.jda.api.events.guild.GuildLeaveEvent;
|
2024-06-23 21:37:24 +01:00
|
|
|
import net.dv8tion.jda.api.hooks.ListenerAdapter;
|
2024-07-01 01:12:32 +01:00
|
|
|
import org.bson.Document;
|
|
|
|
import org.jetbrains.annotations.NotNull;
|
2024-06-23 21:37:24 +01:00
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
2024-06-24 13:56:01 +01:00
|
|
|
import org.springframework.context.annotation.DependsOn;
|
2024-06-27 21:05:54 +01:00
|
|
|
import org.springframework.scheduling.annotation.Scheduled;
|
2024-06-23 21:37:24 +01:00
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
2024-07-01 01:12:32 +01:00
|
|
|
import java.util.HashMap;
|
|
|
|
import java.util.Map;
|
2024-06-27 23:51:40 +01:00
|
|
|
import java.util.concurrent.TimeUnit;
|
2024-06-23 21:37:24 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @author Fascinated (fascinated7)
|
|
|
|
*/
|
2024-06-28 03:01:21 +01:00
|
|
|
@Service
|
2024-07-01 01:12:32 +01:00
|
|
|
@Log4j2(topic = "Guild Service")
|
2024-06-28 03:01:21 +01:00
|
|
|
@Getter
|
2024-07-01 01:12:32 +01:00
|
|
|
@DependsOn({"discordService", "mongoService"})
|
2024-07-01 01:33:52 +01:00
|
|
|
public class GuildService extends ListenerAdapter implements EventListener {
|
2024-07-01 01:12:32 +01:00
|
|
|
private static final long SAVE_INTERVAL = TimeUnit.MINUTES.toMillis(5);
|
2024-06-27 13:00:45 +01:00
|
|
|
|
2024-06-23 21:37:24 +01:00
|
|
|
/**
|
2024-07-01 01:12:32 +01:00
|
|
|
* The cached guilds
|
2024-06-23 21:37:24 +01:00
|
|
|
*/
|
2024-07-01 01:12:32 +01:00
|
|
|
private final Map<String, BatGuild> guilds = new HashMap<>();
|
2024-06-23 21:37:24 +01:00
|
|
|
|
|
|
|
@Autowired
|
2024-07-01 01:12:32 +01:00
|
|
|
public GuildService() {
|
|
|
|
TimerUtils.scheduleRepeating(() -> {
|
|
|
|
long before = System.currentTimeMillis();
|
|
|
|
for (BatGuild guild : guilds.values()) {
|
|
|
|
guild.save();
|
|
|
|
}
|
|
|
|
log.info("Saved {} guilds in {}ms", guilds.size(), System.currentTimeMillis() - before);
|
|
|
|
}, SAVE_INTERVAL, SAVE_INTERVAL);
|
|
|
|
|
2024-06-24 13:56:01 +01:00
|
|
|
DiscordService.JDA.addEventListener(this);
|
2024-06-23 21:37:24 +01:00
|
|
|
}
|
|
|
|
|
2024-07-01 19:40:32 +01:00
|
|
|
/**
|
|
|
|
* Validates the premium status of all guilds
|
|
|
|
* <p>
|
|
|
|
* This method is scheduled to run every day at midnight
|
|
|
|
* </p>
|
|
|
|
*/
|
2024-06-27 21:05:54 +01:00
|
|
|
@Scheduled(cron = "0 0 0 * * *")
|
|
|
|
private void validatePremiumStatus() {
|
|
|
|
for (BatGuild guild : guilds.values()) {
|
2024-07-01 01:12:32 +01:00
|
|
|
PremiumProfile premium = guild.getPremiumProfile();
|
|
|
|
if (!premium.hasExpired()) {
|
|
|
|
return;
|
2024-06-27 21:05:54 +01:00
|
|
|
}
|
2024-07-01 01:12:32 +01:00
|
|
|
premium.removePremium();
|
|
|
|
log.info("Removed premium status from guild \"{}\"", guild.getName());
|
2024-06-27 21:05:54 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-06-23 21:37:24 +01:00
|
|
|
/**
|
|
|
|
* Gets a guild by its ID
|
|
|
|
*
|
|
|
|
* @param id The ID of the guild
|
|
|
|
* @return The guild
|
|
|
|
*/
|
2024-06-24 13:56:01 +01:00
|
|
|
public BatGuild getGuild(@NonNull String id) {
|
2024-07-01 01:12:32 +01:00
|
|
|
long before = System.currentTimeMillis();
|
|
|
|
// Guild is cached
|
2024-06-27 13:00:45 +01:00
|
|
|
if (guilds.containsKey(id)) {
|
|
|
|
return guilds.get(id);
|
|
|
|
}
|
2024-07-01 01:41:40 +01:00
|
|
|
if (DiscordService.JDA.getGuildById(id) == null) {
|
|
|
|
log.warn("Attempted to get guild with ID \"{}\" but it does not exist", id);
|
|
|
|
return null;
|
|
|
|
}
|
2024-07-01 01:12:32 +01:00
|
|
|
// Guild is not cached
|
|
|
|
Document document = MongoService.INSTANCE.getGuildsCollection().find(Filters.eq("_id", id)).first();
|
|
|
|
if (document != null) {
|
|
|
|
BatGuild guild = new BatGuild(id, document);
|
2024-06-27 13:00:45 +01:00
|
|
|
guilds.put(id, guild);
|
2024-07-01 19:40:32 +01:00
|
|
|
log.info("Loaded guild \"{}\" in {}ms", guild.getName(), System.currentTimeMillis() - before);
|
2024-06-27 13:00:45 +01:00
|
|
|
return guild;
|
2024-06-23 21:37:24 +01:00
|
|
|
}
|
2024-07-01 01:12:32 +01:00
|
|
|
// New guild
|
|
|
|
BatGuild guild = new BatGuild(id, new Document());
|
|
|
|
guilds.put(id, guild);
|
|
|
|
log.info("Created guild \"{}\" - \"{}\"", guild.getName(), guild.getId());
|
2024-06-23 21:37:24 +01:00
|
|
|
return guild;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2024-06-24 13:56:01 +01:00
|
|
|
public final void onGuildJoin(GuildJoinEvent event) {
|
2024-07-01 01:12:32 +01:00
|
|
|
BatGuild guild = getGuild(event.getGuild().getId());
|
2024-06-28 18:51:58 +01:00
|
|
|
log.info("Joined guild \"{}\"", guild.getName());
|
2024-07-01 01:12:32 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onGuildLeave(@NotNull GuildLeaveEvent event) {
|
|
|
|
BatGuild guild = getGuild(event.getGuild().getId());
|
|
|
|
log.info("Left guild \"{}\"", guild.getName());
|
|
|
|
guild.save();
|
|
|
|
guilds.remove(guild.getId());
|
2024-06-23 21:37:24 +01:00
|
|
|
}
|
2024-07-01 01:33:52 +01:00
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onSpringShutdown() {
|
|
|
|
log.info("Saving all guilds before shutdown...");
|
|
|
|
for (BatGuild guild : guilds.values()) {
|
|
|
|
guild.save();
|
|
|
|
}
|
|
|
|
log.info("Saved all guilds.");
|
|
|
|
}
|
2024-06-23 21:37:24 +01:00
|
|
|
}
|