added scheduling support

added remind command
added support for parameters with spaces (they are contained by ")
fixed support for remainder parameters
added maxlength support for parameters
added ability to embed templates, to have a text as well
moved properties to a more appropriate position
added method do parse a duration
This commit is contained in:
Sheldan
2020-03-28 20:12:59 +01:00
parent e0474a4c98
commit 03e81a025b
64 changed files with 1318 additions and 125 deletions

View File

@@ -28,10 +28,6 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>

View File

@@ -5,6 +5,7 @@ import dev.sheldan.abstracto.core.exception.ConfigurationException;
import dev.sheldan.abstracto.core.management.PostTargetManagement;
import dev.sheldan.abstracto.core.management.ServerManagementService;
import dev.sheldan.abstracto.core.models.database.PostTarget;
import dev.sheldan.abstracto.core.models.embed.MessageToSend;
import lombok.extern.slf4j.Slf4j;
import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.entities.Message;
@@ -83,6 +84,18 @@ public class PostTargetServiceBean implements PostTargetService {
return this.sendEmbedInPostTarget(embed, postTarget);
}
@Override
public CompletableFuture<Message> sendEmbedInPostTarget(MessageToSend message, String postTargetName, Long serverId) {
PostTarget postTarget = this.getPostTarget(postTargetName, serverId);
return this.sendEmbedInPostTarget(message, postTarget);
}
@Override
public CompletableFuture<Message> sendEmbedInPostTarget(MessageToSend message, PostTarget target) {
TextChannel textChannelForPostTarget = getTextChannelForPostTarget(target);
return textChannelForPostTarget.sendMessage(message.getMessage()).embed(message.getEmbed()).submit();
}
@Override
public boolean validPostTarget(String name) {
List<String> possiblePostTargets = dynamicKeyLoader.getPostTargetsAsList();

View File

@@ -10,10 +10,10 @@ import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import dev.sheldan.abstracto.core.models.listener.MessageEmbeddedModel;
import dev.sheldan.abstracto.core.service.Bot;
import dev.sheldan.abstracto.core.service.MessageCache;
import dev.sheldan.abstracto.core.models.embed.MessageToSend;
import dev.sheldan.abstracto.templating.TemplateService;
import lombok.extern.slf4j.Slf4j;
import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.MessageEmbed;
import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
import org.apache.commons.lang3.StringUtils;
@@ -91,8 +91,8 @@ public class MessageEmbedListener extends ListenerAdapter {
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void createEmbedAndPostEmbed(@Nonnull GuildMessageReceivedEvent event, CachedMessage message) {
MessageEmbeddedModel messageEmbeddedModel = buildTemplateParameter(event, message);
MessageEmbed embed = templateService.renderEmbedTemplate(MESSAGE_EMBED_TEMPLATE, messageEmbeddedModel);
event.getChannel().sendMessage(embed).queue();
MessageToSend embed = templateService.renderEmbedTemplate(MESSAGE_EMBED_TEMPLATE, messageEmbeddedModel);
event.getChannel().sendMessage(embed.getMessage()).embed(embed.getEmbed()).queue();
}
private MessageEmbeddedModel buildTemplateParameter(GuildMessageReceivedEvent event, CachedMessage embeddedMessage) {

View File

@@ -0,0 +1,20 @@
spring.datasource.url=jdbc:postgresql://localhost:5432/abstracto
spring.datasource.username= abstracto
spring.datasource.password= abstracto
spring.jpa.hibernate.default_schema=abstracto
spring.jpa.show-sql = false
spring.jpa.hibernate.ddl-auto = update
spring.jpa.hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect
spring.jpa.hibernate.naming_strategy = org.hibernate.cfg.ImprovedNamingStrategy
log4j.logger.org.hibernate.SQL=info
log4j.logger.org.hibernate.type.descriptor.sql=trace
log4j.logger.org.hibernate.type=trace
log4j.logger.dev.sheldan=info
spring.cache.cache-names=messages
spring.cache.caffeine.spec=maximumSize=500,expireAfterAccess=600s
abstracto.startup.synchronize=true
abstracto.parameter.lowerBound=50

View File

@@ -0,0 +1,9 @@
package dev.sheldan.abstracto.core;
import org.springframework.beans.factory.annotation.Value;
public class Constants {
@Value("${abstracto.parameter.lowerBound}")
public static int PARAMETER_LIMIT = 0;
}

View File

@@ -0,0 +1,19 @@
package dev.sheldan.abstracto.core.models;
import dev.sheldan.abstracto.core.models.database.AChannel;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.core.models.database.AUser;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@Builder
public class AServerAChannelAUser {
private AServer guild;
private AChannel channel;
private AUserInAServer aUserInAServer;
private AUser user;
}

View File

@@ -0,0 +1,14 @@
package dev.sheldan.abstracto.core.models.embed;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import net.dv8tion.jda.api.entities.MessageEmbed;
@Getter
@Setter
@Builder
public class MessageToSend {
private MessageEmbed embed;
private String message;
}

View File

@@ -1,6 +1,7 @@
package dev.sheldan.abstracto.core.service;
import dev.sheldan.abstracto.core.models.database.PostTarget;
import dev.sheldan.abstracto.core.models.embed.MessageToSend;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.MessageEmbed;
@@ -12,6 +13,8 @@ public interface PostTargetService {
CompletableFuture<Message> sendEmbedInPostTarget(MessageEmbed embed, PostTarget target);
CompletableFuture<Message> sendTextInPostTarget(String text, String postTargetName, Long serverId);
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);
boolean validPostTarget(String name);
List<String> getAvailablePostTargets();
}

View File

@@ -0,0 +1,28 @@
package dev.sheldan.abstracto.core.utils;
import java.time.Duration;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ParseUtils {
private static Pattern messageRegex = Pattern.compile("(?<number>\\d+)(?<unit>[ywdhms]+)");
public static Duration parseDuration(String textToParseFrom) {
Matcher matcher = ParseUtils.messageRegex.matcher(textToParseFrom);
Duration start = Duration.ZERO;
while(matcher.find()) {
String unit = matcher.group("unit");
String number = matcher.group("number");
long parsed = Long.parseLong(number);
switch (unit) {
case "w": start = start.plus(Duration.ofDays(parsed * 7)); break;
case "d": start = start.plus(Duration.ofDays(parsed)); break;
case "h": start = start.plus(Duration.ofHours(parsed)); break;
case "m": start = start.plus(Duration.ofMinutes(parsed)); break;
case "s": start = start.plus(Duration.ofSeconds(parsed)); break;
}
}
return start;
}
}

View File

@@ -0,0 +1,44 @@
package dev.sheldan.abstracto.core.utils;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.junit.MockitoJUnitRunner;
import java.time.Duration;
import static org.junit.Assert.*;
@RunWith(MockitoJUnitRunner.class)
public class ParseUtilsTest {
@Test
public void oneDay() {
Duration duration = ParseUtils.parseDuration("1d");
assertEquals(Duration.ofDays(1), duration);
}
@Test
public void twoWeeks() {
Duration duration = ParseUtils.parseDuration("2w");
assertEquals(Duration.ofDays(14), duration);
}
@Test
public void aDayWithMinutes() {
Duration duration = ParseUtils.parseDuration("1d3m");
assertEquals(Duration.ofDays(1).plus(Duration.ofMinutes(3)), duration);
}
@Test
public void allTimeFormats() {
Duration duration = ParseUtils.parseDuration("2w3d4h2m1s");
assertEquals(Duration.ofDays(17).plus(Duration.ofHours(4)).plus(Duration.ofMinutes(2)).plus(Duration.ofSeconds(1)), duration);
}
@Test
public void overFlowingTimeFormats() {
Duration duration = ParseUtils.parseDuration("70s");
assertEquals(Duration.ofMinutes(1).plus(Duration.ofSeconds(10)), duration);
}
}