mirror of
https://github.com/Sheldan/abstracto.git
synced 2026-03-24 13:44:33 +00:00
added starboard functionality (starboard/starstats)
added module to store/retrieve configuration (double and string values) replaced a few null values with optionals (emote loading) fixed creating channels on startup added delete message/get emote utility to bot service extended emote service to have utility methods to use emotes added reactions to message cache added empty message handling to post target service, in case the template evaluates to empty added ability to edit a message in a post target (standard message and embed) added principle of config listeners, so default config can be created, for example starboard thresholds added abstract reaction listeners for adding/removing/clearing fixed foreign keys between channel and server added emote utils to handle AEmote and Emotes renamed emotes to be camelCase, so they are easier to type
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
package dev.sheldan.abstracto.core;
|
||||
package dev.sheldan.abstracto.core.listener;
|
||||
|
||||
import dev.sheldan.abstracto.core.models.CachedMessage;
|
||||
import net.dv8tion.jda.api.entities.Message;
|
||||
@@ -0,0 +1,9 @@
|
||||
package dev.sheldan.abstracto.core.listener;
|
||||
|
||||
import dev.sheldan.abstracto.core.models.CachedMessage;
|
||||
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
|
||||
import net.dv8tion.jda.api.entities.MessageReaction;
|
||||
|
||||
public interface ReactedAddedListener {
|
||||
void executeReactionAdded(CachedMessage message, MessageReaction reaction, AUserInAServer userAdding);
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
package dev.sheldan.abstracto.core.listener;
|
||||
|
||||
import dev.sheldan.abstracto.core.models.CachedMessage;
|
||||
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
|
||||
import net.dv8tion.jda.api.entities.MessageReaction;
|
||||
|
||||
public interface ReactedRemovedListener {
|
||||
void executeReactionRemoved(CachedMessage message, MessageReaction reaction, AUserInAServer userRemoving);
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
package dev.sheldan.abstracto.core.listener;
|
||||
|
||||
import dev.sheldan.abstracto.core.models.database.AServer;
|
||||
|
||||
public interface ServerConfigListener {
|
||||
void updateServerConfig(AServer server);
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
package dev.sheldan.abstracto.core.management;
|
||||
|
||||
import dev.sheldan.abstracto.core.models.database.AConfig;
|
||||
|
||||
public interface ConfigManagementService {
|
||||
void setOrCreateStringValue(Long serverId, String name, String value);
|
||||
void setOrCreateDoubleValue(Long serverId, String name, Double value);
|
||||
AConfig createConfig(Long serverId, String name, String value);
|
||||
AConfig createConfig(Long serverId, String name, Double value);
|
||||
AConfig createIfNotExists(Long serverId, String name, String value);
|
||||
AConfig createIfNotExists(Long serverId, String name, Double value);
|
||||
AConfig loadConfig(Long serverId, String name);
|
||||
}
|
||||
@@ -4,14 +4,16 @@ import dev.sheldan.abstracto.core.models.database.AEmote;
|
||||
import dev.sheldan.abstracto.core.models.database.AServer;
|
||||
import net.dv8tion.jda.api.entities.Emote;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
public interface EmoteManagementService {
|
||||
AEmote loadEmote(Long id);
|
||||
AEmote createCustomEmote(String name, String emoteKey, Long emoteId, Boolean animated, Long serverId);
|
||||
AEmote createCustomEmote(String name, String emoteKey, Long emoteId, Boolean animated, AServer server);
|
||||
AEmote createDefaultEmote(String name, String emoteKey, Long serverId);
|
||||
AEmote createDefaultEmote(String name, String emoteKey, AServer server);
|
||||
AEmote loadEmoteByName(String name, Long serverId);
|
||||
AEmote loadEmoteByName(String name, AServer server);
|
||||
Optional<AEmote> loadEmoteByName(String name, Long serverId);
|
||||
Optional<AEmote> loadEmoteByName(String name, AServer server);
|
||||
AEmote setEmoteToCustomEmote(String name, String emoteKey, Long emoteId, Boolean animated, Long serverId);
|
||||
AEmote setEmoteToCustomEmote(String name, Emote emote, Long serverId);
|
||||
AEmote setEmoteToDefaultEmote(String name, String emoteKey, Long serverId);
|
||||
|
||||
@@ -2,6 +2,8 @@ package dev.sheldan.abstracto.core.management;
|
||||
|
||||
import dev.sheldan.abstracto.core.models.database.*;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface ServerManagementService {
|
||||
AServer createServer(Long id);
|
||||
AServer loadServer(Long id);
|
||||
@@ -12,4 +14,5 @@ public interface ServerManagementService {
|
||||
AChannel getPostTarget(Long serverId, PostTarget target);
|
||||
AChannel getPostTarget(AServer server, PostTarget target);
|
||||
AChannel getPostTarget(AServer server, String name);
|
||||
List<AServer> getAllServers();
|
||||
}
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
package dev.sheldan.abstracto.core.models;
|
||||
|
||||
import dev.sheldan.abstracto.core.models.database.AChannel;
|
||||
import dev.sheldan.abstracto.core.models.database.AServer;
|
||||
import lombok.Builder;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
@Builder
|
||||
public class AServerChannelMessage {
|
||||
private AServer server;
|
||||
private AChannel channel;
|
||||
private Long messageId;
|
||||
}
|
||||
@@ -6,6 +6,7 @@ import lombok.Builder;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
import java.time.Instant;
|
||||
import java.time.OffsetDateTime;
|
||||
import java.util.List;
|
||||
|
||||
@@ -21,6 +22,7 @@ public class CachedMessage {
|
||||
private String content;
|
||||
private List<CachedEmbed> embeds;
|
||||
private List<String> attachmentUrls;
|
||||
private List<CachedReaction> reactions;
|
||||
|
||||
public String getMessageUrl() {
|
||||
return MessageUtils.buildMessageUrl(this.serverId ,this.channelId, this.messageId);
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
package dev.sheldan.abstracto.core.models;
|
||||
|
||||
import dev.sheldan.abstracto.core.models.database.AEmote;
|
||||
import dev.sheldan.abstracto.core.models.database.AUser;
|
||||
import lombok.Builder;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
@Builder
|
||||
public class CachedReaction {
|
||||
private AEmote emote;
|
||||
private List<AUser> users;
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
package dev.sheldan.abstracto.core.models;
|
||||
|
||||
import lombok.Builder;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
@Builder
|
||||
public class ServerChannelMessage {
|
||||
private Long serverId;
|
||||
private Long channelId;
|
||||
private Long messageId;
|
||||
}
|
||||
@@ -17,6 +17,7 @@ public class AChannel implements SnowFlake {
|
||||
|
||||
@Id
|
||||
@Getter
|
||||
@Column(name = "id")
|
||||
public Long id;
|
||||
|
||||
@Getter
|
||||
@@ -24,7 +25,9 @@ public class AChannel implements SnowFlake {
|
||||
private Set<AChannelGroup> groups;
|
||||
|
||||
@ManyToOne(fetch = FetchType.LAZY)
|
||||
@Getter @Setter
|
||||
@Getter
|
||||
@Setter
|
||||
@JoinColumn(name = "server_id")
|
||||
private AServer server;
|
||||
|
||||
@Getter
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
package dev.sheldan.abstracto.core.models.database;
|
||||
|
||||
import lombok.*;
|
||||
|
||||
import javax.persistence.*;
|
||||
|
||||
@Entity
|
||||
@Table(name="systemConfig")
|
||||
@Builder
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
@Getter
|
||||
public class AConfig {
|
||||
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||
private Integer Id;
|
||||
|
||||
@Column
|
||||
private String name;
|
||||
|
||||
@Column
|
||||
@Setter
|
||||
private String stringValue;
|
||||
|
||||
@Column
|
||||
@Setter
|
||||
private Double doubleValue;
|
||||
|
||||
@OneToOne(fetch = FetchType.LAZY)
|
||||
@JoinColumn(name = "server_id", nullable = false)
|
||||
@Getter
|
||||
@Setter
|
||||
private AServer server;
|
||||
}
|
||||
@@ -16,6 +16,7 @@ import java.util.List;
|
||||
public class AServer implements SnowFlake {
|
||||
|
||||
@Id
|
||||
@Column(name = "id")
|
||||
private Long id;
|
||||
|
||||
private String name;
|
||||
@@ -26,10 +27,10 @@ public class AServer implements SnowFlake {
|
||||
|
||||
@OneToMany(
|
||||
fetch = FetchType.LAZY,
|
||||
mappedBy = "server",
|
||||
cascade = CascadeType.ALL,
|
||||
orphanRemoval = true)
|
||||
@Builder.Default
|
||||
@JoinColumn(name = "server_id")
|
||||
private List<AChannel> channels = new ArrayList<>();
|
||||
|
||||
@OneToMany(
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
package dev.sheldan.abstracto.core.service;
|
||||
|
||||
import dev.sheldan.abstracto.core.models.ServerChannelUser;
|
||||
import dev.sheldan.abstracto.core.models.database.AEmote;
|
||||
import net.dv8tion.jda.api.JDA;
|
||||
import net.dv8tion.jda.api.entities.Emote;
|
||||
import net.dv8tion.jda.api.entities.Guild;
|
||||
import net.dv8tion.jda.api.entities.Member;
|
||||
import net.dv8tion.jda.api.entities.TextChannel;
|
||||
@@ -15,6 +17,8 @@ public interface Bot {
|
||||
JDA getInstance();
|
||||
ServerChannelUser getServerChannelUser(Long serverId, Long channelId, Long userId);
|
||||
Member getMemberInServer(Long serverId, Long memberId);
|
||||
void deleteMessage(Long serverId, Long channelId, Long messageId);
|
||||
Emote getEmote(Long serverId, AEmote emote);
|
||||
TextChannel getTextChannelFromServer(Long serverId, Long textChannelId);
|
||||
Guild getGuildById(Long serverId);
|
||||
void shutdown();
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
package dev.sheldan.abstracto.core.service;
|
||||
|
||||
public interface ConfigService {
|
||||
Double getDoubleValue(String name, Long serverId);
|
||||
Double getDoubleValue(String name, Long serverId, Double defaultValue);
|
||||
|
||||
}
|
||||
@@ -1,7 +1,12 @@
|
||||
package dev.sheldan.abstracto.core.service;
|
||||
|
||||
import dev.sheldan.abstracto.core.models.database.AEmote;
|
||||
import net.dv8tion.jda.api.entities.Emote;
|
||||
import net.dv8tion.jda.api.entities.MessageReaction;
|
||||
|
||||
public interface EmoteService {
|
||||
boolean isEmoteUsableByBot(Emote emote);
|
||||
AEmote buildAEmoteFromReaction(MessageReaction.ReactionEmote reaction);
|
||||
String getEmoteAsMention(AEmote emote, Long serverId, String defaultText);
|
||||
String getEmoteAsMention(AEmote emote, Long serverId);
|
||||
}
|
||||
|
||||
@@ -1,14 +1,19 @@
|
||||
package dev.sheldan.abstracto.core.service;
|
||||
|
||||
import dev.sheldan.abstracto.core.models.CachedMessage;
|
||||
import dev.sheldan.abstracto.core.models.CachedReaction;
|
||||
import net.dv8tion.jda.api.entities.Message;
|
||||
import net.dv8tion.jda.api.entities.MessageReaction;
|
||||
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
|
||||
public interface MessageCache {
|
||||
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);
|
||||
CompletableFuture<CachedMessage> putMessageInCache(Message message);
|
||||
CompletableFuture<CachedMessage> getMessageFromCache(Long guildId, Long textChannelId, Long messageId);
|
||||
CompletableFuture<CachedMessage> getMessageFromCache(Message message);
|
||||
CompletableFuture<CachedMessage> putMessageInCache(CachedMessage message);
|
||||
void loadMessage(CompletableFuture<CachedMessage> future, Long guildId, Long textChannelId, Long messageId);
|
||||
void getCachedReactionFromReaction(CompletableFuture<CachedReaction> future, MessageReaction reaction);
|
||||
void buildCachedMessageFromMessage(CompletableFuture<CachedMessage> future, Message message);
|
||||
}
|
||||
|
||||
@@ -15,6 +15,10 @@ public interface PostTargetService {
|
||||
CompletableFuture<Message> sendEmbedInPostTarget(MessageEmbed embed, String postTargetName, Long serverId);
|
||||
CompletableFuture<Message> sendEmbedInPostTarget(MessageToSend message, String postTargetName, Long serverId);
|
||||
CompletableFuture<Message> sendEmbedInPostTarget(MessageToSend message, PostTarget target);
|
||||
CompletableFuture<Message> editEmbedInPostTarget(Long messageId, MessageToSend message, PostTarget target);
|
||||
CompletableFuture<Message> editEmbedInPostTarget(Long messageId, MessageToSend message, String postTargetName, Long serverId);
|
||||
void editOrCreatedInPostTarget(Long messageId, MessageToSend messageToSend, PostTarget target, CompletableFuture<Message> future);
|
||||
void editOrCreatedInPostTarget(Long messageId, MessageToSend messageToSend, String postTarget, Long serverId, CompletableFuture<Message> future);
|
||||
boolean validPostTarget(String name);
|
||||
List<String> getAvailablePostTargets();
|
||||
}
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
package dev.sheldan.abstracto.core.utils;
|
||||
|
||||
import dev.sheldan.abstracto.core.models.CachedMessage;
|
||||
import dev.sheldan.abstracto.core.models.CachedReaction;
|
||||
import dev.sheldan.abstracto.core.models.database.AEmote;
|
||||
import net.dv8tion.jda.api.entities.Emote;
|
||||
import net.dv8tion.jda.api.entities.MessageReaction;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
public class EmoteUtils {
|
||||
|
||||
public static boolean isReactionEmoteAEmote(MessageReaction.ReactionEmote reaction, AEmote emote, Optional<Emote> emoteInGuildOptional) {
|
||||
if(reaction.isEmote() && emote.getCustom()) {
|
||||
if(emoteInGuildOptional.isPresent()) {
|
||||
Emote emoteInGuild = emoteInGuildOptional.get();
|
||||
return emoteInGuild.equals(reaction.getEmote());
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
return reaction.getEmoji().equals(emote.getEmoteKey());
|
||||
}
|
||||
}
|
||||
|
||||
public static Optional<CachedReaction> getReactionFromMessageByEmote(CachedMessage message, AEmote emote) {
|
||||
return message.getReactions().stream().filter(reaction -> compareAEmote(reaction.getEmote(), emote)).findFirst();
|
||||
}
|
||||
|
||||
public static boolean compareAEmote(AEmote a, AEmote b) {
|
||||
if(a.getCustom() && b.getCustom()) {
|
||||
return a.getEmoteId().equals(b.getEmoteId());
|
||||
} else {
|
||||
if(!a.getCustom() && !b.getCustom()) {
|
||||
return a.getEmoteKey().equals(b.getEmoteKey());
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user