|
| 1 | +package org.togetherjava.tjbot.features.cakeday; |
| 2 | + |
| 3 | +import net.dv8tion.jda.api.entities.Guild; |
| 4 | +import net.dv8tion.jda.api.entities.Member; |
| 5 | +import net.dv8tion.jda.api.entities.User; |
| 6 | +import net.dv8tion.jda.api.events.guild.member.GuildMemberRemoveEvent; |
| 7 | +import net.dv8tion.jda.api.events.message.MessageReceivedEvent; |
| 8 | +import net.dv8tion.jda.api.hooks.ListenerAdapter; |
| 9 | +import org.jetbrains.annotations.NotNull; |
| 10 | + |
| 11 | +import org.togetherjava.tjbot.db.generated.tables.records.CakeDaysRecord; |
| 12 | +import org.togetherjava.tjbot.features.EventReceiver; |
| 13 | + |
| 14 | +import java.util.Optional; |
| 15 | + |
| 16 | +/** |
| 17 | + * A listener class responsible for handling cake day related events. |
| 18 | + */ |
| 19 | +public class CakeDayListener extends ListenerAdapter implements EventReceiver { |
| 20 | + |
| 21 | + private final CakeDayService cakeDayService; |
| 22 | + |
| 23 | + /** |
| 24 | + * Constructs a new CakeDayListener with the given {@link CakeDayService}. |
| 25 | + * |
| 26 | + * @param cakeDayService the {@link CakeDayService} to be used by this listener |
| 27 | + */ |
| 28 | + public CakeDayListener(CakeDayService cakeDayService) { |
| 29 | + this.cakeDayService = cakeDayService; |
| 30 | + } |
| 31 | + |
| 32 | + /** |
| 33 | + * Handles the event of a message being received in a guild. |
| 34 | + * <p> |
| 35 | + * It caches the user's cake day and inserts the member's cake day into the database if not |
| 36 | + * already present. |
| 37 | + * |
| 38 | + * @param event the {@link MessageReceivedEvent} representing the message received |
| 39 | + */ |
| 40 | + @Override |
| 41 | + public void onMessageReceived(@NotNull MessageReceivedEvent event) { |
| 42 | + User author = event.getAuthor(); |
| 43 | + Member member = event.getMember(); |
| 44 | + long authorId = author.getIdLong(); |
| 45 | + long guildId = event.getGuild().getIdLong(); |
| 46 | + |
| 47 | + if (member == null || author.isBot() || author.isSystem()) { |
| 48 | + return; |
| 49 | + } |
| 50 | + |
| 51 | + |
| 52 | + if (cakeDayService.hasMemberCakeDayToday(member)) { |
| 53 | + cakeDayService.addCakeDayRole(member); |
| 54 | + return; |
| 55 | + } |
| 56 | + |
| 57 | + if (cakeDayService.isUserCached(author)) { |
| 58 | + return; |
| 59 | + } |
| 60 | + |
| 61 | + cakeDayService.addToCache(author); |
| 62 | + Optional<CakeDaysRecord> cakeDaysRecord = |
| 63 | + cakeDayService.findUserCakeDayFromDatabase(authorId); |
| 64 | + if (cakeDaysRecord.isPresent()) { |
| 65 | + return; |
| 66 | + } |
| 67 | + |
| 68 | + cakeDayService.insertMemberCakeDayToDatabase(member, guildId); |
| 69 | + } |
| 70 | + |
| 71 | + /** |
| 72 | + * Handles the event of a guild member being removed from the guild. It removes the user's cake |
| 73 | + * day information from the database if present. |
| 74 | + * |
| 75 | + * @param event the {@link GuildMemberRemoveEvent} representing the member removal event |
| 76 | + */ |
| 77 | + @Override |
| 78 | + public void onGuildMemberRemove(GuildMemberRemoveEvent event) { |
| 79 | + User user = event.getUser(); |
| 80 | + Guild guild = event.getGuild(); |
| 81 | + |
| 82 | + cakeDayService.handleUserLeft(user, guild); |
| 83 | + } |
| 84 | +} |
0 commit comments