added templating support

changed ping command to use templates
added userjoin/userleave event
added guild to command context
refactored post target service
added logging output to initial loading
added server_id to postTarget
added leave log postTarget
This commit is contained in:
Sheldan
2020-03-16 01:28:17 +01:00
parent 5c6b7b9a78
commit 0521a1ab44
30 changed files with 491 additions and 34 deletions

View File

@@ -24,10 +24,6 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-client</artifactId>
@@ -90,6 +86,12 @@
<version>${project.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>dev.sheldan.abstracto.templating</groupId>
<artifactId>templating-interface</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</project>

View File

@@ -2,46 +2,69 @@ package dev.sheldan.abstracto.core.service;
import dev.sheldan.abstracto.commands.management.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.repository.ChannelRepository;
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 {
@Autowired
private PostTargetRepository postTargetRepository;
@Autowired
private ChannelRepository channelRepository;
private ChannelService channelService;
@Autowired
private ServerService serverService;
@Override
@Transactional
public void createPostTarget(String name, AChannel targetChannel) {
public void createPostTarget(String name, AChannel targetChannel, AServer server) {
if(!PostTarget.AVAILABLE_POST_TARGETS.contains(name)) {
throw new PostTargetException("PostTarget not found");
}
postTargetRepository.save(PostTarget.builder().name(name).AChannel(targetChannel).build());
log.info("Creating post target {} pointing towards {}", name, targetChannel);
postTargetRepository.save(PostTarget.builder().name(name).channelReference(targetChannel).serverReference(server).build());
}
@Override
@Transactional
public void createOrUpdate(String name, AChannel targetChannel) {
public void createOrUpdate(String name, AChannel targetChannel, AServer server) {
PostTarget existing = postTargetRepository.findPostTargetByName(name);
if(existing == null){
this.createPostTarget(name, targetChannel);
this.createPostTarget(name, targetChannel, server);
} else {
this.updatePostTarget(existing, targetChannel);
this.updatePostTarget(existing, targetChannel, server);
}
}
@Override
@Transactional
public void updatePostTarget(PostTarget target, AChannel newTargetChannel) {
postTargetRepository.getOne(target.getId()).setAChannel(newTargetChannel);
public void createOrUpdate(String name, Long channelId, AServer server) {
AChannel dbChannel = channelService.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);
createOrUpdate(name, dbChannel, dbServer);
}
@Override
@Cacheable("posttargets")
public PostTarget getPostTarget(String name, AServer server) {
return postTargetRepository.findPostTargetByName(name);
}
@Override
public void updatePostTarget(PostTarget target, AChannel newTargetChannel, AServer server) {
postTargetRepository.getOne(target.getId()).setChannelReference(newTargetChannel);
}
}

View File

@@ -15,11 +15,19 @@ public class ServerServiceBean implements ServerService {
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

@@ -5,6 +5,7 @@ import dev.sheldan.abstracto.core.models.AChannel;
import dev.sheldan.abstracto.core.models.AChannelType;
import dev.sheldan.abstracto.core.models.ARole;
import dev.sheldan.abstracto.core.models.AServer;
import lombok.extern.slf4j.Slf4j;
import net.dv8tion.jda.api.JDA;
import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.entities.GuildChannel;
@@ -19,6 +20,7 @@ import javax.transaction.Transactional;
import java.util.List;
import java.util.Set;
@Slf4j
@Service
public class StartupManager implements Startup {
@@ -47,7 +49,9 @@ public class StartupManager implements Startup {
@Override
@Transactional
public void synchronize() {
log.info("Synchronizing servers.");
synchronizeServers();
log.info("Done synchronizing servers");
}
private void synchronizeServers(){
@@ -57,6 +61,7 @@ public class StartupManager implements Startup {
availableServers.forEach(aLong -> {
AServer newAServer = serverService.createServer(aLong);
Guild newGuild = instance.getGuildById(aLong);
log.debug("Synchronizing server: {}", aLong);
if(newGuild != null){
synchronizeRolesOf(newGuild, newAServer);
synchronizeChannelsOf(newGuild, newAServer);
@@ -73,6 +78,7 @@ public class StartupManager implements Startup {
Set<Long> newRoles = SetUtils.disjunction(availableRoles, knownRolesId);
newRoles.forEach(aLong -> {
ARole newRole = roleService.createRole(aLong);
log.debug("Adding new role: {}", aLong);
existingAServer.getRoles().add(newRole);
});
}
@@ -85,6 +91,7 @@ public class StartupManager implements Startup {
Set<Long> newChannels = SetUtils.disjunction(existingChannelsIds, knownChannelsIds);
newChannels.forEach(aLong -> {
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);

View File

@@ -0,0 +1,74 @@
package dev.sheldan.abstracto.listener;
import dev.sheldan.abstracto.core.models.AServer;
import dev.sheldan.abstracto.core.models.PostTarget;
import dev.sheldan.abstracto.core.service.PostTargetService;
import dev.sheldan.abstracto.core.service.ServerService;
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;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
import org.jetbrains.annotations.NotNull;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Nonnull;
import java.util.HashMap;
@Service
@Slf4j
public class JoinLeaveListener extends ListenerAdapter {
public static final String USER_JOIN_TEMPLATE = "user_join";
public static final String USER_LEAVE_TEMPLATE = "user_leave";
@Autowired
private PostTargetService postTargetService;
@Autowired
private ServerService serverService;
@Autowired
private TemplateService templateService;
@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());
}
}
@NotNull
private HashMap<String, Object> getUserParameter(@Nonnull User user) {
HashMap<String, Object> parameters = new HashMap<>();
parameters.put("user", user);
parameters.put("userMention", user.getAsMention());
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());
}
}
}

View File

@@ -0,0 +1 @@
User ${user.name}#${user.discriminator} (${userMention}) has joined the guild.

View File

@@ -0,0 +1 @@
User ${user.name}#${user.discriminator} (${userMention}) has left the guild.