Compare commits

...

14 Commits

Author SHA1 Message Date
Sheldan
7bc04a7906 [SIS-xxx] adding sync of starboard posts and quotes, including migration script 2024-07-12 22:45:17 +02:00
Sheldan
89d743987d [SIS-xxx] fixing not escaping notification message for meetup participant notification 2024-07-03 19:19:27 +02:00
release-bot
32ddd4e6f0 Commit from GitHub Actions (Publishes a new version of Sissi) 2024-06-13 16:42:12 +00:00
release-bot
68afc31b2e [maven-release-plugin] prepare for next development iteration 2024-06-13 16:37:16 +00:00
release-bot
d0ba46c440 [maven-release-plugin] prepare release sissi-1.4.55 2024-06-13 16:37:14 +00:00
Sheldan
554d197ca4 [SIS-xxx] upgrading to new abstracto version 2024-06-13 18:23:36 +02:00
Sheldan
8826796fcb [SIS-xxx] changing text for ban notification to contain translation 2024-06-02 23:11:07 +02:00
Sheldan
c8ed0e2195 [SIS-xxx] changing text for ban notification to contain the new invite link 2024-05-31 09:32:48 +02:00
release-bot
25d19bfa26 Commit from GitHub Actions (Publishes a new version of Sissi) 2024-05-31 07:18:27 +00:00
release-bot
f7e19b580e [maven-release-plugin] prepare for next development iteration 2024-05-31 07:14:21 +00:00
release-bot
5f6bd0d88e [maven-release-plugin] prepare release sissi-1.4.54 2024-05-31 07:14:20 +00:00
Sheldan
a110c54411 [SIS-xxx] upgrading abstracto version 2024-05-31 09:11:12 +02:00
release-bot
a4a729dfc2 Commit from GitHub Actions (Publishes a new version of Sissi) 2024-05-05 22:32:21 +00:00
release-bot
85eee4835f [maven-release-plugin] prepare for next development iteration 2024-05-05 22:28:20 +00:00
66 changed files with 477 additions and 95 deletions

4
.env
View File

@@ -1,4 +1,4 @@
REGISTRY_PREFIX=harbor.sheldan.dev/sissi/
ABSTRACTO_PREFIX=harbor.sheldan.dev/abstracto/
VERSION=1.4.52
ABSTRACTO_VERSION=1.5.36
VERSION=1.4.55
ABSTRACTO_VERSION=1.5.38

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>dev.sheldan.sissi.application</groupId>
<artifactId>application</artifactId>
<version>1.4.53</version>
<version>1.4.56-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>executable</artifactId>
@@ -55,12 +55,13 @@
<artifactId>metrics-impl</artifactId>
</dependency>
<!-- modules containing commands -->
<dependency>
<groupId>dev.sheldan.abstracto.scheduling</groupId>
<artifactId>scheduling-impl</artifactId>
</dependency>
<!-- modules containing commands -->
<dependency>
<groupId>dev.sheldan.abstracto.modules</groupId>
<artifactId>link-embed-impl</artifactId>

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>dev.sheldan.sissi</groupId>
<artifactId>sissi</artifactId>
<version>1.4.53</version>
<version>1.4.56-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -4,7 +4,7 @@
<parent>
<groupId>dev.sheldan.sissi.application.module.custom</groupId>
<artifactId>sissi-customizations</artifactId>
<version>1.4.53</version>
<version>1.4.56-SNAPSHOT</version>
</parent>
<artifactId>image-generation-custom</artifactId>

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>dev.sheldan.sissi.application.module.custom</groupId>
<artifactId>sissi-customizations</artifactId>
<version>1.4.53</version>
<version>1.4.56-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<artifactId>application</artifactId>
<groupId>dev.sheldan.sissi.application</groupId>
<version>1.4.53</version>
<version>1.4.56-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>dev.sheldan.sissi.application</groupId>
<artifactId>sissi-modules</artifactId>
<version>1.4.53</version>
<version>1.4.56-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>dev.sheldan.sissi.application</groupId>
<artifactId>sissi-modules</artifactId>
<version>1.4.53</version>
<version>1.4.56-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>dev.sheldan.sissi.application</groupId>
<artifactId>application</artifactId>
<version>1.4.53</version>
<version>1.4.56-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,13 +3,21 @@
<parent>
<groupId>dev.sheldan.sissi.application</groupId>
<artifactId>sissi-modules</artifactId>
<version>1.4.53</version>
<version>1.4.56-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>dev.sheldan.sissi.application.module</groupId>
<artifactId>quotes</artifactId>
<dependencies>
<dependency>
<groupId>dev.sheldan.abstracto.modules</groupId>
<artifactId>starboard-int</artifactId>
<version>${abstracto.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>

View File

@@ -5,7 +5,7 @@ import lombok.Getter;
@Getter
public enum QuotesFeatureDefinition implements FeatureDefinition {
QUOTES("quotes");
QUOTES("quotes"), STARBOARD_QUOTE_SYNC("starboardQuoteSync");
private String key;

View File

@@ -0,0 +1,13 @@
package dev.sheldan.sissi.module.quotes.config;
import dev.sheldan.abstracto.core.config.FeatureConfig;
import dev.sheldan.abstracto.core.config.FeatureDefinition;
import org.springframework.stereotype.Component;
@Component
public class StarboardQuoteSyncFeatureConfig implements FeatureConfig {
@Override
public FeatureDefinition getFeature() {
return QuotesFeatureDefinition.STARBOARD_QUOTE_SYNC;
}
}

View File

@@ -0,0 +1,54 @@
package dev.sheldan.sissi.module.quotes.listener;
import dev.sheldan.abstracto.core.config.FeatureDefinition;
import dev.sheldan.abstracto.core.listener.DefaultListenerResult;
import dev.sheldan.abstracto.core.service.MessageService;
import dev.sheldan.abstracto.starboard.listener.StarboardPostCreatedListener;
import dev.sheldan.abstracto.starboard.model.StarboardPostCreatedModel;
import dev.sheldan.sissi.module.quotes.config.QuotesFeatureDefinition;
import dev.sheldan.sissi.module.quotes.service.QuoteServiceBean;
import lombok.extern.slf4j.Slf4j;
import net.dv8tion.jda.api.entities.Message;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
@Slf4j
@Component
public class StarboardPostCreatedListenerBean implements StarboardPostCreatedListener {
@Autowired
private MessageService messageService;
@Autowired
private QuoteServiceBean quoteServiceBean;
@Autowired
private StarboardPostCreatedListenerBean self;
@Override
public DefaultListenerResult execute(StarboardPostCreatedModel model) {
Long serverId = model.getServerId();
Long starboardPostId = model.getStarboardPostId();
messageService.loadMessage(serverId, model.getStarredMessage().getChannelId(), model.getStarredMessage().getMessageId())
.thenAccept(message -> self.storeQuote(message, model))
.exceptionally(throwable -> {
log.error("Failed to persist quote for starboard post {} in server {}.", starboardPostId, serverId, throwable);
return null;
});
return DefaultListenerResult.PROCESSED;
}
@Transactional
public void storeQuote(Message message, StarboardPostCreatedModel model) {
log.info("Creating quote from starboard post {} in server {} from user {} because of user {}.", model.getStarboardPostId(), model.getServerId(),
model.getStarredUser().getUserId(), model.getLastStarrer().getUserId());
quoteServiceBean.createQuote(model.getStarredUser(), model.getLastStarrer(), message);
}
@Override
public FeatureDefinition getFeature() {
return QuotesFeatureDefinition.STARBOARD_QUOTE_SYNC;
}
}

View File

@@ -0,0 +1,32 @@
package dev.sheldan.sissi.module.quotes.listener;
import dev.sheldan.abstracto.core.config.FeatureDefinition;
import dev.sheldan.abstracto.core.listener.DefaultListenerResult;
import dev.sheldan.abstracto.starboard.listener.StarboardPostDeletedListener;
import dev.sheldan.abstracto.starboard.model.StarboardPostDeletedModel;
import dev.sheldan.sissi.module.quotes.config.QuotesFeatureDefinition;
import dev.sheldan.sissi.module.quotes.service.QuoteServiceBean;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class StarboardPostDeletedListenerBean implements StarboardPostDeletedListener {
@Autowired
private QuoteServiceBean quoteServiceBean;
@Override
public DefaultListenerResult execute(StarboardPostDeletedModel model) {
log.info("Handling delete of starboard post {}, causing the quote of message {} in server {} to be deleted.", model.getStarboardPostId(), model.getStarredMessage().getMessageId(), model.getServerId());
quoteServiceBean.deleteByMessageId(model.getStarredMessage().getMessageId());
return DefaultListenerResult.PROCESSED;
}
@Override
public FeatureDefinition getFeature() {
return QuotesFeatureDefinition.STARBOARD_QUOTE_SYNC;
}
}

View File

@@ -21,12 +21,12 @@ import java.util.List;
@EqualsAndHashCode
public class Quote {
@EmbeddedId
@Getter
private ServerSpecificId id;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false)
private Long id;
@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, fetch = FetchType.LAZY)
@MapsId("serverId")
@JoinColumn(name = "server_id", nullable = false)
private AServer server;
@@ -58,9 +58,9 @@ public class Quote {
@Column(name = "text")
private String text;
@Column(name = "created")
@Column(name = "created", insertable = false, updatable = false)
private Instant created;
@Column(name = "updated")
@Column(name = "updated", insertable = false, updatable = false)
private Instant updated;
}

View File

@@ -1,5 +1,6 @@
package dev.sheldan.sissi.module.quotes.model.database;
import dev.sheldan.abstracto.core.models.database.AServer;
import lombok.*;
import jakarta.persistence.*;
@@ -16,7 +17,7 @@ public class QuoteAttachment {
@Id
@Getter
@Setter
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false)
private Long id;
@@ -25,8 +26,7 @@ public class QuoteAttachment {
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumns(
{
@JoinColumn(updatable = false, insertable = false, name = "quote_id", referencedColumnName = "id"),
@JoinColumn(updatable = false, insertable = false, name = "server_id", referencedColumnName = "server_id")
@JoinColumn(updatable = false, name = "quote_id", referencedColumnName = "id")
})
private Quote quote;
@@ -35,6 +35,10 @@ public class QuoteAttachment {
@Column(name = "url", nullable = false)
private String url;
@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, fetch = FetchType.LAZY)
@JoinColumn(name = "server_id", nullable = false)
private AServer server;
@Getter
@Setter
@Column(name = "is_image", nullable = false)

View File

@@ -1,6 +1,5 @@
package dev.sheldan.sissi.module.quotes.repository;
import dev.sheldan.abstracto.core.models.ServerSpecificId;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import dev.sheldan.sissi.module.quotes.model.database.Quote;
@@ -8,13 +7,16 @@ import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Optional;
@Repository
public interface QuoteRepository extends JpaRepository<Quote, ServerSpecificId> {
public interface QuoteRepository extends JpaRepository<Quote, Long> {
List<Quote> findByTextContainingAndServer(String text, AServer server);
List<Quote> findByTextContainingAndServerAndAuthor(String text, AServer server, AUserInAServer author);
List<Quote> findByServer(AServer server);
List<Quote> findByAuthor(AUserInAServer author);
Long countByAuthor(AUserInAServer author);
Long countByAdder(AUserInAServer adder);
Optional<Quote> findByMessageId(Long messageId);
}

View File

@@ -1,7 +1,7 @@
package dev.sheldan.sissi.module.quotes.service;
import dev.sheldan.abstracto.core.models.ServerChannelMessage;
import dev.sheldan.abstracto.core.models.ServerSpecificId;
import dev.sheldan.abstracto.core.models.ServerUser;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import dev.sheldan.abstracto.core.service.ChannelService;
@@ -16,11 +16,12 @@ import dev.sheldan.sissi.module.quotes.model.command.QuoteResponseModel;
import dev.sheldan.sissi.module.quotes.model.command.QuoteStatsModel;
import dev.sheldan.sissi.module.quotes.model.database.Quote;
import dev.sheldan.sissi.module.quotes.model.database.QuoteAttachment;
import dev.sheldan.sissi.module.quotes.repository.QuoteRepository;
import dev.sheldan.sissi.module.quotes.service.management.QuoteManagementService;
import lombok.extern.slf4j.Slf4j;
import net.dv8tion.jda.api.entities.*;
import net.dv8tion.jda.api.entities.channel.Channel;
import net.dv8tion.jda.api.entities.channel.middleman.GuildMessageChannel;
import org.apache.commons.lang3.tuple.Pair;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -35,9 +36,6 @@ import java.util.stream.Collectors;
@Slf4j
public class QuoteServiceBean {
@Autowired
private QuoteRepository quoteRepository;
@Autowired
private MemberService memberService;
@@ -56,11 +54,14 @@ public class QuoteServiceBean {
@Autowired
private ChannelService channelService;
@Autowired
private QuoteManagementService quoteManagementService;
private static final String QUOTE_RESPONSE_TEMPLATE_KEY = "quote_response";
public Optional<Quote> getRandomQuoteForMember(AUserInAServer aUserInAServer) {
// not nice, but good enough for now
List<Quote> allQuotes = quoteRepository.findByAuthor(aUserInAServer);
List<Quote> allQuotes = quoteManagementService.getFromAuthor(aUserInAServer);
if(allQuotes.isEmpty()) {
return Optional.empty();
}
@@ -69,7 +70,7 @@ public class QuoteServiceBean {
public Optional<Quote> getRandomQuote(AServer server) {
// not nice, but good enough for now
List<Quote> allQuotes = quoteRepository.findByServer(server);
List<Quote> allQuotes = quoteManagementService.getFromServer(server);
if(allQuotes.isEmpty()) {
return Optional.empty();
}
@@ -79,7 +80,7 @@ public class QuoteServiceBean {
public void deleteQuote(Long quoteId, AServer server) {
Optional<Quote> existingQuote = getQuote(quoteId, server);
if(existingQuote.isPresent()) {
quoteRepository.delete(existingQuote.get());
quoteManagementService.deleteQuote(existingQuote.get());
log.info("Deleting quote with id {} in server {}.", quoteId, server.getId());
} else {
throw new QuoteNotFoundException();
@@ -87,9 +88,8 @@ public class QuoteServiceBean {
}
public Optional<Quote> getQuote(Long quoteId, AServer server) {
ServerSpecificId id = new ServerSpecificId(server.getId(), quoteId);
log.info("Loading quote with id {} in server {}.", quoteId, server.getId());
return quoteRepository.findById(id);
return quoteManagementService.getQuote(quoteId);
}
public CompletableFuture<MessageToSend> renderQuoteToMessageToSend(Quote quote) {
@@ -118,7 +118,7 @@ public class QuoteServiceBean {
.builder()
.quoteContent(quote.getText())
.imageAttachmentURLs(imageAttachments)
.quoteId(quote.getId().getId())
.quoteId(quote.getId())
.fileAttachmentURLs(fileAttachments)
.creationDate(quote.getCreated())
.quotedMessage(quotedMessage);
@@ -209,7 +209,7 @@ public class QuoteServiceBean {
}
public Optional<Quote> searchQuote(String query, AServer server) {
List<Quote> foundQuotes = quoteRepository.findByTextContainingAndServer(query, server);
List<Quote> foundQuotes = quoteManagementService.getQuotesWithTextInServer(query, server);
if(foundQuotes.isEmpty()) {
return Optional.empty();
}
@@ -224,7 +224,7 @@ public class QuoteServiceBean {
public Optional<Quote> searchQuote(String query, AServer server, Member targetMember) {
AUserInAServer author = userInServerManagementService.loadOrCreateUser(targetMember);
List<Quote> foundQuotes = quoteRepository.findByTextContainingAndServerAndAuthor(query, server, author);
List<Quote> foundQuotes = quoteManagementService.getQuotesWithTextInServerFromAuthor(query, server, author);
if(foundQuotes.isEmpty()) {
return Optional.empty();
}
@@ -242,8 +242,8 @@ public class QuoteServiceBean {
return getQuoteStats(user, member);
}
public QuoteStatsModel getQuoteStats(AUserInAServer user, Member member) {
Long authored = quoteRepository.countByAuthor(user);
Long added = quoteRepository.countByAdder(user);
Long authored = quoteManagementService.getAmountOfQuotesOfAuthor(user);
Long added = quoteManagementService.getAmountOfQuotesOfAdder(user);
return QuoteStatsModel
.builder()
.quoteCount(added)
@@ -253,4 +253,21 @@ public class QuoteServiceBean {
.serverId(user.getServerReference().getId())
.build();
}
public Quote createQuote(ServerUser authorUser, ServerUser adderUser, Message quoteMessage) {
AUserInAServer author = userInServerManagementService.loadOrCreateUser(authorUser);
AUserInAServer adder = userInServerManagementService.loadOrCreateUser(adderUser);
List<Pair<String, Boolean>> attachments = quoteMessage
.getAttachments()
.stream()
.map(attachment -> Pair.of(attachment.getProxyUrl(), attachment.isImage()))
.toList();
return quoteManagementService.createQuote(author, adder, quoteMessage.getContentDisplay(), ServerChannelMessage.fromMessage(quoteMessage), attachments);
}
public void deleteByMessageId(Long messageId) {
Quote quote = quoteManagementService.findByMessage(messageId).orElseThrow(QuoteNotFoundException::new);
log.info("Deleting quote {} in server {}.", quote.getId(), quote.getServer().getId());
quoteManagementService.deleteQuote(quote);
}
}

View File

@@ -0,0 +1,94 @@
package dev.sheldan.sissi.module.quotes.service.management;
import dev.sheldan.abstracto.core.models.ServerChannelMessage;
import dev.sheldan.abstracto.core.models.database.AChannel;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import dev.sheldan.abstracto.core.service.management.ChannelManagementService;
import dev.sheldan.sissi.module.quotes.model.database.Quote;
import dev.sheldan.sissi.module.quotes.model.database.QuoteAttachment;
import dev.sheldan.sissi.module.quotes.repository.QuoteRepository;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.tuple.Pair;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Optional;
@Component
@Slf4j
public class QuoteManagementService {
@Autowired
private QuoteRepository quoteRepository;
@Autowired
private ChannelManagementService channelManagementService;
public Quote createQuote(AUserInAServer author, AUserInAServer adder, String messageText, ServerChannelMessage quotedMessage, List<Pair<String, Boolean>> attachments) {
AChannel channel = channelManagementService.loadChannel(quotedMessage.getChannelId());
Quote quote = Quote
.builder()
.adder(adder)
.author(author)
.text(messageText)
.messageId(quotedMessage.getMessageId())
.server(adder.getServerReference())
.sourceChannel(channel)
.build();
List<QuoteAttachment> quoteAttachments = attachments
.stream()
.map(stringBooleanPair -> QuoteAttachment
.builder()
.url(stringBooleanPair.getLeft())
.quote(quote)
.server(adder.getServerReference())
.isImage(stringBooleanPair.getRight())
.build())
.toList();
log.info("Creating quote from {} added by {} in server {}.", author.getUserReference().getId(), adder.getUserReference().getId(), author.getServerReference().getId());
quote.setAttachments(quoteAttachments);
return quoteRepository.save(quote);
}
public List<Quote> getFromAuthor(AUserInAServer author) {
return quoteRepository.findByAuthor(author);
}
public List<Quote> getFromServer(AServer aServer) {
return quoteRepository.findByServer(aServer);
}
public void deleteQuote(Quote quote) {
quoteRepository.delete(quote);
}
public Optional<Quote> getQuote(Long quoteId) {
return quoteRepository.findById(quoteId);
}
public List<Quote> getQuotesWithTextInServer(String text, AServer server) {
return quoteRepository.findByTextContainingAndServer(text, server);
}
public List<Quote> getQuotesWithTextInServerFromAuthor(String text, AServer server, AUserInAServer aUserInAServer) {
return quoteRepository.findByTextContainingAndServerAndAuthor(text, server, aUserInAServer);
}
public Long getAmountOfQuotesOfAuthor(AUserInAServer aUserInAServer) {
return quoteRepository.countByAuthor(aUserInAServer);
}
public Long getAmountOfQuotesOfAdder(AUserInAServer aUserInAServer) {
return quoteRepository.countByAdder(aUserInAServer);
}
public Optional<Quote> findByMessage(Long messageId) {
return quoteRepository.findByMessageId(messageId);
}
}

View File

@@ -0,0 +1,7 @@
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog https://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.26.xsd" >
<include file="seedData/data.xml" relativeToChangelogFile="true"/>
<include file="tables/tables.xml" relativeToChangelogFile="true"/>
</databaseChangeLog>

View File

@@ -0,0 +1,6 @@
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog https://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.26.xsd" >
<include file="feature.xml" relativeToChangelogFile="true"/>
</databaseChangeLog>

View File

@@ -0,0 +1,10 @@
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog https://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.26.xsd" >
<changeSet author="Sheldan" id="starboard_quote_sync_feature-insertion">
<insert tableName="feature">
<column name="key" value="starboardQuoteSync"/>
</insert>
</changeSet>
</databaseChangeLog>

View File

@@ -0,0 +1,16 @@
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog https://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.26.xsd" >
<changeSet author="Sheldan" id="quote-add_tracking_columns">
<sql>
DROP TRIGGER IF EXISTS quote_update_trigger ON quote;
CREATE TRIGGER quote_update_trigger BEFORE UPDATE ON quote FOR EACH ROW EXECUTE PROCEDURE update_trigger_procedure();
</sql>
<sql>
DROP TRIGGER IF EXISTS quote_insert_trigger ON quote;
CREATE TRIGGER quote_insert_trigger BEFORE INSERT ON quote FOR EACH ROW EXECUTE PROCEDURE insert_trigger_procedure();
</sql>
</changeSet>
</databaseChangeLog>

View File

@@ -0,0 +1,6 @@
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog https://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.26.xsd" >
<include file="quote.xml" relativeToChangelogFile="true"/>
</databaseChangeLog>

View File

@@ -3,4 +3,5 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog https://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.26.xsd" >
<include file="1.0.2/collection.xml" relativeToChangelogFile="true"/>
<include file="1.4.56/collection.xml" relativeToChangelogFile="true"/>
</databaseChangeLog>

View File

@@ -1,2 +1,5 @@
abstracto.featureFlags.quotes.featureName=quotes
abstracto.featureFlags.quotes.enabled=false
abstracto.featureFlags.starboardQuoteSync.featureName=starboardQuoteSync
abstracto.featureFlags.starboardQuoteSync.enabled=false

View File

@@ -3,7 +3,7 @@
<parent>
<artifactId>sissi-modules</artifactId>
<groupId>dev.sheldan.sissi.application</groupId>
<version>1.4.53</version>
<version>1.4.56-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -2,4 +2,4 @@ apiVersion: v2
name: sissi
description: A Helm chart for Kubernetes
type: application
version: 1.4.52
version: 1.4.55

View File

@@ -3,7 +3,7 @@ bot:
repository: harbor.sheldan.dev/sissi
pullPolicy: Always
image: sissi-bot
tag: 1.4.52
tag: 1.4.55
livenessProbe:
initialDelaySeconds: 60
periodSeconds: 5
@@ -20,7 +20,7 @@ restApi:
repository: harbor.sheldan.dev/sissi
pullPolicy: Always
image: sissi-rest-api
tag: 1.4.52
tag: 1.4.55
podAnnotations: {}
podSecurityContext: {}
securityContext: {}
@@ -60,7 +60,7 @@ privateRestApi:
repository: harbor.sheldan.dev/sissi
pullPolicy: Always
image: sissi-private-rest-api
tag: 1.4.52
tag: 1.4.55
podAnnotations: {}
podSecurityContext: {}
securityContext: {}
@@ -91,23 +91,23 @@ templateDeployment:
repository: harbor.sheldan.dev/abstracto
pullPolicy: Always
image: abstracto-template-deployment
tag: 1.5.36
tag: 1.5.38
templateDeploymentData:
repository: harbor.sheldan.dev/sissi
pullPolicy: Always
image: sissi-template-data
tag: 1.4.52
tag: 1.4.55
dbConfigDeployment:
enabled: true
repository: harbor.sheldan.dev/abstracto
pullPolicy: Always
image: abstracto-db-deployment
tag: 1.5.36
tag: 1.5.38
dbConfigDeploymentData:
repository: harbor.sheldan.dev/sissi
pullPolicy: Always
image: sissi-db-data
tag: 1.4.52
tag: 1.4.55
dbCredentials:
host: null
port: null

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>dev.sheldan.sissi</groupId>
<artifactId>deployment</artifactId>
<version>1.4.53</version>
<version>1.4.56-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
@@ -631,17 +631,6 @@
<destFileName>assignable-roles.zip</destFileName>
</artifactItem>
<artifactItem>
<groupId>dev.sheldan.abstracto.modules</groupId>
<artifactId>utility-impl</artifactId>
<version>${abstracto.version}</version>
<classifier>liquibase</classifier>
<type>zip</type>
<overWrite>true</overWrite>
<outputDirectory>${file.basedir}/db-data/liquibase-artifacts/</outputDirectory>
<destFileName>utility.zip</destFileName>
</artifactItem>
<artifactItem>
<groupId>dev.sheldan.abstracto.modules</groupId>
<artifactId>modmail-impl</artifactId>

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>dev.sheldan.sissi</groupId>
<artifactId>sissi</artifactId>
<version>1.4.53</version>
<version>1.4.56-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -44,4 +44,4 @@ services:
template-data:
build:
context: deployment/image-packaging/src/main/docker/template-data
image: ${REGISTRY_PREFIX}sissi-template-data:${VERSION:-latest}
image: ${REGISTRY_PREFIX}sissi-template-data:${VERSION:-latest}

View File

@@ -13,13 +13,13 @@
<groupId>dev.sheldan.sissi</groupId>
<artifactId>sissi</artifactId>
<name>Sissi</name>
<version>1.4.53</version>
<version>1.4.56-SNAPSHOT</version>
<properties>
<maven.compiler.target>17</maven.compiler.target>
<maven.compiler.source>17</maven.compiler.source>
<abstracto.version>1.5.36</abstracto.version>
<abstracto.templates.version>1.4.37</abstracto.templates.version>
<abstracto.version>1.5.38</abstracto.version>
<abstracto.templates.version>1.4.38</abstracto.templates.version>
<apache-jena.version>4.9.0</apache-jena.version>
<rssreader.version>3.5.0</rssreader.version>
</properties>
@@ -72,7 +72,7 @@
<connection>scm:git:${project.scm.url}</connection>
<developerConnection>scm:git:${project.scm.url}</developerConnection>
<url>https://github.com/Sheldan/Sissi.git</url>
<tag>sissi-1.4.53</tag>
<tag>HEAD</tag>
</scm>
</project>

View File

@@ -0,0 +1,26 @@
import sqlalchemy as db
import os
from starboard_loader import load_all_starboard_posts
from post_loader import enrich_posts
from quote_importer import import_quotes, fix_quote_created
db_host = os.getenv('DB_HOST')
db_port = os.getenv('DB_PORT')
db_database = os.getenv('DB_NAME')
db_user = os.getenv('DB_USER')
db_password = os.getenv('DB_PASS')
engine = db.create_engine('postgresql://%s:%s@%s:%s/%s' % (db_user, db_password, db_host, db_port, db_database))
with engine.connect() as con:
posts = load_all_starboard_posts(con)
print(posts)
print(f'Loaded {len(posts)}')
enriched_posts = enrich_posts(posts)
print(f'Enriched posts')
import_quotes(enriched_posts, con)
print(f'Done storing quotes')
con.commit()
fix_quote_created(enriched_posts, con)
con.commit()
print('Done.')

View File

@@ -0,0 +1,32 @@
import requests
import os
import json
import time
token = os.getenv('TOKEN')
image_extension = ["jpg", "jpeg", "png", "gif", "webp", "tiff", "svg", "apng"]
def enrich_posts(posts):
for post in posts:
print(f"Loading post {post['message_id']}")
url = f"https://discord.com/api/v10/channels/{post['channel_id']}/messages/{post['message_id']}"
message = requests.get(url, headers={'Authorization': token})
time.sleep(5)
if message.status_code == 200:
message_obj = json.loads(message.content)
post['content'] = message_obj['content']
attachments = []
attachment_objs = message_obj['attachments']
if len(attachment_objs) > 0:
for attachment in attachment_objs:
extension = attachment['filename'][attachment['filename'].rfind('.') + 1]
attachment = {
'url': attachment['proxy_url'],
'is_image': extension.lower() in image_extension
}
attachments.append(attachment)
post['attachments'] = attachments
else:
print(f"{post['message_id']}: Didnt find post {url}: {message.status_code}")
return posts

View File

@@ -0,0 +1,25 @@
from sqlalchemy.sql import text
def import_quotes(posts, con):
for post in posts:
if 'content' not in post:
print(f"Skipping {post['message_id']} because no content, did it fail?")
print(f"Inserting {post['message_id']}")
statement = text("""INSERT INTO quote(author_user_in_server_id, adder_user_in_server_id, source_channel_id,
server_id, message_id, text, created)
VALUES(:author_id, :adder_id, :channel_id, :server_id, :message_id, :content, :created) returning id""")
quote_id = con.execute(statement, {'author_id': post['author_id'], 'adder_id': post['adder_id'], 'channel_id': post['channel_id'], 'server_id': post['server_id'],
'message_id': post['message_id'], 'content': post['content'], 'created': post['created']}).fetchone()[0]
print(f'Created quote {quote_id}')
for attachment in post['attachments']:
statement = text("""INSERT INTO quote_attachment(quote_id, server_id, url, is_image)
VALUES(:quote_id, :server_id, :url, :is_image)""")
con.execute(statement, {'quote_id': quote_id, 'server_id': post['server_id'], 'url': attachment['url'], 'is_image': attachment['is_image']})
post['quote_id'] = quote_id
# the insert trigger always updated created, we have to re-do it (will be changed, but not for now)
def fix_quote_created(posts, con):
for post in posts:
if 'quote_id' in post:
statement = text("""update quote set created = :created where id = :quote_id""")
con.execute(statement, {'created': post['created'], 'quote_id': post['quote_id']})

View File

@@ -0,0 +1,29 @@
from sqlalchemy.sql import text
def load_all_starboard_posts(conn):
squery = text("""select sp.id, sp.author_user_in_server_id, sp.source_channel_id, sp.server_id, sp.post_message_id, spr.reactor_user_in_server_id, sp.created
from starboard_post sp
inner join starboard_post_reaction spr
on sp.id = spr.post_id
and spr.created = (
select spr.created
from starboard_post_reaction spr2
where spr2.post_id = sp.id
order by created limit 1
)
where sp.ignored = false
""")
rs = conn.execute(squery)
found_posts = []
for post in rs:
found_posts.append({
'post_id': post[0],
'channel_id': post[2],
'message_id': post[4],
'adder_id': post[5],
'author_id': post[1],
'server_id': post[3],
'created': post[6]
})
return found_posts

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>dev.sheldan.sissi</groupId>
<artifactId>sissi</artifactId>
<version>1.4.53</version>
<version>1.4.56-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -4,7 +4,7 @@
<parent>
<artifactId>customization-templates</artifactId>
<groupId>dev.sheldan.sissi.templates</groupId>
<version>1.4.53</version>
<version>1.4.56-SNAPSHOT</version>
</parent>
<artifactId>image-generation-customization-templates</artifactId>

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>dev.sheldan.sissi.templates</groupId>
<artifactId>customization-templates</artifactId>
<version>1.4.53</version>
<version>1.4.56-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<artifactId>sissi-templates</artifactId>
<groupId>dev.sheldan.sissi.templates</groupId>
<version>1.4.53</version>
<version>1.4.56-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<artifactId>module-templates</artifactId>
<groupId>dev.sheldan.sissi.templates</groupId>
<version>1.4.53</version>
<version>1.4.56-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<artifactId>module-templates</artifactId>
<groupId>dev.sheldan.sissi.templates</groupId>
<version>1.4.53</version>
<version>1.4.56-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -1,7 +1,7 @@
{
<#assign userMentions><#list participants as user>${user.memberMention}<#sep>, </#list></#assign>
"additionalMessage": "${userMentions?json_string}
${notificationMessage}"
${notificationMessage?json_string}"
<#if meetupMessageId??>,
"referencedMessageId": ${meetupMessageId?c}
</#if>

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>dev.sheldan.sissi.templates</groupId>
<artifactId>sissi-templates</artifactId>
<version>1.4.53</version>
<version>1.4.56-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>dev.sheldan.sissi.templates</groupId>
<artifactId>module-templates</artifactId>
<version>1.4.53</version>
<version>1.4.56-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<artifactId>module-templates</artifactId>
<groupId>dev.sheldan.sissi.templates</groupId>
<version>1.4.53</version>
<version>1.4.56-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>dev.sheldan.sissi.templates</groupId>
<artifactId>templates</artifactId>
<version>1.4.53</version>
<version>1.4.56-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>dev.sheldan.sissi.templates</groupId>
<artifactId>template-overrides</artifactId>
<version>1.4.53</version>
<version>1.4.56-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>dev.sheldan.sissi.templates</groupId>
<artifactId>template-overrides</artifactId>
<version>1.4.53</version>
<version>1.4.56-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>dev.sheldan.sissi.templates</groupId>
<artifactId>template-overrides</artifactId>
<version>1.4.53</version>
<version>1.4.56-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<artifactId>sissi-templates</artifactId>
<groupId>dev.sheldan.sissi.templates</groupId>
<version>1.4.53</version>
<version>1.4.56-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>dev.sheldan.sissi.templates.translations</groupId>
<artifactId>customization-translations</artifactId>
<version>1.4.53</version>
<version>1.4.56-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<artifactId>sissi-translations</artifactId>
<groupId>dev.sheldan.sissi.templates.translations</groupId>
<version>1.4.53</version>
<version>1.4.56-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<artifactId>module-translations</artifactId>
<groupId>dev.sheldan.sissi.templates.translations</groupId>
<version>1.4.53</version>
<version>1.4.56-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>dev.sheldan.sissi.templates.translations</groupId>
<artifactId>module-translations</artifactId>
<version>1.4.53</version>
<version>1.4.56-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>dev.sheldan.sissi.templates.translations</groupId>
<artifactId>sissi-translations</artifactId>
<version>1.4.53</version>
<version>1.4.56-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>dev.sheldan.sissi.templates.translations</groupId>
<artifactId>module-translations</artifactId>
<version>1.4.53</version>
<version>1.4.56-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<artifactId>module-translations</artifactId>
<groupId>dev.sheldan.sissi.templates.translations</groupId>
<version>1.4.53</version>
<version>1.4.56-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>dev.sheldan.sissi.templates</groupId>
<artifactId>templates</artifactId>
<version>1.4.53</version>
<version>1.4.56-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>dev.sheldan.sissi.templates.translations.overrides</groupId>
<artifactId>translation-overrides</artifactId>
<version>1.4.53</version>
<version>1.4.56-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>dev.sheldan.sissi.templates.translations.overrides</groupId>
<artifactId>translation-overrides</artifactId>
<version>1.4.53</version>
<version>1.4.56-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>dev.sheldan.sissi.templates.translations.overrides</groupId>
<artifactId>translation-overrides</artifactId>
<version>1.4.53</version>
<version>1.4.56-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -1,2 +1,9 @@
Du wurdest vom Server ${serverName} wegen `${reason}` gebannt.
When du das beeinspruchen willst, folge bitte dieser Einladung: https://discord.gg/rXpBHEGXpE und ANTWORTE AUF DIESE NACHRICHT MIT EINER TEXT NACHRICHT. Die Mods werden dir dann antworten.
Du musst dich in 'Austria Appeal Server' befinden, damit du dem Bot schreiben kannst.
Wenn der Einspruch abgelehnt wird, wirst du vom Server entfernt.
You were banned from the server ${serverName} for `${reason}`.
If you want to appeal, visit https://docs.google.com/forms/d/e/1FAIpQLSegsjW3OaHGZH_VZL6susvVPksLQ2jDWd3vzze6x9LyF4zdfg/viewform.
If you want to appeal, join the server https://discord.gg/rXpBHEGXpE and then message this bot, this opens up a modmail.
Joining the server is necessary in order to make communication to the bot possible.
If the appeal is denied, you will be banned from the above-mentioned server.

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>dev.sheldan.sissi.templates.translations</groupId>
<artifactId>sissi-translations</artifactId>
<version>1.4.53</version>
<version>1.4.56-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -8,4 +8,4 @@ dependencies:
version: ">= 0.0.1"
- name: postgresql
repository: oci://registry-1.docker.io/bitnamicharts
version: 12.12.10 # 13.x.x uses postgresql 16.x
version: 15.3.2