added some utility methods to bot service

reworked message cache to not be jda messages, but own objects: cachedMessages, jda messages should not be kept around
added listener to listen for message links, to represent them in an embed (or embeds)
added offsetDateTime handling for gson
introduced a way on how to handle async transaction handling for suggestions and message loading (self reference with another method with transactional)
added timestamp support to embeds
This commit is contained in:
Sheldan
2020-03-24 20:36:36 +01:00
parent 8cd9068cfc
commit 7d63f6b8af
43 changed files with 696 additions and 136 deletions

View File

@@ -1,7 +1,8 @@
package dev.sheldan.abstracto.core;
import dev.sheldan.abstracto.core.models.CachedMessage;
import net.dv8tion.jda.api.entities.Message;
public interface MessageTextUpdatedListener {
void execute(Message messageBefore, Message messageAfter);
void execute(CachedMessage messageBefore, Message messageAfter);
}

View File

@@ -0,0 +1,28 @@
package dev.sheldan.abstracto.core.models;
import dev.sheldan.abstracto.core.models.embed.CachedEmbed;
import dev.sheldan.abstracto.core.utils.MessageUtils;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import java.time.OffsetDateTime;
import java.util.List;
@Getter
@Setter
@Builder
public class CachedMessage {
private Long serverId;
private Long channelId;
private Long messageId;
private Long authorId;
private OffsetDateTime timeCreated;
private String content;
private List<CachedEmbed> embeds;
private List<String> attachmentUrls;
public String getMessageUrl() {
return MessageUtils.buildMessageUrl(this.serverId ,this.channelId, this.messageId);
}
}

View File

@@ -0,0 +1,17 @@
package dev.sheldan.abstracto.core.models;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.TextChannel;
@Getter
@Setter
@Builder
public class ServerChannelUser {
public Guild guild;
private TextChannel textChannel;
private Member member;
}

View File

@@ -0,0 +1,23 @@
package dev.sheldan.abstracto.core.models.embed;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import java.time.OffsetDateTime;
import java.util.List;
@Getter
@Setter
@Builder
public class CachedEmbed {
private EmbedAuthor author;
private EmbedTitle title;
private EmbedColor color;
private String description;
private String thumbnail;
private String imageUrl;
private List<EmbedField> fields;
private EmbedFooter footer;
private OffsetDateTime timeStamp;
}

View File

@@ -0,0 +1,15 @@
package dev.sheldan.abstracto.core.models.embed;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@Builder
public class EmbedAuthor {
private String name;
private String url;
private String avatar;
}

View File

@@ -0,0 +1,14 @@
package dev.sheldan.abstracto.core.models.embed;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
@Setter
@Getter
@Builder
public class EmbedColor {
private Integer r;
private Integer g;
private Integer b;
}

View File

@@ -0,0 +1,20 @@
package dev.sheldan.abstracto.core.models.embed;
import lombok.Getter;
import lombok.Setter;
import java.time.OffsetDateTime;
import java.util.List;
@Getter @Setter
public class EmbedConfiguration {
private EmbedAuthor author;
private EmbedTitle title;
private EmbedColor color;
private String description;
private String thumbnail;
private String imageUrl;
private List<EmbedField> fields;
private EmbedFooter footer;
private OffsetDateTime timeStamp;
}

View File

@@ -0,0 +1,14 @@
package dev.sheldan.abstracto.core.models.embed;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@Builder
public class EmbedField {
private String name;
private String value;
private Boolean inline;
}

View File

@@ -0,0 +1,13 @@
package dev.sheldan.abstracto.core.models.embed;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@Builder
public class EmbedFooter {
private String text;
private String icon;
}

View File

@@ -0,0 +1,10 @@
package dev.sheldan.abstracto.core.models.embed;
import lombok.Getter;
import lombok.Setter;
@Getter @Setter
public class EmbedTitle {
private String title;
private String url;
}

View File

@@ -0,0 +1,19 @@
package dev.sheldan.abstracto.core.models.listener;
import dev.sheldan.abstracto.core.models.CachedMessage;
import dev.sheldan.abstracto.core.models.UserInitiatedServerContext;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.SuperBuilder;
import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.TextChannel;
@Getter
@Setter
@SuperBuilder
public class MessageEmbeddedModel extends UserInitiatedServerContext {
private CachedMessage embeddedMessage;
private TextChannel sourceChannel;
private Member author;
private Member embeddingUser;
}

View File

@@ -1,6 +1,10 @@
package dev.sheldan.abstracto.core.service;
import dev.sheldan.abstracto.core.models.ServerChannelUser;
import net.dv8tion.jda.api.JDA;
import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.TextChannel;
import org.springframework.stereotype.Service;
import javax.security.auth.login.LoginException;
@@ -9,5 +13,9 @@ import javax.security.auth.login.LoginException;
public interface Bot {
void login() throws LoginException;
JDA getInstance();
ServerChannelUser getServerChannelUser(Long serverId, Long channelId, Long userId);
Member getMemberInServer(Long serverId, Long memberId);
TextChannel getTextChannelFromServer(Long serverId, Long textChannelId);
Guild getGuildById(Long serverId);
void shutdown();
}

View File

@@ -1,9 +1,14 @@
package dev.sheldan.abstracto.core.service;
import dev.sheldan.abstracto.core.models.CachedMessage;
import net.dv8tion.jda.api.entities.Message;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
public interface MessageCache {
Message putMessageInCache(Message message);
Message getMessageFromCache(Message message);
Message getMessageFromCache(Long messageId, Long textChannelId, Long guildId);
CachedMessage putMessageInCache(Message message);
CachedMessage getMessageFromCache(Message message) throws ExecutionException, InterruptedException;
CachedMessage getMessageFromCache(Long guildId, Long textChannelId, Long messageId) throws ExecutionException, InterruptedException;
CompletableFuture<Message> getMessage(Long serverId, Long textChannelId, Long messageId);
}

View File

@@ -3,10 +3,12 @@ package dev.sheldan.abstracto.core.utils;
import dev.sheldan.abstracto.core.management.ChannelManagementService;
import dev.sheldan.abstracto.core.management.ServerManagementService;
import dev.sheldan.abstracto.core.management.UserManagementService;
import dev.sheldan.abstracto.core.models.CachedMessage;
import dev.sheldan.abstracto.core.models.ServerChannelUser;
import dev.sheldan.abstracto.core.models.UserInitiatedServerContext;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import dev.sheldan.abstracto.core.service.Bot;
import lombok.extern.slf4j.Slf4j;
import net.dv8tion.jda.api.entities.Message;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -26,18 +28,22 @@ public class ContextUtils {
@Autowired
private ServerManagementService serverManagementService;
public <T extends UserInitiatedServerContext> UserInitiatedServerContext fromMessage(Message message, Class<T> clazz) {
@Autowired
private Bot bot;
public <T extends UserInitiatedServerContext> UserInitiatedServerContext fromMessage(CachedMessage message, Class<T> clazz) {
Method m = null;
ServerChannelUser serverChannelUser = bot.getServerChannelUser(message.getServerId(), message.getChannelId(), message.getAuthorId());
try {
m = clazz.getMethod("builder");
UserInitiatedServerContext.UserInitiatedServerContextBuilder<?, ?> builder = (UserInitiatedServerContext.UserInitiatedServerContextBuilder) m.invoke(null, null);
AUserInAServer aUserInAServer = userManagementService.loadUser(message.getMember());
AUserInAServer aUserInAServer = userManagementService.loadUser(message.getServerId(), message.getAuthorId());
return builder
.member(message.getMember())
.guild(message.getGuild())
.textChannel(message.getTextChannel())
.channel(channelManagementService.loadChannel(message.getTextChannel().getIdLong()))
.server(serverManagementService.loadServer(message.getGuild().getIdLong()))
.member(serverChannelUser.getMember())
.guild(serverChannelUser.getGuild())
.textChannel(serverChannelUser.getTextChannel())
.channel(channelManagementService.loadChannel(message.getChannelId()))
.server(serverManagementService.loadServer(message.getServerId()))
.aUserInAServer(aUserInAServer)
.user(aUserInAServer.getUserReference())
.build();