added template support to echo

replaced HashMaps for templates with concrete models, so the interface is easier known
added rendering method for objects directly
added default parameters available for commands
split up service beans for server/channel into management and service bean
added server reference in AChannel
refactored join/leave listener
This commit is contained in:
Sheldan
2020-03-17 19:41:25 +01:00
parent 0521a1ab44
commit 167bbb0f8b
41 changed files with 399 additions and 205 deletions

View File

@@ -0,0 +1,7 @@
package dev.sheldan.abstracto.core.exception;
public class PostTargetException extends RuntimeException {
public PostTargetException(String message) {
super(message);
}
}

View File

@@ -0,0 +1,25 @@
package dev.sheldan.abstracto.core.service.management;
import dev.sheldan.abstracto.core.models.AChannel;
import dev.sheldan.abstracto.core.models.AChannelType;
import dev.sheldan.abstracto.core.management.ChannelManagementService;
import dev.sheldan.abstracto.repository.ChannelRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class ChannelManagementServiceBean implements ChannelManagementService {
@Autowired
private ChannelRepository repository;
@Override
public AChannel loadChannel(Long id) {
return repository.getOne(id);
}
@Override
public AChannel createChannel(Long id, AChannelType type) {
return repository.save(AChannel.builder().id(id).type(type).build());
}
}

View File

@@ -1,28 +1,29 @@
package dev.sheldan.abstracto.core.service;
package dev.sheldan.abstracto.core.service.management;
import dev.sheldan.abstracto.commands.management.PostTargetException;
import dev.sheldan.abstracto.core.exception.PostTargetException;
import dev.sheldan.abstracto.core.models.AChannel;
import dev.sheldan.abstracto.core.models.AServer;
import dev.sheldan.abstracto.core.models.PostTarget;
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.repository.PostTargetRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import javax.transaction.Transactional;
@Service
@Slf4j
public class PostTargetServiceServiceBean implements PostTargetService {
public class PostTargetManagementBean implements PostTargetManagement {
@Autowired
private PostTargetRepository postTargetRepository;
@Autowired
private ChannelService channelService;
private ChannelManagementService channelManagementService;
@Autowired
private ServerService serverService;
private ServerManagementService serverManagementService;
@Override
public void createPostTarget(String name, AChannel targetChannel, AServer server) {
@@ -45,14 +46,14 @@ public class PostTargetServiceServiceBean implements PostTargetService {
@Override
public void createOrUpdate(String name, Long channelId, AServer server) {
AChannel dbChannel = channelService.loadChannel(channelId);
AChannel dbChannel = channelManagementService.loadChannel(channelId);
createOrUpdate(name, dbChannel, server);
}
@Override
public void createOrUpdate(String name, Long channelId, Long serverId) {
AChannel dbChannel = channelService.loadChannel(channelId);
AServer dbServer = serverService.loadServer(serverId);
AChannel dbChannel = channelManagementService.loadChannel(channelId);
AServer dbServer = serverManagementService.loadServer(serverId);
createOrUpdate(name, dbChannel, dbServer);
}
@@ -62,6 +63,12 @@ public class PostTargetServiceServiceBean implements PostTargetService {
return postTargetRepository.findPostTargetByName(name);
}
@Override
public PostTarget getPostTarget(String name, Long serverId) {
AServer server = serverManagementService.loadServer(serverId);
return getPostTarget(name, server);
}
@Override
public void updatePostTarget(PostTarget target, AChannel newTargetChannel, AServer server) {
postTargetRepository.getOne(target.getId()).setChannelReference(newTargetChannel);

View File

@@ -1,12 +1,13 @@
package dev.sheldan.abstracto.core.service;
package dev.sheldan.abstracto.core.service.management;
import dev.sheldan.abstracto.core.models.ARole;
import dev.sheldan.abstracto.core.management.RoleManagementService;
import dev.sheldan.abstracto.repository.RoleRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class RoleServiceBean implements RoleService {
public class RoleManagementServiceBean implements RoleManagementService {
@Autowired
private RoleRepository repository;

View File

@@ -0,0 +1,64 @@
package dev.sheldan.abstracto.core.service.management;
import dev.sheldan.abstracto.core.models.AChannel;
import dev.sheldan.abstracto.core.models.AServer;
import dev.sheldan.abstracto.core.models.PostTarget;
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.repository.ServerRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class ServerManagementServiceBean implements ServerManagementService {
@Autowired
private ServerRepository repository;
@Autowired
private PostTargetManagement postTargetManagement;
@Autowired
private ChannelManagementService channelManagementService;
@Override
public AServer createServer(Long id) {
return repository.save(AServer.builder().id(id).build());
}
@Override
public AServer loadServer(Long id) {
return repository.getOne(id);
}
@Override
public void addChannelToServer(AServer server, AChannel channel) {
server.getChannels().add(channel);
}
@Override
public AChannel getPostTarget(Long serverId, String name) {
AServer server = this.loadServer(serverId);
return getPostTarget(server, name);
}
@Override
public AChannel getPostTarget(Long serverId, PostTarget target) {
AServer server = this.loadServer(serverId);
return getPostTarget(server, target);
}
@Override
public AChannel getPostTarget(AServer server, PostTarget target) {
return target.getChannelReference();
}
@Override
public AChannel getPostTarget(AServer server, String name) {
PostTarget target = postTargetManagement.getPostTarget(name, server);
return getPostTarget(server, target);
}
}

View File

@@ -1,24 +1,31 @@
package dev.sheldan.abstracto.core.service;
import dev.sheldan.abstracto.core.models.AChannel;
import dev.sheldan.abstracto.core.models.AChannelType;
import dev.sheldan.abstracto.repository.ChannelRepository;
import lombok.extern.slf4j.Slf4j;
import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.entities.TextChannel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.stereotype.Component;
@Service
@Slf4j
@Component
public class ChannelServiceBean implements ChannelService {
@Autowired
private ChannelRepository repository;
private BotService botService;
@Override
public AChannel loadChannel(Long id) {
return repository.getOne(id);
}
@Override
public AChannel createChannel(Long id, AChannelType type) {
return repository.save(AChannel.builder().id(id).type(type).build());
public void sendTextInAChannel(String text, AChannel channel) {
Guild guild = botService.getInstance().getGuildById(channel.getServer().getId());
if (guild != null) {
TextChannel textChannel = guild.getTextChannelById(channel.getId());
if(textChannel != null) {
textChannel.sendMessage(text).queue();
} else {
log.warn("Channel {} to post towards was not found in server {}", channel.getId(), channel.getServer().getId());
}
} else {
log.warn("Guild {} was not found when trying to post a message", channel.getServer().getId());
}
}
}

View File

@@ -0,0 +1,37 @@
package dev.sheldan.abstracto.core.service;
import dev.sheldan.abstracto.core.management.ServerManagementService;
import dev.sheldan.abstracto.core.models.PostTarget;
import lombok.extern.slf4j.Slf4j;
import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.entities.TextChannel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class PostTargetServiceBean implements PostTargetService {
@Autowired
private ServerManagementService serverManagementService;
@Autowired
private BotService botService;
@Override
public void sendTextInPostTarget(String text, PostTarget target) {
Guild guild = botService.getInstance().getGuildById(target.getServerReference().getId());
if(guild != null) {
TextChannel textChannelById = guild.getTextChannelById(target.getChannelReference().getId());
if(textChannelById != null) {
textChannelById.sendMessage(text).queue();
} else {
log.warn("Incorrect post target configuration: {} points to {} on server {}", target.getName(),
target.getChannelReference().getId(), target.getServerReference().getId());
}
} else {
log.warn("Incorrect post target configuration: Guild id {} was not found.", target.getServerReference().getId());
}
}
}

View File

@@ -1,36 +0,0 @@
package dev.sheldan.abstracto.core.service;
import dev.sheldan.abstracto.core.models.AChannel;
import dev.sheldan.abstracto.core.models.AServer;
import dev.sheldan.abstracto.repository.ServerRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.transaction.Transactional;
@Service
public class ServerServiceBean implements ServerService {
@Autowired
private ServerRepository repository;
@Override
@Transactional
public AServer createServer(Long id) {
return repository.save(AServer.builder().id(id).build());
}
@Override
@Transactional
public AServer loadServer(Long id) {
return repository.getOne(id);
}
@Override
@Transactional
public void addChannelToServer(AServer server, AChannel channel) {
server.getChannels().add(channel);
}
}

View File

@@ -1,6 +1,9 @@
package dev.sheldan.abstracto.core.service;
import dev.sheldan.abstracto.SnowflakeUtils;
import dev.sheldan.abstracto.core.management.ChannelManagementService;
import dev.sheldan.abstracto.core.management.RoleManagementService;
import dev.sheldan.abstracto.core.management.ServerManagementService;
import dev.sheldan.abstracto.core.models.AChannel;
import dev.sheldan.abstracto.core.models.AChannelType;
import dev.sheldan.abstracto.core.models.ARole;
@@ -31,13 +34,13 @@ public class StartupManager implements Startup {
private List<? extends ListenerAdapter> listeners;
@Autowired
private ServerService serverService;
private ServerManagementService serverManagementService;
@Autowired
private ChannelService channelService;
private ChannelManagementService channelManagementService;
@Autowired
private RoleService roleService;
private RoleManagementService roleManagementService;
@Override
@@ -59,7 +62,7 @@ public class StartupManager implements Startup {
List<Guild> onlineGuilds = instance.getGuilds();
Set<Long> availableServers = SnowflakeUtils.getSnowflakeIds(onlineGuilds);
availableServers.forEach(aLong -> {
AServer newAServer = serverService.createServer(aLong);
AServer newAServer = serverManagementService.createServer(aLong);
Guild newGuild = instance.getGuildById(aLong);
log.debug("Synchronizing server: {}", aLong);
if(newGuild != null){
@@ -77,7 +80,7 @@ public class StartupManager implements Startup {
Set<Long> availableRoles = SnowflakeUtils.getSnowflakeIds(existingRoles);
Set<Long> newRoles = SetUtils.disjunction(availableRoles, knownRolesId);
newRoles.forEach(aLong -> {
ARole newRole = roleService.createRole(aLong);
ARole newRole = roleManagementService.createRole(aLong);
log.debug("Adding new role: {}", aLong);
existingAServer.getRoles().add(newRole);
});
@@ -93,8 +96,8 @@ public class StartupManager implements Startup {
GuildChannel channel1 = available.stream().filter(channel -> channel.getIdLong() == aLong).findFirst().get();
log.debug("Adding new channel: {}", aLong);
AChannelType type = AChannel.getAChannelType(channel1.getType());
AChannel newChannel = channelService.createChannel(channel1.getIdLong(), type);
serverService.addChannelToServer(existingServer, newChannel);
AChannel newChannel = channelManagementService.createChannel(channel1.getIdLong(), type);
serverManagementService.addChannelToServer(existingServer, newChannel);
});
}
}

View File

@@ -1,12 +1,11 @@
package dev.sheldan.abstracto.listener;
import dev.sheldan.abstracto.core.models.AServer;
import dev.sheldan.abstracto.core.models.PostTarget;
import dev.sheldan.abstracto.core.management.PostTargetManagement;
import dev.sheldan.abstracto.core.service.PostTargetService;
import dev.sheldan.abstracto.core.service.ServerService;
import dev.sheldan.abstracto.core.management.ServerManagementService;
import dev.sheldan.abstracto.templating.TemplateService;
import lombok.extern.slf4j.Slf4j;
import net.dv8tion.jda.api.entities.TextChannel;
import net.dv8tion.jda.api.entities.User;
import net.dv8tion.jda.api.events.guild.member.GuildMemberJoinEvent;
import net.dv8tion.jda.api.events.guild.member.GuildMemberLeaveEvent;
@@ -23,30 +22,34 @@ import java.util.HashMap;
@Slf4j
public class JoinLeaveListener extends ListenerAdapter {
public static final String USER_JOIN_TEMPLATE = "user_join";
public static final String USER_LEAVE_TEMPLATE = "user_leave";
private static final String USER_JOIN_TEMPLATE = "user_join";
private static final String USER_LEAVE_TEMPLATE = "user_leave";
@Autowired
private PostTargetService postTargetService;
private PostTargetManagement postTargetManagement;
@Autowired
private ServerService serverService;
private ServerManagementService serverManagementService;
@Autowired
private TemplateService templateService;
@Autowired
private PostTargetService postTargetService;
@Override
@Transactional
public void onGuildMemberJoin(@Nonnull GuildMemberJoinEvent event) {
AServer server = serverService.loadServer(event.getGuild().getIdLong());
PostTarget target = postTargetService.getPostTarget(PostTarget.JOIN_LOG, server);
TextChannel textChannelById = event.getGuild().getTextChannelById(target.getChannelReference().getId());
if(textChannelById != null){
HashMap<String, Object> parameters = getUserParameter(event.getUser());
String text = templateService.renderTemplate(USER_JOIN_TEMPLATE, parameters);
textChannelById.sendMessage(text).queue();
} else {
log.warn("{} post target is not defined for server {}", PostTarget.JOIN_LOG, server.getId());
}
String text = getRenderedEvent(event.getUser(), USER_JOIN_TEMPLATE);
PostTarget postTarget = postTargetManagement.getPostTarget(PostTarget.JOIN_LOG, event.getGuild().getIdLong());
postTargetService.sendTextInPostTarget(text, postTarget);
}
@Override
@Transactional
public void onGuildMemberLeave(@Nonnull GuildMemberLeaveEvent event) {
String text = getRenderedEvent(event.getUser(), USER_LEAVE_TEMPLATE);
PostTarget postTarget = postTargetManagement.getPostTarget(PostTarget.LEAVE_LOG, event.getGuild().getIdLong());
postTargetService.sendTextInPostTarget(text, postTarget);
}
@NotNull
@@ -57,18 +60,8 @@ public class JoinLeaveListener extends ListenerAdapter {
return parameters;
}
@Override
@Transactional
public void onGuildMemberLeave(@Nonnull GuildMemberLeaveEvent event) {
AServer server = serverService.loadServer(event.getGuild().getIdLong());
PostTarget target = postTargetService.getPostTarget(PostTarget.LEAVE_LOG, server);
TextChannel textChannelById = event.getGuild().getTextChannelById(target.getChannelReference().getId());
if(textChannelById != null){
HashMap<String, Object> parameters = getUserParameter(event.getUser());
String text = templateService.renderTemplate(USER_LEAVE_TEMPLATE, parameters);
textChannelById.sendMessage(text).queue();
} else {
log.warn("{} post target is not defined for server {}", PostTarget.LEAVE_LOG, server.getId());
}
private String getRenderedEvent(User user, String templateName) {
HashMap<String, Object> parameters = getUserParameter(user);
return templateService.renderTemplate(templateName, parameters);
}
}