package cc.fascinated.bat.service; import cc.fascinated.bat.model.BatGuild; import cc.fascinated.bat.repository.GuildRepository; import lombok.Getter; import lombok.NonNull; import lombok.extern.log4j.Log4j2; import net.dv8tion.jda.api.entities.Guild; import net.dv8tion.jda.api.events.guild.GuildJoinEvent; import net.dv8tion.jda.api.hooks.ListenerAdapter; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.DependsOn; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import java.util.*; /** * @author Fascinated (fascinated7) */ @Service @Log4j2 @Getter @DependsOn("discordService") public class GuildService extends ListenerAdapter { /** * The cached guilds */ private final Map guilds = new HashMap<>(); /** * The guild repository to use */ private final GuildRepository guildRepository; @Autowired public GuildService(@NonNull GuildRepository guildRepository) { this.guildRepository = guildRepository; DiscordService.JDA.addEventListener(this); } @Scheduled(cron = "0 0 0 * * *") private void validatePremiumStatus() { for (BatGuild guild : guilds.values()) { BatGuild.Premium premium = guild.getPremium(); if (premium.getExpiresAt() != null && premium.getExpiresAt().before(new Date())) { premium.removePremium(); guildRepository.save(guild); log.info("Removed premium status from guild \"{}\"", guild.getId()); } } } /** * Gets a guild by its ID * * @param id The ID of the guild * @return The guild */ public BatGuild getGuild(@NonNull String id) { if (guilds.containsKey(id)) { return guilds.get(id); } if (DiscordService.JDA.getGuildById(id) == null) { return null; } long start = System.currentTimeMillis(); Optional optionalGuild = guildRepository.findById(id); if (optionalGuild.isPresent()) { BatGuild guild = optionalGuild.get(); guilds.put(id, guild); return guild; } BatGuild guild = guildRepository.save(new BatGuild(id)); log.info("Created guild \"{}\" in {}ms", id, System.currentTimeMillis() - start); return guild; } /** * Saves a guild * * @param guild The guild to save */ public void saveGuild(@NonNull BatGuild guild) { guildRepository.save(guild); } /** * Gets all guilds * * @return all guilds */ public List getAllGuilds() { List guilds = new ArrayList<>(); for (Guild guild : DiscordService.JDA.getGuilds()) { guilds.add(getGuild(guild.getId())); } return guilds; } @Override public final void onGuildJoin(GuildJoinEvent event) { Guild guild = event.getGuild(); log.info("Joined guild \"{}\"", guild.getId()); getGuild(guild.getId()); // Ensure the guild is in the database } }