Skip to content

Commit

Permalink
Merge pull request #107 from Softawii/feature/curupira-v2
Browse files Browse the repository at this point in the history
Feature/curupira v2
  • Loading branch information
yaansz authored Aug 29, 2024
2 parents 1f6d20d + ca558d7 commit c248bea
Show file tree
Hide file tree
Showing 29 changed files with 788 additions and 1,291 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/build.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ jobs:
- name: 'Set up JDK'
uses: actions/setup-java@v4
with:
java-version: '17'
java-version: '21'
distribution: 'temurin'
cache: 'gradle'

Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/deploy-prod.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -69,4 +69,4 @@ jobs:
key: ${{ secrets.VM_SSH_PRIVATE_KEY }}
script: |
cd /home/${{ secrets.SSH_USERNAME }}/capivara
DISCORD_TOKEN='${{ secrets.DISCORD_BOT_TOKEN }}' LOG_CHANNEL_ID='${{ secrets.DISCORD_LOG_CHANNEL_ID }}' CURUPIRA_RESET='true' DATABASE_DRIVER='org.postgresql.Driver' DATABASE_DIALECT='org.hibernate.dialect.PostgreSQL95Dialect' DATABASE_URL='jdbc:postgresql://host.containers.internal:5432/capivara' DATABASE_USERNAME='${{ secrets.DATABASE_USERNAME }}' DATABASE_PASSWORD='${{ secrets.DATABASE_PASSWORD }}' JAVA_ARGS='-Xmx250M' /bin/bash start-container.sh docker.io/eduardoferro/capivara:${{ github.sha }}
DISCORD_TOKEN='${{ secrets.DISCORD_BOT_TOKEN }}' LOG_CHANNEL_ID='${{ secrets.DISCORD_LOG_CHANNEL_ID }}' CURUPIRA_RESET='true' DATABASE_DRIVER='org.postgresql.Driver' DATABASE_DIALECT='org.hibernate.dialect.PostgreSQL95Dialect' DATABASE_URL='jdbc:postgresql://host.containers.internal:5432/capivara' DATABASE_USERNAME='${{ secrets.DATABASE_USERNAME }}' DATABASE_PASSWORD='${{ secrets.DATABASE_PASSWORD }}' JAVA_ARGS='-Xmx350M' /bin/bash start-container.sh docker.io/eduardoferro/capivara:${{ github.sha }}
6 changes: 3 additions & 3 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
FROM docker.io/eclipse-temurin:17-jdk-alpine as builder
FROM docker.io/eclipse-temurin:21-jdk-alpine as builder

WORKDIR /app
ADD . /tmp
Expand All @@ -11,12 +11,12 @@ RUN cd /tmp && \
mv build/libs/CapivaraBot.jar /app && \
rm -rf /tmp/*

FROM docker.io/eclipse-temurin:17-jre-alpine
FROM docker.io/eclipse-temurin:21-jre-alpine

WORKDIR /app
COPY --from=builder /app .

ENV JAVA_ARGS="-Xmx300M"
ENV JAVA_ARGS="-Xmx350M"
ENV LOG_DIRECTORY="/app/logs"
ENV SPRING_CONFIG_LOCATION="/app/main.properties"
ENV DISCORD_TOKEN="invalid"
Expand Down
15 changes: 8 additions & 7 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
plugins {
id 'java'
id 'application'
id 'org.springframework.boot' version '2.7.0'
id 'org.springframework.boot' version '2.7.18'
id 'com.github.johnrengelman.shadow' version '8.1.1'
}

Expand All @@ -24,7 +24,7 @@ springBoot {
dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.2'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.2'
implementation ('org.springframework.boot:spring-boot-starter-data-jpa:2.7.0') {
implementation ('org.springframework.boot:spring-boot-starter-data-jpa:2.7.18') {
exclude module: 'spring-boot-starter-logging'
}
implementation 'org.springframework.boot:spring-boot-starter-log4j2:2.7.0'
Expand All @@ -33,12 +33,13 @@ dependencies {
implementation 'com.h2database:h2:2.1.212'
implementation 'org.postgresql:postgresql:42.3.6'

implementation("net.dv8tion:JDA:5.0.0-beta.16") {
implementation("net.dv8tion:JDA:5.1.0") {
exclude module: 'opus-java'
}

implementation("com.github.Softawii:curupira:v0.3.0")
implementation("com.github.Softawii:curupira:v0.3.0:all")
implementation("com.github.Softawii:curupira:v1.0.0") {
changing = true
}
}

tasks.register('deploy') {
Expand All @@ -65,5 +66,5 @@ test {
useJUnitPlatform()
}

sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
sourceCompatibility = JavaVersion.VERSION_21
targetCompatibility = JavaVersion.VERSION_21
2 changes: 2 additions & 0 deletions src/main/java/com/softawii/capivara/Main.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.info.BuildProperties;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.stereotype.Component;

@SpringBootApplication
public class Main {
Expand Down
20 changes: 10 additions & 10 deletions src/main/java/com/softawii/capivara/config/SpringConfig.java
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
package com.softawii.capivara.config;

import com.softawii.capivara.utils.CapivaraExceptionHandler;
import com.softawii.curupira.core.Curupira;
import com.softawii.capivara.controller.MainExceptionController;
import com.softawii.curupira.v2.core.CurupiraBoot;
import com.softawii.curupira.v2.integration.ContextProvider;
import net.dv8tion.jda.api.JDA;
import net.dv8tion.jda.api.JDABuilder;
import net.dv8tion.jda.api.requests.GatewayIntent;
import net.dv8tion.jda.api.utils.MemberCachePolicy;
import net.dv8tion.jda.api.utils.cache.CacheFlag;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
Expand Down Expand Up @@ -52,7 +52,8 @@ public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
em.setPackagesToScan("com.softawii.capivara.entity",
"com.softawii.capivara.repository",
"com.softawii.capivara.services",
"com.softawii.capivara.listeners.events");
"com.softawii.capivara.events",
"com.softawii.capivara.controller");

JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
em.setJpaVendorAdapter(vendorAdapter);
Expand Down Expand Up @@ -85,31 +86,30 @@ public JDA jda() {
}

@Bean
public CapivaraExceptionHandler capivaraExceptionHandler() {
public MainExceptionController capivaraExceptionHandler() {
String logChannelId = env.getProperty("log.channel.id");
String logDirectory = env.getProperty("log_directory");
if (logChannelId != null) {
Path logPath = null;
if (logDirectory != null) {
logPath = Path.of(logDirectory);
}
return new CapivaraExceptionHandler(logChannelId, logPath);
return new MainExceptionController(logChannelId, logPath);
}

return null;
}

@Bean
public Curupira curupira(JDA jda, @Autowired(required = false) CapivaraExceptionHandler exceptionHandler) {
String pkg = "com.softawii.capivara.listeners";
public CurupiraBoot curupira(JDA jda, ContextProvider context) {
String pkg = "com.softawii.capivara.controller";
String resetEnv = env.getProperty("curupira.reset", "false");
boolean reset = Boolean.parseBoolean(resetEnv);
LOGGER.info("curupira.reset: " + reset);

return new Curupira(jda, reset, exceptionHandler, pkg);
return new CurupiraBoot(jda, context, reset, pkg);
}


Properties additionalProperties() {
Properties properties = new Properties();
properties.setProperty("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto"));
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.softawii.capivara.config;

import com.softawii.curupira.v2.integration.ContextProvider;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;

@Component
public class SpringContextProvider implements ContextProvider {

private final ApplicationContext context;

public SpringContextProvider(ApplicationContext context) {
this.context = context;
}

@Override
public <T> T getInstance(Class<T> aClass) {
return context.getBean(aClass);
}
}
Original file line number Diff line number Diff line change
@@ -1,21 +1,21 @@
package com.softawii.capivara.utils;
package com.softawii.capivara.controller;

import com.softawii.curupira.core.ExceptionHandler;
import com.softawii.curupira.exceptions.InvalidChannelTypeException;
import com.softawii.curupira.exceptions.MissingPermissionsException;

import com.softawii.curupira.v2.annotations.DiscordException;
import com.softawii.curupira.v2.annotations.DiscordExceptions;
import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.JDA;
import net.dv8tion.jda.api.entities.MessageEmbed;
import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
import net.dv8tion.jda.api.events.Event;
import net.dv8tion.jda.api.events.channel.GenericChannelEvent;
import net.dv8tion.jda.api.events.guild.GenericGuildEvent;
import net.dv8tion.jda.api.events.interaction.command.GenericCommandInteractionEvent;
import net.dv8tion.jda.api.interactions.Interaction;
import net.dv8tion.jda.api.requests.restaction.MessageCreateAction;
import net.dv8tion.jda.api.utils.FileUpload;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.stereotype.Component;

import java.awt.*;
import java.io.IOException;
Expand All @@ -29,30 +29,20 @@
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;

public class CapivaraExceptionHandler implements ExceptionHandler {
@DiscordExceptions
public class MainExceptionController {

private final Logger LOGGER = LogManager.getLogger(CapivaraExceptionHandler.class);
private final Logger LOGGER = LogManager.getLogger(MainExceptionController.class);
private String channelId;
private Path logDirectory;

public CapivaraExceptionHandler(String channelId, Path logDirectory) {
public MainExceptionController(String channelId, Path logDirectory) {
this.channelId = channelId;
this.logDirectory = logDirectory;
}

@Override
@DiscordException(Throwable.class)
public void handle(Throwable throwable, Interaction interaction) {
if (interaction instanceof GenericCommandInteractionEvent event) {
if (throwable instanceof MissingPermissionsException) {
event.reply("You don't have permission to execute this command!").setEphemeral(true).queue();
return;
}
else if(throwable instanceof InvalidChannelTypeException) {
event.reply("You can't execute this command in this channel!").setEphemeral(true).queue();
return;
}
}

InputStream logFileBytes = null;
if (logDirectory != null) {
Path logFile = logDirectory.resolve("capivara.log");
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package com.softawii.capivara.controller;

import com.softawii.capivara.exceptions.MissingPermissionsException;
import com.softawii.curupira.v2.annotations.DiscordException;
import com.softawii.curupira.v2.annotations.DiscordExceptions;
import com.softawii.curupira.v2.annotations.LocaleType;
import com.softawii.curupira.v2.localization.LocalizationManager;
import net.dv8tion.jda.api.interactions.DiscordLocale;
import net.dv8tion.jda.api.interactions.Interaction;
import net.dv8tion.jda.api.interactions.callbacks.IReplyCallback;
import org.springframework.stereotype.Component;

@Component
@DiscordExceptions(classes = SocialTwitterGroup.class)
public class SocialExceptionController {

private final MainExceptionController mainExceptionController;

public SocialExceptionController(MainExceptionController mainExceptionController) {
this.mainExceptionController = mainExceptionController;
}

@DiscordException(MissingPermissionsException.class)
public void missingPermissions(Throwable throwable, Interaction interaction, LocalizationManager localization, @LocaleType DiscordLocale locale) {
if (interaction instanceof IReplyCallback callback) {
callback.reply(localization.getLocalizedString("social.error.missing_permissions", locale)).setEphemeral(true).queue();
}
}

@DiscordException(Throwable.class)
public void generic(Throwable throwable, Interaction interaction, LocalizationManager localization, @LocaleType DiscordLocale locale) {
if (interaction instanceof IReplyCallback callback) {
callback.reply(localization.getLocalizedString("social.error.generic", locale)).setEphemeral(true).queue();
}

this.mainExceptionController.handle(throwable, interaction);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package com.softawii.capivara.controller;

import com.softawii.capivara.exceptions.MissingPermissionsException;
import com.softawii.capivara.services.TwitterParserConfigService;
import com.softawii.curupira.v2.annotations.DiscordController;
import com.softawii.curupira.v2.annotations.RequestInfo;
import com.softawii.curupira.v2.annotations.commands.DiscordCommand;
import com.softawii.curupira.v2.annotations.interactions.DiscordButton;
import com.softawii.curupira.v2.api.TextLocaleResponse;
import net.dv8tion.jda.api.Permission;
import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.channel.unions.MessageChannelUnion;
import net.dv8tion.jda.api.events.interaction.component.ButtonInteractionEvent;
import net.dv8tion.jda.api.interactions.DiscordLocale;
import net.dv8tion.jda.api.interactions.components.buttons.Button;
import org.springframework.stereotype.Component;

@Component
@DiscordController(parent = "social", value = "twitter", description = "Twitter Controller", permissions = Permission.ADMINISTRATOR,
resource = "social", locales = DiscordLocale.PORTUGUESE_BRAZILIAN)
public class SocialTwitterGroup {
public static final String deleteBotTwitterMessage = "twitter-bot-message-delete";
private final TwitterParserConfigService service;

public SocialTwitterGroup(TwitterParserConfigService service) {
this.service = service;
}

public static Button generateDeleteButton(long authorId) {
return Button.danger(String.format("%s:%s", deleteBotTwitterMessage, authorId), "Apagar");
}

@DiscordCommand(name = "enable", description = "Enable the automatic Twitter link transformation service")
public TextLocaleResponse enable(Guild guild) {
service.enable(guild.getIdLong());
return new TextLocaleResponse("social.twitter.enable.response", guild.getName());
}

@DiscordCommand(name = "disable", description = "Disable the automatic Twitter link transformation service")
public TextLocaleResponse disable(Guild guild) {
service.disable(guild.getIdLong());
return new TextLocaleResponse("social.twitter.disable.response", guild.getName());
}

@DiscordButton(name = deleteBotTwitterMessage, ephemeral = true)
public TextLocaleResponse delete(ButtonInteractionEvent event, @RequestInfo Member member) throws MissingPermissionsException {
// Format: ButtonID:Owner
String ownerId = event.getComponentId().split(":")[1];
String messageOwner = member.getId();

MessageChannelUnion channel = event.getChannel();

if (!messageOwner.equals(ownerId)) {
throw new MissingPermissionsException();
}

channel.deleteMessageById(event.getMessageId()).queue();
return new TextLocaleResponse("twitter.delete.response");
}

}
Loading

0 comments on commit c248bea

Please sign in to comment.