mirror of
https://github.com/Sheldan/Sissi.git
synced 2026-01-26 19:21:43 +00:00
Compare commits
23 Commits
sissi-1.3.
...
sissi-1.3.
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
75187cae00 | ||
|
|
710a039707 | ||
|
|
b7dcb72e7a | ||
|
|
ead142cf5d | ||
|
|
11bf8cc9bc | ||
|
|
1083f93d2c | ||
|
|
6de38d3bea | ||
|
|
9de6eb4b8b | ||
|
|
df1392bf84 | ||
|
|
6e065de915 | ||
|
|
a1820aea67 | ||
|
|
09c113c6bc | ||
|
|
d080292e85 | ||
|
|
0e9ea8cf1a | ||
|
|
5d1037f66d | ||
|
|
eb6251aae0 | ||
|
|
caccf8b405 | ||
|
|
5390c0e53e | ||
|
|
8732064764 | ||
|
|
46833e024f | ||
|
|
e459ef77f3 | ||
|
|
a827d7e946 | ||
|
|
85da8684a4 |
2
.github/workflows/release.yml
vendored
2
.github/workflows/release.yml
vendored
@@ -34,5 +34,5 @@ jobs:
|
|||||||
env:
|
env:
|
||||||
REGISTRY_PREFIX: docker.pkg.github.com/sheldan/sissi/
|
REGISTRY_PREFIX: docker.pkg.github.com/sheldan/sissi/
|
||||||
VERSION: ${{ env.version }}
|
VERSION: ${{ env.version }}
|
||||||
ABSTRACTO_VERSION: 1.4.14
|
ABSTRACTO_VERSION: 1.4.19
|
||||||
ABSTRACTO_REGISTRY_PREFIX: docker.pkg.github.com/sheldan/abstracto/
|
ABSTRACTO_REGISTRY_PREFIX: docker.pkg.github.com/sheldan/abstracto/
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>dev.sheldan.sissi.application</groupId>
|
<groupId>dev.sheldan.sissi.application</groupId>
|
||||||
<artifactId>application</artifactId>
|
<artifactId>application</artifactId>
|
||||||
<version>1.3.14</version>
|
<version>1.3.21</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<artifactId>executable</artifactId>
|
<artifactId>executable</artifactId>
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>dev.sheldan.sissi</groupId>
|
<groupId>dev.sheldan.sissi</groupId>
|
||||||
<artifactId>sissi</artifactId>
|
<artifactId>sissi</artifactId>
|
||||||
<version>1.3.14</version>
|
<version>1.3.21</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>dev.sheldan.sissi.application.module.custom</groupId>
|
<groupId>dev.sheldan.sissi.application.module.custom</groupId>
|
||||||
<artifactId>sissi-customizations</artifactId>
|
<artifactId>sissi-customizations</artifactId>
|
||||||
<version>1.3.14</version>
|
<version>1.3.21</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>application</artifactId>
|
<artifactId>application</artifactId>
|
||||||
<groupId>dev.sheldan.sissi.application</groupId>
|
<groupId>dev.sheldan.sissi.application</groupId>
|
||||||
<version>1.3.14</version>
|
<version>1.3.21</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@@ -3,13 +3,20 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>dev.sheldan.sissi.application</groupId>
|
<groupId>dev.sheldan.sissi.application</groupId>
|
||||||
<artifactId>sissi-modules</artifactId>
|
<artifactId>sissi-modules</artifactId>
|
||||||
<version>1.3.14</version>
|
<version>1.3.21</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
<groupId>dev.sheldan.sissi.application.module</groupId>
|
<groupId>dev.sheldan.sissi.application.module</groupId>
|
||||||
<artifactId>debra</artifactId>
|
<artifactId>debra</artifactId>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.google.code.gson</groupId>
|
||||||
|
<artifactId>gson</artifactId>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
<plugins>
|
<plugins>
|
||||||
<plugin>
|
<plugin>
|
||||||
|
|||||||
@@ -4,24 +4,32 @@ import dev.sheldan.abstracto.core.command.UtilityModuleDefinition;
|
|||||||
import dev.sheldan.abstracto.core.command.condition.AbstractConditionableCommand;
|
import dev.sheldan.abstracto.core.command.condition.AbstractConditionableCommand;
|
||||||
import dev.sheldan.abstracto.core.command.config.CommandConfiguration;
|
import dev.sheldan.abstracto.core.command.config.CommandConfiguration;
|
||||||
import dev.sheldan.abstracto.core.command.config.HelpInfo;
|
import dev.sheldan.abstracto.core.command.config.HelpInfo;
|
||||||
|
import dev.sheldan.abstracto.core.command.config.Parameter;
|
||||||
import dev.sheldan.abstracto.core.command.execution.CommandContext;
|
import dev.sheldan.abstracto.core.command.execution.CommandContext;
|
||||||
import dev.sheldan.abstracto.core.command.execution.CommandResult;
|
import dev.sheldan.abstracto.core.command.execution.CommandResult;
|
||||||
import dev.sheldan.abstracto.core.config.FeatureDefinition;
|
import dev.sheldan.abstracto.core.config.FeatureDefinition;
|
||||||
|
import dev.sheldan.abstracto.core.exception.AbstractoRunTimeException;
|
||||||
import dev.sheldan.abstracto.core.interaction.InteractionService;
|
import dev.sheldan.abstracto.core.interaction.InteractionService;
|
||||||
import dev.sheldan.abstracto.core.interaction.slash.SlashCommandConfig;
|
import dev.sheldan.abstracto.core.interaction.slash.SlashCommandConfig;
|
||||||
|
import dev.sheldan.abstracto.core.interaction.slash.parameter.SlashCommandParameterService;
|
||||||
import dev.sheldan.abstracto.core.service.ChannelService;
|
import dev.sheldan.abstracto.core.service.ChannelService;
|
||||||
import dev.sheldan.abstracto.core.templating.model.MessageToSend;
|
import dev.sheldan.abstracto.core.templating.model.MessageToSend;
|
||||||
import dev.sheldan.abstracto.core.templating.service.TemplateService;
|
import dev.sheldan.abstracto.core.templating.service.TemplateService;
|
||||||
import dev.sheldan.abstracto.core.utils.FutureUtils;
|
import dev.sheldan.abstracto.core.utils.FutureUtils;
|
||||||
import dev.sheldan.sissi.module.debra.config.DebraFeatureDefinition;
|
import dev.sheldan.sissi.module.debra.config.DebraFeatureDefinition;
|
||||||
import dev.sheldan.sissi.module.debra.config.DebraSlashCommandNames;
|
import dev.sheldan.sissi.module.debra.config.DebraSlashCommandNames;
|
||||||
|
import dev.sheldan.sissi.module.debra.converter.DonationConverter;
|
||||||
|
import dev.sheldan.sissi.module.debra.model.api.DonationsResponse;
|
||||||
import dev.sheldan.sissi.module.debra.model.commands.DonationsModel;
|
import dev.sheldan.sissi.module.debra.model.commands.DonationsModel;
|
||||||
import dev.sheldan.sissi.module.debra.service.DonationService;
|
import dev.sheldan.sissi.module.debra.service.DonationService;
|
||||||
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
|
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
import java.util.concurrent.CompletableFuture;
|
import java.util.concurrent.CompletableFuture;
|
||||||
|
|
||||||
|
|
||||||
@@ -30,6 +38,8 @@ public class Donations extends AbstractConditionableCommand {
|
|||||||
|
|
||||||
private static final String DONATIONS_COMMAND_NAME = "donations";
|
private static final String DONATIONS_COMMAND_NAME = "donations";
|
||||||
private static final String DONATIONS_RESPONSE_TEMPLATE_KEY = "donations_response";
|
private static final String DONATIONS_RESPONSE_TEMPLATE_KEY = "donations_response";
|
||||||
|
private static final String SELECTION_PARAMETER = "type";
|
||||||
|
private static final String SELECTION_VALUE_PARAMETER = "parametervalue";
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private ChannelService channelService;
|
private ChannelService channelService;
|
||||||
@@ -43,26 +53,81 @@ public class Donations extends AbstractConditionableCommand {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private TemplateService templateService;
|
private TemplateService templateService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private DonationConverter donationConverter;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private SlashCommandParameterService slashCommandParameterService;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CompletableFuture<CommandResult> executeAsync(CommandContext commandContext) {
|
public CompletableFuture<CommandResult> executeAsync(CommandContext commandContext) {
|
||||||
MessageToSend messageToSend = getDonationMessageToSend();
|
List<Object> parameters = commandContext.getParameters().getParameters();
|
||||||
|
MessageToSend messageToSend;
|
||||||
|
if(parameters.isEmpty()) {
|
||||||
|
messageToSend = getDonationMessageToSend(commandContext.getGuild().getIdLong(), null, null);
|
||||||
|
} else {
|
||||||
|
String type = (String) parameters.get(0);
|
||||||
|
Integer selectionValue = (Integer) parameters.get(1);
|
||||||
|
Integer top = null;
|
||||||
|
Integer latest = null;
|
||||||
|
switch (type) {
|
||||||
|
case "top": top = selectionValue; break;
|
||||||
|
default:
|
||||||
|
case "latest" :
|
||||||
|
latest = selectionValue; break;
|
||||||
|
}
|
||||||
|
messageToSend = getDonationMessageToSend(commandContext.getGuild().getIdLong(), top, latest);
|
||||||
|
}
|
||||||
return FutureUtils.toSingleFutureGeneric(channelService.sendMessageToSendToChannel(messageToSend, commandContext.getChannel()))
|
return FutureUtils.toSingleFutureGeneric(channelService.sendMessageToSendToChannel(messageToSend, commandContext.getChannel()))
|
||||||
.thenApply(unused -> CommandResult.fromSuccess());
|
.thenApply(unused -> CommandResult.fromSuccess());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CompletableFuture<CommandResult> executeSlash(SlashCommandInteractionEvent event) {
|
public CompletableFuture<CommandResult> executeSlash(SlashCommandInteractionEvent event) {
|
||||||
MessageToSend messageToSend = getDonationMessageToSend();
|
String selectionType = null;
|
||||||
|
if(slashCommandParameterService.hasCommandOption(SELECTION_PARAMETER, event)) {
|
||||||
|
selectionType = slashCommandParameterService.getCommandOption(SELECTION_PARAMETER, event, String.class);
|
||||||
|
}
|
||||||
|
Integer selectionValue = 5;
|
||||||
|
if(slashCommandParameterService.hasCommandOption(SELECTION_VALUE_PARAMETER, event)) {
|
||||||
|
selectionValue = slashCommandParameterService.getCommandOption(SELECTION_VALUE_PARAMETER, event, Integer.class);
|
||||||
|
}
|
||||||
|
if(selectionValue > 20) {
|
||||||
|
selectionValue = 5;
|
||||||
|
}
|
||||||
|
Integer top = null;
|
||||||
|
Integer latest = null;
|
||||||
|
if(selectionType != null) {
|
||||||
|
switch (selectionType) {
|
||||||
|
case "top": top = selectionValue; break;
|
||||||
|
default:
|
||||||
|
case "latest" :
|
||||||
|
latest = selectionValue; break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
MessageToSend messageToSend = getDonationMessageToSend(event.getGuild().getIdLong(), top, latest);
|
||||||
return interactionService.replyMessageToSend(messageToSend, event)
|
return interactionService.replyMessageToSend(messageToSend, event)
|
||||||
.thenApply(interactionHook -> CommandResult.fromSuccess());
|
.thenApply(interactionHook -> CommandResult.fromSuccess());
|
||||||
}
|
}
|
||||||
|
|
||||||
private MessageToSend getDonationMessageToSend() {
|
private MessageToSend getDonationMessageToSend(Long serverId, Integer top, Integer latest) {
|
||||||
BigDecimal currentDonationAmount = donationService.fetchCurrentDonationAmount();
|
DonationsModel donationModel;
|
||||||
DonationsModel donationModel = DonationsModel
|
try {
|
||||||
.builder()
|
DonationsResponse donationResponse = donationService.fetchCurrentDonationAmount(serverId);
|
||||||
.donationAmount(currentDonationAmount)
|
donationModel = donationConverter.convertDonationResponse(donationResponse);
|
||||||
.build();
|
if(top != null) {
|
||||||
|
donationModel.setDonations(donationService.getHighestDonations(donationResponse, top));
|
||||||
|
donationModel.setType(DonationsModel.DonationType.TOP);
|
||||||
|
} else if(latest != null) {
|
||||||
|
donationModel.setType(DonationsModel.DonationType.LATEST);
|
||||||
|
donationModel.setDonations(donationService.getLatestDonations(donationResponse, latest));
|
||||||
|
} else {
|
||||||
|
donationModel.setDonations(new ArrayList<>());
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new AbstractoRunTimeException("Failed to load donation amount.", e);
|
||||||
|
}
|
||||||
return templateService.renderEmbedTemplate(DONATIONS_RESPONSE_TEMPLATE_KEY, donationModel);
|
return templateService.renderEmbedTemplate(DONATIONS_RESPONSE_TEMPLATE_KEY, donationModel);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -77,15 +142,35 @@ public class Donations extends AbstractConditionableCommand {
|
|||||||
.builder()
|
.builder()
|
||||||
.enabled(true)
|
.enabled(true)
|
||||||
.rootCommandName(DebraSlashCommandNames.DEBRA)
|
.rootCommandName(DebraSlashCommandNames.DEBRA)
|
||||||
.commandName("donations")
|
.commandName(DONATIONS_COMMAND_NAME)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
|
Parameter selectionParameter = Parameter
|
||||||
|
.builder()
|
||||||
|
.templated(true)
|
||||||
|
.name(SELECTION_PARAMETER)
|
||||||
|
.optional(true)
|
||||||
|
.type(String.class)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
|
||||||
|
Parameter selectionValueParameter = Parameter
|
||||||
|
.builder()
|
||||||
|
.templated(true)
|
||||||
|
.name(SELECTION_VALUE_PARAMETER)
|
||||||
|
.optional(true)
|
||||||
|
.type(Integer.class)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
List<Parameter> parameters = Arrays.asList(selectionParameter, selectionValueParameter);
|
||||||
|
|
||||||
return CommandConfiguration.builder()
|
return CommandConfiguration.builder()
|
||||||
.name(DONATIONS_COMMAND_NAME)
|
.name(DONATIONS_COMMAND_NAME)
|
||||||
.module(UtilityModuleDefinition.UTILITY)
|
.module(UtilityModuleDefinition.UTILITY)
|
||||||
.templated(true)
|
.templated(true)
|
||||||
.slashCommandConfig(slashCommandConfig)
|
.slashCommandConfig(slashCommandConfig)
|
||||||
.async(true)
|
.async(true)
|
||||||
|
.parameters(parameters)
|
||||||
.supportsEmbedException(true)
|
.supportsEmbedException(true)
|
||||||
.causesReaction(false)
|
.causesReaction(false)
|
||||||
.help(helpInfo)
|
.help(helpInfo)
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ import java.util.List;
|
|||||||
public class DebraFeatureConfig implements FeatureConfig {
|
public class DebraFeatureConfig implements FeatureConfig {
|
||||||
|
|
||||||
public static final String DEBRA_DONATION_NOTIFICATION_DELAY_CONFIG_KEY = "debraDonationNotificationDelayMillis";
|
public static final String DEBRA_DONATION_NOTIFICATION_DELAY_CONFIG_KEY = "debraDonationNotificationDelayMillis";
|
||||||
|
public static final String DEBRA_DONATION_API_FETCH_SIZE_KEY = "debraDonationApiFetchSize";
|
||||||
public static final String DEBRA_DONATION_NOTIFICATION_SERVER_ID_ENV_NAME = "DEBRA_DONATION_NOTIFICATION_SERVER_ID";
|
public static final String DEBRA_DONATION_NOTIFICATION_SERVER_ID_ENV_NAME = "DEBRA_DONATION_NOTIFICATION_SERVER_ID";
|
||||||
@Override
|
@Override
|
||||||
public FeatureDefinition getFeature() {
|
public FeatureDefinition getFeature() {
|
||||||
@@ -25,6 +26,6 @@ public class DebraFeatureConfig implements FeatureConfig {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<String> getRequiredSystemConfigKeys() {
|
public List<String> getRequiredSystemConfigKeys() {
|
||||||
return Arrays.asList(DEBRA_DONATION_NOTIFICATION_DELAY_CONFIG_KEY);
|
return Arrays.asList(DEBRA_DONATION_NOTIFICATION_DELAY_CONFIG_KEY, DEBRA_DONATION_API_FETCH_SIZE_KEY);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,5 +11,5 @@ import org.springframework.context.annotation.Configuration;
|
|||||||
@ConfigurationProperties(prefix = "sissi.debra")
|
@ConfigurationProperties(prefix = "sissi.debra")
|
||||||
public class DebraProperties {
|
public class DebraProperties {
|
||||||
private String websocketURL;
|
private String websocketURL;
|
||||||
private String donationsPageURL;
|
private String donationAPIUrl;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,28 @@
|
|||||||
|
package dev.sheldan.sissi.module.debra.converter;
|
||||||
|
|
||||||
|
import dev.sheldan.sissi.module.debra.model.api.Donation;
|
||||||
|
import dev.sheldan.sissi.module.debra.model.api.DonationsResponse;
|
||||||
|
import dev.sheldan.sissi.module.debra.model.commands.DonationItemModel;
|
||||||
|
import dev.sheldan.sissi.module.debra.model.commands.DonationsModel;
|
||||||
|
import org.apache.commons.lang3.BooleanUtils;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
public class DonationConverter {
|
||||||
|
public DonationItemModel convertDonation(Donation donation) {
|
||||||
|
return DonationItemModel
|
||||||
|
.builder()
|
||||||
|
.donationAmount(donation.getAmount())
|
||||||
|
.firstName(donation.getFirstname())
|
||||||
|
.lastName(donation.getLastname())
|
||||||
|
.anonymous(BooleanUtils.toBoolean(donation.getAnonym()))
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
public DonationsModel convertDonationResponse(DonationsResponse response) {
|
||||||
|
return DonationsModel
|
||||||
|
.builder()
|
||||||
|
.totalAmount(response.getPage().getCollected())
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -3,7 +3,7 @@ package dev.sheldan.sissi.module.debra.listener;
|
|||||||
import dev.sheldan.abstracto.core.listener.AsyncStartupListener;
|
import dev.sheldan.abstracto.core.listener.AsyncStartupListener;
|
||||||
import dev.sheldan.abstracto.core.service.ConfigService;
|
import dev.sheldan.abstracto.core.service.ConfigService;
|
||||||
import dev.sheldan.sissi.module.debra.config.DebraProperties;
|
import dev.sheldan.sissi.module.debra.config.DebraProperties;
|
||||||
import dev.sheldan.sissi.module.debra.model.Donation;
|
import dev.sheldan.sissi.module.debra.model.listener.DonationResponseModel;
|
||||||
import dev.sheldan.sissi.module.debra.service.DonationService;
|
import dev.sheldan.sissi.module.debra.service.DonationService;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import okhttp3.*;
|
import okhttp3.*;
|
||||||
@@ -49,7 +49,7 @@ public class WebsocketListener extends WebSocketListener implements AsyncStartup
|
|||||||
log.info("Waiting {} milli seconds to send notification.", delayMillis);
|
log.info("Waiting {} milli seconds to send notification.", delayMillis);
|
||||||
Thread.sleep(delayMillis);
|
Thread.sleep(delayMillis);
|
||||||
log.info("Loading new donation amount and sending notification.");
|
log.info("Loading new donation amount and sending notification.");
|
||||||
Donation donation = donationService.parseDonationFromMessage(text);
|
DonationResponseModel donation = donationService.parseDonationFromMessage(text);
|
||||||
donationService.sendDonationNotification(donation).thenAccept(unused -> {
|
donationService.sendDonationNotification(donation).thenAccept(unused -> {
|
||||||
log.info("Successfully notified about donation.");
|
log.info("Successfully notified about donation.");
|
||||||
}).exceptionally(throwable -> {
|
}).exceptionally(throwable -> {
|
||||||
@@ -65,13 +65,10 @@ public class WebsocketListener extends WebSocketListener implements AsyncStartup
|
|||||||
@Override
|
@Override
|
||||||
public void onFailure(WebSocket webSocket, Throwable t, @Nullable Response response) {
|
public void onFailure(WebSocket webSocket, Throwable t, @Nullable Response response) {
|
||||||
log.warn("Websocket connection failed...", t);
|
log.warn("Websocket connection failed...", t);
|
||||||
webSocket.close(1000, null);
|
|
||||||
webSocket.close(1000, "Connection closed");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onClosing(WebSocket webSocket, int code, String reason) {
|
public void onClosing(WebSocket webSocket, int code, String reason) {
|
||||||
webSocket.close(1000, null);
|
|
||||||
log.info("Closing websocket connection. It was closed with code {} and reason {}.", code, reason);
|
log.info("Closing websocket connection. It was closed with code {} and reason {}.", code, reason);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,20 @@
|
|||||||
|
package dev.sheldan.sissi.module.debra.model.api;
|
||||||
|
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
@Builder
|
||||||
|
public class Description {
|
||||||
|
private BigDecimal collected;
|
||||||
|
private BigDecimal target;
|
||||||
|
private String currency;
|
||||||
|
private String slug;
|
||||||
|
private String displayName;
|
||||||
|
private BigDecimal collectedNet;
|
||||||
|
private BigDecimal percent;
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
package dev.sheldan.sissi.module.debra.model.api;
|
||||||
|
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
@Builder
|
||||||
|
public class Donation {
|
||||||
|
private BigDecimal amount;
|
||||||
|
private String currency;
|
||||||
|
private String text;
|
||||||
|
private Integer anonym;
|
||||||
|
private String firstname;
|
||||||
|
private String lastname;
|
||||||
|
}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
package dev.sheldan.sissi.module.debra.model.api;
|
||||||
|
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
|
||||||
|
import java.math.BigInteger;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
@Builder
|
||||||
|
public class DonationsResponse {
|
||||||
|
private Description page;
|
||||||
|
private BigInteger donationCount;
|
||||||
|
private List<Donation> donations;
|
||||||
|
}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
package dev.sheldan.sissi.module.debra.model.commands;
|
||||||
|
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Builder
|
||||||
|
public class DonationItemModel {
|
||||||
|
private String firstName;
|
||||||
|
private String lastName;
|
||||||
|
private BigDecimal donationAmount;
|
||||||
|
private Boolean anonymous;
|
||||||
|
}
|
||||||
@@ -2,11 +2,21 @@ package dev.sheldan.sissi.module.debra.model.commands;
|
|||||||
|
|
||||||
import lombok.Builder;
|
import lombok.Builder;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
@Builder
|
@Builder
|
||||||
|
@Setter
|
||||||
public class DonationsModel {
|
public class DonationsModel {
|
||||||
private BigDecimal donationAmount;
|
private BigDecimal totalAmount;
|
||||||
|
private DonationType type;
|
||||||
|
private List<DonationItemModel> donations;
|
||||||
|
|
||||||
|
public enum DonationType {
|
||||||
|
LATEST, TOP
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
package dev.sheldan.sissi.module.debra.model.listener;
|
package dev.sheldan.sissi.module.debra.model.listener;
|
||||||
|
|
||||||
import dev.sheldan.sissi.module.debra.model.Donation;
|
|
||||||
import lombok.Builder;
|
import lombok.Builder;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
|
|
||||||
@@ -9,6 +8,6 @@ import java.math.BigDecimal;
|
|||||||
@Getter
|
@Getter
|
||||||
@Builder
|
@Builder
|
||||||
public class DonationNotificationModel {
|
public class DonationNotificationModel {
|
||||||
private Donation donation;
|
private DonationResponseModel donation;
|
||||||
private BigDecimal totalDonationAmount;
|
private BigDecimal totalDonationAmount;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
package dev.sheldan.sissi.module.debra.model;
|
package dev.sheldan.sissi.module.debra.model.listener;
|
||||||
|
|
||||||
import lombok.Builder;
|
import lombok.Builder;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
@@ -9,7 +9,7 @@ import java.math.BigDecimal;
|
|||||||
@Getter
|
@Getter
|
||||||
@Builder
|
@Builder
|
||||||
@ToString
|
@ToString
|
||||||
public class Donation {
|
public class DonationResponseModel {
|
||||||
private String donatorName;
|
private String donatorName;
|
||||||
private BigDecimal amount;
|
private BigDecimal amount;
|
||||||
private String message;
|
private String message;
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
package dev.sheldan.sissi.module.debra.service;
|
||||||
|
|
||||||
|
import com.google.gson.JsonDeserializationContext;
|
||||||
|
import com.google.gson.JsonDeserializer;
|
||||||
|
import com.google.gson.JsonElement;
|
||||||
|
import com.google.gson.JsonParseException;
|
||||||
|
|
||||||
|
import java.lang.reflect.Type;
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
|
||||||
|
public class BigDecimalGsonAdapter implements JsonDeserializer<BigDecimal> {
|
||||||
|
@Override
|
||||||
|
public BigDecimal deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
|
||||||
|
try {
|
||||||
|
return new BigDecimal(json.getAsString()
|
||||||
|
.replace(".", "")
|
||||||
|
.replace(',', '.'));
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
throw new JsonParseException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1,8 @@
|
|||||||
package dev.sheldan.sissi.module.debra.service;
|
package dev.sheldan.sissi.module.debra.service;
|
||||||
|
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.google.gson.GsonBuilder;
|
||||||
|
import dev.sheldan.abstracto.core.service.ConfigService;
|
||||||
import dev.sheldan.abstracto.core.service.PostTargetService;
|
import dev.sheldan.abstracto.core.service.PostTargetService;
|
||||||
import dev.sheldan.abstracto.core.templating.model.MessageToSend;
|
import dev.sheldan.abstracto.core.templating.model.MessageToSend;
|
||||||
import dev.sheldan.abstracto.core.templating.service.TemplateService;
|
import dev.sheldan.abstracto.core.templating.service.TemplateService;
|
||||||
@@ -7,25 +10,32 @@ import dev.sheldan.abstracto.core.utils.FutureUtils;
|
|||||||
import dev.sheldan.sissi.module.debra.DonationAmountNotFoundException;
|
import dev.sheldan.sissi.module.debra.DonationAmountNotFoundException;
|
||||||
import dev.sheldan.sissi.module.debra.config.DebraPostTarget;
|
import dev.sheldan.sissi.module.debra.config.DebraPostTarget;
|
||||||
import dev.sheldan.sissi.module.debra.config.DebraProperties;
|
import dev.sheldan.sissi.module.debra.config.DebraProperties;
|
||||||
import dev.sheldan.sissi.module.debra.model.Donation;
|
import dev.sheldan.sissi.module.debra.converter.DonationConverter;
|
||||||
|
import dev.sheldan.sissi.module.debra.model.api.Donation;
|
||||||
|
import dev.sheldan.sissi.module.debra.model.api.DonationsResponse;
|
||||||
|
import dev.sheldan.sissi.module.debra.model.commands.DonationItemModel;
|
||||||
|
import dev.sheldan.sissi.module.debra.model.commands.DonationsModel;
|
||||||
|
import dev.sheldan.sissi.module.debra.model.listener.DonationResponseModel;
|
||||||
import dev.sheldan.sissi.module.debra.model.listener.DonationNotificationModel;
|
import dev.sheldan.sissi.module.debra.model.listener.DonationNotificationModel;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import net.dv8tion.jda.api.entities.Message;
|
import net.dv8tion.jda.api.entities.Message;
|
||||||
|
import okhttp3.OkHttpClient;
|
||||||
|
import okhttp3.Request;
|
||||||
|
import okhttp3.Response;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
|
||||||
import java.io.InputStreamReader;
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.net.URL;
|
import java.util.Comparator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.concurrent.CompletableFuture;
|
import java.util.concurrent.CompletableFuture;
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import static dev.sheldan.sissi.module.debra.config.DebraFeatureConfig.DEBRA_DONATION_API_FETCH_SIZE_KEY;
|
||||||
import static dev.sheldan.sissi.module.debra.config.DebraFeatureConfig.DEBRA_DONATION_NOTIFICATION_SERVER_ID_ENV_NAME;
|
import static dev.sheldan.sissi.module.debra.config.DebraFeatureConfig.DEBRA_DONATION_NOTIFICATION_SERVER_ID_ENV_NAME;
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
@@ -41,19 +51,27 @@ public class DonationService {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private TemplateService templateService;
|
private TemplateService templateService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private OkHttpClient okHttpClient;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private DonationConverter donationConverter;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ConfigService configService;
|
||||||
|
|
||||||
private static final String DEBRA_DONATION_NOTIFICATION_TEMPLATE_KEY = "debra_donation_notification";
|
private static final String DEBRA_DONATION_NOTIFICATION_TEMPLATE_KEY = "debra_donation_notification";
|
||||||
|
|
||||||
private static final Pattern MESSAGE_PATTERN = Pattern.compile("(.*) hat (\\d{1,9},\\d{2}) Euro gespendet!<br \\/>Vielen Dank!<br \\/>Nachricht:<br \\/>(.*)");
|
private static final Pattern MESSAGE_PATTERN = Pattern.compile("(.*) hat (\\d{1,9},\\d{2}) Euro gespendet!<br \\/>Vielen Dank!<br \\/>Nachricht:<br \\/>(.*)");
|
||||||
private static final Pattern DONATION_PAGE_AMOUNT_PARTNER = Pattern.compile("\"metric4\",\\s*\"(.*)\"");
|
|
||||||
|
|
||||||
public Donation parseDonationFromMessage(String message) {
|
public DonationResponseModel parseDonationFromMessage(String message) {
|
||||||
Matcher matcher = MESSAGE_PATTERN.matcher(message);
|
Matcher matcher = MESSAGE_PATTERN.matcher(message);
|
||||||
if (matcher.find()) {
|
if (matcher.find()) {
|
||||||
String donatorName = matcher.group(1);
|
String donatorName = matcher.group(1);
|
||||||
String amountString = matcher.group(2);
|
String amountString = matcher.group(2);
|
||||||
BigDecimal amount = new BigDecimal(amountString.replace(',', '.'));
|
BigDecimal amount = new BigDecimal(amountString.replace(',', '.'));
|
||||||
String donationMessage = Optional.ofNullable(matcher.group(3)).map(msg -> msg.replaceAll("(<br>)+", " ")).map(String::trim).orElse("");
|
String donationMessage = Optional.ofNullable(matcher.group(3)).map(msg -> msg.replaceAll("(<br>)+", " ")).map(String::trim).orElse("");
|
||||||
return Donation
|
return DonationResponseModel
|
||||||
.builder()
|
.builder()
|
||||||
.message(donationMessage)
|
.message(donationMessage)
|
||||||
.donatorName(donatorName)
|
.donatorName(donatorName)
|
||||||
@@ -64,32 +82,67 @@ public class DonationService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public BigDecimal fetchCurrentDonationAmount() {
|
public List<DonationItemModel> getHighestDonations(DonationsResponse response, Integer maxCount) {
|
||||||
try (InputStream is = new URL(debraProperties.getDonationsPageURL()).openStream()) {
|
List<Donation> topDonations = response
|
||||||
BufferedReader br = new BufferedReader(new InputStreamReader(is));
|
.getDonations()
|
||||||
String line;
|
.stream()
|
||||||
while ((line = br.readLine()) != null) {
|
.sorted(Comparator.comparing(Donation::getAmount)
|
||||||
Matcher matcher = DONATION_PAGE_AMOUNT_PARTNER.matcher(line);
|
.reversed())
|
||||||
if (matcher.find()) {
|
.collect(Collectors.toList());
|
||||||
return new BigDecimal(matcher.group(1).replace(',', '.'));
|
return topDonations
|
||||||
}
|
.stream()
|
||||||
}
|
.limit(maxCount)
|
||||||
log.warn("Did not find the donation amount in the configured URL {}", debraProperties.getDonationsPageURL());
|
.map(donation -> donationConverter.convertDonation(donation))
|
||||||
throw new DonationAmountNotFoundException();
|
.collect(Collectors.toList());
|
||||||
} catch (IOException ex) {
|
|
||||||
log.warn("Failed to load page for parsing donation amount {}.", debraProperties.getDonationsPageURL(), ex);
|
|
||||||
throw new DonationAmountNotFoundException();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public CompletableFuture<Void> sendDonationNotification(Donation donation) {
|
public List<DonationItemModel> getLatestDonations(DonationsResponse response, Integer maxCount) {
|
||||||
|
return response
|
||||||
|
.getDonations()
|
||||||
|
.stream()
|
||||||
|
.limit(maxCount)
|
||||||
|
.map(donation -> donationConverter.convertDonation(donation))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
public DonationsResponse fetchCurrentDonationAmount(Long serverId) throws IOException {
|
||||||
|
Long fetchSize = configService.getLongValueOrConfigDefault(DEBRA_DONATION_API_FETCH_SIZE_KEY, serverId);
|
||||||
|
Request request = new Request.Builder()
|
||||||
|
.url(String.format(debraProperties.getDonationAPIUrl(), fetchSize))
|
||||||
|
.get()
|
||||||
|
.build();
|
||||||
|
Response response = okHttpClient.newCall(request).execute();
|
||||||
|
if(!response.isSuccessful()) {
|
||||||
|
if (log.isDebugEnabled()) {
|
||||||
|
log.error("Failed to retrieve urban dictionary definition. Response had code {} with body {}.",
|
||||||
|
response.code(), response.body());
|
||||||
|
}
|
||||||
|
throw new DonationAmountNotFoundException();
|
||||||
|
}
|
||||||
|
Gson gson = getGson();
|
||||||
|
|
||||||
|
return gson.fromJson(response.body().string(), DonationsResponse.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Gson getGson() {
|
||||||
|
return new GsonBuilder()
|
||||||
|
.registerTypeAdapter(BigDecimal.class, new BigDecimalGsonAdapter())
|
||||||
|
.create();
|
||||||
|
}
|
||||||
|
|
||||||
|
private DonationsModel getDonationInfoModel(Long serverId) throws IOException {
|
||||||
|
return donationConverter.convertDonationResponse(fetchCurrentDonationAmount(serverId));
|
||||||
|
}
|
||||||
|
|
||||||
|
public CompletableFuture<Void> sendDonationNotification(DonationResponseModel donation) throws IOException {
|
||||||
|
Long targetServerId = Long.parseLong(System.getenv(DEBRA_DONATION_NOTIFICATION_SERVER_ID_ENV_NAME));
|
||||||
|
DonationsModel donationInfoModel = getDonationInfoModel(targetServerId);
|
||||||
DonationNotificationModel model = DonationNotificationModel
|
DonationNotificationModel model = DonationNotificationModel
|
||||||
.builder()
|
.builder()
|
||||||
.donation(donation)
|
.donation(donation)
|
||||||
.totalDonationAmount(fetchCurrentDonationAmount())
|
.totalDonationAmount(donationInfoModel.getTotalAmount())
|
||||||
.build();
|
.build();
|
||||||
MessageToSend messageToSend = templateService.renderEmbedTemplate(DEBRA_DONATION_NOTIFICATION_TEMPLATE_KEY, model);
|
MessageToSend messageToSend = templateService.renderEmbedTemplate(DEBRA_DONATION_NOTIFICATION_TEMPLATE_KEY, model);
|
||||||
Long targetServerId = Long.parseLong(System.getenv(DEBRA_DONATION_NOTIFICATION_SERVER_ID_ENV_NAME));
|
|
||||||
List<CompletableFuture<Message>> firstMessage = postTargetService.sendEmbedInPostTarget(messageToSend, DebraPostTarget.DEBRA_DONATION_NOTIFICATION, targetServerId);
|
List<CompletableFuture<Message>> firstMessage = postTargetService.sendEmbedInPostTarget(messageToSend, DebraPostTarget.DEBRA_DONATION_NOTIFICATION, targetServerId);
|
||||||
List<CompletableFuture<Message>> secondMessage = postTargetService.sendEmbedInPostTarget(messageToSend, DebraPostTarget.DEBRA_DONATION_NOTIFICATION2, targetServerId);
|
List<CompletableFuture<Message>> secondMessage = postTargetService.sendEmbedInPostTarget(messageToSend, DebraPostTarget.DEBRA_DONATION_NOTIFICATION2, targetServerId);
|
||||||
firstMessage.addAll(secondMessage);
|
firstMessage.addAll(secondMessage);
|
||||||
|
|||||||
@@ -5,7 +5,10 @@ abstracto.postTargets.debraDonationNotification.name=debraDonationNotification
|
|||||||
abstracto.postTargets.debraDonationNotification2.name=debraDonationNotification2
|
abstracto.postTargets.debraDonationNotification2.name=debraDonationNotification2
|
||||||
|
|
||||||
sissi.debra.websocketURL=ws://spenden.baba.fm:8765/
|
sissi.debra.websocketURL=ws://spenden.baba.fm:8765/
|
||||||
sissi.debra.donationsPageURL=https://em.altruja.de/discord-fuer-debra-2022
|
sissi.debra.donationAPIUrl=https://www.altruja.de/api/page/discord-fuer-debra-2022?details=1&num=%s&ort=0
|
||||||
|
|
||||||
abstracto.systemConfigs.debraDonationNotificationDelayMillis.name=debraDonationNotificationDelayMillis
|
abstracto.systemConfigs.debraDonationNotificationDelayMillis.name=debraDonationNotificationDelayMillis
|
||||||
abstracto.systemConfigs.debraDonationNotificationDelayMillis.longValue=60000
|
abstracto.systemConfigs.debraDonationNotificationDelayMillis.longValue=60000
|
||||||
|
|
||||||
|
abstracto.systemConfigs.debraDonationApiFetchSize.name=debraDonationApiFetchSize
|
||||||
|
abstracto.systemConfigs.debraDonationApiFetchSize.longValue=1000
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>dev.sheldan.sissi.application</groupId>
|
<groupId>dev.sheldan.sissi.application</groupId>
|
||||||
<artifactId>sissi-modules</artifactId>
|
<artifactId>sissi-modules</artifactId>
|
||||||
<version>1.3.14</version>
|
<version>1.3.21</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,158 @@
|
|||||||
|
package dev.sheldan.sissi.module.meetup.commands;
|
||||||
|
|
||||||
|
import dev.sheldan.abstracto.core.command.UtilityModuleDefinition;
|
||||||
|
import dev.sheldan.abstracto.core.command.condition.AbstractConditionableCommand;
|
||||||
|
import dev.sheldan.abstracto.core.command.config.CommandConfiguration;
|
||||||
|
import dev.sheldan.abstracto.core.command.config.HelpInfo;
|
||||||
|
import dev.sheldan.abstracto.core.command.config.Parameter;
|
||||||
|
import dev.sheldan.abstracto.core.command.execution.CommandContext;
|
||||||
|
import dev.sheldan.abstracto.core.command.execution.CommandResult;
|
||||||
|
import dev.sheldan.abstracto.core.config.FeatureDefinition;
|
||||||
|
import dev.sheldan.abstracto.core.interaction.InteractionService;
|
||||||
|
import dev.sheldan.abstracto.core.interaction.slash.SlashCommandConfig;
|
||||||
|
import dev.sheldan.abstracto.core.interaction.slash.parameter.SlashCommandParameterService;
|
||||||
|
import dev.sheldan.sissi.module.meetup.config.MeetupFeatureDefinition;
|
||||||
|
import dev.sheldan.sissi.module.meetup.config.MeetupSlashCommandNames;
|
||||||
|
import dev.sheldan.sissi.module.meetup.exception.NotMeetupOrganizerException;
|
||||||
|
import dev.sheldan.sissi.module.meetup.model.database.Meetup;
|
||||||
|
import dev.sheldan.sissi.module.meetup.service.MeetupServiceBean;
|
||||||
|
import dev.sheldan.sissi.module.meetup.service.management.MeetupManagementServiceBean;
|
||||||
|
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.concurrent.CompletableFuture;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
public class ChangeMeetup extends AbstractConditionableCommand {
|
||||||
|
|
||||||
|
private static final String CHANGE_MEETUP_COMMAND = "changeMeetup";
|
||||||
|
private static final String MEETUP_ID_PARAMETER = "meetupId";
|
||||||
|
private static final String MEETUP_NEW_VALUE_PARAMETER = "newValue";
|
||||||
|
private static final String MEETUP_PROPERTY_PARAMETER = "property";
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private SlashCommandParameterService slashCommandParameterService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private MeetupManagementServiceBean meetupManagementServiceBean;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private MeetupServiceBean meetupServiceBean;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private InteractionService interactionService;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CompletableFuture<CommandResult> executeAsync(CommandContext commandContext) {
|
||||||
|
List<Object> parameters = commandContext.getParameters().getParameters();
|
||||||
|
Long meetupId = (Long) parameters.get(0);
|
||||||
|
Meetup meetup = meetupManagementServiceBean.getMeetup(meetupId, commandContext.getGuild().getIdLong());
|
||||||
|
if(!meetup.getOrganizer().getUserReference().getId().equals(commandContext.getAuthor().getIdLong())) {
|
||||||
|
throw new NotMeetupOrganizerException();
|
||||||
|
}
|
||||||
|
String property = (String) parameters.get(1);
|
||||||
|
MeetupProperty propertyEnum = MeetupProperty.valueOf(property);
|
||||||
|
String newValue = (String) parameters.get(2);
|
||||||
|
return updateMeetup(meetup, propertyEnum, newValue).thenApply(unused -> CommandResult.fromSuccess());
|
||||||
|
}
|
||||||
|
|
||||||
|
private CompletableFuture<Void> updateMeetup(Meetup meetup, MeetupProperty propertyEnum, String newValue) {
|
||||||
|
CompletableFuture<Void> future;
|
||||||
|
switch (propertyEnum) {
|
||||||
|
case TOPIC:
|
||||||
|
future = meetupServiceBean.changeMeetupTopic(meetup, newValue);
|
||||||
|
break;
|
||||||
|
case LOCATION:
|
||||||
|
future = meetupServiceBean.changeMeetupLocation(meetup, newValue);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
case DESCRIPTION:
|
||||||
|
future = meetupServiceBean.changeMeetupDescription(meetup, newValue);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return future;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CompletableFuture<CommandResult> executeSlash(SlashCommandInteractionEvent event) {
|
||||||
|
Long meetupId = slashCommandParameterService.getCommandOption(MEETUP_ID_PARAMETER, event, Integer.class).longValue();
|
||||||
|
Meetup meetup = meetupManagementServiceBean.getMeetup(meetupId, event.getGuild().getIdLong());
|
||||||
|
if(!meetup.getOrganizer().getUserReference().getId().equals(event.getMember().getIdLong())) {
|
||||||
|
throw new NotMeetupOrganizerException();
|
||||||
|
}
|
||||||
|
String newValue = slashCommandParameterService.getCommandOption(MEETUP_NEW_VALUE_PARAMETER, event, String.class);
|
||||||
|
String property = slashCommandParameterService.getCommandOption(MEETUP_PROPERTY_PARAMETER, event, String.class);
|
||||||
|
MeetupProperty propertyEnum = MeetupProperty.valueOf(property);
|
||||||
|
return updateMeetup(meetup, propertyEnum, newValue)
|
||||||
|
.thenCompose(commandResult -> interactionService.replyEmbed("changeMeetup_response", event))
|
||||||
|
.thenApply(unused -> CommandResult.fromSuccess());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CommandConfiguration getConfiguration() {
|
||||||
|
Parameter meetupIdParameter = Parameter
|
||||||
|
.builder()
|
||||||
|
.templated(true)
|
||||||
|
.name(MEETUP_ID_PARAMETER)
|
||||||
|
.type(Long.class)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
List<String> meetupProperties = Arrays
|
||||||
|
.stream(MeetupProperty.values())
|
||||||
|
.map(Enum::name)
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
|
Parameter meetupPropertyParameter = Parameter
|
||||||
|
.builder()
|
||||||
|
.templated(true)
|
||||||
|
.name(MEETUP_PROPERTY_PARAMETER)
|
||||||
|
.type(String.class)
|
||||||
|
.choices(meetupProperties)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
Parameter newValueParameter = Parameter
|
||||||
|
.builder()
|
||||||
|
.templated(true)
|
||||||
|
.name(MEETUP_NEW_VALUE_PARAMETER)
|
||||||
|
.type(String.class)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
List<Parameter> parameters = Arrays.asList(meetupIdParameter, meetupPropertyParameter, newValueParameter);
|
||||||
|
HelpInfo helpInfo = HelpInfo
|
||||||
|
.builder()
|
||||||
|
.templated(true)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
SlashCommandConfig slashCommandConfig = SlashCommandConfig
|
||||||
|
.builder()
|
||||||
|
.enabled(true)
|
||||||
|
.rootCommandName(MeetupSlashCommandNames.MEETUP)
|
||||||
|
.commandName("changeMeetup")
|
||||||
|
.build();
|
||||||
|
|
||||||
|
return CommandConfiguration.builder()
|
||||||
|
.name(CHANGE_MEETUP_COMMAND)
|
||||||
|
.module(UtilityModuleDefinition.UTILITY)
|
||||||
|
.templated(true)
|
||||||
|
.async(true)
|
||||||
|
.slashCommandConfig(slashCommandConfig)
|
||||||
|
.supportsEmbedException(true)
|
||||||
|
.causesReaction(true)
|
||||||
|
.parameters(parameters)
|
||||||
|
.help(helpInfo)
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public FeatureDefinition getFeature() {
|
||||||
|
return MeetupFeatureDefinition.MEETUP;
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum MeetupProperty {
|
||||||
|
DESCRIPTION, TOPIC, LOCATION
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -71,6 +71,7 @@ public class CreateMeetup extends AbstractConditionableCommand {
|
|||||||
private static final String MEETUP_TIME_PARAMETER = "meetupTime";
|
private static final String MEETUP_TIME_PARAMETER = "meetupTime";
|
||||||
private static final String TOPIC_PARAMETER = "topic";
|
private static final String TOPIC_PARAMETER = "topic";
|
||||||
private static final String DESCRIPTION_PARAMETER = "description";
|
private static final String DESCRIPTION_PARAMETER = "description";
|
||||||
|
private static final String LOCATION_PARAMETER = "location";
|
||||||
private static final String CONFIRMATION_TEMPLATE = "createMeetup_confirmation";
|
private static final String CONFIRMATION_TEMPLATE = "createMeetup_confirmation";
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -86,7 +87,7 @@ public class CreateMeetup extends AbstractConditionableCommand {
|
|||||||
}
|
}
|
||||||
AUserInAServer organizer = userInServerManagementService.loadOrCreateUser(commandContext.getAuthor());
|
AUserInAServer organizer = userInServerManagementService.loadOrCreateUser(commandContext.getAuthor());
|
||||||
AChannel meetupChannel = channelManagementService.loadChannel(commandContext.getChannel().getIdLong());
|
AChannel meetupChannel = channelManagementService.loadChannel(commandContext.getChannel().getIdLong());
|
||||||
Meetup meetup = meetupManagementServiceBean.createMeetup(meetupTime, meetupTopic, description, organizer, meetupChannel);
|
Meetup meetup = meetupManagementServiceBean.createMeetup(meetupTime, meetupTopic, description, organizer, meetupChannel, null);
|
||||||
String confirmationId = componentService.generateComponentId();
|
String confirmationId = componentService.generateComponentId();
|
||||||
String cancelId = componentService.generateComponentId();
|
String cancelId = componentService.generateComponentId();
|
||||||
MeetupConfirmationModel model = MeetupConfirmationModel
|
MeetupConfirmationModel model = MeetupConfirmationModel
|
||||||
@@ -95,6 +96,7 @@ public class CreateMeetup extends AbstractConditionableCommand {
|
|||||||
.guildId(commandContext.getGuild().getIdLong())
|
.guildId(commandContext.getGuild().getIdLong())
|
||||||
.description(description)
|
.description(description)
|
||||||
.topic(meetupTopic)
|
.topic(meetupTopic)
|
||||||
|
.location(meetup.getLocation())
|
||||||
.confirmationId(confirmationId)
|
.confirmationId(confirmationId)
|
||||||
.cancelId(cancelId)
|
.cancelId(cancelId)
|
||||||
.meetupId(meetup.getId().getId())
|
.meetupId(meetup.getId().getId())
|
||||||
@@ -117,10 +119,17 @@ public class CreateMeetup extends AbstractConditionableCommand {
|
|||||||
} else {
|
} else {
|
||||||
description = "";
|
description = "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String location;
|
||||||
|
if(slashCommandParameterService.hasCommandOption(LOCATION_PARAMETER, event)) {
|
||||||
|
location = slashCommandParameterService.getCommandOption(LOCATION_PARAMETER, event, String.class);
|
||||||
|
} else {
|
||||||
|
location = null;
|
||||||
|
}
|
||||||
Instant meetupTime = Instant.ofEpochSecond(time);
|
Instant meetupTime = Instant.ofEpochSecond(time);
|
||||||
AUserInAServer organizer = userInServerManagementService.loadOrCreateUser(event.getMember());
|
AUserInAServer organizer = userInServerManagementService.loadOrCreateUser(event.getMember());
|
||||||
AChannel meetupChannel = channelManagementService.loadChannel(event.getChannel().getIdLong());
|
AChannel meetupChannel = channelManagementService.loadChannel(event.getChannel().getIdLong());
|
||||||
Meetup meetup = meetupManagementServiceBean.createMeetup(meetupTime, topic, description, organizer, meetupChannel);
|
Meetup meetup = meetupManagementServiceBean.createMeetup(meetupTime, topic, description, organizer, meetupChannel, location);
|
||||||
String confirmationId = componentService.generateComponentId();
|
String confirmationId = componentService.generateComponentId();
|
||||||
String cancelId = componentService.generateComponentId();
|
String cancelId = componentService.generateComponentId();
|
||||||
MeetupConfirmationModel model = MeetupConfirmationModel
|
MeetupConfirmationModel model = MeetupConfirmationModel
|
||||||
@@ -129,6 +138,7 @@ public class CreateMeetup extends AbstractConditionableCommand {
|
|||||||
.guildId(event.getGuild().getIdLong())
|
.guildId(event.getGuild().getIdLong())
|
||||||
.description(description)
|
.description(description)
|
||||||
.topic(topic)
|
.topic(topic)
|
||||||
|
.location(meetup.getLocation())
|
||||||
.confirmationId(confirmationId)
|
.confirmationId(confirmationId)
|
||||||
.cancelId(cancelId)
|
.cancelId(cancelId)
|
||||||
.meetupId(meetup.getId().getId())
|
.meetupId(meetup.getId().getId())
|
||||||
@@ -166,7 +176,17 @@ public class CreateMeetup extends AbstractConditionableCommand {
|
|||||||
.type(String.class)
|
.type(String.class)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
List<Parameter> parameters = Arrays.asList(timeParameter, topicParameter, descriptionParameter);
|
Parameter locationParameter = Parameter
|
||||||
|
.builder()
|
||||||
|
.templated(true)
|
||||||
|
.name(LOCATION_PARAMETER)
|
||||||
|
.remainder(true)
|
||||||
|
.optional(true)
|
||||||
|
.slashCommandOnly(true)
|
||||||
|
.type(String.class)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
List<Parameter> parameters = Arrays.asList(timeParameter, topicParameter, descriptionParameter, locationParameter);
|
||||||
HelpInfo helpInfo = HelpInfo
|
HelpInfo helpInfo = HelpInfo
|
||||||
.builder()
|
.builder()
|
||||||
.templated(true)
|
.templated(true)
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import dev.sheldan.sissi.module.meetup.config.MeetupFeatureDefinition;
|
|||||||
import dev.sheldan.sissi.module.meetup.config.MeetupSlashCommandNames;
|
import dev.sheldan.sissi.module.meetup.config.MeetupSlashCommandNames;
|
||||||
import dev.sheldan.sissi.module.meetup.exception.NotMeetupOrganizerException;
|
import dev.sheldan.sissi.module.meetup.exception.NotMeetupOrganizerException;
|
||||||
import dev.sheldan.sissi.module.meetup.model.database.Meetup;
|
import dev.sheldan.sissi.module.meetup.model.database.Meetup;
|
||||||
|
import dev.sheldan.sissi.module.meetup.model.database.MeetupDecision;
|
||||||
import dev.sheldan.sissi.module.meetup.service.MeetupServiceBean;
|
import dev.sheldan.sissi.module.meetup.service.MeetupServiceBean;
|
||||||
import dev.sheldan.sissi.module.meetup.service.management.MeetupManagementServiceBean;
|
import dev.sheldan.sissi.module.meetup.service.management.MeetupManagementServiceBean;
|
||||||
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
|
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
|
||||||
@@ -24,6 +25,7 @@ import org.springframework.stereotype.Component;
|
|||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.concurrent.CompletableFuture;
|
import java.util.concurrent.CompletableFuture;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
public class NotifyMeetupParticipants extends AbstractConditionableCommand {
|
public class NotifyMeetupParticipants extends AbstractConditionableCommand {
|
||||||
@@ -42,6 +44,7 @@ public class NotifyMeetupParticipants extends AbstractConditionableCommand {
|
|||||||
|
|
||||||
private static final String MEETUP_ID_PARAMETER = "meetupId";
|
private static final String MEETUP_ID_PARAMETER = "meetupId";
|
||||||
private static final String NOTIFICATION_MESSAGE_PARAMETER = "notificationMessage";
|
private static final String NOTIFICATION_MESSAGE_PARAMETER = "notificationMessage";
|
||||||
|
private static final String NOTIFICATION_MEETUP_DECISION = "decision";
|
||||||
private static final String NOTIFY_MEETUP_PARTICIPANTS_COMMAND = "notifyMeetupParticipants";
|
private static final String NOTIFY_MEETUP_PARTICIPANTS_COMMAND = "notifyMeetupParticipants";
|
||||||
private static final String NOTIFY_MEETUP_PARTICIPANTS_RESPONSE = "notifyMeetupParticipants_response";
|
private static final String NOTIFY_MEETUP_PARTICIPANTS_RESPONSE = "notifyMeetupParticipants_response";
|
||||||
|
|
||||||
@@ -54,7 +57,7 @@ public class NotifyMeetupParticipants extends AbstractConditionableCommand {
|
|||||||
throw new NotMeetupOrganizerException();
|
throw new NotMeetupOrganizerException();
|
||||||
}
|
}
|
||||||
String notificationMessage = (String) parameters.get(1);
|
String notificationMessage = (String) parameters.get(1);
|
||||||
return meetupServiceBean.notifyMeetupParticipants(meetup, notificationMessage)
|
return meetupServiceBean.notifyMeetupParticipants(meetup, notificationMessage, null)
|
||||||
.thenApply(unused -> CommandResult.fromSuccess());
|
.thenApply(unused -> CommandResult.fromSuccess());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -65,8 +68,12 @@ public class NotifyMeetupParticipants extends AbstractConditionableCommand {
|
|||||||
if(!meetup.getOrganizer().getUserReference().getId().equals(event.getMember().getIdLong())) {
|
if(!meetup.getOrganizer().getUserReference().getId().equals(event.getMember().getIdLong())) {
|
||||||
throw new NotMeetupOrganizerException();
|
throw new NotMeetupOrganizerException();
|
||||||
}
|
}
|
||||||
|
MeetupDecision toNotify = null;
|
||||||
|
if(slashCommandParameterService.hasCommandOption(NOTIFICATION_MEETUP_DECISION, event)) {
|
||||||
|
toNotify = MeetupDecision.valueOf(slashCommandParameterService.getCommandOption(NOTIFICATION_MEETUP_DECISION, event, String.class));
|
||||||
|
}
|
||||||
String notificationMessage = slashCommandParameterService.getCommandOption(NOTIFICATION_MESSAGE_PARAMETER, event, String.class);
|
String notificationMessage = slashCommandParameterService.getCommandOption(NOTIFICATION_MESSAGE_PARAMETER, event, String.class);
|
||||||
return meetupServiceBean.notifyMeetupParticipants(meetup, notificationMessage)
|
return meetupServiceBean.notifyMeetupParticipants(meetup, notificationMessage, toNotify)
|
||||||
.thenCompose(unused -> interactionService.replyEmbed(NOTIFY_MEETUP_PARTICIPANTS_RESPONSE, event))
|
.thenCompose(unused -> interactionService.replyEmbed(NOTIFY_MEETUP_PARTICIPANTS_RESPONSE, event))
|
||||||
.thenApply(unused -> CommandResult.fromSuccess());
|
.thenApply(unused -> CommandResult.fromSuccess());
|
||||||
}
|
}
|
||||||
@@ -88,7 +95,22 @@ public class NotifyMeetupParticipants extends AbstractConditionableCommand {
|
|||||||
.remainder(true)
|
.remainder(true)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
List<Parameter> parameters = Arrays.asList(meetupIdParameter, notificationMessage);
|
List<String> meetupDecisions = Arrays
|
||||||
|
.stream(MeetupDecision.values())
|
||||||
|
.map(Enum::name)
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
|
Parameter meetupDecisionChoice = Parameter
|
||||||
|
.builder()
|
||||||
|
.templated(true)
|
||||||
|
.name(NOTIFICATION_MEETUP_DECISION)
|
||||||
|
.type(String.class)
|
||||||
|
.optional(true)
|
||||||
|
.choices(meetupDecisions)
|
||||||
|
.slashCommandOnly(true)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
List<Parameter> parameters = Arrays.asList(meetupIdParameter, notificationMessage, meetupDecisionChoice);
|
||||||
HelpInfo helpInfo = HelpInfo
|
HelpInfo helpInfo = HelpInfo
|
||||||
.builder()
|
.builder()
|
||||||
.templated(true)
|
.templated(true)
|
||||||
|
|||||||
@@ -104,6 +104,10 @@ public class MeetupConfirmationListener implements ButtonClickedListener {
|
|||||||
messageModel.setNoId(noButtonId);
|
messageModel.setNoId(noButtonId);
|
||||||
messageModel.setMaybeId(maybeButtonId);
|
messageModel.setMaybeId(maybeButtonId);
|
||||||
messageModel.setNoTimeId(noTimeButtonId);
|
messageModel.setNoTimeId(noTimeButtonId);
|
||||||
|
meetup.setYesButtonId(yesButtonId);
|
||||||
|
meetup.setMaybeButtonId(maybeButtonId);
|
||||||
|
meetup.setNoTimeButtonId(noTimeButtonId);
|
||||||
|
meetup.setNotInterestedButtonId(noButtonId);
|
||||||
messageModel.setCancelled(false);
|
messageModel.setCancelled(false);
|
||||||
Long meetupId = payload.getMeetupId();
|
Long meetupId = payload.getMeetupId();
|
||||||
Long serverId = payload.getGuildId();
|
Long serverId = payload.getGuildId();
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ public class MeetupConfirmationModel {
|
|||||||
private MemberDisplay organizer;
|
private MemberDisplay organizer;
|
||||||
private Instant meetupTime;
|
private Instant meetupTime;
|
||||||
private Long meetupId;
|
private Long meetupId;
|
||||||
|
private String location;
|
||||||
private String topic;
|
private String topic;
|
||||||
private String description;
|
private String description;
|
||||||
private Long guildId;
|
private Long guildId;
|
||||||
|
|||||||
@@ -43,6 +43,26 @@ public class Meetup {
|
|||||||
@Column(name = "message_id")
|
@Column(name = "message_id")
|
||||||
private Long messageId;
|
private Long messageId;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Column(name = "location")
|
||||||
|
private String location;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Column(name = "yes_button_id")
|
||||||
|
private String yesButtonId;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Column(name = "maybe_button_id")
|
||||||
|
private String maybeButtonId;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Column(name = "no_time_button_id")
|
||||||
|
private String noTimeButtonId;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Column(name = "not_interested_button_id")
|
||||||
|
private String notInterestedButtonId;
|
||||||
|
|
||||||
@OneToMany(
|
@OneToMany(
|
||||||
fetch = FetchType.LAZY,
|
fetch = FetchType.LAZY,
|
||||||
orphanRemoval = true,
|
orphanRemoval = true,
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ public class MeetupMessageModel {
|
|||||||
private String topic;
|
private String topic;
|
||||||
private String description;
|
private String description;
|
||||||
private Instant meetupTime;
|
private Instant meetupTime;
|
||||||
|
private String location;
|
||||||
private MemberDisplay organizer;
|
private MemberDisplay organizer;
|
||||||
private Long meetupId;
|
private Long meetupId;
|
||||||
private String yesId;
|
private String yesId;
|
||||||
|
|||||||
@@ -11,4 +11,7 @@ import java.util.List;
|
|||||||
public class MeetupNotificationModel {
|
public class MeetupNotificationModel {
|
||||||
private List<MemberDisplay> participants;
|
private List<MemberDisplay> participants;
|
||||||
private String notificationMessage;
|
private String notificationMessage;
|
||||||
|
private Long meetupMessageId;
|
||||||
|
private String meetupTopic;
|
||||||
|
private Long meetupId;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package dev.sheldan.sissi.module.meetup.service;
|
package dev.sheldan.sissi.module.meetup.service;
|
||||||
|
|
||||||
|
import dev.sheldan.abstracto.core.exception.AbstractoRunTimeException;
|
||||||
import dev.sheldan.abstracto.core.interaction.ComponentPayloadManagementService;
|
import dev.sheldan.abstracto.core.interaction.ComponentPayloadManagementService;
|
||||||
import dev.sheldan.abstracto.core.interaction.ComponentPayloadService;
|
import dev.sheldan.abstracto.core.interaction.ComponentPayloadService;
|
||||||
import dev.sheldan.abstracto.core.models.ServerChannelMessage;
|
import dev.sheldan.abstracto.core.models.ServerChannelMessage;
|
||||||
@@ -33,6 +34,9 @@ import org.springframework.beans.factory.annotation.Autowired;
|
|||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
import java.io.UnsupportedEncodingException;
|
||||||
|
import java.net.URLEncoder;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.time.temporal.ChronoUnit;
|
import java.time.temporal.ChronoUnit;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
@@ -145,6 +149,11 @@ public class MeetupServiceBean {
|
|||||||
.builder()
|
.builder()
|
||||||
.description(meetup.getDescription())
|
.description(meetup.getDescription())
|
||||||
.topic(meetup.getTopic())
|
.topic(meetup.getTopic())
|
||||||
|
.location(meetup.getLocation())
|
||||||
|
.noTimeId(meetup.getNoTimeButtonId())
|
||||||
|
.yesId(meetup.getYesButtonId())
|
||||||
|
.maybeId(meetup.getMaybeButtonId())
|
||||||
|
.noId(meetup.getNotInterestedButtonId())
|
||||||
.meetupTime(meetup.getMeetupTime())
|
.meetupTime(meetup.getMeetupTime())
|
||||||
.meetupId(meetup.getId().getId())
|
.meetupId(meetup.getId().getId())
|
||||||
.participants(getMemberDisplays(participating))
|
.participants(getMemberDisplays(participating))
|
||||||
@@ -250,8 +259,8 @@ public class MeetupServiceBean {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public CompletableFuture<Void> notifyMeetupParticipants(Meetup meetup, String message) {
|
public CompletableFuture<Void> notifyMeetupParticipants(Meetup meetup, String message, MeetupDecision toNotify) {
|
||||||
List<MeetupDecision> decisionsToBeNotified = Arrays.asList(MeetupDecision.MAYBE, MeetupDecision.YES);
|
List<MeetupDecision> decisionsToBeNotified = toNotify == null ? Arrays.asList(MeetupDecision.MAYBE, MeetupDecision.YES) : Arrays.asList(toNotify);
|
||||||
List<MemberDisplay> participants = meetup
|
List<MemberDisplay> participants = meetup
|
||||||
.getParticipants()
|
.getParticipants()
|
||||||
.stream()
|
.stream()
|
||||||
@@ -262,6 +271,9 @@ public class MeetupServiceBean {
|
|||||||
MeetupNotificationModel model = MeetupNotificationModel
|
MeetupNotificationModel model = MeetupNotificationModel
|
||||||
.builder()
|
.builder()
|
||||||
.notificationMessage(message)
|
.notificationMessage(message)
|
||||||
|
.meetupId(meetup.getId().getId())
|
||||||
|
.meetupMessageId(meetup.getMessageId())
|
||||||
|
.meetupTopic(meetup.getTopic())
|
||||||
.participants(participants)
|
.participants(participants)
|
||||||
.build();
|
.build();
|
||||||
MessageChannel channel = channelService.getMessageChannelFromServer(meetup.getServer().getId(), meetup.getMeetupChannel().getId());
|
MessageChannel channel = channelService.getMessageChannelFromServer(meetup.getServer().getId(), meetup.getMeetupChannel().getId());
|
||||||
@@ -386,4 +398,37 @@ public class MeetupServiceBean {
|
|||||||
return null;
|
return null;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public CompletableFuture<Void> changeMeetupDescription(Meetup meetup, String newDescription) {
|
||||||
|
meetup.setDescription(newDescription);
|
||||||
|
return updateMeetupMessage(meetup);
|
||||||
|
}
|
||||||
|
|
||||||
|
public CompletableFuture<Void> changeMeetupLocation(Meetup meetup, String newLocation) {
|
||||||
|
try {
|
||||||
|
meetup.setLocation(URLEncoder.encode(newLocation, StandardCharsets.UTF_8.toString()));
|
||||||
|
} catch (UnsupportedEncodingException e) {
|
||||||
|
throw new AbstractoRunTimeException(e);
|
||||||
|
}
|
||||||
|
return updateMeetupMessage(meetup);
|
||||||
|
}
|
||||||
|
|
||||||
|
public CompletableFuture<Void> changeMeetupTopic(Meetup meetup, String newTopic) {
|
||||||
|
meetup.setTopic(newTopic);
|
||||||
|
return updateMeetupMessage(meetup);
|
||||||
|
}
|
||||||
|
|
||||||
|
private CompletableFuture<Void> updateMeetupMessage(Meetup meetup) {
|
||||||
|
Long meetupId = meetup.getId().getId();
|
||||||
|
Long serverId = meetup.getId().getServerId();
|
||||||
|
MeetupMessageModel meetupMessageModel = getMeetupMessageModel(meetup);
|
||||||
|
MessageToSend updatedMeetupMessage = getMeetupMessage(meetupMessageModel);
|
||||||
|
GuildMessageChannel meetupChannel = channelService.getMessageChannelFromServer(serverId, meetup.getMeetupChannel().getId());
|
||||||
|
return channelService.editMessageInAChannelFuture(updatedMeetupMessage, meetupChannel, meetup.getMessageId())
|
||||||
|
.thenAccept(message -> log.info("Updated message of meetup {} in channel {} in server {}.", meetupId, meetup.getMeetupChannel().getId(), serverId))
|
||||||
|
.exceptionally(throwable -> {
|
||||||
|
log.info("Failed to update message of meetup {} in channel {} in server {}.", meetupId, meetup.getMeetupChannel().getId(), serverId, throwable);
|
||||||
|
return null;
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package dev.sheldan.sissi.module.meetup.service.management;
|
package dev.sheldan.sissi.module.meetup.service.management;
|
||||||
|
|
||||||
|
import dev.sheldan.abstracto.core.exception.AbstractoRunTimeException;
|
||||||
import dev.sheldan.abstracto.core.models.ServerSpecificId;
|
import dev.sheldan.abstracto.core.models.ServerSpecificId;
|
||||||
import dev.sheldan.abstracto.core.models.database.AChannel;
|
import dev.sheldan.abstracto.core.models.database.AChannel;
|
||||||
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
|
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
|
||||||
@@ -12,6 +13,9 @@ import dev.sheldan.sissi.module.meetup.repository.MeetupRepository;
|
|||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.io.UnsupportedEncodingException;
|
||||||
|
import java.net.URLEncoder;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@@ -26,22 +30,28 @@ public class MeetupManagementServiceBean {
|
|||||||
|
|
||||||
public static final String MEETUP_COUNTER_KEY = "meetup";
|
public static final String MEETUP_COUNTER_KEY = "meetup";
|
||||||
|
|
||||||
public Meetup createMeetup(Instant timeStamp, String topic, String description, AUserInAServer organizer, AChannel meetupChannel) {
|
public Meetup createMeetup(Instant timeStamp, String topic, String description, AUserInAServer organizer, AChannel meetupChannel, String location) {
|
||||||
if(timeStamp.isBefore(Instant.now())) {
|
if(timeStamp.isBefore(Instant.now())) {
|
||||||
throw new MeetupPastTimeException();
|
throw new MeetupPastTimeException();
|
||||||
}
|
}
|
||||||
Long meetupId = counterService.getNextCounterValue(organizer.getServerReference(), MEETUP_COUNTER_KEY);
|
Long meetupId = counterService.getNextCounterValue(organizer.getServerReference(), MEETUP_COUNTER_KEY);
|
||||||
Meetup meetup = Meetup
|
Meetup meetup = null;
|
||||||
.builder()
|
try {
|
||||||
.meetupTime(timeStamp)
|
meetup = Meetup
|
||||||
.description(description)
|
.builder()
|
||||||
.topic(topic)
|
.meetupTime(timeStamp)
|
||||||
.organizer(organizer)
|
.description(description)
|
||||||
.server(organizer.getServerReference())
|
.topic(topic)
|
||||||
.meetupChannel(meetupChannel)
|
.location(URLEncoder.encode(location, StandardCharsets.UTF_8.toString()))
|
||||||
.state(MeetupState.NEW)
|
.organizer(organizer)
|
||||||
.id(new ServerSpecificId(organizer.getServerReference().getId(), meetupId))
|
.server(organizer.getServerReference())
|
||||||
.build();
|
.meetupChannel(meetupChannel)
|
||||||
|
.state(MeetupState.NEW)
|
||||||
|
.id(new ServerSpecificId(organizer.getServerReference().getId(), meetupId))
|
||||||
|
.build();
|
||||||
|
} catch (UnsupportedEncodingException e) {
|
||||||
|
throw new AbstractoRunTimeException(e);
|
||||||
|
}
|
||||||
return meetupRepository.save(meetup);
|
return meetupRepository.save(meetup);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,11 @@
|
|||||||
|
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
|
||||||
|
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
|
||||||
|
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
|
||||||
|
xmlns:pro="http://www.liquibase.org/xml/ns/pro"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog dbchangelog.xsd
|
||||||
|
http://www.liquibase.org/xml/ns/dbchangelog-ext dbchangelog.xsd
|
||||||
|
http://www.liquibase.org/xml/ns/pro dbchangelog.xsd" >
|
||||||
|
<include file="tables/tables.xml" relativeToChangelogFile="true"/>
|
||||||
|
<include file="seedData/data.xml" relativeToChangelogFile="true"/>
|
||||||
|
</databaseChangeLog>
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
|
||||||
|
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
|
||||||
|
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
|
||||||
|
xmlns:pro="http://www.liquibase.org/xml/ns/pro"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog dbchangelog.xsd
|
||||||
|
http://www.liquibase.org/xml/ns/dbchangelog-ext dbchangelog.xsd
|
||||||
|
http://www.liquibase.org/xml/ns/pro dbchangelog.xsd" >
|
||||||
|
<property name="utilityModule" value="(SELECT id FROM module WHERE name = 'utility')"/>
|
||||||
|
<property name="meetupFeature" value="(SELECT id FROM feature WHERE key = 'meetup')"/>
|
||||||
|
|
||||||
|
<changeSet author="Sheldan" id="meetup-change_command">
|
||||||
|
<insert tableName="command">
|
||||||
|
<column name="name" value="changeMeetup"/>
|
||||||
|
<column name="module_id" valueComputed="${utilityModule}"/>
|
||||||
|
<column name="feature_id" valueComputed="${meetupFeature}"/>
|
||||||
|
</insert>
|
||||||
|
</changeSet>
|
||||||
|
|
||||||
|
</databaseChangeLog>
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
|
||||||
|
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
|
||||||
|
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
|
||||||
|
xmlns:pro="http://www.liquibase.org/xml/ns/pro"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog dbchangelog.xsd
|
||||||
|
http://www.liquibase.org/xml/ns/dbchangelog-ext dbchangelog.xsd
|
||||||
|
http://www.liquibase.org/xml/ns/pro dbchangelog.xsd" >
|
||||||
|
<include file="command.xml" relativeToChangelogFile="true"/>
|
||||||
|
</databaseChangeLog>
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
|
||||||
|
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
|
||||||
|
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
|
||||||
|
xmlns:pro="http://www.liquibase.org/xml/ns/pro"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog dbchangelog.xsd
|
||||||
|
http://www.liquibase.org/xml/ns/dbchangelog-ext dbchangelog.xsd
|
||||||
|
http://www.liquibase.org/xml/ns/pro dbchangelog.xsd" >
|
||||||
|
<changeSet author="Sheldan" id="meetup-add_info_columns">
|
||||||
|
<addColumn tableName="meetup">
|
||||||
|
<column name="location" type="VARCHAR(100)" />
|
||||||
|
</addColumn>
|
||||||
|
<addColumn tableName="meetup">
|
||||||
|
<column name="yes_button_id" type="VARCHAR(100)" />
|
||||||
|
</addColumn>
|
||||||
|
<addColumn tableName="meetup">
|
||||||
|
<column name="maybe_button_id" type="VARCHAR(100)" />
|
||||||
|
</addColumn>
|
||||||
|
<addColumn tableName="meetup">
|
||||||
|
<column name="no_time_button_id" type="VARCHAR(100)" />
|
||||||
|
</addColumn>
|
||||||
|
<addColumn tableName="meetup">
|
||||||
|
<column name="not_interested_button_id" type="VARCHAR(100)" />
|
||||||
|
</addColumn>
|
||||||
|
</changeSet>
|
||||||
|
|
||||||
|
</databaseChangeLog>
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
|
||||||
|
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
|
||||||
|
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
|
||||||
|
xmlns:pro="http://www.liquibase.org/xml/ns/pro"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog dbchangelog.xsd
|
||||||
|
http://www.liquibase.org/xml/ns/dbchangelog-ext dbchangelog.xsd
|
||||||
|
http://www.liquibase.org/xml/ns/pro dbchangelog.xsd" >
|
||||||
|
<include file="meetup.xml" relativeToChangelogFile="true"/>
|
||||||
|
</databaseChangeLog>
|
||||||
@@ -8,4 +8,5 @@
|
|||||||
http://www.liquibase.org/xml/ns/pro dbchangelog.xsd" >
|
http://www.liquibase.org/xml/ns/pro dbchangelog.xsd" >
|
||||||
<include file="1.1.0/collection.xml" relativeToChangelogFile="true"/>
|
<include file="1.1.0/collection.xml" relativeToChangelogFile="true"/>
|
||||||
<include file="1.2.0/collection.xml" relativeToChangelogFile="true"/>
|
<include file="1.2.0/collection.xml" relativeToChangelogFile="true"/>
|
||||||
|
<include file="1.3.18/collection.xml" relativeToChangelogFile="true"/>
|
||||||
</databaseChangeLog>
|
</databaseChangeLog>
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>dev.sheldan.sissi.application</groupId>
|
<groupId>dev.sheldan.sissi.application</groupId>
|
||||||
<artifactId>application</artifactId>
|
<artifactId>application</artifactId>
|
||||||
<version>1.3.14</version>
|
<version>1.3.21</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>dev.sheldan.sissi.application</groupId>
|
<groupId>dev.sheldan.sissi.application</groupId>
|
||||||
<artifactId>sissi-modules</artifactId>
|
<artifactId>sissi-modules</artifactId>
|
||||||
<version>1.3.14</version>
|
<version>1.3.21</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>dev.sheldan.sissi</groupId>
|
<groupId>dev.sheldan.sissi</groupId>
|
||||||
<artifactId>deployment</artifactId>
|
<artifactId>deployment</artifactId>
|
||||||
<version>1.3.14</version>
|
<version>1.3.21</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@@ -31,4 +31,4 @@ DEBRA_DONATION_NOTIFICATION_SERVER_ID=0
|
|||||||
PGADMIN_DEFAULT_PASSWORD=admin
|
PGADMIN_DEFAULT_PASSWORD=admin
|
||||||
TOKEN=<INSERT TOKEN>
|
TOKEN=<INSERT TOKEN>
|
||||||
YOUTUBE_API_KEY=<INSERT KEY>
|
YOUTUBE_API_KEY=<INSERT KEY>
|
||||||
SISSI_VERSION=1.3.14
|
SISSI_VERSION=1.3.21
|
||||||
@@ -46,6 +46,7 @@ services:
|
|||||||
TOKEN: ${TOKEN}
|
TOKEN: ${TOKEN}
|
||||||
REMOTE_DEBUG: ${REMOTE_DEBUG}
|
REMOTE_DEBUG: ${REMOTE_DEBUG}
|
||||||
DB_PASS: ${DATABASE_PASSWORD}
|
DB_PASS: ${DATABASE_PASSWORD}
|
||||||
|
DEBRA_DONATION_NOTIFICATION_SERVER_ID: ${DEBRA_DONATION_NOTIFICATION_SERVER_ID}
|
||||||
DB_HOST: ${COMPOSE_PROJECT_NAME}_${DATABASE_HOST}
|
DB_HOST: ${COMPOSE_PROJECT_NAME}_${DATABASE_HOST}
|
||||||
DB_PORT: ${DATABASE_PORT}
|
DB_PORT: ${DATABASE_PORT}
|
||||||
DB_USER: ${DATABASE_USER}
|
DB_USER: ${DATABASE_USER}
|
||||||
@@ -143,4 +144,4 @@ volumes:
|
|||||||
db-data:
|
db-data:
|
||||||
grafana-user-data:
|
grafana-user-data:
|
||||||
prometheus-data:
|
prometheus-data:
|
||||||
bot-logs:
|
bot-logs:
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>dev.sheldan.sissi</groupId>
|
<groupId>dev.sheldan.sissi</groupId>
|
||||||
<artifactId>deployment</artifactId>
|
<artifactId>deployment</artifactId>
|
||||||
<version>1.3.14</version>
|
<version>1.3.21</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>dev.sheldan.sissi</groupId>
|
<groupId>dev.sheldan.sissi</groupId>
|
||||||
<artifactId>sissi</artifactId>
|
<artifactId>sissi</artifactId>
|
||||||
<version>1.3.14</version>
|
<version>1.3.21</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
8
pom.xml
8
pom.xml
@@ -13,15 +13,15 @@
|
|||||||
<groupId>dev.sheldan.sissi</groupId>
|
<groupId>dev.sheldan.sissi</groupId>
|
||||||
<artifactId>sissi</artifactId>
|
<artifactId>sissi</artifactId>
|
||||||
<name>Sissi</name>
|
<name>Sissi</name>
|
||||||
<version>1.3.14</version>
|
<version>1.3.21</version>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<maven.compiler.target>1.8</maven.compiler.target>
|
<maven.compiler.target>1.8</maven.compiler.target>
|
||||||
<maven.compiler.source>1.8</maven.compiler.source>
|
<maven.compiler.source>1.8</maven.compiler.source>
|
||||||
<!-- edit in release.yml as well -->
|
<!-- edit in release.yml as well -->
|
||||||
<!-- when releasing a new bot version, update the .env as well-->
|
<!-- when releasing a new bot version, update the .env as well-->
|
||||||
<abstracto.version>1.4.14</abstracto.version>
|
<abstracto.version>1.4.19</abstracto.version>
|
||||||
<abstracto.templates.version>1.4.9</abstracto.templates.version>
|
<abstracto.templates.version>1.4.13</abstracto.templates.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
<modules>
|
<modules>
|
||||||
@@ -57,7 +57,7 @@
|
|||||||
<scm>
|
<scm>
|
||||||
<url>https://maven.pkg.github.com/Sheldan/Sissi</url>
|
<url>https://maven.pkg.github.com/Sheldan/Sissi</url>
|
||||||
<developerConnection>scm:git:git@github.com:Sheldan/Sissi.git</developerConnection>
|
<developerConnection>scm:git:git@github.com:Sheldan/Sissi.git</developerConnection>
|
||||||
<tag>sissi-1.3.14</tag>
|
<tag>sissi-1.3.21</tag>
|
||||||
</scm>
|
</scm>
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>dev.sheldan.sissi</groupId>
|
<groupId>dev.sheldan.sissi</groupId>
|
||||||
<artifactId>sissi</artifactId>
|
<artifactId>sissi</artifactId>
|
||||||
<version>1.3.14</version>
|
<version>1.3.21</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>dev.sheldan.sissi.templates</groupId>
|
<groupId>dev.sheldan.sissi.templates</groupId>
|
||||||
<artifactId>customization-templates</artifactId>
|
<artifactId>customization-templates</artifactId>
|
||||||
<version>1.3.14</version>
|
<version>1.3.21</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>sissi-templates</artifactId>
|
<artifactId>sissi-templates</artifactId>
|
||||||
<groupId>dev.sheldan.sissi.templates</groupId>
|
<groupId>dev.sheldan.sissi.templates</groupId>
|
||||||
<version>1.3.14</version>
|
<version>1.3.21</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>module-templates</artifactId>
|
<artifactId>module-templates</artifactId>
|
||||||
<groupId>dev.sheldan.sissi.templates</groupId>
|
<groupId>dev.sheldan.sissi.templates</groupId>
|
||||||
<version>1.3.14</version>
|
<version>1.3.21</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,26 @@
|
|||||||
{
|
{
|
||||||
<#assign donationAmount=donationAmount>
|
<#assign donationAmount=totalAmount>
|
||||||
<#setting locale="de_DE">
|
<#setting locale="de_DE">
|
||||||
"additionalMessage": "<#include "donations_response_description">",
|
"additionalMessage": "<#include "donations_response_description">",
|
||||||
"embeds": [
|
"embeds": [
|
||||||
{
|
{
|
||||||
"imageUrl": "https://cdn.discordapp.com/attachments/299115929206390784/1047306670319079474/dotpict-1.png"
|
"imageUrl": "https://cdn.discordapp.com/attachments/299115929206390784/1047306670319079474/dotpict-1.png"
|
||||||
|
<#if donations?size gt 0>
|
||||||
|
,<#if type.name() == "LATEST">
|
||||||
|
"description": "<#include "donations_response_latest_donations_description">"
|
||||||
|
<#else>
|
||||||
|
"description": "<#include "donations_response_top_donations_description">"
|
||||||
|
</#if>
|
||||||
|
,"fields": [
|
||||||
|
<#list donations as donation>
|
||||||
|
{
|
||||||
|
"name": "<#if donation.anonymous><#include "donations_response_anonymous"><#else>${donation.firstName}</#if>",
|
||||||
|
"value": "${donation.donationAmount}€",
|
||||||
|
"inline": true
|
||||||
|
}
|
||||||
|
<#sep>,</#list>
|
||||||
|
]
|
||||||
|
</#if>
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>module-templates</artifactId>
|
<artifactId>module-templates</artifactId>
|
||||||
<groupId>dev.sheldan.sissi.templates</groupId>
|
<groupId>dev.sheldan.sissi.templates</groupId>
|
||||||
<version>1.3.14</version>
|
<version>1.3.21</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"additionalMessage": "<@safe_include "changeMeetup_response_text"/>",
|
||||||
|
"messageConfig": {
|
||||||
|
"ephemeral": true
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -8,6 +8,14 @@
|
|||||||
},
|
},
|
||||||
"description": "<@format_instant_date_time instant=meetupTime/>
|
"description": "<@format_instant_date_time instant=meetupTime/>
|
||||||
${description?json_string}"
|
${description?json_string}"
|
||||||
|
<#if location?? && location != "%22%22">,
|
||||||
|
"fields": [
|
||||||
|
{
|
||||||
|
"name": "<@safe_include "createMeetup_confirmation_location_field_title"/>",
|
||||||
|
"value": "https://www.google.com/maps?q=${location?json_string}"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
</#if>
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"buttons": [
|
"buttons": [
|
||||||
|
|||||||
@@ -2,4 +2,7 @@
|
|||||||
<#assign userMentions><#list participants as user>${user.memberMention}<#sep>, </#list></#assign>
|
<#assign userMentions><#list participants as user>${user.memberMention}<#sep>, </#list></#assign>
|
||||||
"additionalMessage": "${userMentions?json_string}
|
"additionalMessage": "${userMentions?json_string}
|
||||||
${notificationMessage}"
|
${notificationMessage}"
|
||||||
|
<#if meetupMessageId??>,
|
||||||
|
"referencedMessageId": ${meetupMessageId?c}
|
||||||
|
</#if>
|
||||||
}
|
}
|
||||||
@@ -20,7 +20,6 @@
|
|||||||
"description": "<#if cancelled>~~</#if><@safe_include "meetup_display_description"/><#if cancelled>~~</#if>"
|
"description": "<#if cancelled>~~</#if><@safe_include "meetup_display_description"/><#if cancelled>~~</#if>"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
<#if yesId?has_content && noId?has_content && maybeId?has_content && !cancelled>
|
|
||||||
"buttons": [
|
"buttons": [
|
||||||
{
|
{
|
||||||
"label": "<@safe_include "meetup_message_yes_button_label"/>",
|
"label": "<@safe_include "meetup_message_yes_button_label"/>",
|
||||||
@@ -42,8 +41,14 @@
|
|||||||
"id": "${noId}",
|
"id": "${noId}",
|
||||||
"buttonStyle": "danger"
|
"buttonStyle": "danger"
|
||||||
}
|
}
|
||||||
|
<#if location?? && location != "%22%22">,
|
||||||
|
{
|
||||||
|
"label": "<@safe_include "meetup_message_location_button_label"/>",
|
||||||
|
"url": "https://www.google.com/maps?q=${location?json_string}",
|
||||||
|
"buttonStyle": "link"
|
||||||
|
}
|
||||||
|
</#if>
|
||||||
],
|
],
|
||||||
</#if>
|
|
||||||
"messageConfig": {
|
"messageConfig": {
|
||||||
"allowsRoleMention": true
|
"allowsRoleMention": true
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>dev.sheldan.sissi.templates</groupId>
|
<groupId>dev.sheldan.sissi.templates</groupId>
|
||||||
<artifactId>sissi-templates</artifactId>
|
<artifactId>sissi-templates</artifactId>
|
||||||
<version>1.3.14</version>
|
<version>1.3.21</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>dev.sheldan.sissi.templates</groupId>
|
<groupId>dev.sheldan.sissi.templates</groupId>
|
||||||
<artifactId>module-templates</artifactId>
|
<artifactId>module-templates</artifactId>
|
||||||
<version>1.3.14</version>
|
<version>1.3.21</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>dev.sheldan.sissi.templates</groupId>
|
<groupId>dev.sheldan.sissi.templates</groupId>
|
||||||
<artifactId>templates</artifactId>
|
<artifactId>templates</artifactId>
|
||||||
<version>1.3.14</version>
|
<version>1.3.21</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>dev.sheldan.sissi.templates</groupId>
|
<groupId>dev.sheldan.sissi.templates</groupId>
|
||||||
<artifactId>template-overrides</artifactId>
|
<artifactId>template-overrides</artifactId>
|
||||||
<version>1.3.14</version>
|
<version>1.3.21</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>dev.sheldan.sissi.templates</groupId>
|
<groupId>dev.sheldan.sissi.templates</groupId>
|
||||||
<artifactId>template-overrides</artifactId>
|
<artifactId>template-overrides</artifactId>
|
||||||
<version>1.3.14</version>
|
<version>1.3.21</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>dev.sheldan.sissi.templates</groupId>
|
<groupId>dev.sheldan.sissi.templates</groupId>
|
||||||
<artifactId>template-overrides</artifactId>
|
<artifactId>template-overrides</artifactId>
|
||||||
<version>1.3.14</version>
|
<version>1.3.21</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>sissi-templates</artifactId>
|
<artifactId>sissi-templates</artifactId>
|
||||||
<groupId>dev.sheldan.sissi.templates</groupId>
|
<groupId>dev.sheldan.sissi.templates</groupId>
|
||||||
<version>1.3.14</version>
|
<version>1.3.21</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>dev.sheldan.sissi.templates.translations</groupId>
|
<groupId>dev.sheldan.sissi.templates.translations</groupId>
|
||||||
<artifactId>customization-translations</artifactId>
|
<artifactId>customization-translations</artifactId>
|
||||||
<version>1.3.14</version>
|
<version>1.3.21</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>sissi-translations</artifactId>
|
<artifactId>sissi-translations</artifactId>
|
||||||
<groupId>dev.sheldan.sissi.templates.translations</groupId>
|
<groupId>dev.sheldan.sissi.templates.translations</groupId>
|
||||||
<version>1.3.14</version>
|
<version>1.3.21</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>module-translations</artifactId>
|
<artifactId>module-translations</artifactId>
|
||||||
<groupId>dev.sheldan.sissi.templates.translations</groupId>
|
<groupId>dev.sheldan.sissi.templates.translations</groupId>
|
||||||
<version>1.3.14</version>
|
<version>1.3.21</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
Anonym
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
Das hier sind die neuesten Spenden:
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
Das hier sind die höchsten Spenden:
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
The amount of donations you want to load for the specified type. Defaults to 5, max 20.
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
Type of donations you want to load, either 'top' or 'latest'. Default 'latest' for any other value
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>dev.sheldan.sissi.templates.translations</groupId>
|
<groupId>dev.sheldan.sissi.templates.translations</groupId>
|
||||||
<artifactId>module-translations</artifactId>
|
<artifactId>module-translations</artifactId>
|
||||||
<version>1.3.14</version>
|
<version>1.3.21</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
Property has been updated.
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
Changes a property of a meetup
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
This command is used to change a property of a meetup.
|
||||||
|
That can include: description, topic and location.
|
||||||
|
In order to clear the location please enter "". It is not possible to clear the topic or the description.
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
The ID of the meetup to change a property of
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
The new value of the property
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
Description
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
Location
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
Topic
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
The property to change
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
Location
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
Where the meetup should be. This will be used with a Google Maps search link in the display.
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
Maybe
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
No time
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
No
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
Yes
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
The decision of the people to be notified
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
Location
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>dev.sheldan.sissi.templates.translations</groupId>
|
<groupId>dev.sheldan.sissi.templates.translations</groupId>
|
||||||
<artifactId>sissi-translations</artifactId>
|
<artifactId>sissi-translations</artifactId>
|
||||||
<version>1.3.14</version>
|
<version>1.3.21</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>dev.sheldan.sissi.templates.translations</groupId>
|
<groupId>dev.sheldan.sissi.templates.translations</groupId>
|
||||||
<artifactId>module-translations</artifactId>
|
<artifactId>module-translations</artifactId>
|
||||||
<version>1.3.14</version>
|
<version>1.3.21</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>dev.sheldan.sissi.templates</groupId>
|
<groupId>dev.sheldan.sissi.templates</groupId>
|
||||||
<artifactId>templates</artifactId>
|
<artifactId>templates</artifactId>
|
||||||
<version>1.3.14</version>
|
<version>1.3.21</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>dev.sheldan.sissi.templates.translations.overrides</groupId>
|
<groupId>dev.sheldan.sissi.templates.translations.overrides</groupId>
|
||||||
<artifactId>translation-overrides</artifactId>
|
<artifactId>translation-overrides</artifactId>
|
||||||
<version>1.3.14</version>
|
<version>1.3.21</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>dev.sheldan.sissi.templates.translations.overrides</groupId>
|
<groupId>dev.sheldan.sissi.templates.translations.overrides</groupId>
|
||||||
<artifactId>translation-overrides</artifactId>
|
<artifactId>translation-overrides</artifactId>
|
||||||
<version>1.3.14</version>
|
<version>1.3.21</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>dev.sheldan.sissi.templates.translations.overrides</groupId>
|
<groupId>dev.sheldan.sissi.templates.translations.overrides</groupId>
|
||||||
<artifactId>translation-overrides</artifactId>
|
<artifactId>translation-overrides</artifactId>
|
||||||
<version>1.3.14</version>
|
<version>1.3.21</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>dev.sheldan.sissi.templates.translations</groupId>
|
<groupId>dev.sheldan.sissi.templates.translations</groupId>
|
||||||
<artifactId>sissi-translations</artifactId>
|
<artifactId>sissi-translations</artifactId>
|
||||||
<version>1.3.14</version>
|
<version>1.3.21</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user