added utility module

added ability to create/accept/reject suggestions them
made commands async, because a lot of operations behave like that
in case the database is needed in an async operation, this needs to be in a separate transactional service
fixed ordering of Long parameters (server > channel > message)
added initial emote handling (no adding of emotes yet)
fixed creation of AUserInAServer, in case the user did not exist yet, when loading
changed PostTargetService to return Futures instead of being a void, in order to be able to act on the message posted
set logging level to debug
fixed help for different commands (templates had wrong naming)
This commit is contained in:
Sheldan
2020-03-21 14:31:59 +01:00
parent d3a9a7a9f0
commit df0c156743
57 changed files with 890 additions and 61 deletions

View File

@@ -19,7 +19,7 @@ import java.util.List;
@Service
@Slf4j
public class SetPostTargetCommand implements Command {
public class PostTargetCommand implements Command {
@Autowired
private PostTargetManagement postTargetManagement;
@@ -32,7 +32,7 @@ public class SetPostTargetCommand implements Command {
GuildChannel channel = (GuildChannel) commandContext.getParameters().getParameters().get(1);
String targetName = (String) commandContext.getParameters().getParameters().get(0);
Guild guild = channel.getGuild();
postTargetManagement.createOrUpdate(targetName, channel.getIdLong(), guild.getIdLong());
postTargetManagement.createOrUpdate(targetName, guild.getIdLong(), channel.getIdLong());
log.info("Setting posttarget {} in {} to {}", targetName, guild.getIdLong(), channel.getId());
return Result.fromSuccess();
}

View File

@@ -0,0 +1,41 @@
package dev.sheldan.abstracto.core.service;
import dev.sheldan.abstracto.core.management.EmoteManagementService;
import dev.sheldan.abstracto.core.models.database.AEmote;
import lombok.extern.slf4j.Slf4j;
import net.dv8tion.jda.api.entities.Emote;
import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.entities.Message;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
@Slf4j
public class MessageServiceBean implements MessageService {
@Autowired
private Bot bot;
@Autowired
private EmoteManagementService emoteManagementService;
@Override
public void addReactionToMessage(String emoteKey, Long serverId, Message message) {
Guild guildById = bot.getInstance().getGuildById(serverId);
if(guildById != null) {
AEmote emote = emoteManagementService.loadEmoteByName(emoteKey, serverId);
if(emote.getCustom()) {
Emote emoteById = guildById.getEmoteById(emote.getEmoteId());
if(emoteById != null) {
message.addReaction(emoteById).queue();
} else {
log.warn("Emote with key {} and id {} for guild {} was not found.", emoteKey, emote.getEmoteId(), guildById.getId());
}
} else {
message.addReaction(emote.getEmoteKey()).queue();
}
} else {
log.warn("Guild {} was not found when trying to react to a message.", serverId);
}
}
}

View File

@@ -6,11 +6,14 @@ import dev.sheldan.abstracto.core.management.ServerManagementService;
import dev.sheldan.abstracto.core.models.database.PostTarget;
import lombok.extern.slf4j.Slf4j;
import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.MessageEmbed;
import net.dv8tion.jda.api.entities.TextChannel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.concurrent.CompletableFuture;
@Slf4j
@Component
@@ -26,15 +29,15 @@ public class PostTargetServiceBean implements PostTargetService {
private Bot botService;
@Override
public void sendTextInPostTarget(String text, PostTarget target) {
public CompletableFuture<Message> sendTextInPostTarget(String text, PostTarget target) {
TextChannel textChannelForPostTarget = getTextChannelForPostTarget(target);
textChannelForPostTarget.sendMessage(text).queue();
return textChannelForPostTarget.sendMessage(text).submit();
}
@Override
public void sendEmbedInPostTarget(MessageEmbed embed, PostTarget target) {
public CompletableFuture<Message> sendEmbedInPostTarget(MessageEmbed embed, PostTarget target) {
TextChannel textChannelForPostTarget = getTextChannelForPostTarget(target);
textChannelForPostTarget.sendMessage(embed).queue();
return textChannelForPostTarget.sendMessage(embed).submit();
}
private TextChannel getTextChannelForPostTarget(PostTarget target) {
@@ -64,14 +67,14 @@ public class PostTargetServiceBean implements PostTargetService {
}
@Override
public void sendTextInPostTarget(String text, String postTargetName, Long serverId) {
public CompletableFuture<Message> sendTextInPostTarget(String text, String postTargetName, Long serverId) {
PostTarget postTarget = this.getPostTarget(postTargetName, serverId);
this.sendTextInPostTarget(text, postTarget);
return this.sendTextInPostTarget(text, postTarget);
}
@Override
public void sendEmbedInPostTarget(MessageEmbed embed, String postTargetName, Long serverId) {
public CompletableFuture<Message> sendEmbedInPostTarget(MessageEmbed embed, String postTargetName, Long serverId) {
PostTarget postTarget = this.getPostTarget(postTargetName, serverId);
this.sendEmbedInPostTarget(embed, postTarget);
return this.sendEmbedInPostTarget(embed, postTarget);
}
}

View File

@@ -0,0 +1,54 @@
package dev.sheldan.abstracto.core.service.management;
import dev.sheldan.abstracto.core.management.EmoteManagementService;
import dev.sheldan.abstracto.core.management.ServerManagementService;
import dev.sheldan.abstracto.core.models.database.AEmote;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.repository.EmoteRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class EmoteManagementServiceBean implements EmoteManagementService {
@Autowired
private EmoteRepository repository;
@Autowired
private ServerManagementService serverManagementService;
@Override
public AEmote loadEmote(Long id) {
return repository.getOne(id);
}
@Override
public AEmote loadEmoteByName(String name, Long serverId) {
AServer server = serverManagementService.loadServer(serverId);
return repository.findAEmoteByNameAndServerRef(name, server);
}
@Override
public AEmote createCustomEmote(String name, String emoteKey, Long emoteId, Boolean animated) {
AEmote emote = AEmote.builder()
.animated(animated)
.custom(true)
.emoteKey(emoteKey)
.emoteId(emoteId)
.name(name)
.build();
repository.save(emote);
return emote;
}
@Override
public AEmote createDefaultEmote(String name, String emoteKey) {
AEmote emote = AEmote.builder()
.custom(false)
.emoteKey(emoteKey)
.name(name)
.build();
repository.save(emote);
return emote;
}
}

View File

@@ -26,7 +26,7 @@ public class PostTargetManagementBean implements PostTargetManagement {
private ServerManagementService serverManagementService;
@Override
public void createPostTarget(String name, AChannel targetChannel, AServer server) {
public void createPostTarget(String name, AServer server, AChannel targetChannel) {
if(!PostTarget.AVAILABLE_POST_TARGETS.contains(name)) {
throw new PostTargetException("PostTarget not found");
}
@@ -35,26 +35,26 @@ public class PostTargetManagementBean implements PostTargetManagement {
}
@Override
public void createOrUpdate(String name, AChannel targetChannel, AServer server) {
public void createOrUpdate(String name, AServer server, AChannel targetChannel) {
PostTarget existing = postTargetRepository.findPostTargetByName(name);
if(existing == null){
this.createPostTarget(name, targetChannel, server);
this.createPostTarget(name, server, targetChannel);
} else {
this.updatePostTarget(existing, targetChannel, server);
this.updatePostTarget(existing, server, targetChannel);
}
}
@Override
public void createOrUpdate(String name, Long channelId, AServer server) {
public void createOrUpdate(String name, AServer server, Long channelId) {
AChannel dbChannel = channelManagementService.loadChannel(channelId);
createOrUpdate(name, dbChannel, server);
createOrUpdate(name, server, dbChannel);
}
@Override
public void createOrUpdate(String name, Long channelId, Long serverId) {
public void createOrUpdate(String name, Long serverId, Long channelId) {
AChannel dbChannel = channelManagementService.loadChannel(channelId);
AServer dbServer = serverManagementService.loadServer(serverId);
createOrUpdate(name, dbChannel, dbServer);
createOrUpdate(name, dbServer, dbChannel);
}
@Override
@@ -70,7 +70,7 @@ public class PostTargetManagementBean implements PostTargetManagement {
}
@Override
public void updatePostTarget(PostTarget target, AChannel newTargetChannel, AServer server) {
public void updatePostTarget(PostTarget target, AServer server, AChannel newTargetChannel) {
postTargetRepository.getOne(target.getId()).setChannelReference(newTargetChannel);
}

View File

@@ -3,12 +3,15 @@ package dev.sheldan.abstracto.core.service.management;
import dev.sheldan.abstracto.core.management.ChannelManagementService;
import dev.sheldan.abstracto.core.management.PostTargetManagement;
import dev.sheldan.abstracto.core.management.ServerManagementService;
import dev.sheldan.abstracto.core.management.UserManagementService;
import dev.sheldan.abstracto.core.models.database.*;
import dev.sheldan.abstracto.repository.ServerRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
@Slf4j
public class ServerManagementServiceBean implements ServerManagementService {
@Autowired
@@ -20,6 +23,9 @@ public class ServerManagementServiceBean implements ServerManagementService {
@Autowired
private ChannelManagementService channelManagementService;
@Autowired
private UserManagementService userManagementService;
@Override
public AServer createServer(Long id) {
return repository.save(AServer.builder().id(id).build());
@@ -27,7 +33,11 @@ public class ServerManagementServiceBean implements ServerManagementService {
@Override
public AServer loadServer(Long id) {
return repository.getOne(id);
if(repository.existsById(id)) {
return repository.getOne(id);
} else {
return createServer(id);
}
}
@Override
@@ -37,6 +47,14 @@ public class ServerManagementServiceBean implements ServerManagementService {
@Override
public AUserInAServer addUserToServer(AServer server, AUser user) {
return this.addUserToServer(server.getId(), user.getId());
}
@Override
public AUserInAServer addUserToServer(Long serverId, Long userId) {
log.info("Adding user {} to server {}", userId, serverId);
AServer server = repository.getOne(serverId);
AUser user = userManagementService.loadUser(userId);
AUserInAServer aUserInAServer = AUserInAServer.builder().serverReference(server).userReference(user).build();
server.getUsers().add(aUserInAServer);
return aUserInAServer;

View File

@@ -7,11 +7,13 @@ import dev.sheldan.abstracto.core.models.database.AUser;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import dev.sheldan.abstracto.repository.UserInServerRepository;
import dev.sheldan.abstracto.repository.UserRepository;
import lombok.extern.slf4j.Slf4j;
import net.dv8tion.jda.api.entities.Member;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
@Slf4j
public class UserManagementServiceBean implements UserManagementService {
@Autowired
@@ -25,41 +27,55 @@ public class UserManagementServiceBean implements UserManagementService {
@Override
public AUserInAServer loadUser(Long userId, Long serverId) {
AUser user = userRepository.getOne(userId);
public AUserInAServer loadUser(Long serverId, Long userId) {
AUser user = this.loadUser(userId);
AServer server = serverManagementService.loadServer(serverId);
return loadUser(user, server);
return loadUser(server, user);
}
@Override
public AUserInAServer loadUser(AUser user, AServer server) {
return userInServerRepository.findByServerReferenceAndUserReference(server, user);
public AUserInAServer loadUser(AServer server, AUser user) {
if(userInServerRepository.existsByServerReferenceAndUserReference(server, user)) {
return userInServerRepository.findByServerReferenceAndUserReference(server, user);
} else {
return this.createUserInServer(server.getId(), user.getId());
}
}
@Override
public AUserInAServer loadUser(Member member) {
AUserInAServer aUserInAServer = this.loadUser(member.getGuild().getIdLong(), member.getIdLong());
if(aUserInAServer == null) {
return this.createUserInServer(member);
}
return null;
return this.loadUser(member.getGuild().getIdLong(), member.getIdLong());
}
@Override
public AUserInAServer createUserInServer(Member member) {
AServer server = serverManagementService.loadServer(member.getGuild().getIdLong());
return this.createUserInServer(member.getGuild().getIdLong(), member.getIdLong());
}
if(!userRepository.existsById(member.getIdLong())) {
this.createUser(member);
}
AUser aUser = userRepository.getOne(member.getIdLong());
return serverManagementService.addUserToServer(server, aUser);
@Override
public AUserInAServer createUserInServer(Long guildId, Long userId) {
return serverManagementService.addUserToServer(guildId, userId);
}
@Override
public AUser createUser(Member member) {
AUser aUser = AUser.builder().id(member.getIdLong()).build();
return createUser(member.getIdLong());
}
@Override
public AUser createUser(Long userId) {
log.info("Creating user {}", userId);
AUser aUser = AUser.builder().id(userId).build();
userRepository.save(aUser);
return aUser;
}
@Override
public AUser loadUser(Long userId) {
if(userRepository.existsById(userId)) {
return userRepository.getOne(userId);
} else {
return this.createUser(userId);
}
}
}

View File

@@ -0,0 +1,11 @@
package dev.sheldan.abstracto.repository;
import dev.sheldan.abstracto.core.models.database.AEmote;
import dev.sheldan.abstracto.core.models.database.AServer;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface EmoteRepository extends JpaRepository<AEmote, Long> {
AEmote findAEmoteByNameAndServerRef(String name, AServer server);
}

View File

@@ -9,4 +9,5 @@ import org.springframework.stereotype.Repository;
@Repository
public interface UserInServerRepository extends JpaRepository<AUserInAServer, Long> {
AUserInAServer findByServerReferenceAndUserReference(AServer serverId, AUser userId);
boolean existsByServerReferenceAndUserReference(AServer server, AUser user);
}

View File

@@ -2,6 +2,8 @@ package dev.sheldan.abstracto.repository;
import dev.sheldan.abstracto.core.models.database.AUser;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface UserRepository extends JpaRepository<AUser, Long> {
}