Compare commits

...

63 Commits

Author SHA1 Message Date
Sheldan
7e3fbe5ec6 [maven-release-plugin] prepare release oneplusbot-1.4.2 2021-06-02 01:06:00 +02:00
Sheldan
f304b20fe7 [OPB-26] enabling moderation module
updating versions
2021-06-01 21:49:03 +02:00
Sheldan
c9d1114731 [OPB-29] setting up logback configuration for requests 2021-06-01 21:46:01 +02:00
Sheldan
d8f37117c4 [maven-release-plugin] prepare for next development iteration 2021-05-26 22:12:54 +02:00
Sheldan
c1437373ff [maven-release-plugin] prepare release oneplusbot-1.4.1 2021-05-26 22:12:46 +02:00
Sheldan
1e2ab7fbfa [OPB-30] updating abstracto version and preparing for new release 2021-05-26 21:45:35 +02:00
Sheldan
b3b16d0e74 [maven-release-plugin] prepare for next development iteration 2021-05-26 15:10:35 +02:00
Sheldan
d3d79e8803 [maven-release-plugin] prepare release oneplusbot-1.4.0 2021-05-26 15:10:28 +02:00
Sheldan
bf448e167a Revert "[OPB-30] fixing abstracto version"
This reverts commit 1a135a9b
2021-05-26 14:18:38 +02:00
Sheldan
1a135a9bb8 [OPB-30] fixing abstracto version 2021-05-26 14:10:49 +02:00
Sheldan
fa5abaaed4 [OPB-30] enabling experience module
upgrading abstracto to version 1.2.13
preparing for release
2021-05-26 13:42:58 +02:00
Sheldan
2d98cbba81 [OPB-xxx] changing statistic color to be the op color 2021-05-24 22:37:04 +02:00
Sheldan
f7502c76de [maven-release-plugin] prepare for next development iteration 2021-05-24 00:02:56 +02:00
Sheldan
7c2b627fc9 [maven-release-plugin] prepare release oneplusbot-1.3.12 2021-05-24 00:02:50 +02:00
Sheldan
0419c70e49 [OPB-xxx] updating abstracto version 2021-05-23 23:39:08 +02:00
Sheldan
7777e4f1f0 [OPB-21] enabling emote tracking 2021-05-23 22:25:39 +02:00
Sheldan
02fd4af0f4 [OPB-20] enabling profanity filter 2021-05-23 18:01:32 +02:00
Sheldan
4778bca1ac [OPB-xxx] update readme 2021-05-12 01:13:52 +02:00
Sheldan
c14dc1a0a5 [maven-release-plugin] prepare for next development iteration 2021-05-12 01:12:14 +02:00
Sheldan
a34cf8ab4a [maven-release-plugin] prepare release oneplusbot-1.3.11 2021-05-12 01:12:07 +02:00
Sheldan
9a9c6fca2d [OPB-xxx] updating abstracto version 2021-05-12 01:11:18 +02:00
Sheldan
e236522328 [OPB-19] adding referral link functionality
changing name for setups feature
aligning starboard custom module name
2021-05-12 00:35:03 +02:00
Sheldan
67ae9702fd [OPB-17] implementing setups functionality 2021-05-11 13:07:15 +02:00
Sheldan
798d7bc894 [OPB-18] enabling invite filter module
upgrading liquibase structure to newer version
2021-05-10 22:31:54 +02:00
Sheldan
91bef88ab8 [maven-release-plugin] prepare for next development iteration 2021-05-02 23:47:21 +02:00
Sheldan
e57d82dbe2 [maven-release-plugin] prepare release oneplusbot-1.3.10 2021-05-02 23:47:15 +02:00
Sheldan
8de138550c [OPB-16] adding suggestion module and upgrading to newer abstracto version 2021-05-02 22:03:51 +02:00
Sheldan
a8ad582aec [OPB-14] renaming news module to not clash with the news command 2021-05-02 21:04:52 +02:00
Sheldan
f2055d8c52 [OPB-15] removing spaces before > for news posts, because of formatting issue of discord 2021-05-02 20:35:38 +02:00
Sheldan
58f92293a4 [OPB-xx] limiting response for defines to 250 characters to limit the wall of texts it can create 2021-04-30 01:31:19 +02:00
Sheldan
2e3afbc77d [OP-12] fixing news role in template 2021-04-25 00:25:42 +02:00
Sheldan
aee9186031 [OP-12] fixing truncating date for news posts locks resulting in longer period until it was locked 2021-04-25 00:02:57 +02:00
Sheldan
a5a598fc25 [maven-release-plugin] prepare for next development iteration 2021-04-24 22:34:06 +02:00
Sheldan
c4e5e7a7c3 [maven-release-plugin] prepare release oneplusbot-1.3.9 2021-04-24 22:33:59 +02:00
Sheldan
3dc9f45dde [OP-xxx] updating to release versions of abstracto 2021-04-24 22:19:18 +02:00
Sheldan
9f773abd7e [OPB-13] adding logging module and customizing leave message templates 2021-04-24 16:06:10 +02:00
Sheldan
bf55064984 [OPB-12] adding news/newsupdate command and introducing mechanisms for cleanup thereof
changing templates to have the metaconfig
moving starboard custom templates
2021-04-24 01:38:59 +02:00
Sheldan
d860ad6291 [OPB-xx] creating overrides for templates containing the embed color 2021-04-16 18:03:40 +02:00
Sheldan
d563950bee [OPB-10] fixing gateway ping metric in dashboard 2021-04-11 21:11:03 +02:00
Sheldan
79bd338f45 [maven-release-plugin] prepare for next development iteration 2021-04-11 00:43:21 +02:00
Sheldan
0bb14e0657 [maven-release-plugin] prepare release oneplusbot-1.3.8 2021-04-11 00:43:16 +02:00
Sheldan
d71faa9749 [OPB-x] enabling remind module and updating to abstracto 1.2.8 2021-04-11 00:39:23 +02:00
Sheldan
e251b12dff [OPB-x] changing urban define template to remove timestamp and make link visible 2021-04-10 23:12:29 +02:00
Sheldan
4efb2470f8 [OPB-10] adding gateway ping to grafana dashboard 2021-04-08 00:40:16 +02:00
Sheldan
77065f2374 [maven-release-plugin] prepare for next development iteration 2021-04-05 02:21:08 +02:00
Sheldan
0de0bdd64b [maven-release-plugin] prepare release oneplusbot-1.3.7 2021-04-05 02:21:02 +02:00
Sheldan
e75322cda7 [OPB-9] adding overrides module
overriding urban define template
updating to abstracto 1.2.7
2021-04-05 01:32:18 +02:00
Sheldan
698d34c0e0 [OPB-8] adding oneplus bot version to docker compose
changing port forwards to be local forwards
2021-04-05 01:24:21 +02:00
Sheldan
b3fafac81f [OPB-7] adding cache stats to grafana dashboard 2021-04-05 01:20:56 +02:00
Sheldan
8de5e543c8 [maven-release-plugin] prepare for next development iteration 2021-03-29 03:35:39 +02:00
Sheldan
eb620f5309 [maven-release-plugin] prepare release oneplusbot-1.3.6 2021-03-29 03:35:33 +02:00
Sheldan
694e33da93 [OPB-x] update to abstracto release 1.2.6 2021-03-29 03:33:45 +02:00
Sheldan
af27472b09 [OPB-x] updating release pipeline 2021-03-29 01:59:23 +02:00
Sheldan
89c810c346 [maven-release-plugin] prepare for next development iteration 2021-03-29 01:56:31 +02:00
Sheldan
eb28bb6fd8 [maven-release-plugin] prepare release oneplusbot-1.3.5 2021-03-29 01:56:26 +02:00
Sheldan
fad8abe2e3 [OPB-x] updating to abstracto 1.2.5
adding webservices dependency
2021-03-29 01:45:13 +02:00
Sheldan
d25f8dc12f [maven-release-plugin] prepare for next development iteration 2021-03-24 22:32:39 +01:00
Sheldan
9190688f45 [maven-release-plugin] prepare release oneplusbot-1.3.4 2021-03-24 22:32:33 +01:00
Sheldan
b84177f062 [OPB-x] updating to abstracto 1.2.4 2021-03-24 22:30:41 +01:00
Sheldan
6985f329f8 [maven-release-plugin] prepare for next development iteration 2021-03-24 21:28:17 +01:00
Sheldan
a815f7239e [maven-release-plugin] prepare release oneplusbot-1.3.3 2021-03-24 21:28:10 +01:00
Sheldan
085e53cebc [OPB-x] updating to abstracto 1.2.3 2021-03-24 21:21:21 +01:00
Sheldan
b7a67c8a38 [maven-release-plugin] prepare for next development iteration 2021-03-24 14:54:38 +01:00
164 changed files with 7860 additions and 425 deletions

View File

@@ -34,5 +34,5 @@ jobs:
env:
REGISTRY_PREFIX: docker.pkg.github.com/sheldan/oneplusbot/
VERSION: ${{ env.version }}
ABSTRACTO_VERSION: 1.2
ABSTRACTO_VERSION: 1.2.15
ABSTRACTO_REGISTRY_PREFIX: docker.pkg.github.com/sheldan/abstracto/

View File

@@ -7,5 +7,5 @@ The migration of the existing data from the database is handled via one time mig
Custom features which were ported
- [ ] FAQ
- [ ] Setup channel handling
- [ ] Referral link handling
- [x] Setup channel handling
- [x] Referral link handling

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>dev.sheldan.oneplus.bot.application</groupId>
<artifactId>application</artifactId>
<version>1.3.2</version>
<version>1.4.2</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>executable</artifactId>
@@ -80,17 +80,80 @@
<artifactId>link-embed-impl</artifactId>
</dependency>
<dependency>
<groupId>dev.sheldan.abstracto.modules</groupId>
<artifactId>webservices-impl</artifactId>
</dependency>
<dependency>
<groupId>dev.sheldan.abstracto.modules</groupId>
<artifactId>remind-impl</artifactId>
</dependency>
<dependency>
<groupId>dev.sheldan.abstracto.modules</groupId>
<artifactId>suggestion-impl</artifactId>
</dependency>
<dependency>
<groupId>dev.sheldan.abstracto.modules</groupId>
<artifactId>starboard-impl</artifactId>
</dependency>
<dependency>
<groupId>dev.sheldan.abstracto.modules</groupId>
<artifactId>logging-impl</artifactId>
</dependency>
<dependency>
<groupId>dev.sheldan.abstracto.modules</groupId>
<artifactId>invite-filter-impl</artifactId>
</dependency>
<dependency>
<groupId>dev.sheldan.abstracto.modules</groupId>
<artifactId>statistic-impl</artifactId>
</dependency>
<dependency>
<groupId>dev.sheldan.abstracto.modules</groupId>
<artifactId>profanity-filter-impl</artifactId>
</dependency>
<dependency>
<groupId>dev.sheldan.abstracto.modules</groupId>
<artifactId>experience-tracking-impl</artifactId>
</dependency>
<dependency>
<groupId>dev.sheldan.abstracto.modules</groupId>
<artifactId>moderation-impl</artifactId>
</dependency>
<dependency>
<groupId>dev.sheldan.oneplus.bot.application.custom</groupId>
<artifactId>starboard-custom</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>dev.sheldan.oneplus.bot.application.modules</groupId>
<artifactId>news</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>dev.sheldan.oneplus.bot.application.modules</groupId>
<artifactId>setup</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>dev.sheldan.oneplus.bot.application.modules</groupId>
<artifactId>referral</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</project>

View File

@@ -16,4 +16,6 @@ log4j.logger.org.hibernate.type=trace
management.metrics.tags.application=oneplus-bot
spring.security.user.name=abstracto
spring.security.user.password=password
spring.security.user.roles=USER
spring.security.user.roles=USER
spring.application.name=OnePlusBot

View File

@@ -6,4 +6,6 @@ spring.quartz.jdbc.initialize-schema=never
management.metrics.tags.application=oneplus-bot
spring.security.user.name= ${REST_USER_NAME}
spring.security.user.password= ${REST_PASSWORD}
spring.security.user.roles=USER
spring.security.user.roles=USER
spring.application.name=OnePlusBot

View File

@@ -29,7 +29,26 @@
</appender>
<appender name="requests-file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/requests_log.log</file>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<Pattern>
%d{dd-MM-yyyy HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
</Pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>
${LOG_PATH}/archived/requests_log_%d{dd-MM-yyyy}.log
</fileNamePattern>
<maxHistory>10</maxHistory>
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
</appender>
<logger name="dev.sheldan.abstracto" level="INFO"/>
<logger name="dev.sheldan.abstracto.core.logging" level="DEBUG">
<appender-ref ref="requests-file"/>
</logger>
<root level="info">
<appender-ref ref="logFileAppender"/>

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>dev.sheldan.oneplus.bot.application</groupId>
<artifactId>application</artifactId>
<version>1.3.2</version>
<version>1.4.2</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>dev.sheldan.oneplus.bot.application.custom</groupId>
<artifactId>oneplus-bot-customizations</artifactId>
<version>1.3.2</version>
<version>1.4.2</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,8 +3,8 @@
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-3.8.xsd
http://www.liquibase.org/xml/ns/dbchangelog-ext ../dbchangelog-3.8.xsd
http://www.liquibase.org/xml/ns/pro ../dbchangelog-3.8.xsd" >
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="starboard-custom-seedData/data.xml" relativeToChangelogFile="true"/>
</databaseChangeLog>

View File

@@ -3,8 +3,8 @@
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-3.8.xsd
http://www.liquibase.org/xml/ns/dbchangelog-ext ../../dbchangelog-3.8.xsd
http://www.liquibase.org/xml/ns/pro ../../dbchangelog-3.8.xsd" >
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="feature.xml" relativeToChangelogFile="true"/>
</databaseChangeLog>

View File

@@ -3,9 +3,9 @@
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-3.8.xsd
http://www.liquibase.org/xml/ns/dbchangelog-ext ../../dbchangelog-3.8.xsd
http://www.liquibase.org/xml/ns/pro ../../dbchangelog-3.8.xsd" >
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="starboard_custom_feature-insertion">
<insert tableName="feature">
<column name="key" value="starboardNotification"/>

View File

@@ -257,6 +257,7 @@
<xsd:attributeGroup name="changeLogAttributes">
<xsd:attribute name="logicalFilePath" type="xsd:string"/>
<xsd:attribute name="context" type="xsd:string"/>
<xsd:attribute name="changeLogId" type="xsd:string"/>
<xsd:attribute name="objectQuotingStrategy" type="objectQuotingStrategy" default="LEGACY"/>
</xsd:attributeGroup>
@@ -277,11 +278,12 @@
<xsd:attribute name="created" type="xsd:string"/>
<xsd:attribute name="runOrder" type="xsd:string"/>
<xsd:attribute name="ignore" type="booleanExp"/>
<xsd:attribute name="runWith" type="xsd:string" />
</xsd:attributeGroup>
<!-- Attributes for changes -->
<xsd:attributeGroup name="changeAttributes">
<xsd:anyAttribute namespace="##any" processContents="lax"/>
<xsd:anyAttribute namespace="##other" processContents="lax"/>
</xsd:attributeGroup>
<!-- Attributes for constraints -->
@@ -306,7 +308,7 @@
<xsd:attribute name="validateNullable" type="booleanExp"/>
<xsd:attribute name="validateUnique" type="booleanExp"/>
<xsd:attribute name="validatePrimaryKey" type="booleanExp"/>
<xsd:attribute name="validateForeignKey " type="booleanExp"/>
<xsd:attribute name="validateForeignKey" type="booleanExp"/>
</xsd:attributeGroup>
<xsd:attributeGroup name="column">
@@ -420,9 +422,10 @@
<xsd:attribute name="incrementBy" type="xsd:string"/>
<xsd:attribute name="maxValue" type="xsd:string"/>
<xsd:attribute name="minValue" type="xsd:string"/>
<xsd:attribute name="ordered" type="booleanExp"/>
<xsd:attribute name="ordered" type="xsd:string"/>
<xsd:attribute name="cacheSize" type="xsd:string"/>
<xsd:attribute name="cycle" type="booleanExp">
<xsd:attribute name="dataType" type="xsd:string" />
<xsd:attribute name="cycle" type="xsd:string">
<xsd:annotation>
<xsd:documentation>
true for a cycling sequence, false for a non-cycling sequence.
@@ -481,11 +484,15 @@
<xsd:attributeGroup ref="changeAttributes"/>
<xsd:attributeGroup ref="tableNameAttribute"/>
<xsd:attribute name="constraintName" type="xsd:string"/>
<xsd:attribute name="dropIndex" type="booleanExp"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="addUniqueConstraint">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded" />
</xsd:choice>
<xsd:attributeGroup ref="changeAttributes"/>
<xsd:attributeGroup ref="tableNameAttribute"/>
<xsd:attribute name="columnNames" type="xsd:string"
@@ -616,6 +623,7 @@
<xsd:attribute name="header" type="xsd:string"/>
<xsd:attribute name="name" type="xsd:string"/>
<xsd:attribute name="type" type="xsd:string"/>
<xsd:attribute name="allowUpdate" type="booleanExp"/>
<xsd:attribute name="defaultValue" type="xsd:string"/>
<xsd:attribute name="defaultValueNumeric" type="xsd:string"/>
<xsd:attribute name="defaultValueDate" type="xsd:string"/>
@@ -919,6 +927,7 @@
<xsd:attribute name="schemaName" type="xsd:string"/>
<xsd:attribute name="tableName" type="xsd:string" use="required"/>
<xsd:attribute name="columnName" type="xsd:string" use="required"/>
<xsd:attribute name="columnDataType" type="xsd:string"/>
<xsd:attribute name="remarks" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
@@ -957,6 +966,7 @@
<xsd:attributeGroup ref="tableNameAttribute"/>
<xsd:attribute name="tablespace" type="xsd:string"/>
<xsd:attribute name="remarks" type="xsd:string"/>
<xsd:anyAttribute namespace="##other" processContents="lax"/>
</xsd:complexType>
</xsd:element>
@@ -1124,7 +1134,7 @@
<xsd:complexType>
<xsd:attributeGroup ref="changeAttributes"/>
<xsd:attribute name="tag" type="xsd:string" use="required"/>
<xsd:anyAttribute namespace="##other" processContents="lax"/>
</xsd:complexType>
</xsd:element>
@@ -1226,7 +1236,6 @@
<xsd:complexType>
<xsd:attributeGroup ref="changeAttributes"/>
<xsd:attributeGroup ref="sequenceAttributes"/>
<xsd:attribute name="dataType" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
@@ -1283,7 +1292,7 @@
</xsd:sequence>
<xsd:attributeGroup ref="changeAttributes"/>
<xsd:attribute name="class" type="xsd:string" use="required"/>
<xsd:anyAttribute processContents="lax" />
</xsd:complexType>
</xsd:element>
@@ -1374,4 +1383,4 @@
</xsd:sequence>
</xsd:group>
</xsd:schema>
</xsd:schema>

View File

@@ -3,8 +3,8 @@
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-3.8.xsd
http://www.liquibase.org/xml/ns/dbchangelog-ext dbchangelog-3.8.xsd
http://www.liquibase.org/xml/ns/pro dbchangelog-3.8.xsd" >
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="1.0-starboard-custom/collection.xml" relativeToChangelogFile="true"/>
</databaseChangeLog>

View File

@@ -0,0 +1,39 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>dev.sheldan.oneplus.bot.application.modules</groupId>
<artifactId>oneplus-bot-modules</artifactId>
<version>1.4.2</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>news</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptors>
<descriptor>src/main/assembly/liquibase.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

View File

@@ -0,0 +1,18 @@
<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.1.0 http://maven.apache.org/xsd/assembly-2.1.0.xsd">
<id>liquibase</id>
<formats>
<format>zip</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
<fileSet>
<outputDirectory>.</outputDirectory>
<directory>${project.basedir}/src/main/resources/migrations</directory>
<includes>
<include>**/*</include>
</includes>
</fileSet>
</fileSets>
</assembly>

View File

@@ -0,0 +1,56 @@
package dev.sheldan.oneplus.bot.modules.news.commands;
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.oneplus.bot.modules.news.config.NewsFeatureDefinition;
import dev.sheldan.oneplus.bot.modules.news.config.NewsModuleDefinition;
import dev.sheldan.oneplus.bot.modules.news.service.NewsServiceBean;
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;
@Component
public class News extends AbstractConditionableCommand {
@Autowired
private NewsServiceBean newsServiceBean;
@Override
public CompletableFuture<CommandResult> executeAsync(CommandContext commandContext) {
String text = (String) commandContext.getParameters().getParameters().get(0);
// workaround for Discord formatting issue
text = text.replace("\n >", "\n>");
return newsServiceBean.sendNewsPost(text, commandContext.getMessage())
.thenApply(unused -> CommandResult.fromSuccess());
}
@Override
public CommandConfiguration getConfiguration() {
Parameter newsText = Parameter.builder().name("text").type(String.class).remainder(true).templated(true).build();
List<Parameter> parameters = Arrays.asList(newsText);
HelpInfo helpInfo = HelpInfo.builder().templated(true).build();
return CommandConfiguration.builder()
.name("news")
.module(NewsModuleDefinition.NEWS)
.parameters(parameters)
.supportsEmbedException(true)
.async(true)
.help(helpInfo)
.templated(true)
.causesReaction(true)
.build();
}
@Override
public FeatureDefinition getFeature() {
return NewsFeatureDefinition.NEWS;
}
}

View File

@@ -0,0 +1,59 @@
package dev.sheldan.oneplus.bot.modules.news.commands;
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.oneplus.bot.modules.news.config.NewsFeatureDefinition;
import dev.sheldan.oneplus.bot.modules.news.config.NewsModuleDefinition;
import dev.sheldan.oneplus.bot.modules.news.service.NewsServiceBean;
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;
@Component
public class UpdateNews extends AbstractConditionableCommand {
@Autowired
private NewsServiceBean newsServiceBean;
@Override
public CompletableFuture<CommandResult> executeAsync(CommandContext commandContext) {
List<Object> parameters = commandContext.getParameters().getParameters();
Long messageId = (Long) parameters.get(0);
String postText = (String) parameters.get(1);
// workaround for Discord formatting issue
postText = postText.replace("\n >", "\n>");
return newsServiceBean.updateNewsPostViaId(messageId, postText, commandContext.getMessage())
.thenApply(unused -> CommandResult.fromSuccess());
}
@Override
public CommandConfiguration getConfiguration() {
Parameter newsPostId = Parameter.builder().name("newsPostId").type(Long.class).templated(true).build();
Parameter newsText = Parameter.builder().name("text").type(String.class).remainder(true).templated(true).build();
List<Parameter> parameters = Arrays.asList(newsPostId, newsText);
HelpInfo helpInfo = HelpInfo.builder().templated(true).build();
return CommandConfiguration.builder()
.name("updateNews")
.module(NewsModuleDefinition.NEWS)
.parameters(parameters)
.supportsEmbedException(true)
.async(true)
.help(helpInfo)
.templated(true)
.causesReaction(true)
.build();
}
@Override
public FeatureDefinition getFeature() {
return NewsFeatureDefinition.NEWS;
}
}

View File

@@ -0,0 +1,23 @@
package dev.sheldan.oneplus.bot.modules.news.config;
import dev.sheldan.abstracto.core.config.FeatureConfig;
import dev.sheldan.abstracto.core.config.FeatureDefinition;
import dev.sheldan.abstracto.core.config.PostTargetEnum;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.List;
@Component
public class NewsFeature implements FeatureConfig {
@Override
public FeatureDefinition getFeature() {
return NewsFeatureDefinition.NEWS;
}
@Override
public List<PostTargetEnum> getRequiredPostTargets() {
return Arrays.asList(NewsPostTarget.NEWS_TARGET);
}
}

View File

@@ -0,0 +1,15 @@
package dev.sheldan.oneplus.bot.modules.news.config;
import dev.sheldan.abstracto.core.config.FeatureDefinition;
import lombok.Getter;
@Getter
public enum NewsFeatureDefinition implements FeatureDefinition {
NEWS("news");
private String key;
NewsFeatureDefinition(String key) {
this.key = key;
}
}

View File

@@ -0,0 +1,21 @@
package dev.sheldan.oneplus.bot.modules.news.config;
import dev.sheldan.abstracto.core.command.config.ModuleDefinition;
import dev.sheldan.abstracto.core.command.config.ModuleInfo;
import org.springframework.stereotype.Component;
@Component
public class NewsModuleDefinition implements ModuleDefinition {
public static final String NEWS = "newsModule";
@Override
public ModuleInfo getInfo() {
return ModuleInfo.builder().name(NEWS).templated(true).build();
}
@Override
public String getParentModule() {
return "default";
}
}

View File

@@ -0,0 +1,15 @@
package dev.sheldan.oneplus.bot.modules.news.config;
import dev.sheldan.abstracto.core.config.PostTargetEnum;
import lombok.Getter;
@Getter
public enum NewsPostTarget implements PostTargetEnum {
NEWS_TARGET("news");
private String key;
NewsPostTarget(String key) {
this.key = key;
}
}

View File

@@ -0,0 +1,10 @@
package dev.sheldan.oneplus.bot.modules.news.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
@Configuration
@PropertySource("classpath:news.properties")
public class NewsProperties {
}

View File

@@ -0,0 +1,16 @@
package dev.sheldan.oneplus.bot.modules.news.exception;
import dev.sheldan.abstracto.core.exception.AbstractoRunTimeException;
import dev.sheldan.abstracto.core.templating.Templatable;
public class NewsPostLockedException extends AbstractoRunTimeException implements Templatable {
@Override
public String getTemplateName() {
return "news_post_locked_exception";
}
@Override
public Object getTemplateModel() {
return new Object();
}
}

View File

@@ -0,0 +1,16 @@
package dev.sheldan.oneplus.bot.modules.news.exception;
import dev.sheldan.abstracto.core.exception.AbstractoRunTimeException;
import dev.sheldan.abstracto.core.templating.Templatable;
public class NewsPostNotFoundException extends AbstractoRunTimeException implements Templatable {
@Override
public String getTemplateName() {
return "news_post_not_found_exception";
}
@Override
public Object getTemplateModel() {
return new Object();
}
}

View File

@@ -0,0 +1,31 @@
package dev.sheldan.oneplus.bot.modules.news.job;
import dev.sheldan.oneplus.bot.modules.news.service.NewsServiceBean;
import lombok.extern.slf4j.Slf4j;
import org.quartz.DisallowConcurrentExecution;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.PersistJobDataAfterExecution;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.quartz.QuartzJobBean;
import org.springframework.stereotype.Component;
@Slf4j
@DisallowConcurrentExecution
@Component
@PersistJobDataAfterExecution
public class NewsPostCleanupJob extends QuartzJobBean {
@Autowired
private NewsServiceBean newsServiceBean;
@Override
protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
try {
log.info("Executing news post cleanup job.");
newsServiceBean.cleanUpNewsPosts();
} catch (Exception exception) {
log.error("Failed to execute news post cleanup job.", exception);
}
}
}

View File

@@ -0,0 +1,31 @@
package dev.sheldan.oneplus.bot.modules.news.job;
import dev.sheldan.oneplus.bot.modules.news.service.NewsServiceBean;
import lombok.extern.slf4j.Slf4j;
import org.quartz.DisallowConcurrentExecution;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.PersistJobDataAfterExecution;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.quartz.QuartzJobBean;
import org.springframework.stereotype.Component;
@Slf4j
@DisallowConcurrentExecution
@Component
@PersistJobDataAfterExecution
public class NewsPostLockingJob extends QuartzJobBean {
@Autowired
private NewsServiceBean newsServiceBean;
@Override
protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
try {
log.info("Executing news post lock job.");
newsServiceBean.lockNewsPosts();
} catch (Exception exception) {
log.error("Failed to execute news post lock job.", exception);
}
}
}

View File

@@ -0,0 +1,46 @@
package dev.sheldan.oneplus.bot.modules.news.listener;
import dev.sheldan.abstracto.core.config.FeatureDefinition;
import dev.sheldan.abstracto.core.listener.DefaultListenerResult;
import dev.sheldan.abstracto.core.listener.async.jda.AsyncMessageUpdatedListener;
import dev.sheldan.abstracto.core.models.listener.MessageUpdatedModel;
import dev.sheldan.oneplus.bot.modules.news.config.NewsFeatureDefinition;
import dev.sheldan.oneplus.bot.modules.news.model.database.NewsPost;
import dev.sheldan.oneplus.bot.modules.news.service.NewsServiceBean;
import dev.sheldan.oneplus.bot.modules.news.service.management.NewsPostManagementServiceBean;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Optional;
@Component
@Slf4j
public class NewsMessageSourceMessageUpdatedListener implements AsyncMessageUpdatedListener {
@Autowired
private NewsPostManagementServiceBean newsPostManagementServiceBean;
@Autowired
private NewsServiceBean newsServiceBean;
@Override
public DefaultListenerResult execute(MessageUpdatedModel model) {
Optional<NewsPost> existingPostOptional = newsPostManagementServiceBean.getNewsPostForSourceMessage(model.getAfter().getIdLong());
if(existingPostOptional.isPresent()) {
NewsPost newsPost = existingPostOptional.get();
if(!newsPost.isLocked()) {
newsServiceBean.updateNewsPost(newsPost, model.getAfter());
return DefaultListenerResult.PROCESSED;
} else {
log.info("Not updating news post {}, because it is locked.", newsPost.getSourceMessageId());
}
}
return DefaultListenerResult.IGNORED;
}
@Override
public FeatureDefinition getFeature() {
return NewsFeatureDefinition.NEWS;
}
}

View File

@@ -0,0 +1,18 @@
package dev.sheldan.oneplus.bot.modules.news.model;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.Role;
@Getter
@Setter
@Builder
public class NewsMessageModel {
private String messageText;
private Message message;
private Member author;
private Role newsRole;
}

View File

@@ -0,0 +1,51 @@
package dev.sheldan.oneplus.bot.modules.news.model.database;
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 lombok.*;
import javax.persistence.*;
import java.time.Instant;
@Builder
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "news_post")
@Getter
@Setter
@EqualsAndHashCode
public class NewsPost {
@Id
@Column(name = "source_message_id")
private Long sourceMessageId;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "server_id", nullable = false)
private AServer server;
@Column(name = "news_message_id")
private Long newsMessageId;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "author_user_in_server_id", nullable = false)
private AUserInAServer author;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "source_channel_id", nullable = false)
private AChannel sourceChannel;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "news_channel_id", nullable = false)
private AChannel newsChannel;
@Column(name = "locked")
private boolean locked;
@Column(name = "created")
private Instant created;
@Column(name = "updated")
private Instant updated;
}

View File

@@ -0,0 +1,17 @@
package dev.sheldan.oneplus.bot.modules.news.repository;
import dev.sheldan.oneplus.bot.modules.news.model.database.NewsPost;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.time.Instant;
import java.util.List;
import java.util.Optional;
@Repository
public interface NewsPostRepository extends JpaRepository<NewsPost, Long> {
List<NewsPost> findByCreatedLessThanAndLockedFalse(Instant date);
List<NewsPost> findByUpdatedLessThanAndLockedTrue(Instant date);
Optional<NewsPost> findByNewsMessageId(Long newsMessageId);
}

View File

@@ -0,0 +1,127 @@
package dev.sheldan.oneplus.bot.modules.news.service;
import dev.sheldan.abstracto.core.service.ChannelService;
import dev.sheldan.abstracto.core.service.PostTargetService;
import dev.sheldan.abstracto.core.templating.model.MessageToSend;
import dev.sheldan.abstracto.core.templating.service.TemplateService;
import dev.sheldan.abstracto.core.utils.FutureUtils;
import dev.sheldan.oneplus.bot.modules.news.config.NewsPostTarget;
import dev.sheldan.oneplus.bot.modules.news.exception.NewsPostLockedException;
import dev.sheldan.oneplus.bot.modules.news.model.NewsMessageModel;
import dev.sheldan.oneplus.bot.modules.news.model.database.NewsPost;
import dev.sheldan.oneplus.bot.modules.news.service.management.NewsPostManagementServiceBean;
import lombok.extern.slf4j.Slf4j;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.TextChannel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.List;
import java.util.concurrent.CompletableFuture;
@Component
@Slf4j
public class NewsServiceBean {
@Autowired
private PostTargetService postTargetService;
@Autowired
private TemplateService templateService;
@Autowired
private NewsPostManagementServiceBean newsPostManagementServiceBean;
@Autowired
private ChannelService channelService;
@Autowired
private NewsServiceBean self;
private static final String MESSAGE_TEMPLATE_KEY = "news_post";
@Value("${abstracto.feature.news.postLockSeconds}")
private Long postLockSeconds;
@Value("${abstracto.feature.news.removalDays}")
private Long removalDays;
@Transactional
public void lockNewsPosts() {
Instant oldestDate = Instant.now().minus(postLockSeconds, ChronoUnit.SECONDS);
log.info("Locking news posts older than {}.", oldestDate);
List<NewsPost> oldPosts = newsPostManagementServiceBean.findNewsPostsOlderNotLocked(oldestDate);
log.info("Locking {} news posts.", oldPosts.size());
oldPosts.forEach(newsPost -> newsPost.setLocked(true));
}
@Transactional
public void cleanUpNewsPosts() {
Instant oldestDate = Instant.now().minus(removalDays, ChronoUnit.DAYS).truncatedTo(ChronoUnit.DAYS);
log.info("Deleting news posts older than {}.", oldestDate);
List<NewsPost> oldPosts = newsPostManagementServiceBean.findNewsPostsUpdatedOlderThanAndLocked(oldestDate);
newsPostManagementServiceBean.deleteNewsPosts(oldPosts);
}
public CompletableFuture<Message> sendNewsPost(String text, Message commandMessage) {
NewsMessageModel model = NewsMessageModel
.builder()
.messageText(text)
.message(commandMessage)
.author(commandMessage.getMember())
.build();
log.info("Sending new message post based on message {}.", commandMessage.getIdLong());
Long serverId = commandMessage.getGuild().getIdLong();
MessageToSend messageToSend = templateService.renderEmbedTemplate(MESSAGE_TEMPLATE_KEY, model, serverId);
List<CompletableFuture<Message>> messageFutures = postTargetService.sendEmbedInPostTarget(messageToSend, NewsPostTarget.NEWS_TARGET, serverId);
return FutureUtils.toSingleFutureGeneric(messageFutures)
.thenApply(unused -> {
Message createdMessage = messageFutures.get(0).join();
self.persistPost(commandMessage, createdMessage);
return createdMessage;
});
}
public CompletableFuture<Void> updateNewsPostViaId(Long postId, String postText, Message updatedMessage) {
NewsPost post = newsPostManagementServiceBean.getNewsPostForNewsMessageId(postId);
if(post.isLocked()) {
throw new NewsPostLockedException();
}
return updateNewsPostMessage(post, updatedMessage, postText);
}
public CompletableFuture<Void> updateNewsPost(NewsPost newsPost, Message updatedMessage) {
String contentStripped = updatedMessage.getContentRaw();
String command = contentStripped.split(" ")[0];
String postText = updatedMessage.getContentRaw().replaceFirst(command, "");
return updateNewsPostMessage(newsPost, updatedMessage, postText);
}
private CompletableFuture<Void> updateNewsPostMessage(NewsPost newsPost, Message updatedMessage, String postText) {
NewsMessageModel model = NewsMessageModel
.builder()
.messageText(postText)
.message(updatedMessage)
.author(updatedMessage.getMember())
.build();
Long serverId = updatedMessage.getGuild().getIdLong();
newsPost.setUpdated(Instant.now());
log.info("Updating news post {} with new content based on message from user {} in server {}.",
newsPost.getSourceMessageId(), updatedMessage.getIdLong(), updatedMessage.getGuild().getId());
MessageToSend messageToSend = templateService.renderEmbedTemplate(MESSAGE_TEMPLATE_KEY, model, serverId);
TextChannel newsChannel = channelService.getTextChannelFromServer(serverId, newsPost.getNewsChannel().getId());
return channelService.editMessageInAChannelFuture(messageToSend, newsChannel, newsPost.getNewsMessageId())
.thenApply(message -> null);
}
@Transactional
public void persistPost(Message commandMessage, Message createdMessage) {
log.info("Persisting news post with created message {} based on command message {}.", createdMessage.getIdLong(), commandMessage.getIdLong());
newsPostManagementServiceBean.createNewsPost(commandMessage, createdMessage);
}
}

View File

@@ -0,0 +1,77 @@
package dev.sheldan.oneplus.bot.modules.news.service.management;
import dev.sheldan.abstracto.core.models.database.AChannel;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import dev.sheldan.abstracto.core.service.management.UserInServerManagementService;
import dev.sheldan.oneplus.bot.modules.news.exception.NewsPostNotFoundException;
import dev.sheldan.oneplus.bot.modules.news.model.database.NewsPost;
import dev.sheldan.oneplus.bot.modules.news.repository.NewsPostRepository;
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 javax.persistence.EntityManager;
import java.time.Instant;
import java.util.List;
import java.util.Optional;
@Component
@Slf4j
public class NewsPostManagementServiceBean {
@Autowired
private NewsPostRepository newsPostRepository;
@Autowired
private EntityManager entityManager;
@Autowired
private UserInServerManagementService userInServerManagementService;
public NewsPost createNewsPost(Message commandMessage, Message createdMessage) {
AChannel sourceChannel = entityManager.getReference(AChannel.class, commandMessage.getChannel().getIdLong());
AChannel newsChannel = entityManager.getReference(AChannel.class, createdMessage.getChannel().getIdLong());
AUserInAServer author = userInServerManagementService.loadOrCreateUser(commandMessage.getMember());
NewsPost post = NewsPost
.builder()
.sourceChannel(sourceChannel)
.newsChannel(newsChannel)
.author(author)
.newsMessageId(createdMessage.getIdLong())
.sourceMessageId(commandMessage.getIdLong())
.server(author.getServerReference())
.locked(false)
.build();
log.debug("Created news post based on message {}.", createdMessage.getIdLong());
return newsPostRepository.save(post);
}
public Optional<NewsPost> getNewsPostForSourceMessage(Long sourceMessageId) {
return newsPostRepository.findById(sourceMessageId);
}
public Optional<NewsPost> getNewsPostForNewsMessageIdOptional(Long sourceMessageId) {
return newsPostRepository.findByNewsMessageId(sourceMessageId);
}
public NewsPost getNewsPostForNewsMessageId(Long sourceMessageId) {
return getNewsPostForNewsMessageIdOptional(sourceMessageId).orElseThrow(NewsPostNotFoundException::new);
}
public List<NewsPost> findNewsPostsOlderNotLocked(Instant pointInTime) {
log.debug("Checking for not locked news posts older than {}", pointInTime);
return newsPostRepository.findByCreatedLessThanAndLockedFalse(pointInTime);
}
public List<NewsPost> findNewsPostsUpdatedOlderThanAndLocked(Instant pointInTime) {
log.debug("Checking for not locked news posts updated older than {}.", pointInTime);
return newsPostRepository.findByUpdatedLessThanAndLockedTrue(pointInTime);
}
public void deleteNewsPosts(List<NewsPost> postsToDelete) {
log.info("Deleting {} news posts.", postsToDelete.size());
postsToDelete.forEach(newsPost -> log.info("Deleting news post {}", newsPost.getSourceMessageId()));
newsPostRepository.deleteAll(postsToDelete);
}
}

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: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="news-update/update.xml" relativeToChangelogFile="true"/>
</databaseChangeLog>

View File

@@ -0,0 +1,15 @@
<?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="rename-news-module">
<update tableName="module">
<column name="name" value="newsModule" />
<where>name = 'news'</where>
</update>
</changeSet>
</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: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="module.xml" relativeToChangelogFile="true"/>
</databaseChangeLog>

View File

@@ -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="news-tables/tables.xml" relativeToChangelogFile="true"/>
<include file="news-seedData/data.xml" relativeToChangelogFile="true"/>
</databaseChangeLog>

View File

@@ -0,0 +1,23 @@
<?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="newsFeature" value="(SELECT id FROM feature WHERE key = 'news')"/>
<property name="newsModule" value="(SELECT id FROM module WHERE name = 'news')"/>
<changeSet author="Sheldan" id="news-commands" >
<insert tableName="command">
<column name="name" value="news"/>
<column name="module_id" valueComputed="${newsModule}"/>
<column name="feature_id" valueComputed="${newsFeature}"/>
</insert>
<insert tableName="command">
<column name="name" value="updateNews"/>
<column name="module_id" valueComputed="${newsModule}"/>
<column name="feature_id" valueComputed="${newsFeature}"/>
</insert>
</changeSet>
</databaseChangeLog>

View File

@@ -0,0 +1,13 @@
<?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="feature.xml" relativeToChangelogFile="true"/>
<include file="module.xml" relativeToChangelogFile="true"/>
<include file="command.xml" relativeToChangelogFile="true"/>
<include file="news_jobs.xml" relativeToChangelogFile="true"/>
</databaseChangeLog>

View File

@@ -0,0 +1,14 @@
<?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="news_feature-insertion">
<insert tableName="feature">
<column name="key" value="news"/>
</insert>
</changeSet>
</databaseChangeLog>

View File

@@ -0,0 +1,14 @@
<?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="news-module-insertion">
<insert tableName="module">
<column name="name" value="news"/>
</insert>
</changeSet>
</databaseChangeLog>

View File

@@ -0,0 +1,28 @@
<?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="news-job-insert">
<insert tableName="scheduler_job">
<column name="name" value="newsLockJob"/>
<column name="group_name" value="news"/>
<column name="clazz" value="dev.sheldan.oneplus.bot.modules.news.job.NewsPostLockingJob"/>
<column name="active" value="true"/>
<column name="cron_expression" value="0 0 * * * ?"/>
<column name="recovery" value="false"/>
</insert>
<insert tableName="scheduler_job">
<column name="name" value="newsCleanupJob"/>
<column name="group_name" value="news"/>
<column name="clazz" value="dev.sheldan.oneplus.bot.modules.news.job.NewsPostCleanupJob"/>
<column name="active" value="true"/>
<column name="cron_expression" value="0 0 0 * * ?"/>
<column name="recovery" value="false"/>
</insert>
</changeSet>
</databaseChangeLog>

View File

@@ -0,0 +1,62 @@
<?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="news_post-table">
<createTable tableName="news_post">
<column name="source_message_id" type="BIGINT">
<constraints nullable="true" primaryKey="true" primaryKeyName="pk_news_post"/>
</column>
<column name="source_channel_id" type="BIGINT">
<constraints nullable="false"/>
</column>
<column name="news_channel_id" type="BIGINT">
<constraints nullable="false"/>
</column>
<column name="author_user_in_server_id" type="BIGINT">
<constraints nullable="false"/>
</column>
<column name="news_message_id" type="BIGINT">
<constraints nullable="false"/>
</column>
<column name="server_id" type="BIGINT">
<constraints nullable="false"/>
</column>
<column name="locked" type="boolean">
<constraints nullable="false"/>
</column>
<column name="created" type="TIMESTAMP WITHOUT TIME ZONE">
<constraints nullable="true"/>
</column>
<column name="updated" type="TIMESTAMP WITHOUT TIME ZONE"/>
</createTable>
<addForeignKeyConstraint baseColumnNames="source_channel_id" baseTableName="news_post" constraintName="fk_news_post_source_channel"
deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION"
referencedColumnNames="id" referencedTableName="channel" validate="true"/>
<addForeignKeyConstraint baseColumnNames="news_channel_id" baseTableName="news_post" constraintName="fk_news_channel"
deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION"
referencedColumnNames="id" referencedTableName="channel" validate="true"/>
<addForeignKeyConstraint baseColumnNames="author_user_in_server_id" baseTableName="news_post" constraintName="fk_news_post_author"
deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION"
referencedColumnNames="user_in_server_id" referencedTableName="user_in_server" validate="true"/>
<addForeignKeyConstraint baseColumnNames="server_id" baseTableName="news_post" constraintName="fk_news_post_server"
deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION"
referencedColumnNames="id" referencedTableName="server" validate="true"/>
<sql>
DROP TRIGGER IF EXISTS news_post_update_trigger ON news_post;
CREATE TRIGGER repost_check_channel_group_update_trigger BEFORE UPDATE ON news_post FOR EACH ROW EXECUTE PROCEDURE update_trigger_procedure();
</sql>
<sql>
DROP TRIGGER IF EXISTS news_post_insert_trigger ON news_post;
CREATE TRIGGER repost_check_channel_group_insert_trigger BEFORE INSERT ON news_post FOR EACH ROW EXECUTE PROCEDURE insert_trigger_procedure();
</sql>
</changeSet>
</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: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="news_post.xml" relativeToChangelogFile="true"/>
</databaseChangeLog>

View File

@@ -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="1.3.9-news/collection.xml" relativeToChangelogFile="true"/>
<include file="1.3.10-news/collection.xml" relativeToChangelogFile="true"/>
</databaseChangeLog>

View File

@@ -0,0 +1,7 @@
abstracto.postTargets.news.name=news
abstracto.featureFlags.news.featureName=news
abstracto.featureFlags.news.enabled=false
abstracto.feature.news.removalDays=4
abstracto.feature.news.postLockSeconds=3600

View File

@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>dev.sheldan.oneplus.bot.application</groupId>
<artifactId>application</artifactId>
<version>1.4.2</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>dev.sheldan.oneplus.bot.application.modules</groupId>
<artifactId>oneplus-bot-modules</artifactId>
<packaging>pom</packaging>
<modules>
<module>news</module>
<module>setup</module>
<module>referral</module>
</modules>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
</project>

View File

@@ -0,0 +1,39 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>dev.sheldan.oneplus.bot.application.modules</groupId>
<artifactId>oneplus-bot-modules</artifactId>
<version>1.4.2</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>referral</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptors>
<descriptor>src/main/assembly/liquibase.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

View File

@@ -0,0 +1,18 @@
<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.1.0 http://maven.apache.org/xsd/assembly-2.1.0.xsd">
<id>liquibase</id>
<formats>
<format>zip</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
<fileSet>
<outputDirectory>.</outputDirectory>
<directory>${project.basedir}/src/main/resources/migrations</directory>
<includes>
<include>**/*</include>
</includes>
</fileSet>
</fileSets>
</assembly>

View File

@@ -0,0 +1,15 @@
package dev.sheldan.oneplus.bot.modules.referral.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
@Configuration
public class ReferralBeanConfig {
@Bean(value = "referralDelayExecutor")
public ScheduledExecutorService getDelayedExecutor() {
return Executors.newSingleThreadScheduledExecutor();
}
}

View File

@@ -0,0 +1,24 @@
package dev.sheldan.oneplus.bot.modules.referral.config;
import dev.sheldan.abstracto.core.config.FeatureConfig;
import dev.sheldan.abstracto.core.config.FeatureDefinition;
import dev.sheldan.abstracto.core.config.PostTargetEnum;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.List;
@Component
public class ReferralFeature implements FeatureConfig {
@Override
public FeatureDefinition getFeature() {
return ReferralFeatureDefinition.REFERRAL;
}
@Override
public List<PostTargetEnum> getRequiredPostTargets() {
return Arrays.asList(ReferralPostTarget.REFERRAL);
}
}

View File

@@ -0,0 +1,15 @@
package dev.sheldan.oneplus.bot.modules.referral.config;
import dev.sheldan.abstracto.core.config.FeatureDefinition;
import lombok.Getter;
@Getter
public enum ReferralFeatureDefinition implements FeatureDefinition {
REFERRAL("referral");
private String key;
ReferralFeatureDefinition(String key) {
this.key = key;
}
}

View File

@@ -0,0 +1,15 @@
package dev.sheldan.oneplus.bot.modules.referral.config;
import dev.sheldan.abstracto.core.config.PostTargetEnum;
import lombok.Getter;
@Getter
public enum ReferralPostTarget implements PostTargetEnum {
REFERRAL("referral");
private String key;
ReferralPostTarget(String key) {
this.key = key;
}
}

View File

@@ -0,0 +1,10 @@
package dev.sheldan.oneplus.bot.modules.referral.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
@Configuration
@PropertySource("classpath:referral.properties")
public class ReferralProperties {
}

View File

@@ -0,0 +1,167 @@
package dev.sheldan.oneplus.bot.modules.referral.listener;
import dev.sheldan.abstracto.core.config.FeatureDefinition;
import dev.sheldan.abstracto.core.listener.DefaultListenerResult;
import dev.sheldan.abstracto.core.listener.async.jda.AsyncMessageReceivedListener;
import dev.sheldan.abstracto.core.models.ServerUser;
import dev.sheldan.abstracto.core.models.database.PostTarget;
import dev.sheldan.abstracto.core.models.listener.MessageReceivedModel;
import dev.sheldan.abstracto.core.service.ChannelService;
import dev.sheldan.abstracto.core.service.MessageService;
import dev.sheldan.abstracto.core.service.management.PostTargetManagement;
import dev.sheldan.abstracto.core.utils.CompletableFutureList;
import dev.sheldan.oneplus.bot.modules.referral.config.ReferralFeatureDefinition;
import dev.sheldan.oneplus.bot.modules.referral.config.ReferralPostTarget;
import dev.sheldan.oneplus.bot.modules.referral.model.template.Referral;
import dev.sheldan.oneplus.bot.modules.referral.model.template.ReferralPostModel;
import dev.sheldan.oneplus.bot.modules.referral.model.template.ReferralTooRecentModel;
import dev.sheldan.oneplus.bot.modules.referral.service.ReferralServiceBean;
import lombok.extern.slf4j.Slf4j;
import net.dv8tion.jda.api.entities.Message;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.time.Instant;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.function.Function;
@Component
@Slf4j
public class ReferralListener implements AsyncMessageReceivedListener {
@Autowired
private PostTargetManagement postTargetManagement;
@Autowired
private MessageService messageService;
@Autowired
private ReferralServiceBean referralServiceBean;
@Autowired
private ChannelService channelService;
@Autowired
private ReferralListener self;
@Qualifier("referralDelayExecutor")
@Autowired
private ScheduledExecutorService scheduledExecutorService;
@Value("${oneplus.bot.referral.deleteDelaySeconds}")
private Long deleteDelaySeconds;
@Value("${oneplus.bot.referral.maxReferralCount}")
private Long maxReferralLinksPerPost;
private static final String NO_REFERRAL_LINK_FOUND_TEMPLATE_KEY = "referralListener_no_referral_link_found";
private static final String REFERRAL_POST_TOO_RECENT_TEMPLATE_KEY = "referralListener_too_recent_post";
private static final String REFERRAL_POST_EMBED_TEMPLATE_KEY = "referralListener_referral_post";
@Override
public DefaultListenerResult execute(MessageReceivedModel model) {
Long serverId = model.getServerId();
Optional<PostTarget> referralPostTargetOptional = postTargetManagement.getPostTargetOptional(ReferralPostTarget.REFERRAL, serverId);
if(referralPostTargetOptional.isPresent()) {
PostTarget referralTarget = referralPostTargetOptional.get();
Message message = model.getMessage();
if (message.getChannel().getIdLong() == referralTarget.getChannelReference().getId()) {
Long authorId = message.getAuthor().getIdLong();
if (!message.isFromGuild() || message.isWebhookMessage() || message.getType().isSystem()) {
log.info("Deleting illegal message by user {} in referral channel in server {}.", authorId, serverId);
messageService.deleteMessage(message).exceptionally(deletionErrorConsumer(message));
return DefaultListenerResult.IGNORED;
}
if(message.getAuthor().isBot()) {
log.debug("Ignoring message from a bot user {} in referral channel in server {}.", authorId, serverId);
return DefaultListenerResult.IGNORED;
}
List<Referral> foundReferrals = referralServiceBean.getReferralsFromMessage(message);
if(foundReferrals.isEmpty()) {
log.info("Did not find referrals in message {} by user {} in server {} - deleting message.",
message.getIdLong(), authorId, serverId);
deleteAndNotify(message, NO_REFERRAL_LINK_FOUND_TEMPLATE_KEY, new Object());
return DefaultListenerResult.IGNORED;
}
log.info("Found {} referral links in message {} by user {} in server {}.",
foundReferrals.size(), message.getIdLong(), authorId, serverId);
Instant nextReferralDate = referralServiceBean.getNextReferralDate(message.getMember());
if(nextReferralDate.isAfter(Instant.now())) {
log.info("Referrals in message {} by user {} in server {} was before allowed repost date {} - deleting message.",
message.getIdLong(), authorId, serverId, nextReferralDate);
ReferralTooRecentModel templateModel = ReferralTooRecentModel
.builder()
.nextReferralDate(nextReferralDate)
.build();
deleteAndNotify(message, REFERRAL_POST_TOO_RECENT_TEMPLATE_KEY, templateModel);
return DefaultListenerResult.PROCESSED;
}
if(foundReferrals.size() > maxReferralLinksPerPost) {
log.info("More referral links ({}) than allowed ({}) in message {} in server {} by user {}.",
foundReferrals.size(), maxReferralLinksPerPost, message.getIdLong(), serverId, authorId);
foundReferrals = foundReferrals.subList(0, maxReferralLinksPerPost.intValue());
}
ReferralPostModel postModel = ReferralPostModel
.builder()
.referrals(foundReferrals)
.postingMember(message.getMember())
.build();
ServerUser serverUser = ServerUser.fromMember(message.getMember());
CompletableFutureList<Message> sendFutures = new CompletableFutureList<>(channelService
.sendEmbedTemplateInMessageChannelList(REFERRAL_POST_EMBED_TEMPLATE_KEY, postModel, message.getChannel()));
CompletableFuture<Void> deletionFuture = messageService.deleteMessage(message);
CompletableFuture.allOf(sendFutures.getMainFuture(), deletionFuture)
.thenAccept(unused -> self.updateReferralStateInDatabase(serverUser))
.exceptionally(throwable -> {
log.error("Failed to delete or persist referral message from user {} in server {}.", authorId, serverId, throwable);
return null;
});
}
}
return DefaultListenerResult.IGNORED;
}
@Transactional
public void updateReferralStateInDatabase(ServerUser serverUser) {
referralServiceBean.updateDbState(serverUser);
}
private void deleteAndNotify(Message message, String usedTemplate, Object usedModel) {
CompletableFutureList<Message> futures = new CompletableFutureList<>(channelService
.sendEmbedTemplateInMessageChannelList(usedTemplate, usedModel, message.getChannel()));
futures.getMainFuture().thenAccept(unused ->
scheduledExecutorService.schedule(() ->
futures.getObjects().forEach(createdMessage -> messageService.deleteMessage(createdMessage)),
deleteDelaySeconds, TimeUnit.SECONDS));
futures.getMainFuture().exceptionally(throwable -> {
log.error("Failed to send denial about setups with template {} message {} in channel {} in server {} by {}.",
usedTemplate, message.getIdLong(), message.getChannel().getIdLong(), message.getGuild().getIdLong(), message.getAuthor().getIdLong());
return null;
});
messageService.deleteMessage(message).exceptionally(deletionErrorConsumer(message));
}
private Function<Throwable, Void> deletionErrorConsumer(Message message) {
return throwable -> {
log.error("Failed to delete setups message {} in channel {} in server {} by {}.",
message.getIdLong(), message.getChannel().getIdLong(), message.getGuild().getIdLong(), message.getAuthor().getIdLong());
return null;
};
}
@Override
public FeatureDefinition getFeature() {
return ReferralFeatureDefinition.REFERRAL;
}
}

View File

@@ -0,0 +1,14 @@
package dev.sheldan.oneplus.bot.modules.referral.model;
import lombok.Getter;
@Getter
public enum ReferralType {
SMARTPHONE("smartphone"), ACCESSORIES("accessories"), SMARTPHONE_INDIA("smartphoneIndia");
private String key;
ReferralType(String key) {
this.key = key;
}
}

View File

@@ -0,0 +1,44 @@
package dev.sheldan.oneplus.bot.modules.referral.model.database;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import lombok.*;
import javax.persistence.*;
import java.time.Instant;
@Builder
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "referral_user_in_server")
@Getter
@Setter
@EqualsAndHashCode
public class ReferralUserInAServer {
@Id
@Column(name = "id")
private Long id;
/**
* The {@link AUserInAServer user} which is represented by this object
*/
@OneToOne(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@PrimaryKeyJoinColumn
private AUserInAServer user;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "server_id", nullable = false)
private AServer server;
@Column(name = "last_referral_post")
private Instant lastReferralPost;
@Column(name = "created")
private Instant created;
@Column(name = "updated")
private Instant updated;
}

View File

@@ -0,0 +1,15 @@
package dev.sheldan.oneplus.bot.modules.referral.model.template;
import dev.sheldan.oneplus.bot.modules.referral.model.ReferralType;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@Builder
public class Referral {
private String referralLink;
private String referralIdentifier;
private ReferralType type;
}

View File

@@ -0,0 +1,16 @@
package dev.sheldan.oneplus.bot.modules.referral.model.template;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import net.dv8tion.jda.api.entities.Member;
import java.util.List;
@Getter
@Setter
@Builder
public class ReferralPostModel {
private Member postingMember;
private List<Referral> referrals;
}

View File

@@ -0,0 +1,14 @@
package dev.sheldan.oneplus.bot.modules.referral.model.template;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import java.time.Instant;
@Getter
@Setter
@Builder
public class ReferralTooRecentModel {
private Instant nextReferralDate;
}

View File

@@ -0,0 +1,12 @@
package dev.sheldan.oneplus.bot.modules.referral.repository;
import dev.sheldan.oneplus.bot.modules.referral.model.database.ReferralUserInAServer;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.util.Optional;
@Repository
public interface ReferralUserInAServerRepository extends JpaRepository<ReferralUserInAServer, Long> {
Optional<ReferralUserInAServer> findByServer_IdAndUser_UserReference_Id(Long serverId, Long userId);
}

View File

@@ -0,0 +1,77 @@
package dev.sheldan.oneplus.bot.modules.referral.service;
import dev.sheldan.abstracto.core.models.ServerUser;
import dev.sheldan.oneplus.bot.modules.referral.model.ReferralType;
import dev.sheldan.oneplus.bot.modules.referral.model.database.ReferralUserInAServer;
import dev.sheldan.oneplus.bot.modules.referral.model.template.Referral;
import dev.sheldan.oneplus.bot.modules.referral.service.management.ReferralUserManagementServiceBean;
import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Message;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@Component
public class ReferralServiceBean {
@Value("${oneplus.bot.referral.referralRepostDays}")
private Long repostDurationDays;
@Autowired
private ReferralUserManagementServiceBean referralUserManagementServiceBean;
private final Pattern referralPattern = Pattern.compile("(?<whole>https?://(?:www\\.)?oneplus\\.(?:[a-z]{1,63})[^\\s]*invite(?:#(?<identifier>[^\\s]+)|.+=([^\\s&]+)))");
public List<Referral> getReferralsFromMessage(Message message) {
List<Referral> referrals = new ArrayList<>();
Matcher matcher = referralPattern.matcher(message.getContentRaw());
while(matcher.find()) {
String fullUrl = matcher.group("whole");
String referralIdentifier = matcher.group("identifier");
Referral referral = Referral
.builder()
.referralLink(fullUrl)
.type(getType(referralIdentifier, fullUrl))
.referralIdentifier(referralIdentifier)
.build();
referrals.add(referral);
}
return referrals;
}
private ReferralType getType(String identifier, String fullUrl) {
if(identifier.length() < 20) {
return ReferralType.SMARTPHONE;
} else if(fullUrl.contains(".in")) {
return ReferralType.SMARTPHONE_INDIA;
} else {
return ReferralType.ACCESSORIES;
}
}
public void updateDbState(ServerUser serverUser) {
Optional<ReferralUserInAServer> userOptional = referralUserManagementServiceBean.getReferralFromDb(serverUser);
if(userOptional.isPresent()) {
userOptional.get().setLastReferralPost(Instant.now());
} else {
referralUserManagementServiceBean.createReferralUser(serverUser);
}
}
public Instant getNextReferralDate(Member member) {
ServerUser serverUser = ServerUser.fromMember(member);
Optional<ReferralUserInAServer> userOptional = referralUserManagementServiceBean.getReferralFromDb(serverUser);
return userOptional.map(referralUserInAServer -> referralUserInAServer
.getLastReferralPost()
.plus(repostDurationDays, ChronoUnit.DAYS))
.orElse(Instant.now());
}
}

View File

@@ -0,0 +1,38 @@
package dev.sheldan.oneplus.bot.modules.referral.service.management;
import dev.sheldan.abstracto.core.models.ServerUser;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import dev.sheldan.abstracto.core.service.management.UserInServerManagementService;
import dev.sheldan.oneplus.bot.modules.referral.model.database.ReferralUserInAServer;
import dev.sheldan.oneplus.bot.modules.referral.repository.ReferralUserInAServerRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.time.Instant;
import java.util.Optional;
@Component
public class ReferralUserManagementServiceBean {
@Autowired
private ReferralUserInAServerRepository repository;
@Autowired
private UserInServerManagementService userInServerManagementService;
public Optional<ReferralUserInAServer> getReferralFromDb(ServerUser serverUser) {
return repository.findByServer_IdAndUser_UserReference_Id(serverUser.getServerId(), serverUser.getUserId());
}
public ReferralUserInAServer createReferralUser(ServerUser serverUser) {
AUserInAServer userInAServer = userInServerManagementService.loadOrCreateUser(serverUser);
ReferralUserInAServer user = ReferralUserInAServer
.builder()
.user(userInAServer)
.id(userInAServer.getUserInServerId())
.lastReferralPost(Instant.now())
.server(userInAServer.getServerReference())
.build();
return repository.save(user);
}
}

View File

@@ -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="referral-tables/tables.xml" relativeToChangelogFile="true"/>
<include file="referral-seedData/data.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: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="feature.xml" relativeToChangelogFile="true"/>
</databaseChangeLog>

View File

@@ -0,0 +1,14 @@
<?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="referral_feature-insertion">
<insert tableName="feature">
<column name="key" value="referral"/>
</insert>
</changeSet>
</databaseChangeLog>

View File

@@ -0,0 +1,35 @@
<?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="referral_user_in_server-table">
<createTable tableName="referral_user_in_server">
<column name="id" type="BIGINT">
<constraints nullable="false" primaryKey="true" primaryKeyName="referral_user_in_server_pkey"/>
</column>
<column name="created" type="TIMESTAMP WITHOUT TIME ZONE">
<constraints nullable="true"/>
</column>
<column name="updated" type="TIMESTAMP WITHOUT TIME ZONE"/>
<column name="last_referral_post" type="TIMESTAMP WITHOUT TIME ZONE" />
<column name="server_id" type="BIGINT">
<constraints nullable="false"/>
</column>
</createTable>
<addForeignKeyConstraint baseColumnNames="server_id" baseTableName="referral_user_in_server" constraintName="fk_referral_user_in_server_server" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="id" referencedTableName="server" validate="true"/>
<addForeignKeyConstraint baseColumnNames="id" baseTableName="referral_user_in_server" constraintName="fk_referral_user_in_server_user" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="user_in_server_id" referencedTableName="user_in_server" validate="true"/>
<sql>
DROP TRIGGER IF EXISTS referral_user_in_server_update_trigger ON referral_user_in_server;
CREATE TRIGGER referral_user_in_server_update_trigger BEFORE UPDATE ON referral_user_in_server FOR EACH ROW EXECUTE PROCEDURE update_trigger_procedure();
</sql>
<sql>
DROP TRIGGER IF EXISTS referral_user_in_server_insert_trigger ON referral_user_in_server;
CREATE TRIGGER referral_user_in_server_insert_trigger BEFORE INSERT ON referral_user_in_server FOR EACH ROW EXECUTE PROCEDURE insert_trigger_procedure();
</sql>
</changeSet>
</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: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="referral_user_in_server.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: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="1.3.11-referral/collection.xml" relativeToChangelogFile="true"/>
</databaseChangeLog>

View File

@@ -0,0 +1,8 @@
abstracto.postTargets.referral.name=referral
abstracto.featureFlags.referral.featureName=referral
abstracto.featureFlags.referral.enabled=false
oneplus.bot.referral.maxReferralCount=2
oneplus.bot.referral.deleteDelaySeconds=7
oneplus.bot.referral.referralRepostDays=14

View File

@@ -0,0 +1,34 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>oneplus-bot-modules</artifactId>
<groupId>dev.sheldan.oneplus.bot.application.modules</groupId>
<version>1.4.2</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>setup</artifactId>
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptors>
<descriptor>src/main/assembly/liquibase.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

View File

@@ -0,0 +1,18 @@
<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.1.0 http://maven.apache.org/xsd/assembly-2.1.0.xsd">
<id>liquibase</id>
<formats>
<format>zip</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
<fileSet>
<outputDirectory>.</outputDirectory>
<directory>${project.basedir}/src/main/resources/migrations</directory>
<includes>
<include>**/*</include>
</includes>
</fileSet>
</fileSets>
</assembly>

View File

@@ -0,0 +1,15 @@
package dev.sheldan.oneplus.bot.modules.setup.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
@Configuration
public class SetupBeanConfig {
@Bean(value = "setupDelayedExecutor")
public ScheduledExecutorService getDelayedExecutor() {
return Executors.newSingleThreadScheduledExecutor();
}
}

View File

@@ -0,0 +1,30 @@
package dev.sheldan.oneplus.bot.modules.setup.config;
import dev.sheldan.abstracto.core.config.FeatureConfig;
import dev.sheldan.abstracto.core.config.FeatureDefinition;
import dev.sheldan.abstracto.core.config.PostTargetEnum;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.List;
import static dev.sheldan.oneplus.bot.modules.setup.listener.SetupListener.SETUP_UPVOTE_EMOTE_KEY;
@Component
public class SetupFeatureConfig implements FeatureConfig {
@Override
public FeatureDefinition getFeature() {
return SetupFeatureDefinition.SETUP;
}
@Override
public List<PostTargetEnum> getRequiredPostTargets() {
return Arrays.asList(SetupPostTarget.SETUP);
}
@Override
public List<String> getRequiredEmotes() {
return Arrays.asList(SETUP_UPVOTE_EMOTE_KEY);
}
}

View File

@@ -0,0 +1,15 @@
package dev.sheldan.oneplus.bot.modules.setup.config;
import dev.sheldan.abstracto.core.config.FeatureDefinition;
import lombok.Getter;
@Getter
public enum SetupFeatureDefinition implements FeatureDefinition {
SETUP("setup");
private String key;
SetupFeatureDefinition(String key) {
this.key = key;
}
}

View File

@@ -0,0 +1,15 @@
package dev.sheldan.oneplus.bot.modules.setup.config;
import dev.sheldan.abstracto.core.config.PostTargetEnum;
import lombok.Getter;
@Getter
public enum SetupPostTarget implements PostTargetEnum {
SETUP("setup");
private String key;
SetupPostTarget(String key) {
this.key = key;
}
}

View File

@@ -0,0 +1,10 @@
package dev.sheldan.oneplus.bot.modules.setup.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
@Configuration
@PropertySource("classpath:setup.properties")
public class SetupProperties {
}

View File

@@ -0,0 +1,99 @@
package dev.sheldan.oneplus.bot.modules.setup.listener;
import dev.sheldan.abstracto.core.config.FeatureDefinition;
import dev.sheldan.abstracto.core.listener.DefaultListenerResult;
import dev.sheldan.abstracto.core.listener.async.jda.AsyncMessageReceivedListener;
import dev.sheldan.abstracto.core.models.database.PostTarget;
import dev.sheldan.abstracto.core.models.listener.MessageReceivedModel;
import dev.sheldan.abstracto.core.service.MessageService;
import dev.sheldan.abstracto.core.service.ReactionService;
import dev.sheldan.abstracto.core.service.management.PostTargetManagement;
import dev.sheldan.oneplus.bot.modules.setup.config.SetupFeatureDefinition;
import dev.sheldan.oneplus.bot.modules.setup.config.SetupPostTarget;
import dev.sheldan.oneplus.bot.modules.setup.service.SetupServiceBean;
import lombok.extern.slf4j.Slf4j;
import net.dv8tion.jda.api.entities.Message;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.Optional;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
@Component
@Slf4j
public class SetupListener implements AsyncMessageReceivedListener {
@Autowired
private PostTargetManagement postTargetManagement;
@Autowired
private SetupServiceBean setupServiceBean;
@Qualifier("setupDelayedExecutor")
@Autowired
private ScheduledExecutorService scheduledExecutorService;
@Value("${oneplus.bot.setup.deletionDelaySeconds}")
private Long deletionDelay;
@Autowired
private MessageService messageService;
@Autowired
private ReactionService reactionService;
public static final String SETUP_UPVOTE_EMOTE_KEY = "setupUpvote";
@Override
public DefaultListenerResult execute(MessageReceivedModel model) {
Long serverId = model.getServerId();
Optional<PostTarget> setupPostTargetOptional = postTargetManagement.getPostTargetOptional(SetupPostTarget.SETUP, serverId);
if(setupPostTargetOptional.isPresent()) {
PostTarget setupTarget = setupPostTargetOptional.get();
Message originalMessage = model.getMessage();
if(originalMessage.getChannel().getIdLong() == setupTarget.getChannelReference().getId()) {
if(!originalMessage.isFromGuild() || originalMessage.isWebhookMessage() || originalMessage.getType().isSystem()) {
messageService.deleteMessage(originalMessage);
return DefaultListenerResult.IGNORED;
}
boolean currentlyInvalid = setupServiceBean.currentlyInvalid(originalMessage);
if(currentlyInvalid) {
if(setupServiceBean.mightContainEmbed(originalMessage)) {
log.info("Setup message did not contain embeds not attachments, but a link - waiting for embeds on message {}" +
" in channel {} in guild {} by user {}.", originalMessage.getIdLong(), originalMessage.getChannel().getIdLong(),
originalMessage.getGuild().getIdLong(), originalMessage.getAuthor().getIdLong());
scheduledExecutorService.schedule(() -> {
messageService.loadMessage(originalMessage).thenAccept(loadedMessage -> {
if(setupServiceBean.currentlyInvalid(loadedMessage)) {
log.info("Message did not contain attachments nor embeds after a delay - deleting setup message {}.", loadedMessage.getIdLong());
messageService.deleteMessage(loadedMessage);
} else {
log.info("Message contained embeds/attachments after a delay - message was accepted {}.", loadedMessage.getIdLong());
reactionService.addReactionToMessage(SETUP_UPVOTE_EMOTE_KEY, serverId, loadedMessage);
}
});
}, deletionDelay, TimeUnit.SECONDS);
} else {
log.info("Did not find any attachments nor embeds and no link to lead to any embeds - deleting setup message {} in channel {} in server {}" +
"by user {} for setup.", originalMessage.getIdLong(), originalMessage.getChannel().getIdLong(), originalMessage.getGuild().getIdLong(),
originalMessage.getAuthor().getIdLong());
messageService.deleteMessage(originalMessage);
}
} else {
log.info("Accepting setup message {} in channel {} in guild {} from user {}.", originalMessage.getIdLong(),
originalMessage.getChannel().getIdLong(), originalMessage.getGuild().getIdLong(), originalMessage.getAuthor().getIdLong());
reactionService.addReactionToMessage(SETUP_UPVOTE_EMOTE_KEY, serverId, originalMessage);
}
}
}
return DefaultListenerResult.IGNORED;
}
@Override
public FeatureDefinition getFeature() {
return SetupFeatureDefinition.SETUP;
}
}

View File

@@ -0,0 +1,35 @@
package dev.sheldan.oneplus.bot.modules.setup.service;
import net.dv8tion.jda.api.entities.EmbedType;
import net.dv8tion.jda.api.entities.Message;
import org.springframework.stereotype.Component;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@Component
public class SetupServiceBean {
private static final Pattern URL_REGEX = Pattern.compile("((https?|ftp)://|(www|ftp)\\.)?[a-z0-9-]+(\\.[a-z0-9-]+)+([/?].*)?");
public boolean mightContainEmbed(Message message) {
Matcher urlMatcher = URL_REGEX.matcher(message.getContentRaw());
return urlMatcher.find();
}
public boolean currentlyValid(Message message) {
return !message.getAttachments().isEmpty() ||
(
!message.getEmbeds().isEmpty() &&
message
.getEmbeds()
.stream()
.anyMatch(messageEmbed -> messageEmbed.getType().equals(EmbedType.IMAGE))
);
}
public boolean currentlyInvalid(Message message) {
return !currentlyValid(message);
}
}

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: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="setup-seedData/data.xml" relativeToChangelogFile="true"/>
</databaseChangeLog>

View File

@@ -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="feature.xml" relativeToChangelogFile="true"/>
<include file="default_emote.xml" relativeToChangelogFile="true"/>
</databaseChangeLog>

View File

@@ -0,0 +1,15 @@
<?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="setup_default_emote-insert">
<insert tableName="default_emote">
<column name="emote_key" value="setupUpvote"/>
<column name="name" value="👍"/>
</insert>
</changeSet>
</databaseChangeLog>

View File

@@ -0,0 +1,14 @@
<?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="setup_feature-insertion">
<insert tableName="feature">
<column name="key" value="setup"/>
</insert>
</changeSet>
</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: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="1.3.11-setup/collection.xml" relativeToChangelogFile="true"/>
</databaseChangeLog>

View File

@@ -0,0 +1,6 @@
abstracto.postTargets.setup.name=setup
abstracto.featureFlags.setup.featureName=setup
abstracto.featureFlags.setup.enabled=false
oneplus.bot.setup.deletionDelaySeconds=3

View File

@@ -5,16 +5,17 @@
<parent>
<groupId>dev.sheldan.oneplus.bot</groupId>
<artifactId>oneplusbot</artifactId>
<version>1.3.2</version>
<version>1.4.2</version>
</parent>
<groupId>dev.sheldan.oneplus.bot.application</groupId>
<artifactId>application</artifactId>
<packaging>pom</packaging>
<version>1.3.2</version>
<version>1.4.2</version>
<modules>
<module>executable</module>
<module>oneplus-bot-customizations</module>
<module>oneplus-bot-modules</module>
</modules>
<dependencyManagement>

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>dev.sheldan.oneplus.bot.deployment</groupId>
<artifactId>deployment</artifactId>
<version>1.3.2</version>
<version>1.4.2</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -24,4 +24,6 @@ PGADMIN_PORT=5050
# default authentication for pg admin
PGADMIN_DEFAULT_EMAIL=sheldan@sheldan.dev
PGADMIN_DEFAULT_PASSWORD=admin
TOKEN=<INSERT TOKEN>
TOKEN=<INSERT TOKEN>
YOUTUBE_API_KEY=<INSERT KEY>
ONEPLUS_BOT_VERSION=1.4.2

View File

@@ -2,21 +2,21 @@ version: '3.7'
services:
db:
image: ${REGISTRY_PREFIX}oneplus_bot_database
image: ${REGISTRY_PREFIX}oneplus_bot_database:${ONEPLUS_BOT_VERSION}
container_name: database
restart: always
environment:
POSTGRES_PASSWORD: ${DATABASE_PASSWORD}
POSTGRES_USER: ${DATABASE_USER}
ports:
- "${DATABASE_PORT}:5432"
- "127.0.0.1:${DATABASE_PORT}:5432"
networks:
- oneplusbot
volumes:
- db-data:/var/lib/postgresql/data
deployment_container:
container_name: deployment
image: ${REGISTRY_PREFIX}oneplus_bot_deployment
image: ${REGISTRY_PREFIX}oneplus_bot_deployment:${ONEPLUS_BOT_VERSION}
depends_on:
- db
environment:
@@ -34,7 +34,7 @@ services:
networks:
- oneplusbot
bot:
image: ${REGISTRY_PREFIX}oneplus_bot
image: ${REGISTRY_PREFIX}oneplus_bot:${ONEPLUS_BOT_VERSION}
depends_on:
- db
- deployment_container
@@ -50,10 +50,11 @@ services:
DB_NAME: ${DATABASE_NAME}
REST_USER_NAME: ${REST_USER_NAME}
REST_PASSWORD: ${REST_PASSWORD}
YOUTUBE_API_KEY: ${YOUTUBE_API_KEY}
command: sh -c "while ping -c1 deployment_container &>/dev/null; do sleep 1; done; echo 'Liquibase finished!' && ./start.sh"
ports:
- "${DEBUG_PORT}:5005"
- "${TOMCAT_PORT}:8080"
- "127.0.0.1:${DEBUG_PORT}:5005"
- "127.0.0.1:${TOMCAT_PORT}:8080"
networks:
- oneplusbot
volumes:
@@ -61,24 +62,24 @@ services:
- ./config:/config
pgadmin:
container_name: pgadmin
image: ${REGISTRY_PREFIX}oneplus_bot_pg_admin
image: ${REGISTRY_PREFIX}oneplus_bot_pg_admin:${ONEPLUS_BOT_VERSION}
depends_on:
- db
environment:
PGADMIN_DEFAULT_EMAIL: ${PGADMIN_DEFAULT_EMAIL}
PGADMIN_DEFAULT_PASSWORD: ${PGADMIN_DEFAULT_PASSWORD}
ports:
- "${PGADMIN_PORT}:80"
- "127.0.0.1:${PGADMIN_PORT}:80"
restart: unless-stopped
networks:
- oneplusbot
prometheus:
container_name: prometheus
image: ${REGISTRY_PREFIX}oneplus_bot_prometheus
image: ${REGISTRY_PREFIX}oneplus_bot_prometheus:${ONEPLUS_BOT_VERSION}
depends_on:
- bot
ports:
- "${PROMETHEUS_PORT}:9090"
- "127.0.0.1:${PROMETHEUS_PORT}:9090"
restart: unless-stopped
networks:
- oneplusbot
@@ -87,12 +88,12 @@ services:
- prometheus-data:/prometheus
grafana:
container_name: grafana
image: ${REGISTRY_PREFIX}oneplus_bot_grafana
image: ${REGISTRY_PREFIX}oneplus_bot_grafana:${ONEPLUS_BOT_VERSION}
depends_on:
- prometheus
- bot
ports:
- "${GRAFANA_PORT}:3000"
- "127.0.0.1:${GRAFANA_PORT}:3000"
restart: unless-stopped
volumes:
- grafana-user-data:/var/lib/grafana

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>dev.sheldan.oneplus.bot.deployment</groupId>
<artifactId>deployment</artifactId>
<version>1.3.2</version>
<version>1.4.2</version>
</parent>
<modelVersion>4.0.0</modelVersion>
@@ -52,6 +52,27 @@
<outputDirectory>${file.basedir}/deployment/template-artifacts/</outputDirectory>
<destFileName>core.zip</destFileName>
</artifactItem>
<artifactItem>
<groupId>dev.sheldan.abstracto-templates.templates</groupId>
<artifactId>experience-tracking</artifactId>
<version>${abstracto.templates.version}</version>
<type>zip</type>
<overWrite>true</overWrite>
<outputDirectory>${file.basedir}/deployment/template-artifacts/</outputDirectory>
<destFileName>experience-tracking.zip</destFileName>
</artifactItem>
<artifactItem>
<groupId>dev.sheldan.abstracto-templates.templates</groupId>
<artifactId>moderation</artifactId>
<version>${abstracto.templates.version}</version>
<type>zip</type>
<overWrite>true</overWrite>
<outputDirectory>${file.basedir}/deployment/template-artifacts/</outputDirectory>
<destFileName>moderation.zip</destFileName>
</artifactItem>
<artifactItem>
<groupId>dev.sheldan.abstracto-templates.templates</groupId>
<artifactId>entertainment</artifactId>
@@ -89,6 +110,76 @@
<destFileName>utility.zip</destFileName>
</artifactItem>
<artifactItem>
<groupId>dev.sheldan.abstracto-templates.templates</groupId>
<artifactId>webservices</artifactId>
<version>${abstracto.templates.version}</version>
<type>zip</type>
<overWrite>true</overWrite>
<outputDirectory>${file.basedir}/deployment/template-artifacts/</outputDirectory>
<destFileName>webservices.zip</destFileName>
</artifactItem>
<artifactItem>
<groupId>dev.sheldan.abstracto-templates.templates</groupId>
<artifactId>remind</artifactId>
<version>${abstracto.templates.version}</version>
<type>zip</type>
<overWrite>true</overWrite>
<outputDirectory>${file.basedir}/deployment/template-artifacts/</outputDirectory>
<destFileName>remind.zip</destFileName>
</artifactItem>
<artifactItem>
<groupId>dev.sheldan.abstracto-templates.templates</groupId>
<artifactId>suggestion</artifactId>
<version>${abstracto.templates.version}</version>
<type>zip</type>
<overWrite>true</overWrite>
<outputDirectory>${file.basedir}/deployment/template-artifacts/</outputDirectory>
<destFileName>suggestion.zip</destFileName>
</artifactItem>
<artifactItem>
<groupId>dev.sheldan.abstracto-templates.templates</groupId>
<artifactId>invite-filter</artifactId>
<version>${abstracto.templates.version}</version>
<type>zip</type>
<overWrite>true</overWrite>
<outputDirectory>${file.basedir}/deployment/template-artifacts/</outputDirectory>
<destFileName>invite-filter.zip</destFileName>
</artifactItem>
<artifactItem>
<groupId>dev.sheldan.abstracto-templates.templates</groupId>
<artifactId>statistic</artifactId>
<version>${abstracto.templates.version}</version>
<type>zip</type>
<overWrite>true</overWrite>
<outputDirectory>${file.basedir}/deployment/template-artifacts/</outputDirectory>
<destFileName>statistic.zip</destFileName>
</artifactItem>
<artifactItem>
<groupId>dev.sheldan.abstracto-templates.templates</groupId>
<artifactId>logging</artifactId>
<version>${abstracto.templates.version}</version>
<type>zip</type>
<overWrite>true</overWrite>
<outputDirectory>${file.basedir}/deployment/template-artifacts/</outputDirectory>
<destFileName>logging.zip</destFileName>
</artifactItem>
<artifactItem>
<groupId>dev.sheldan.abstracto-templates.templates</groupId>
<artifactId>profanity-filter</artifactId>
<version>${abstracto.templates.version}</version>
<type>zip</type>
<overWrite>true</overWrite>
<outputDirectory>${file.basedir}/deployment/template-artifacts/</outputDirectory>
<destFileName>profanity-filter.zip</destFileName>
</artifactItem>
<artifactItem>
<groupId>dev.sheldan.oneplus.bot.templates.modules</groupId>
<artifactId>starboard-custom-templates</artifactId>
@@ -99,7 +190,38 @@
<destFileName>starboard-custom.zip</destFileName>
</artifactItem>
<artifactItem>
<groupId>dev.sheldan.oneplus.bot.templates.modules</groupId>
<artifactId>news-templates</artifactId>
<version>${project.version}</version>
<type>zip</type>
<overWrite>true</overWrite>
<outputDirectory>${file.basedir}/deployment/template-artifacts/</outputDirectory>
<destFileName>news.zip</destFileName>
</artifactItem>
<artifactItem>
<groupId>dev.sheldan.oneplus.bot.templates.modules</groupId>
<artifactId>referral-templates</artifactId>
<version>${project.version}</version>
<type>zip</type>
<overWrite>true</overWrite>
<outputDirectory>${file.basedir}/deployment/template-artifacts/</outputDirectory>
<destFileName>referral.zip</destFileName>
</artifactItem>
<!-- translation artefacts -->
<artifactItem>
<groupId>dev.sheldan.abstracto-templates.translations</groupId>
<artifactId>core</artifactId>
<version>${abstracto.templates.version}</version>
<type>zip</type>
<overWrite>true</overWrite>
<outputDirectory>${file.basedir}/deployment/translation-artifacts/</outputDirectory>
<destFileName>core.zip</destFileName>
</artifactItem>
<artifactItem>
<groupId>dev.sheldan.abstracto-templates.translations</groupId>
<artifactId>utility</artifactId>
@@ -111,12 +233,12 @@
</artifactItem>
<artifactItem>
<groupId>dev.sheldan.abstracto-templates.translations</groupId>
<artifactId>core</artifactId>
<artifactId>experience-tracking</artifactId>
<version>${abstracto.templates.version}</version>
<type>zip</type>
<overWrite>true</overWrite>
<outputDirectory>${file.basedir}/deployment/translation-artifacts/</outputDirectory>
<destFileName>core.zip</destFileName>
<destFileName>experience-tracking.zip</destFileName>
</artifactItem>
<artifactItem>
<groupId>dev.sheldan.abstracto-templates.translations</groupId>
@@ -127,6 +249,15 @@
<outputDirectory>${file.basedir}/deployment/translation-artifacts/</outputDirectory>
<destFileName>entertainment.zip</destFileName>
</artifactItem>
<artifactItem>
<groupId>dev.sheldan.abstracto-templates.translations</groupId>
<artifactId>moderation</artifactId>
<version>${abstracto.templates.version}</version>
<type>zip</type>
<overWrite>true</overWrite>
<outputDirectory>${file.basedir}/deployment/translation-artifacts/</outputDirectory>
<destFileName>moderation.zip</destFileName>
</artifactItem>
<artifactItem>
<groupId>dev.sheldan.abstracto-templates.translations</groupId>
<artifactId>link-embed</artifactId>
@@ -145,6 +276,7 @@
<outputDirectory>${file.basedir}/deployment/translation-artifacts/</outputDirectory>
<destFileName>starboard.zip</destFileName>
</artifactItem>
<artifactItem>
<groupId>dev.sheldan.abstracto-templates.translations</groupId>
<artifactId>utility</artifactId>
@@ -155,9 +287,79 @@
<destFileName>utility.zip</destFileName>
</artifactItem>
<artifactItem>
<groupId>dev.sheldan.abstracto-templates.translations</groupId>
<artifactId>webservices</artifactId>
<version>${abstracto.templates.version}</version>
<type>zip</type>
<overWrite>true</overWrite>
<outputDirectory>${file.basedir}/deployment/translation-artifacts/</outputDirectory>
<destFileName>webservices.zip</destFileName>
</artifactItem>
<artifactItem>
<groupId>dev.sheldan.abstracto-templates.translations</groupId>
<artifactId>remind</artifactId>
<version>${abstracto.templates.version}</version>
<type>zip</type>
<overWrite>true</overWrite>
<outputDirectory>${file.basedir}/deployment/translation-artifacts/</outputDirectory>
<destFileName>remind.zip</destFileName>
</artifactItem>
<artifactItem>
<groupId>dev.sheldan.abstracto-templates.translations</groupId>
<artifactId>suggestion</artifactId>
<version>${abstracto.templates.version}</version>
<type>zip</type>
<overWrite>true</overWrite>
<outputDirectory>${file.basedir}/deployment/translation-artifacts/</outputDirectory>
<destFileName>suggestion.zip</destFileName>
</artifactItem>
<artifactItem>
<groupId>dev.sheldan.abstracto-templates.translations</groupId>
<artifactId>invite-filter</artifactId>
<version>${abstracto.templates.version}</version>
<type>zip</type>
<overWrite>true</overWrite>
<outputDirectory>${file.basedir}/deployment/translation-artifacts/</outputDirectory>
<destFileName>invite-filter.zip</destFileName>
</artifactItem>
<artifactItem>
<groupId>dev.sheldan.abstracto-templates.translations</groupId>
<artifactId>statistic</artifactId>
<version>${abstracto.templates.version}</version>
<type>zip</type>
<overWrite>true</overWrite>
<outputDirectory>${file.basedir}/deployment/translation-artifacts/</outputDirectory>
<destFileName>statistic.zip</destFileName>
</artifactItem>
<artifactItem>
<groupId>dev.sheldan.abstracto-templates.translations</groupId>
<artifactId>profanity-filter</artifactId>
<version>${abstracto.templates.version}</version>
<type>zip</type>
<overWrite>true</overWrite>
<outputDirectory>${file.basedir}/deployment/translation-artifacts/</outputDirectory>
<destFileName>profanity-filter.zip</destFileName>
</artifactItem>
<artifactItem>
<groupId>dev.sheldan.abstracto-templates.translations</groupId>
<artifactId>logging</artifactId>
<version>${abstracto.templates.version}</version>
<type>zip</type>
<overWrite>true</overWrite>
<outputDirectory>${file.basedir}/deployment/translation-artifacts/</outputDirectory>
<destFileName>logging.zip</destFileName>
</artifactItem>
<artifactItem>
<groupId>dev.sheldan.oneplus.bot.templates.translations</groupId>
<artifactId>starboard-custom</artifactId>
<artifactId>starboard-custom-translations</artifactId>
<version>${project.version}</version>
<type>zip</type>
<overWrite>true</overWrite>
@@ -165,6 +367,37 @@
<destFileName>starboard-custom.zip</destFileName>
</artifactItem>
<!-- custom -->
<artifactItem>
<groupId>dev.sheldan.oneplus.bot.templates.translations</groupId>
<artifactId>news-translations</artifactId>
<version>${project.version}</version>
<type>zip</type>
<overWrite>true</overWrite>
<outputDirectory>${file.basedir}/deployment/translation-artifacts/</outputDirectory>
<destFileName>news.zip</destFileName>
</artifactItem>
<artifactItem>
<groupId>dev.sheldan.oneplus.bot.templates.translations</groupId>
<artifactId>setup-translations</artifactId>
<version>${project.version}</version>
<type>zip</type>
<overWrite>true</overWrite>
<outputDirectory>${file.basedir}/deployment/translation-artifacts/</outputDirectory>
<destFileName>setup.zip</destFileName>
</artifactItem>
<artifactItem>
<groupId>dev.sheldan.oneplus.bot.templates.translations</groupId>
<artifactId>referral-translations</artifactId>
<version>${project.version}</version>
<type>zip</type>
<overWrite>true</overWrite>
<outputDirectory>${file.basedir}/deployment/translation-artifacts/</outputDirectory>
<destFileName>referral.zip</destFileName>
</artifactItem>
<!-- liquibase artifacts -->
<artifactItem>
<groupId>dev.sheldan.abstracto.scheduling</groupId>
@@ -199,6 +432,28 @@
<destFileName>utility.zip</destFileName>
</artifactItem>
<artifactItem>
<groupId>dev.sheldan.abstracto.modules</groupId>
<artifactId>moderation-impl</artifactId>
<version>${abstracto.version}</version>
<classifier>liquibase</classifier>
<type>zip</type>
<overWrite>true</overWrite>
<outputDirectory>${file.basedir}/deployment/liquibase-artifacts/</outputDirectory>
<destFileName>moderation.zip</destFileName>
</artifactItem>
<artifactItem>
<groupId>dev.sheldan.abstracto.modules</groupId>
<artifactId>experience-tracking-impl</artifactId>
<version>${abstracto.version}</version>
<classifier>liquibase</classifier>
<type>zip</type>
<overWrite>true</overWrite>
<outputDirectory>${file.basedir}/deployment/liquibase-artifacts/</outputDirectory>
<destFileName>experience-tracking.zip</destFileName>
</artifactItem>
<artifactItem>
<groupId>dev.sheldan.abstracto.modules</groupId>
<artifactId>entertainment-impl</artifactId>
@@ -244,6 +499,84 @@
<destFileName>utility.zip</destFileName>
</artifactItem>
<artifactItem>
<groupId>dev.sheldan.abstracto.modules</groupId>
<artifactId>webservices-impl</artifactId>
<version>${abstracto.version}</version>
<classifier>liquibase</classifier>
<type>zip</type>
<overWrite>true</overWrite>
<outputDirectory>${file.basedir}/deployment/liquibase-artifacts/</outputDirectory>
<destFileName>webservices.zip</destFileName>
</artifactItem>
<artifactItem>
<groupId>dev.sheldan.abstracto.modules</groupId>
<artifactId>remind-impl</artifactId>
<version>${abstracto.version}</version>
<classifier>liquibase</classifier>
<type>zip</type>
<overWrite>true</overWrite>
<outputDirectory>${file.basedir}/deployment/liquibase-artifacts/</outputDirectory>
<destFileName>remind.zip</destFileName>
</artifactItem>
<artifactItem>
<groupId>dev.sheldan.abstracto.modules</groupId>
<artifactId>suggestion-impl</artifactId>
<version>${abstracto.version}</version>
<classifier>liquibase</classifier>
<type>zip</type>
<overWrite>true</overWrite>
<outputDirectory>${file.basedir}/deployment/liquibase-artifacts/</outputDirectory>
<destFileName>suggestion.zip</destFileName>
</artifactItem>
<artifactItem>
<groupId>dev.sheldan.abstracto.modules</groupId>
<artifactId>invite-filter-impl</artifactId>
<version>${abstracto.version}</version>
<classifier>liquibase</classifier>
<type>zip</type>
<overWrite>true</overWrite>
<outputDirectory>${file.basedir}/deployment/liquibase-artifacts/</outputDirectory>
<destFileName>invite-filter.zip</destFileName>
</artifactItem>
<artifactItem>
<groupId>dev.sheldan.abstracto.modules</groupId>
<artifactId>statistic-impl</artifactId>
<version>${abstracto.version}</version>
<classifier>liquibase</classifier>
<type>zip</type>
<overWrite>true</overWrite>
<outputDirectory>${file.basedir}/deployment/liquibase-artifacts/</outputDirectory>
<destFileName>statistic.zip</destFileName>
</artifactItem>
<artifactItem>
<groupId>dev.sheldan.abstracto.modules</groupId>
<artifactId>profanity-filter-impl</artifactId>
<version>${abstracto.version}</version>
<classifier>liquibase</classifier>
<type>zip</type>
<overWrite>true</overWrite>
<outputDirectory>${file.basedir}/deployment/liquibase-artifacts/</outputDirectory>
<destFileName>profanity-filter.zip</destFileName>
</artifactItem>
<artifactItem>
<groupId>dev.sheldan.abstracto.modules</groupId>
<artifactId>logging-impl</artifactId>
<version>${abstracto.version}</version>
<classifier>liquibase</classifier>
<type>zip</type>
<overWrite>true</overWrite>
<outputDirectory>${file.basedir}/deployment/liquibase-artifacts/</outputDirectory>
<destFileName>logging.zip</destFileName>
</artifactItem>
<!-- customizations -->
<artifactItem>
<groupId>dev.sheldan.oneplus.bot.application.custom</groupId>
<artifactId>starboard-custom</artifactId>
@@ -255,6 +588,82 @@
<destFileName>starboard-custom.zip</destFileName>
</artifactItem>
<artifactItem>
<groupId>dev.sheldan.oneplus.bot.application.modules</groupId>
<artifactId>news</artifactId>
<version>${project.version}</version>
<classifier>liquibase</classifier>
<type>zip</type>
<overWrite>true</overWrite>
<outputDirectory>${file.basedir}/deployment/liquibase-artifacts/</outputDirectory>
<destFileName>news.zip</destFileName>
</artifactItem>
<artifactItem>
<groupId>dev.sheldan.oneplus.bot.application.modules</groupId>
<artifactId>setup</artifactId>
<version>${project.version}</version>
<classifier>liquibase</classifier>
<type>zip</type>
<overWrite>true</overWrite>
<outputDirectory>${file.basedir}/deployment/liquibase-artifacts/</outputDirectory>
<destFileName>setup.zip</destFileName>
</artifactItem>
<artifactItem>
<groupId>dev.sheldan.oneplus.bot.application.modules</groupId>
<artifactId>referral</artifactId>
<version>${project.version}</version>
<classifier>liquibase</classifier>
<type>zip</type>
<overWrite>true</overWrite>
<outputDirectory>${file.basedir}/deployment/liquibase-artifacts/</outputDirectory>
<destFileName>referral.zip</destFileName>
</artifactItem>
<!-- overrides -->
<artifactItem>
<groupId>dev.sheldan.oneplus.bot.templates.overrides.templates</groupId>
<artifactId>core</artifactId>
<version>${project.version}</version>
<type>zip</type>
<overWrite>true</overWrite>
<outputDirectory>${file.basedir}/deployment/template-artifacts/</outputDirectory>
<destFileName>overrides-templates-core.zip</destFileName>
</artifactItem>
<artifactItem>
<groupId>dev.sheldan.oneplus.bot.templates.overrides.templates</groupId>
<artifactId>webservices</artifactId>
<version>${project.version}</version>
<type>zip</type>
<overWrite>true</overWrite>
<outputDirectory>${file.basedir}/deployment/template-artifacts/</outputDirectory>
<destFileName>overrides-templates-webservices.zip</destFileName>
</artifactItem>
<artifactItem>
<groupId>dev.sheldan.oneplus.bot.templates.overrides.templates</groupId>
<artifactId>logging</artifactId>
<version>${project.version}</version>
<type>zip</type>
<overWrite>true</overWrite>
<outputDirectory>${file.basedir}/deployment/template-artifacts/</outputDirectory>
<destFileName>overrides-templates-logging.zip</destFileName>
</artifactItem>
<artifactItem>
<groupId>dev.sheldan.oneplus.bot.templates.overrides.templates</groupId>
<artifactId>statistic</artifactId>
<version>${project.version}</version>
<type>zip</type>
<overWrite>true</overWrite>
<outputDirectory>${file.basedir}/deployment/template-artifacts/</outputDirectory>
<destFileName>overrides-templates-statistic.zip</destFileName>
</artifactItem>
</artifactItems>
</configuration>
</plugin>

View File

@@ -1,6 +1,6 @@
ARG ABSTRACTO_REGISTRY_PREFIX=
ARG ABSTRACTO_REGISTRY_PREFIX
ARG ABSTRACTO_VERSION=latest
FROM ${ABSTRACTO_REGISTRY_PREFIX}abstracto_deployment:${ABSTRACTO_VERSION}
FROM ${ABSTRACTO_REGISTRY_PREFIX}abstracto_deployment:${ABSTRACTO_VERSION:-latest}
MAINTAINER Sheldan
ADD template-artifacts /templates
ADD translation-artifacts /translations

View File

@@ -1,14 +1,33 @@
{
"template_artifacts": ["utility", "core", "entertainment", "starboard", "link-embed", "starboard-custom"],
"translation_artifacts": ["utility", "core", "entertainment", "starboard", "link-embed", "starboard-custom"],
"template_artifacts": ["utility", "core", "entertainment", "starboard", "link-embed", "webservices", "remind", "logging",
"suggestion", "invite-filter", "profanity-filter", "statistic", "experience-tracking", "moderation",
"starboard-custom",
"overrides-templates-webservices", "overrides-templates-core", "overrides-templates-logging", "overrides-templates-statistic",
"news", "referral"],
"translation_artifacts": ["utility", "core", "entertainment", "starboard", "link-embed", "webservices", "suggestion",
"remind", "logging", "invite-filter", "profanity-filter", "statistic", "experience-tracking", "moderation",
"starboard-custom",
"news", "setup", "referral"],
"liquibase_artifacts": [
{ "zip": "scheduling", "file": "scheduling-changeLog.xml" },
{ "zip": "core", "file": "core-changeLog.xml" },
{ "zip": "utility", "file": "utility-changeLog.xml"},
{ "zip": "entertainment", "file": "entertainment-changeLog.xml"},
{ "zip": "link-embed", "file": "link-embed-changeLog.xml"},
{ "zip": "webservices", "file": "webservices-changeLog.xml"},
{ "zip": "starboard", "file": "starboard-changeLog.xml"},
{ "zip": "starboard-custom", "file": "starboard-custom-changeLog.xml"}
{ "zip": "remind", "file": "remind-changeLog.xml"},
{ "zip": "logging", "file": "logging-changeLog.xml"},
{ "zip": "suggestion", "file": "suggestion-changeLog.xml"},
{ "zip": "invite-filter", "file": "inviteFilter-changeLog.xml"},
{ "zip": "profanity-filter", "file": "profanityFilter-changeLog.xml"},
{ "zip": "statistic", "file": "statistic-changeLog.xml"},
{ "zip": "experience-tracking", "file": "experience-changeLog.xml"},
{ "zip": "moderation", "file": "moderation-changeLog.xml"},
{ "zip": "setup", "file": "setup-changeLog.xml"},
{ "zip": "referral", "file": "referral-changeLog.xml"},
{ "zip": "starboard-custom", "file": "starboard-custom-changeLog.xml"},
{ "zip": "news", "file": "news-changeLog.xml"}
]
}

View File

@@ -29,6 +29,27 @@
</appender>
<appender name="requests-file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/requests_log.log</file>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<Pattern>
%d{dd-MM-yyyy HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
</Pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>
${LOG_PATH}/archived/requests_log_%d{dd-MM-yyyy}.log
</fileNamePattern>
<maxHistory>10</maxHistory>
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
</appender>
<logger name="dev.sheldan.abstracto" level="INFO"/>
<logger name="dev.sheldan.abstracto.core.logging" level="DEBUG">
<appender-ref ref="requests-file"/>
</logger>
<root level="info">
<appender-ref ref="logFileAppender"/>
<appender-ref ref="stdout"/>

View File

@@ -11,7 +11,7 @@ scrape_configs:
scheme: http
static_configs:
- targets:
- 172.17.0.1:8080
- oneplusbot:8080
basic_auth:
username: "abstracto"
password_file: /etc/prometheus/micrometer_password

View File

@@ -3,7 +3,7 @@
<parent>
<artifactId>oneplusbot</artifactId>
<groupId>dev.sheldan.oneplus.bot</groupId>
<version>1.3.2</version>
<version>1.4.2</version>
</parent>
<modelVersion>4.0.0</modelVersion>

10
pom.xml
View File

@@ -12,13 +12,15 @@
<groupId>dev.sheldan.oneplus.bot</groupId>
<artifactId>oneplusbot</artifactId>
<version>1.3.2</version>
<version>1.4.2</version>
<properties>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.source>1.8</maven.compiler.source>
<abstracto.version>1.2.2</abstracto.version>
<abstracto.templates.version>1.2.1</abstracto.templates.version>
<!-- edit in release.yml as well -->
<!-- when releasing a new opbot version, update the docker-compose as well-->
<abstracto.version>1.2.15</abstracto.version>
<abstracto.templates.version>1.2.11</abstracto.templates.version>
</properties>
<modules>
@@ -54,7 +56,7 @@
<scm>
<url>https://maven.pkg.github.com/Sheldan/OnePlusBot</url>
<developerConnection>scm:git:git@github.com:Sheldan/OnePlusBot.git</developerConnection>
<tag>oneplusbot-1.3.2</tag>
<tag>oneplusbot-1.4.2</tag>
</scm>
</project>

View File

@@ -0,0 +1,37 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>dev.sheldan.oneplus.bot.templates.modules</groupId>
<artifactId>oneplus-bot-modules-templates</artifactId>
<version>1.4.2</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>news-templates</artifactId>
<packaging>pom</packaging>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<finalName>starboard-custom-templates-${project.version}</finalName>
<appendAssemblyId>false</appendAssemblyId>
<descriptors>
<descriptor>src/main/assembly/assembly.xml</descriptor>
</descriptors>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

Some files were not shown because too many files have changed in this diff Show More