package cc.fascinated.bat.service; import cc.fascinated.bat.model.BatGuild; import cc.fascinated.bat.repository.GuildRepository; import lombok.NonNull; import lombok.extern.log4j.Log4j2; 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.cache.annotation.CachePut; import org.springframework.cache.annotation.Cacheable; import org.springframework.context.annotation.DependsOn; import org.springframework.stereotype.Service; import java.util.List; import java.util.Optional; /** * @author Fascinated (fascinated7) */ @Service @Log4j2 @DependsOn("discordService") public class GuildService extends ListenerAdapter { /** * The guild repository to use */ private final GuildRepository guildRepository; @Autowired public GuildService(@NonNull GuildRepository guildRepository) { this.guildRepository = guildRepository; DiscordService.JDA.addEventListener(this); } /** * Gets a guild by its ID * * @param id The ID of the guild * @return The guild */ @Cacheable(cacheNames = "guilds", key = "#id") public BatGuild getGuild(@NonNull String id) { long start = System.currentTimeMillis(); Optional optionalGuild = guildRepository.findById(id); if (optionalGuild.isPresent()) { return optionalGuild.get(); } 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 */ @CachePut(cacheNames = "guilds", key = "#guild.id") public void saveGuild(@NonNull BatGuild guild) { guildRepository.save(guild); } /** * Gets all guilds * * @return all guilds */ public List getAllGuilds() { return guildRepository.findAll(); } @Override public final void onGuildJoin(GuildJoinEvent event) { log.info("Joined guild \"{}\"", event.getGuild().getId()); getGuild(event.getGuild().getId()); // Ensure the guild is in the database } }