diff --git a/src/main/java/cc/fascinated/bat/event/EventListener.java b/src/main/java/cc/fascinated/bat/event/EventListener.java index 759cd1d..43c68d5 100644 --- a/src/main/java/cc/fascinated/bat/event/EventListener.java +++ b/src/main/java/cc/fascinated/bat/event/EventListener.java @@ -7,9 +7,13 @@ import cc.fascinated.bat.model.token.beatsaber.scoresaber.ScoreSaberLeaderboardT import cc.fascinated.bat.model.token.beatsaber.scoresaber.ScoreSaberPlayerScoreToken; import cc.fascinated.bat.model.token.beatsaber.scoresaber.ScoreSaberScoreToken; import lombok.NonNull; +import net.dv8tion.jda.api.entities.Guild; import net.dv8tion.jda.api.entities.Invite; import net.dv8tion.jda.api.entities.Role; +import net.dv8tion.jda.api.entities.channel.concrete.TextChannel; +import net.dv8tion.jda.api.entities.channel.concrete.VoiceChannel; import net.dv8tion.jda.api.entities.emoji.Emoji; +import net.dv8tion.jda.api.entities.sticker.GuildSticker; import net.dv8tion.jda.api.events.channel.ChannelCreateEvent; import net.dv8tion.jda.api.events.channel.ChannelDeleteEvent; import net.dv8tion.jda.api.events.channel.update.*; @@ -27,6 +31,7 @@ import net.dv8tion.jda.api.events.guild.member.update.GuildMemberUpdateBoostTime import net.dv8tion.jda.api.events.guild.member.update.GuildMemberUpdateNicknameEvent; import net.dv8tion.jda.api.events.guild.member.update.GuildMemberUpdateTimeOutEvent; import net.dv8tion.jda.api.events.guild.override.GenericPermissionOverrideEvent; +import net.dv8tion.jda.api.events.guild.update.*; import net.dv8tion.jda.api.events.guild.voice.GenericGuildVoiceEvent; import net.dv8tion.jda.api.events.interaction.ModalInteractionEvent; import net.dv8tion.jda.api.events.interaction.component.ButtonInteractionEvent; @@ -40,9 +45,13 @@ import net.dv8tion.jda.api.events.role.update.RoleUpdateColorEvent; import net.dv8tion.jda.api.events.role.update.RoleUpdateIconEvent; import net.dv8tion.jda.api.events.role.update.RoleUpdateNameEvent; import net.dv8tion.jda.api.events.role.update.RoleUpdatePermissionsEvent; +import net.dv8tion.jda.api.events.sticker.GuildStickerAddedEvent; +import net.dv8tion.jda.api.events.sticker.GuildStickerRemovedEvent; +import net.dv8tion.jda.api.events.sticker.update.GuildStickerUpdateNameEvent; import net.dv8tion.jda.api.events.user.update.UserUpdateAvatarEvent; import net.dv8tion.jda.api.events.user.update.UserUpdateGlobalNameEvent; import net.dv8tion.jda.api.events.user.update.UserUpdateNameEvent; +import net.dv8tion.jda.api.interactions.DiscordLocale; import java.time.OffsetDateTime; import java.util.List; @@ -181,6 +190,80 @@ public interface EventListener { default void onChannelUpdateSlowmode(@NonNull BatGuild guild, @NonNull ChannelUpdateSlowmodeEvent event) { } + default void onGuildUpdateName(@NonNull BatGuild guild, String oldName, String newName, @NonNull GuildUpdateNameEvent event) { + } + + default void onGuildStickerAdd(@NonNull BatGuild guild, @NonNull GuildSticker sticker, @NonNull GuildStickerAddedEvent event) { + } + + default void onGuildStickerRemove(@NonNull BatGuild guild, @NonNull GuildSticker sticker, @NonNull GuildStickerRemovedEvent event) { + } + + default void onGuildStickerRename(@NonNull BatGuild guild, @NonNull GuildSticker sticker, @NonNull String oldName, + @NonNull String newName, @NonNull GuildStickerUpdateNameEvent event) { + } + + default void onGuildUpdateAfkChannel(@NonNull BatGuild guild, VoiceChannel oldChannel, VoiceChannel newChannel, @NonNull GuildUpdateAfkChannelEvent event) { + } + + default void onGuildUpdateAfkTimeout(@NonNull BatGuild guild, Guild.Timeout oldTimeout, Guild.Timeout newTimeout, @NonNull GuildUpdateAfkTimeoutEvent event) { + } + + default void onGuildUpdateBanner(@NonNull BatGuild guild, String oldBannerUrl, String newBannerUrl, @NonNull GuildUpdateBannerEvent event) { + } + + default void onGuildUpdateDescription(@NonNull BatGuild guild, String oldDescription, String newDescription, @NonNull GuildUpdateDescriptionEvent event) { + } + + default void onGuildUpdateIcon(@NonNull BatGuild guild, String oldIconUrl, String newIconUrl, @NonNull GuildUpdateIconEvent event) { + } + + default void onGuildUpdateLocale(@NonNull BatGuild guild, DiscordLocale oldLocale, DiscordLocale newLocale, @NonNull GuildUpdateLocaleEvent event) { + } + + default void onGuildUpdateCommunityUpdatesChannel(@NonNull BatGuild guild, TextChannel oldChannel, TextChannel newChannel, + @NonNull GuildUpdateCommunityUpdatesChannelEvent event) { + } + + default void onGuildUpdateBoostTier(@NonNull BatGuild guild, Guild.BoostTier oldTier, Guild.BoostTier newTier, @NonNull GuildUpdateBoostTierEvent event) { + } + + default void onGuildUpdateMaxMembers(@NonNull BatGuild guild, int oldCount, int newCount, @NonNull GuildUpdateMaxMembersEvent event) { + } + + default void onGuildUpdateExplicitContentLevel(@NonNull BatGuild guild, Guild.ExplicitContentLevel oldLevel, Guild.ExplicitContentLevel newLevel, + @NonNull GuildUpdateExplicitContentLevelEvent event) { + } + + default void onGuildUpdateMFALevel(@NonNull BatGuild guild, Guild.MFALevel oldLevel, Guild.MFALevel newLevel, @NonNull GuildUpdateMFALevelEvent event) { + } + + default void onGuildUpdateNotificationLevel(@NonNull BatGuild guild, Guild.NotificationLevel oldLevel, Guild.NotificationLevel newLevel, + @NonNull GuildUpdateNotificationLevelEvent event) { + } + + default void onGuildUpdateNSFWLevel(@NonNull BatGuild guild, Guild.NSFWLevel oldLevel, Guild.NSFWLevel newLevel, @NonNull GuildUpdateNSFWLevelEvent event) { + } + + default void onGuildUpdateOwner(@NonNull BatGuild guild, @NonNull BatUser oldOwner, @NonNull BatUser newOwner, @NonNull GuildUpdateOwnerEvent event) { + } + + default void onGuildUpdateRulesChannel(@NonNull BatGuild guild, TextChannel oldChannel, TextChannel newChannel, @NonNull GuildUpdateRulesChannelEvent event) { + } + + default void onGuildUpdateSystemChannel(@NonNull BatGuild guild, TextChannel oldChannel, TextChannel newChannel, @NonNull GuildUpdateSystemChannelEvent event) { + } + + default void onGuildUpdateVanityCode(@NonNull BatGuild guild, String oldCode, String newCode, @NonNull GuildUpdateVanityCodeEvent event) { + } + + default void onGuildUpdateVerificationLevel(@NonNull BatGuild guild, Guild.VerificationLevel oldLevel, Guild.VerificationLevel newLevel, + @NonNull GuildUpdateVerificationLevelEvent event) { + } + + default void onGuildUpdateSplash(@NonNull BatGuild guild, String oldSplashUrl, String newSplashUrl, @NonNull GuildUpdateSplashEvent event) { + } + default void onShutdown() { } } diff --git a/src/main/java/cc/fascinated/bat/features/logging/LogType.java b/src/main/java/cc/fascinated/bat/features/logging/LogType.java index a9b024f..f6fdab4 100644 --- a/src/main/java/cc/fascinated/bat/features/logging/LogType.java +++ b/src/main/java/cc/fascinated/bat/features/logging/LogType.java @@ -42,7 +42,6 @@ public enum LogType { CHANNEL_DELETE(LogCategory.CHANNEL), VOICE_CHANNEL_JOIN(LogCategory.CHANNEL), VOICE_CHANNEL_LEAVE(LogCategory.CHANNEL), - CHANNEL_PERMISSIONS_UPDATED(LogCategory.CHANNEL), CHANNEL_CONFIGURATION(LogCategory.CHANNEL), /** @@ -52,10 +51,14 @@ public enum LogType { EMOJI_ADD(LogCategory.GUILD), EMOJI_REMOVE(LogCategory.GUILD), EMOJI_NAME_UPDATED(LogCategory.GUILD), - ROLE_PERMISSIONS_UPDATED(LogCategory.GUILD), ROLE_CREATE(LogCategory.GUILD), ROLE_DELETE(LogCategory.GUILD), - ROLE_CONFIGURATION(LogCategory.GUILD); + ROLE_CONFIGURATION(LogCategory.GUILD), + STICKER_ADD(LogCategory.GUILD), + STICKER_REMOVE(LogCategory.GUILD), + STICKER_NAME_UPDATED(LogCategory.GUILD), + BOOST_TIER_UPDATED(LogCategory.GUILD), + GUILD_CONFIGURATION(LogCategory.GUILD); /** * The category of the log type diff --git a/src/main/java/cc/fascinated/bat/features/logging/listeners/ChannelListener.java b/src/main/java/cc/fascinated/bat/features/logging/listeners/ChannelListener.java index 4635dbc..0a8811d 100644 --- a/src/main/java/cc/fascinated/bat/features/logging/listeners/ChannelListener.java +++ b/src/main/java/cc/fascinated/bat/features/logging/listeners/ChannelListener.java @@ -163,7 +163,7 @@ public class ChannelListener implements EventListener { : deniedPermissions.substring(0, deniedPermissions.length() - 2)), true); } - logFeature.sendLog(guild, LogType.CHANNEL_PERMISSIONS_UPDATED, EmbedUtils.successEmbed() + logFeature.sendLog(guild, LogType.CHANNEL_CONFIGURATION, EmbedUtils.successEmbed() .setDescription(description.build()).build()); } diff --git a/src/main/java/cc/fascinated/bat/features/logging/listeners/GuildListener.java b/src/main/java/cc/fascinated/bat/features/logging/listeners/GuildListener.java index a68a984..2ad679e 100644 --- a/src/main/java/cc/fascinated/bat/features/logging/listeners/GuildListener.java +++ b/src/main/java/cc/fascinated/bat/features/logging/listeners/GuildListener.java @@ -2,15 +2,23 @@ package cc.fascinated.bat.features.logging.listeners; import cc.fascinated.bat.common.EmbedDescriptionBuilder; import cc.fascinated.bat.common.EmbedUtils; +import cc.fascinated.bat.common.EnumUtils; +import cc.fascinated.bat.common.TimeUtils; import cc.fascinated.bat.event.EventListener; import cc.fascinated.bat.features.logging.LogFeature; import cc.fascinated.bat.features.logging.LogType; import cc.fascinated.bat.model.BatGuild; +import cc.fascinated.bat.model.BatUser; import lombok.NonNull; import lombok.extern.log4j.Log4j2; +import net.dv8tion.jda.api.entities.Guild; import net.dv8tion.jda.api.entities.Invite; import net.dv8tion.jda.api.entities.channel.ChannelType; +import net.dv8tion.jda.api.entities.channel.concrete.TextChannel; +import net.dv8tion.jda.api.entities.channel.concrete.VoiceChannel; import net.dv8tion.jda.api.events.guild.invite.GuildInviteCreateEvent; +import net.dv8tion.jda.api.events.guild.update.*; +import net.dv8tion.jda.api.interactions.DiscordLocale; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Component; @@ -42,11 +50,227 @@ public class GuildListener implements EventListener { ), true); } description.appendLine("Max Uses: `%s`".formatted(expandedInvite.getMaxUses() == 0 ? "Infinite" : expandedInvite.getMaxUses()), true); - description.appendLine("Creator: %s".formatted(expandedInvite.getInviter() == null ? "Unknown" : expandedInvite.getInviter().getAsMention()), true);; - logFeature.sendLog(guild, LogType.INVITE_CREATE, EmbedUtils.successEmbed() - .setDescription(description - .build()) - .build()); + description.appendLine("Creator: %s".formatted(expandedInvite.getInviter() == null ? "Unknown" : expandedInvite.getInviter().getAsMention()), true); + ; + logFeature.sendLog(guild, LogType.INVITE_CREATE, EmbedUtils.successEmbed().setDescription(description.build()).build()); }); } + + @Override + public void onGuildUpdateName(@NonNull BatGuild guild, String oldName, String newName, @NonNull GuildUpdateNameEvent event) { + log.info("Guild name was updated in guild \"{}\" from \"{}\" to \"{}\"", guild.getGuild().getName(), oldName, newName); + + EmbedDescriptionBuilder description = new EmbedDescriptionBuilder("Guild Name Updated") + .appendLine("Name: `%s` -> `%s`".formatted(oldName, newName), true); + logFeature.sendLog(guild, LogType.GUILD_CONFIGURATION, EmbedUtils.successEmbed().setDescription(description.build()).build()); + } + + @Override + public void onGuildUpdateAfkChannel(@NonNull BatGuild guild, VoiceChannel oldChannel, VoiceChannel newChannel, @NonNull GuildUpdateAfkChannelEvent event) { + log.info("Guild AFK channel was updated in guild \"{}\" from \"{}\" to \"{}\"", guild.getGuild().getName(), oldChannel == null ? "None" : oldChannel.getName(), newChannel == null ? "None" : newChannel.getName()); + + EmbedDescriptionBuilder description = new EmbedDescriptionBuilder("Guild AFK Channel Updated") + .appendLine("Channel: `%s` -> `%s`".formatted( + oldChannel == null ? "None" : oldChannel.getName(), + newChannel == null ? "None" : newChannel.getName() + ), true); + logFeature.sendLog(guild, LogType.GUILD_CONFIGURATION, EmbedUtils.successEmbed().setDescription(description.build()).build()); + } + + @Override + public void onGuildUpdateAfkTimeout(@NonNull BatGuild guild, Guild.Timeout oldTimeout, Guild.Timeout newTimeout, @NonNull GuildUpdateAfkTimeoutEvent event) { + log.info("Guild AFK timeout was updated in guild \"{}\" from \"{}\" to \"{}\"", + guild.getGuild().getName(), oldTimeout.getSeconds(), newTimeout.getSeconds()); + + EmbedDescriptionBuilder description = new EmbedDescriptionBuilder("Guild AFK Timeout Updated") + .appendLine("Timeout: `%s` -> `%s`".formatted( + TimeUtils.format(oldTimeout.getSeconds() * 1000L), + TimeUtils.format(newTimeout.getSeconds() * 1000L) + ), true); + logFeature.sendLog(guild, LogType.GUILD_CONFIGURATION, EmbedUtils.successEmbed().setDescription(description.build()).build()); + } + + @Override + public void onGuildUpdateBanner(@NonNull BatGuild guild, String oldBannerUrl, String newBannerUrl, @NonNull GuildUpdateBannerEvent event) { + log.info("Guild banner was updated in guild \"{}\" from \"{}\" to \"{}\"", guild.getGuild().getName(), oldBannerUrl, newBannerUrl); + + EmbedDescriptionBuilder description = new EmbedDescriptionBuilder("Guild Banner Updated") + .appendLine("Banner: [click here](%s)".formatted(newBannerUrl), true); + logFeature.sendLog(guild, LogType.GUILD_CONFIGURATION, EmbedUtils.successEmbed().setDescription(description.build()).build()); + } + + @Override + public void onGuildUpdateDescription(@NonNull BatGuild guild, String oldDescription, String newDescription, @NonNull GuildUpdateDescriptionEvent event) { + log.info("Guild description was updated in guild \"{}\" from \"{}\" to \"{}\"", guild.getGuild().getName(), oldDescription, newDescription); + + EmbedDescriptionBuilder description = new EmbedDescriptionBuilder("Guild Description Updated") + .appendLine("Description: `%s` -> `%s`".formatted(oldDescription, newDescription), true); + logFeature.sendLog(guild, LogType.GUILD_CONFIGURATION, EmbedUtils.successEmbed().setDescription(description.build()).build()); + } + + @Override + public void onGuildUpdateIcon(@NonNull BatGuild guild, String oldIconUrl, String newIconUrl, @NonNull GuildUpdateIconEvent event) { + log.info("Guild icon was updated in guild \"{}\" from \"{}\" to \"{}\"", guild.getGuild().getName(), oldIconUrl, newIconUrl); + + EmbedDescriptionBuilder description = new EmbedDescriptionBuilder("Guild Icon Updated") + .appendLine("Icon: [click here](%s)".formatted(newIconUrl), true); + logFeature.sendLog(guild, LogType.GUILD_CONFIGURATION, EmbedUtils.successEmbed().setDescription(description.build()).build()); + } + + @Override + public void onGuildUpdateLocale(@NonNull BatGuild guild, DiscordLocale oldLocale, DiscordLocale newLocale, @NonNull GuildUpdateLocaleEvent event) { + log.info("Guild primary language was updated in guild \"{}\" from \"{}\" to \"{}\"", guild.getGuild().getName(), oldLocale, newLocale); + + EmbedDescriptionBuilder description = new EmbedDescriptionBuilder("Guild Primary Language Updated") + .appendLine("Language: `%s` -> `%s`".formatted( + oldLocale.getLanguageName(), + newLocale.getLanguageName() + ), true); + logFeature.sendLog(guild, LogType.GUILD_CONFIGURATION, EmbedUtils.successEmbed().setDescription(description.build()).build()); + } + + @Override + public void onGuildUpdateCommunityUpdatesChannel(@NonNull BatGuild guild, TextChannel oldChannel, TextChannel newChannel, @NonNull GuildUpdateCommunityUpdatesChannelEvent event) { + log.info("Guild community updates channel was updated in guild \"{}\" from \"{}\" to \"{}\"", guild.getGuild().getName(), oldChannel == null ? "None" : oldChannel.getName(), newChannel == null ? "None" : newChannel.getName()); + + EmbedDescriptionBuilder description = new EmbedDescriptionBuilder("Community Updates Channel Updated") + .appendLine("Channel: `%s` -> `%s`".formatted( + oldChannel == null ? "None" : oldChannel.getName(), + newChannel == null ? "None" : newChannel.getName() + ), true); + logFeature.sendLog(guild, LogType.GUILD_CONFIGURATION, EmbedUtils.successEmbed().setDescription(description.build()).build()); + } + + + @Override + public void onGuildUpdateBoostTier(@NonNull BatGuild guild, Guild.BoostTier oldTier, Guild.BoostTier newTier, @NonNull GuildUpdateBoostTierEvent event) { + log.info("Guild boost tier was updated in guild \"{}\" from \"{}\" to \"{}\"", guild.getGuild().getName(), oldTier.getKey(), newTier.getKey()); + + EmbedDescriptionBuilder description = new EmbedDescriptionBuilder("Guild Boost Tier Updated") + .appendLine("Tier: `%s` -> `%s`".formatted(oldTier.getKey(), newTier.getKey()), true); + logFeature.sendLog(guild, LogType.BOOST_TIER_UPDATED, EmbedUtils.successEmbed().setDescription(description.build()).build()); + } + + @Override + public void onGuildUpdateMaxMembers(@NonNull BatGuild guild, int oldCount, int newCount, @NonNull GuildUpdateMaxMembersEvent event) { + log.info("Guild max members was updated in guild \"{}\" from \"{}\" to \"{}\"", guild.getGuild().getName(), oldCount, newCount); + + EmbedDescriptionBuilder description = new EmbedDescriptionBuilder("Guild Max Members Updated") + .appendLine("Members: `%s` -> `%s`".formatted(oldCount, newCount), true); + logFeature.sendLog(guild, LogType.GUILD_CONFIGURATION, EmbedUtils.successEmbed().setDescription(description.build()).build()); + } + + @Override + public void onGuildUpdateExplicitContentLevel(@NonNull BatGuild guild, Guild.ExplicitContentLevel oldLevel, Guild.ExplicitContentLevel newLevel, @NonNull GuildUpdateExplicitContentLevelEvent event) { + log.info("Guild explicit content level was updated in guild \"{}\" from \"{}\" to \"{}\"", guild.getGuild().getName(), oldLevel.getKey(), newLevel.getKey()); + + EmbedDescriptionBuilder description = new EmbedDescriptionBuilder("Guild Explicit Content Level Updated") + .appendLine("Level: `%s` -> `%s`".formatted( + EnumUtils.getEnumName(oldLevel), + EnumUtils.getEnumName(newLevel) + ), true); + logFeature.sendLog(guild, LogType.GUILD_CONFIGURATION, EmbedUtils.successEmbed().setDescription(description.build()).build()); + } + + @Override + public void onGuildUpdateMFALevel(@NonNull BatGuild guild, Guild.MFALevel oldLevel, Guild.MFALevel newLevel, @NonNull GuildUpdateMFALevelEvent event) { + log.info("Guild MFA level was updated in guild \"{}\" from \"{}\" to \"{}\"", guild.getGuild().getName(), oldLevel.getKey(), newLevel.getKey()); + + EmbedDescriptionBuilder description = new EmbedDescriptionBuilder("Guild MFA Level Updated") + .appendLine("Level: `%s` -> `%s`".formatted( + EnumUtils.getEnumName(oldLevel), + EnumUtils.getEnumName(newLevel) + ), true); + logFeature.sendLog(guild, LogType.GUILD_CONFIGURATION, EmbedUtils.successEmbed().setDescription(description.build()).build()); + } + + @Override + public void onGuildUpdateNotificationLevel(@NonNull BatGuild guild, Guild.NotificationLevel oldLevel, Guild.NotificationLevel newLevel, @NonNull GuildUpdateNotificationLevelEvent event) { + log.info("Guild notification level was updated in guild \"{}\" from \"{}\" to \"{}\"", guild.getGuild().getName(), oldLevel.getKey(), newLevel.getKey()); + + EmbedDescriptionBuilder description = new EmbedDescriptionBuilder("Guild Notification Level Updated") + .appendLine("Level: `%s` -> `%s`".formatted( + EnumUtils.getEnumName(oldLevel), + EnumUtils.getEnumName(newLevel) + ), true); + logFeature.sendLog(guild, LogType.GUILD_CONFIGURATION, EmbedUtils.successEmbed().setDescription(description.build()).build()); + } + + @Override + public void onGuildUpdateNSFWLevel(@NonNull BatGuild guild, Guild.NSFWLevel oldLevel, Guild.NSFWLevel newLevel, @NonNull GuildUpdateNSFWLevelEvent event) { + log.info("Guild NSFW level was updated in guild \"{}\" from \"{}\" to \"{}\"", guild.getGuild().getName(), oldLevel.getKey(), newLevel.getKey()); + + EmbedDescriptionBuilder description = new EmbedDescriptionBuilder("Guild NSFW Level Updated") + .appendLine("Level: `%s` -> `%s`".formatted( + EnumUtils.getEnumName(oldLevel), + EnumUtils.getEnumName(newLevel) + ), true); + logFeature.sendLog(guild, LogType.GUILD_CONFIGURATION, EmbedUtils.successEmbed().setDescription(description.build()).build()); + } + + @Override + public void onGuildUpdateOwner(@NonNull BatGuild guild, @NonNull BatUser oldOwner, @NonNull BatUser newOwner, @NonNull GuildUpdateOwnerEvent event) { + log.info("Guild owner was updated in guild \"{}\" from \"{}\" to \"{}\"", guild.getGuild().getName(), oldOwner.getUser().getAsTag(), newOwner.getUser().getAsTag()); + + EmbedDescriptionBuilder description = new EmbedDescriptionBuilder("Guild Owner Updated") + .appendLine("Owner: %s -> %s".formatted(oldOwner.getUser().getAsMention(), newOwner.getUser().getAsMention()), true); + logFeature.sendLog(guild, LogType.GUILD_CONFIGURATION, EmbedUtils.successEmbed().setDescription(description.build()).build()); + } + + @Override + public void onGuildUpdateRulesChannel(@NonNull BatGuild guild, TextChannel oldChannel, TextChannel newChannel, @NonNull GuildUpdateRulesChannelEvent event) { + log.info("Guild rules channel was updated in guild \"{}\" from \"{}\" to \"{}\"", guild.getGuild().getName(), oldChannel == null ? "None" : oldChannel.getName(), newChannel == null ? "None" : newChannel.getName()); + + EmbedDescriptionBuilder description = new EmbedDescriptionBuilder("Rules Channel Updated") + .appendLine("Channel: %s -> %s".formatted( + oldChannel == null ? "`None`" : oldChannel.getAsMention(), + newChannel == null ? "`None`" : newChannel.getAsMention() + ), true); + logFeature.sendLog(guild, LogType.GUILD_CONFIGURATION, EmbedUtils.successEmbed().setDescription(description.build()).build()); + } + + @Override + public void onGuildUpdateSystemChannel(@NonNull BatGuild guild, TextChannel oldChannel, TextChannel newChannel, @NonNull GuildUpdateSystemChannelEvent event) { + log.info("Guild system channel was updated in guild \"{}\" from \"{}\" to \"{}\"", guild.getGuild().getName(), oldChannel == null ? "None" : oldChannel.getName(), newChannel == null ? "None" : newChannel.getName()); + + EmbedDescriptionBuilder description = new EmbedDescriptionBuilder("System Channel Updated") + .appendLine("Channel: %s -> %s".formatted( + oldChannel == null ? "`None`" : oldChannel.getAsMention(), + newChannel == null ? "`None`" : newChannel.getAsMention() + ), true); + logFeature.sendLog(guild, LogType.GUILD_CONFIGURATION, EmbedUtils.successEmbed().setDescription(description.build()).build()); + } + + @Override + public void onGuildUpdateVanityCode(@NonNull BatGuild guild, String oldCode, String newCode, @NonNull GuildUpdateVanityCodeEvent event) { + log.info("Guild vanity code was updated in guild \"{}\" from \"{}\" to \"{}\"", guild.getGuild().getName(), oldCode, newCode); + + EmbedDescriptionBuilder description = new EmbedDescriptionBuilder("Vanity Code Updated") + .appendLine("Code: `%s` -> `%s`".formatted( + oldCode == null ? "None" : oldCode, + newCode == null ? "None" : newCode + ), true); + logFeature.sendLog(guild, LogType.GUILD_CONFIGURATION, EmbedUtils.successEmbed().setDescription(description.build()).build()); + } + + @Override + public void onGuildUpdateVerificationLevel(@NonNull BatGuild guild, Guild.VerificationLevel oldLevel, Guild.VerificationLevel newLevel, @NonNull GuildUpdateVerificationLevelEvent event) { + log.info("Guild verification level was updated in guild \"{}\" from \"{}\" to \"{}\"", guild.getGuild().getName(), oldLevel.getKey(), newLevel.getKey()); + + EmbedDescriptionBuilder description = new EmbedDescriptionBuilder("Verification Level Updated") + .appendLine("Level: `%s` -> `%s`".formatted( + EnumUtils.getEnumName(oldLevel), + EnumUtils.getEnumName(newLevel) + ), true); + logFeature.sendLog(guild, LogType.GUILD_CONFIGURATION, EmbedUtils.successEmbed().setDescription(description.build()).build()); + } + + @Override + public void onGuildUpdateSplash(@NonNull BatGuild guild, String oldSplashUrl, String newSplashUrl, @NonNull GuildUpdateSplashEvent event) { + log.info("Guild splash was updated in guild \"{}\" from \"{}\" to \"{}\"", guild.getGuild().getName(), oldSplashUrl, newSplashUrl); + + EmbedDescriptionBuilder description = new EmbedDescriptionBuilder("Guild Splash Updated") + .appendLine("Splash: [click here](%s)".formatted(newSplashUrl), true); + logFeature.sendLog(guild, LogType.GUILD_CONFIGURATION, EmbedUtils.successEmbed().setDescription(description.build()).build()); + } } diff --git a/src/main/java/cc/fascinated/bat/features/logging/listeners/RoleListener.java b/src/main/java/cc/fascinated/bat/features/logging/listeners/RoleListener.java index bea6b79..fe4e79a 100644 --- a/src/main/java/cc/fascinated/bat/features/logging/listeners/RoleListener.java +++ b/src/main/java/cc/fascinated/bat/features/logging/listeners/RoleListener.java @@ -65,7 +65,7 @@ public class RoleListener implements EventListener { description.appendLine("Denied Permissions: %s".formatted(deniedPermissions.substring(0, deniedPermissions.length() - 2)), true); } - logFeature.sendLog(guild, LogType.ROLE_PERMISSIONS_UPDATED, EmbedUtils.successEmbed() + logFeature.sendLog(guild, LogType.ROLE_CONFIGURATION, EmbedUtils.successEmbed() .setDescription(description.build()) .build()); } diff --git a/src/main/java/cc/fascinated/bat/features/logging/listeners/StickerListener.java b/src/main/java/cc/fascinated/bat/features/logging/listeners/StickerListener.java new file mode 100644 index 0000000..8184b8a --- /dev/null +++ b/src/main/java/cc/fascinated/bat/features/logging/listeners/StickerListener.java @@ -0,0 +1,64 @@ +package cc.fascinated.bat.features.logging.listeners; + +import cc.fascinated.bat.common.EmbedDescriptionBuilder; +import cc.fascinated.bat.common.EmbedUtils; +import cc.fascinated.bat.event.EventListener; +import cc.fascinated.bat.features.logging.LogFeature; +import cc.fascinated.bat.features.logging.LogType; +import cc.fascinated.bat.model.BatGuild; +import lombok.NonNull; +import lombok.extern.log4j.Log4j2; +import net.dv8tion.jda.api.entities.sticker.GuildSticker; +import net.dv8tion.jda.api.events.sticker.GuildStickerAddedEvent; +import net.dv8tion.jda.api.events.sticker.GuildStickerRemovedEvent; +import net.dv8tion.jda.api.events.sticker.update.GuildStickerUpdateNameEvent; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * @author Fascinated (fascinated7) + */ +@Component +@Log4j2(topic = "Logging - Sticker Listener") +public class StickerListener implements EventListener { + private final LogFeature logFeature; + + @Autowired + public StickerListener(@NonNull LogFeature logFeature) { + this.logFeature = logFeature; + } + + @Override + public void onGuildStickerAdd(@NonNull BatGuild guild, @NonNull GuildSticker sticker, @NonNull GuildStickerAddedEvent event) { + log.info("Sticker \"{}\" was added in guild \"{}\"", sticker.getName(), guild.getName()); + logFeature.sendLog(guild, LogType.STICKER_ADD, EmbedUtils.successEmbed() + .setDescription(new EmbedDescriptionBuilder("Sticker Added") + .appendLine("Sticker: %s".formatted(sticker.getName()), true) + .appendLine("URL: %s".formatted(sticker.getIconUrl()), true) + .build()) + .build()); + } + + @Override + public void onGuildStickerRemove(@NonNull BatGuild guild, @NonNull GuildSticker sticker, @NonNull GuildStickerRemovedEvent event) { + log.info("Sticker \"{}\" was removed in guild \"{}\"", sticker.getName(), guild.getName()); + logFeature.sendLog(guild, LogType.STICKER_REMOVE, EmbedUtils.successEmbed() + .setDescription(new EmbedDescriptionBuilder("Sticker Removed") + .appendLine("Sticker: %s".formatted(sticker.getName()), true) + .appendLine("URL: %s".formatted(sticker.getIconUrl()), true) + .build()) + .build()); + } + + @Override + public void onGuildStickerRename(@NonNull BatGuild guild, @NonNull GuildSticker sticker, @NonNull String oldName, + @NonNull String newName, @NonNull GuildStickerUpdateNameEvent event) { + log.info("Sticker \"{}\" was renamed in guild \"{}\" from \"{}\" to \"{}\"", sticker.getName(), guild.getName(), oldName, newName); + logFeature.sendLog(guild, LogType.STICKER_NAME_UPDATED, EmbedUtils.successEmbed() + .setDescription(new EmbedDescriptionBuilder("Sticker Renamed") + .appendLine("Sticker: %s".formatted(sticker.getName()), true) + .appendLine("Name: `%s` -> `%s`".formatted(oldName, newName), true) + .build()) + .build()); + } +} diff --git a/src/main/java/cc/fascinated/bat/service/EventService.java b/src/main/java/cc/fascinated/bat/service/EventService.java index aa7d67f..9514aaf 100644 --- a/src/main/java/cc/fascinated/bat/service/EventService.java +++ b/src/main/java/cc/fascinated/bat/service/EventService.java @@ -25,6 +25,7 @@ import net.dv8tion.jda.api.events.guild.member.update.GuildMemberUpdateBoostTime import net.dv8tion.jda.api.events.guild.member.update.GuildMemberUpdateNicknameEvent; import net.dv8tion.jda.api.events.guild.member.update.GuildMemberUpdateTimeOutEvent; import net.dv8tion.jda.api.events.guild.override.GenericPermissionOverrideEvent; +import net.dv8tion.jda.api.events.guild.update.*; import net.dv8tion.jda.api.events.guild.voice.GuildVoiceUpdateEvent; import net.dv8tion.jda.api.events.interaction.ModalInteractionEvent; import net.dv8tion.jda.api.events.interaction.component.ButtonInteractionEvent; @@ -37,6 +38,9 @@ import net.dv8tion.jda.api.events.role.update.RoleUpdateColorEvent; import net.dv8tion.jda.api.events.role.update.RoleUpdateIconEvent; import net.dv8tion.jda.api.events.role.update.RoleUpdateNameEvent; import net.dv8tion.jda.api.events.role.update.RoleUpdatePermissionsEvent; +import net.dv8tion.jda.api.events.sticker.GuildStickerAddedEvent; +import net.dv8tion.jda.api.events.sticker.GuildStickerRemovedEvent; +import net.dv8tion.jda.api.events.sticker.update.GuildStickerUpdateNameEvent; import net.dv8tion.jda.api.events.user.update.UserUpdateAvatarEvent; import net.dv8tion.jda.api.events.user.update.UserUpdateGlobalNameEvent; import net.dv8tion.jda.api.events.user.update.UserUpdateNameEvent; @@ -516,4 +520,216 @@ public class EventService extends ListenerAdapter { listener.onChannelUpdateSlowmode(guild, event); } } + + @Override + public void onGuildUpdateName(@NotNull GuildUpdateNameEvent event) { + BatGuild guild = guildService.getGuild(event.getGuild().getId()); + + for (EventListener listener : LISTENERS) { + listener.onGuildUpdateName(guild, event.getOldName(), event.getNewName(), event); + } + } + + @Override + public void onGuildStickerAdded(@NotNull GuildStickerAddedEvent event) { + BatGuild guild = guildService.getGuild(event.getGuild().getId()); + + for (EventListener listener : LISTENERS) { + listener.onGuildStickerAdd(guild, event.getSticker(), event); + } + } + + @Override + public void onGuildStickerRemoved(@NotNull GuildStickerRemovedEvent event) { + BatGuild guild = guildService.getGuild(event.getGuild().getId()); + + for (EventListener listener : LISTENERS) { + listener.onGuildStickerRemove(guild, event.getSticker(), event); + } + } + + @Override + public void onGuildStickerUpdateName(@NotNull GuildStickerUpdateNameEvent event) { + BatGuild guild = guildService.getGuild(event.getGuild().getId()); + + for (EventListener listener : LISTENERS) { + listener.onGuildStickerRename(guild, event.getSticker(), event.getOldValue(), event.getNewValue(), event); + } + } + + @Override + public void onGuildUpdateAfkChannel(@NotNull GuildUpdateAfkChannelEvent event) { + BatGuild guild = guildService.getGuild(event.getGuild().getId()); + + for (EventListener listener : LISTENERS) { + listener.onGuildUpdateAfkChannel(guild, event.getOldAfkChannel(), event.getNewAfkChannel(), event); + } + } + + @Override + public void onGuildUpdateAfkTimeout(@NotNull GuildUpdateAfkTimeoutEvent event) { + BatGuild guild = guildService.getGuild(event.getGuild().getId()); + + for (EventListener listener : LISTENERS) { + listener.onGuildUpdateAfkTimeout(guild, event.getOldAfkTimeout(), event.getNewAfkTimeout(), event); + } + } + + @Override + public void onGuildUpdateBanner(@NotNull GuildUpdateBannerEvent event) { + BatGuild guild = guildService.getGuild(event.getGuild().getId()); + + for (EventListener listener : LISTENERS) { + listener.onGuildUpdateBanner(guild, event.getOldBannerUrl(), event.getNewBannerUrl(), event); + } + } + + @Override + public void onGuildUpdateDescription(@NotNull GuildUpdateDescriptionEvent event) { + BatGuild guild = guildService.getGuild(event.getGuild().getId()); + + for (EventListener listener : LISTENERS) { + listener.onGuildUpdateDescription(guild, event.getOldDescription(), event.getNewDescription(), event); + } + } + + @Override + public void onGuildUpdateIcon(@NotNull GuildUpdateIconEvent event) { + BatGuild guild = guildService.getGuild(event.getGuild().getId()); + + for (EventListener listener : LISTENERS) { + listener.onGuildUpdateIcon(guild, event.getOldIconUrl(), event.getNewIconUrl(), event); + } + } + + @Override + public void onGuildUpdateLocale(@NotNull GuildUpdateLocaleEvent event) { + BatGuild guild = guildService.getGuild(event.getGuild().getId()); + + for (EventListener listener : LISTENERS) { + listener.onGuildUpdateLocale(guild, event.getOldValue(), event.getNewValue(), event); + } + } + + @Override + public void onGuildUpdateCommunityUpdatesChannel(@NotNull GuildUpdateCommunityUpdatesChannelEvent event) { + BatGuild guild = guildService.getGuild(event.getGuild().getId()); + + for (EventListener listener : LISTENERS) { + listener.onGuildUpdateCommunityUpdatesChannel(guild, event.getOldCommunityUpdatesChannel(), event.getNewCommunityUpdatesChannel(), event); + } + } + + @Override + public void onGuildUpdateBoostTier(@NotNull GuildUpdateBoostTierEvent event) { + BatGuild guild = guildService.getGuild(event.getGuild().getId()); + + for (EventListener listener : LISTENERS) { + listener.onGuildUpdateBoostTier(guild, event.getOldBoostTier(), event.getNewBoostTier(), event); + } + } + + @Override + public void onGuildUpdateMaxMembers(@NotNull GuildUpdateMaxMembersEvent event) { + BatGuild guild = guildService.getGuild(event.getGuild().getId()); + + for (EventListener listener : LISTENERS) { + listener.onGuildUpdateMaxMembers(guild, event.getOldMaxMembers(), event.getNewMaxMembers(), event); + } + } + + @Override + public void onGuildUpdateExplicitContentLevel(@NotNull GuildUpdateExplicitContentLevelEvent event) { + BatGuild guild = guildService.getGuild(event.getGuild().getId()); + + for (EventListener listener : LISTENERS) { + listener.onGuildUpdateExplicitContentLevel(guild, event.getOldLevel(), event.getNewLevel(), event); + } + } + + @Override + public void onGuildUpdateMFALevel(@NotNull GuildUpdateMFALevelEvent event) { + BatGuild guild = guildService.getGuild(event.getGuild().getId()); + + for (EventListener listener : LISTENERS) { + listener.onGuildUpdateMFALevel(guild, event.getOldMFALevel(), event.getNewMFALevel(), event); + } + } + + @Override + public void onGuildUpdateNotificationLevel(@NotNull GuildUpdateNotificationLevelEvent event) { + BatGuild guild = guildService.getGuild(event.getGuild().getId()); + + for (EventListener listener : LISTENERS) { + listener.onGuildUpdateNotificationLevel(guild, event.getOldNotificationLevel(), event.getNewNotificationLevel(), event); + } + } + + @Override + public void onGuildUpdateNSFWLevel(@NotNull GuildUpdateNSFWLevelEvent event) { + BatGuild guild = guildService.getGuild(event.getGuild().getId()); + + for (EventListener listener : LISTENERS) { + listener.onGuildUpdateNSFWLevel(guild, event.getOldNSFWLevel(), event.getNewNSFWLevel(), event); + } + } + + @Override + public void onGuildUpdateOwner(@NotNull GuildUpdateOwnerEvent event) { + BatGuild guild = guildService.getGuild(event.getGuild().getId()); + if (event.getOldOwner() == null || event.getNewOwner() == null) { + return; + } + BatUser oldOwner = userService.getUser(event.getOldOwner().getId(), event.getOldOwner().getUser()); + BatUser newOwner = userService.getUser(event.getNewOwner().getId(), event.getNewOwner().getUser()); + + for (EventListener listener : LISTENERS) { + listener.onGuildUpdateOwner(guild, oldOwner, newOwner, event); + } + } + + @Override + public void onGuildUpdateRulesChannel(@NotNull GuildUpdateRulesChannelEvent event) { + BatGuild guild = guildService.getGuild(event.getGuild().getId()); + + for (EventListener listener : LISTENERS) { + listener.onGuildUpdateRulesChannel(guild, event.getOldRulesChannel(), event.getNewRulesChannel(), event); + } + } + + @Override + public void onGuildUpdateSystemChannel(@NotNull GuildUpdateSystemChannelEvent event) { + BatGuild guild = guildService.getGuild(event.getGuild().getId()); + + for (EventListener listener : LISTENERS) { + listener.onGuildUpdateSystemChannel(guild, event.getOldSystemChannel(), event.getNewSystemChannel(), event); + } + } + + @Override + public void onGuildUpdateVanityCode(@NotNull GuildUpdateVanityCodeEvent event) { + BatGuild guild = guildService.getGuild(event.getGuild().getId()); + + for (EventListener listener : LISTENERS) { + listener.onGuildUpdateVanityCode(guild, event.getOldVanityCode(), event.getNewVanityCode(), event); + } + } + + @Override + public void onGuildUpdateVerificationLevel(@NotNull GuildUpdateVerificationLevelEvent event) { + BatGuild guild = guildService.getGuild(event.getGuild().getId()); + + for (EventListener listener : LISTENERS) { + listener.onGuildUpdateVerificationLevel(guild, event.getOldVerificationLevel(), event.getNewVerificationLevel(), event); + } + } + + @Override + public void onGuildUpdateSplash(@NotNull GuildUpdateSplashEvent event) { + BatGuild guild = guildService.getGuild(event.getGuild().getId()); + + for (EventListener listener : LISTENERS) { + listener.onGuildUpdateSplash(guild, event.getOldSplashUrl(), event.getNewSplashUrl(), event); + } + } } diff --git a/src/main/java/cc/fascinated/bat/service/TMDBService.java b/src/main/java/cc/fascinated/bat/service/TMDBService.java deleted file mode 100644 index 5c1176b..0000000 --- a/src/main/java/cc/fascinated/bat/service/TMDBService.java +++ /dev/null @@ -1,77 +0,0 @@ -package cc.fascinated.bat.service; - -import info.movito.themoviedbapi.TmdbApi; -import info.movito.themoviedbapi.model.core.Movie; -import info.movito.themoviedbapi.model.core.MovieResultsPage; -import info.movito.themoviedbapi.model.core.TvSeries; -import info.movito.themoviedbapi.model.core.TvSeriesResultsPage; -import lombok.Getter; -import lombok.SneakyThrows; -import lombok.extern.log4j.Log4j2; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Service; - -import java.util.List; - -/** - * @author Nick (okNick) - */ -@Service -@Getter -@Log4j2(topic = "TMDB Service") -public class TMDBService { - /** - * The API key. - */ - private final String apiKey; - - /** - * The TMDB API instance. - */ - private final TmdbApi tmdbApi; - - public TMDBService(@Value("${tmdb.api-key}") String apiKey) { - this.apiKey = apiKey; - - this.tmdbApi = new TmdbApi(apiKey); - } - - /** - * Lookup movies based on the provided query and options. - * - * @param query The query to search for - * @param includeAdult Whether to include adult content - * @param language The language to search in - * @param primaryReleaseYear The primary release year to filter by - * @param region The region to search in - * @param year The year to filter by - * @return The list of movies found with the provided query and options - */ - @SneakyThrows - public List lookupMovies(String query, boolean includeAdult, String language, String primaryReleaseYear, String region, String year) { - MovieResultsPage movies = tmdbApi.getSearch().searchMovie(query, includeAdult, language, primaryReleaseYear, 1, region, year); - if (movies.getTotalResults() == 0) { - return null; - } - return movies.getResults(); - } - - /** - * Lookup series based on the provided query and options. - * - * @param query The query to search for - * @param includeAdult Whether to include adult content - * @param language The language to search in - * @param firstAirDateYear The first air date year to filter by - * @param year The year to filter by - * @return The list of series found with the provided query and options - */ - @SneakyThrows - public List lookupSeries(String query, boolean includeAdult, String language, int firstAirDateYear, int year) { - TvSeriesResultsPage series = tmdbApi.getSearch().searchTv(query, firstAirDateYear, includeAdult, language, 1, year); - if (series.getTotalResults() == 0) { - return null; - } - return series.getResults(); - } -} \ No newline at end of file