feat: add error-prone library, done translations
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/pr Build is failing Details

pull/3/head
Davide Polonio 2023-04-19 18:08:22 +02:00
parent 97c3d50e6b
commit b2a2f04ba3
10 changed files with 166 additions and 9 deletions

10
.mvn/jvm.config Normal file
View File

@ -0,0 +1,10 @@
--add-exports jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED
--add-exports jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED
--add-exports jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED
--add-exports jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED
--add-exports jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED
--add-exports jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED
--add-exports jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED
--add-exports jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED
--add-opens jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED
--add-opens jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED

16
pom.xml
View File

@ -42,6 +42,7 @@
<jackson-databind.version>2.13.3</jackson-databind.version> <jackson-databind.version>2.13.3</jackson-databind.version>
<junit-jupiter-params.version>5.9.1</junit-jupiter-params.version> <junit-jupiter-params.version>5.9.1</junit-jupiter-params.version>
<google-guice.version>5.1.0</google-guice.version> <google-guice.version>5.1.0</google-guice.version>
<error-prone.version>2.18.0</error-prone.version>
</properties> </properties>
<dependencies> <dependencies>
@ -240,7 +241,11 @@
<version>31.1-jre</version> <version>31.1-jre</version>
</dependency> </dependency>
<dependency>
<groupId>com.google.errorprone</groupId>
<artifactId>error_prone_annotations</artifactId>
<version>${error-prone.version}</version>
</dependency>
</dependencies> </dependencies>
<build> <build>
@ -279,12 +284,19 @@
</plugin> </plugin>
<plugin> <plugin>
<artifactId>maven-compiler-plugin</artifactId> <artifactId>maven-compiler-plugin</artifactId>
<version>3.6.2</version> <version>3.8.1</version>
<configuration> <configuration>
<compilerArgs> <compilerArgs>
<arg>-parameters</arg> <arg>-parameters</arg>
<arg>-XDcompilePolicy=simple</arg>
<arg>-Xplugin:ErrorProne</arg>
</compilerArgs> </compilerArgs>
<annotationProcessorPaths> <annotationProcessorPaths>
<path>
<groupId>com.google.errorprone</groupId>
<artifactId>error_prone_core</artifactId>
<version>${error-prone.version}</version>
</path>
<path> <path>
<groupId>io.jooby</groupId> <groupId>io.jooby</groupId>
<artifactId>jooby-apt</artifactId> <artifactId>jooby-apt</artifactId>

View File

@ -1,5 +1,6 @@
package com.github.polpetta.mezzotre.telegram.command; package com.github.polpetta.mezzotre.telegram.command;
import com.github.polpetta.mezzotre.i18n.TemplateContentGenerator;
import com.github.polpetta.mezzotre.orm.model.TgChat; import com.github.polpetta.mezzotre.orm.model.TgChat;
import com.google.inject.assistedinject.Assisted; import com.google.inject.assistedinject.Assisted;
import com.pengrad.telegrambot.model.Update; import com.pengrad.telegrambot.model.Update;
@ -9,7 +10,9 @@ import java.util.Collections;
import java.util.Optional; import java.util.Optional;
import java.util.Set; import java.util.Set;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executor;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Named;
/** /**
* Generates a "Command not found" message * Generates a "Command not found" message
@ -19,12 +22,20 @@ import javax.inject.Inject;
* @see com.github.polpetta.mezzotre.telegram.callbackquery.NotFound for the event-based version * @see com.github.polpetta.mezzotre.telegram.callbackquery.NotFound for the event-based version
*/ */
class NotFound implements Processor { class NotFound implements Processor {
private static final String CMD_CTX_NAME = "cmdName";
private final String commandName; private final String commandName;
private final TemplateContentGenerator templateContentGenerator;
private final Executor threadPool;
@Inject @Inject
public NotFound(@Assisted String commandName) { public NotFound(
@Assisted String commandName,
TemplateContentGenerator templateContentGenerator,
@Named("eventThreadPool") Executor threadPool) {
this.commandName = commandName; this.commandName = commandName;
this.templateContentGenerator = templateContentGenerator;
this.threadPool = threadPool;
} }
@Override @Override
@ -35,10 +46,13 @@ class NotFound implements Processor {
@Override @Override
public CompletableFuture<Optional<BaseRequest<?, ?>>> process(TgChat chat, Update update) { public CompletableFuture<Optional<BaseRequest<?, ?>>> process(TgChat chat, Update update) {
// FIXME complete it with: localization, callbackQuery to show help message // FIXME complete it with: localization, callbackQuery to show help message
return CompletableFuture.completedFuture(update) return CompletableFuture.supplyAsync(
.thenApply( () ->
ignored -> templateContentGenerator.mergeTemplate(
Optional.of( ctx -> ctx.put(CMD_CTX_NAME, commandName),
new SendMessage(chat.getId(), "Command " + commandName + " is not valid"))); chat.getLocale(),
"template/telegram/notFound.vm"),
threadPool)
.thenApply(text -> Optional.of(new SendMessage(chat.getId(), text)));
} }
} }

View File

@ -13,7 +13,21 @@ import javax.inject.Inject;
import javax.inject.Named; import javax.inject.Named;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
// FIXME doc, tests(?) /**
* This Jooby {@link Extension} allows to start and execute services that implement {@link Service}
* class. This allows implementation of this interface to be automatically started. Services need to
* me listed by the named key {@code "services"}, which is a {@link List} of services passed by the
* {@link com.google.inject.Injector}.
*
* <p>The module handles the services start and stop when the whole JVM is stopped, allowing a
* graceful service shutdown.
*
* @author Davide Polonio
* @since 1.0
* @see <a href="https://github.com/google/guava/wiki/ServiceExplained">Guava Service Wiki
* explained</a>
* @see ServiceManager
*/
public class ServiceModule implements Extension { public class ServiceModule implements Extension {
private final ServiceManager serviceManager; private final ServiceManager serviceManager;

View File

@ -10,6 +10,8 @@ changeLanguage.english=English
changeLanguage.italian=Italian changeLanguage.italian=Italian
changeLanguage.cmdDescription=Select the new language I will use to speak to you changeLanguage.cmdDescription=Select the new language I will use to speak to you
changeLanguage.inlineKeyboardButtonName=Change language changeLanguage.inlineKeyboardButtonName=Change language
selectLanguageTutorial.english=English
selectLanguageTutorial.italian=Italian
spell.speakWithAnimals=Speak with animals spell.speakWithAnimals=Speak with animals
selectLanguageTutorial.showMeTutorialInlineKeyboardButtonName=Show me what you can do! selectLanguageTutorial.showMeTutorialInlineKeyboardButtonName=Show me what you can do!
help.notShownYet=It seems you haven''t checked out what I can do yet! To have a complete list of my abilities, type /help in chat at any time! help.notShownYet=It seems you haven''t checked out what I can do yet! To have a complete list of my abilities, type /help in chat at any time!
@ -17,3 +19,5 @@ help.buttonBelow=Alternatively, you can click the button down below.
help.description=Here is a list of what I can do help.description=Here is a list of what I can do
help.buttonsToo=You can do the same operations you''d do with the commands aforementioned by selecting the corresponding button below \ud83d\udc47 help.buttonsToo=You can do the same operations you''d do with the commands aforementioned by selecting the corresponding button below \ud83d\udc47
help.cmdDescription=Print the help message help.cmdDescription=Print the help message
notfound.description=Mmm I''m not able to find command {0}, are you sure to have it typed correctly?
notfound.howToHelp=Let me show you what I can do by typing /help in the chat!

View File

@ -10,6 +10,8 @@ changeLanguage.english=English
changeLanguage.italian=Italian changeLanguage.italian=Italian
changeLanguage.cmdDescription=Select the new language I will use to speak to you changeLanguage.cmdDescription=Select the new language I will use to speak to you
changeLanguage.inlineKeyboardButtonName=Change language changeLanguage.inlineKeyboardButtonName=Change language
selectLanguageTutorial.english=English
selectLanguageTutorial.italian=Italian
spell.speakWithAnimals=Speak with animals spell.speakWithAnimals=Speak with animals
selectLanguageTutorial.showMeTutorialInlineKeyboardButtonName=Show me what you can do! selectLanguageTutorial.showMeTutorialInlineKeyboardButtonName=Show me what you can do!
help.notShownYet=It seems you haven''t checked out what I can do yet! To have a complete list of my abilities, type /help in chat at any time! help.notShownYet=It seems you haven''t checked out what I can do yet! To have a complete list of my abilities, type /help in chat at any time!
@ -17,3 +19,5 @@ help.buttonBelow=Alternatively, you can click the button down below.
help.description=Here is a list of what I can do help.description=Here is a list of what I can do
help.buttonsToo=You can do the same operations you''d do with the commands aforementioned by selecting the corresponding button below \ud83d\udc47 help.buttonsToo=You can do the same operations you''d do with the commands aforementioned by selecting the corresponding button below \ud83d\udc47
help.cmdDescription=Print the help message help.cmdDescription=Print the help message
notfound.description=Mmm I''m not able to find command {0}, are you sure to have it typed correctly?
notfound.howToHelp=Let me show you what I can do by typing /help in the chat!

View File

@ -1,11 +1,23 @@
start.helloFirstName=Ciao {0}! \ud83d\udc4b start.helloFirstName=Ciao {0}! \ud83d\udc4b
start.description=Questo è {0}, un semplice bot che ci concenta sulla gestione di contenuto per DnD! Per favore comincia selezionando la lingua qui sotto \ud83d\udc47 start.description=Questo è {0}, un semplice bot che ci concenta sulla gestione di contenuto per DnD! Per favore comincia selezionando la lingua qui sotto \ud83d\udc47
start.cmdDescription=Comincia a chattare con questo bot
start.inlineKeyboardButtonName=Cominciamo!
selectLanguageTutorial.inlineKeyboardButtonName=Seleziona linguaggio
selectLanguageTutorial.drinkAction=*Procede a bere una pozione al cui suo interno si trova uno strano liquido multicolore* selectLanguageTutorial.drinkAction=*Procede a bere una pozione al cui suo interno si trova uno strano liquido multicolore*
selectLanguageTutorial.setLanguage=Grazie! Ora che ho bevuto questa posizione modificata di {0} che ho trovato ieri al negozio di pozioni magiche la "Cristalleria Fermentatrice" posso parlare con te nel linguaggio che preferisci! selectLanguageTutorial.setLanguage=Grazie! Ora che ho bevuto questa posizione modificata di {0} che ho trovato ieri al negozio di pozioni magiche la "Cristalleria Fermentatrice" posso parlare con te nel linguaggio che preferisci!
selectLanguageTutorial.instructions=Puoi sempre cambiare le preferenze della tua lingua scrivendo /changeLanguage nella chat. selectLanguageTutorial.instructions=Puoi sempre cambiare le preferenze della tua lingua scrivendo /changeLanguage nella chat.
changeLanguage.english=Inglese
changeLanguage.italian=Italiano
changeLanguage.cmdDescription=Seleziona il nuovo linguaggio che userò per parlare con te
changeLanguage.inlineKeyboardButtonName=Cambia lingua
selectLanguageTutorial.english=Inglese selectLanguageTutorial.english=Inglese
selectLanguageTutorial.italian=Italiano selectLanguageTutorial.italian=Italiano
spell.speakWithAnimals=Parlare con animali spell.speakWithAnimals=Parlare con animali
selectLanguageTutorial.showMeTutorialInlineKeyboardButtonName=Mostrami cosa puoi fare! selectLanguageTutorial.showMeTutorialInlineKeyboardButtonName=Mostrami cosa puoi fare!
help.notShownYet=Sembra tu non abbia ancora visto cosa posso fare! Per avere una lista completa delle mie abilità, scrivi /help nella chat in qualsiasi momento! help.notShownYet=Sembra tu non abbia ancora visto cosa posso fare! Per avere una lista completa delle mie abilità, scrivi /help nella chat in qualsiasi momento!
help.buttonBelow=Alternativamente, puoi premere il bottone qui sotto. help.buttonBelow=Alternativamente, puoi premere il bottone qui sotto.
help.description=Ecco una lista di quello che sono in grado di fare
help.buttonsToo=Puoi fare le stesse operazioni che faresti con i comandi elencati precedentemente cliccando il bottone corrispondente qui di sotto \ud83d\udc47
help.cmdDescription=Stampa il messaggio d'aiuto
notfound.description=Mmm non sono in grado di trovare il comando {0}, sei sicuro di averlo scritto correttamente?
notfound.howToHelp=Lascia che ti mostri cosa posso fare, scrivi /help nella chat!

View File

@ -1,11 +1,23 @@
start.helloFirstName=Ciao {0}! \ud83d\udc4b start.helloFirstName=Ciao {0}! \ud83d\udc4b
start.description=Questo è {0}, un semplice bot che ci concenta sulla gestione di contenuto per DnD! Per favore comincia selezionando la lingua qui sotto \ud83d\udc47 start.description=Questo è {0}, un semplice bot che ci concenta sulla gestione di contenuto per DnD! Per favore comincia selezionando la lingua qui sotto \ud83d\udc47
start.cmdDescription=Comincia a chattare con questo bot
start.inlineKeyboardButtonName=Cominciamo!
selectLanguageTutorial.inlineKeyboardButtonName=Seleziona linguaggio
selectLanguageTutorial.drinkAction=*Procede a bere una pozione al cui suo interno si trova uno strano liquido multicolore* selectLanguageTutorial.drinkAction=*Procede a bere una pozione al cui suo interno si trova uno strano liquido multicolore*
selectLanguageTutorial.setLanguage=Grazie! Ora che ho bevuto questa posizione modificata di {0} che ho trovato ieri al negozio di pozioni magiche la "Cristalleria Fermentatrice" posso parlare con te nel linguaggio che preferisci! selectLanguageTutorial.setLanguage=Grazie! Ora che ho bevuto questa posizione modificata di {0} che ho trovato ieri al negozio di pozioni magiche la "Cristalleria Fermentatrice" posso parlare con te nel linguaggio che preferisci!
selectLanguageTutorial.instructions=Puoi sempre cambiare le preferenze della tua lingua scrivendo /changeLanguage nella chat. selectLanguageTutorial.instructions=Puoi sempre cambiare le preferenze della tua lingua scrivendo /changeLanguage nella chat.
changeLanguage.english=Inglese
changeLanguage.italian=Italiano
changeLanguage.cmdDescription=Seleziona il nuovo linguaggio che userò per parlare con te
changeLanguage.inlineKeyboardButtonName=Cambia lingua
selectLanguageTutorial.english=Inglese selectLanguageTutorial.english=Inglese
selectLanguageTutorial.italian=Italiano selectLanguageTutorial.italian=Italiano
spell.speakWithAnimals=Parlare con animali spell.speakWithAnimals=Parlare con animali
selectLanguageTutorial.showMeTutorialInlineKeyboardButtonName=Mostrami cosa puoi fare! selectLanguageTutorial.showMeTutorialInlineKeyboardButtonName=Mostrami cosa puoi fare!
help.notShownYet=Sembra tu non abbia ancora visto cosa posso fare! Per avere una lista completa delle mie abilità, scrivi /help nella chat in qualsiasi momento! help.notShownYet=Sembra tu non abbia ancora visto cosa posso fare! Per avere una lista completa delle mie abilità, scrivi /help nella chat in qualsiasi momento!
help.buttonBelow=Alternativamente, puoi premere il bottone qui sotto. help.buttonBelow=Alternativamente, puoi premere il bottone qui sotto.
help.description=Ecco una lista di quello che sono in grado di fare
help.buttonsToo=Puoi fare le stesse operazioni che faresti con i comandi elencati precedentemente cliccando il bottone corrispondente qui di sotto \ud83d\udc47
help.cmdDescription=Stampa il messaggio d'aiuto
notfound.description=Mmm non sono in grado di trovare il comando {0}, sei sicuro di averlo scritto correttamente?
notfound.howToHelp=Lascia che ti mostri cosa posso fare, scrivi /help nella chat!

View File

@ -0,0 +1,3 @@
${i18n.notfound.description.insert(${cmdName})}
${i18n.notfound.howToHelp}

View File

@ -0,0 +1,72 @@
package com.github.polpetta.mezzotre.util;
import static org.junit.jupiter.api.Assertions.*;
import com.google.common.util.concurrent.Service;
import java.util.List;
import java.util.concurrent.Executor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.parallel.Execution;
import org.junit.jupiter.api.parallel.ExecutionMode;
@Execution(ExecutionMode.CONCURRENT)
class ServiceModuleTest {
/**
* This test seems stupid, but it is actually important that the behavior of the extension is
* always with a {@code lateInit} set to true, otherwise services won't be alive for the whole JVM
* execution
*/
@Test
void shouldBeLateInit() {
// Necessary otherwise ServiceManager will throw exception in the constructor 🤦
final Service dumbService =
new Service() {
@Override
public Service startAsync() {
return null;
}
@Override
public boolean isRunning() {
return false;
}
@Override
public State state() {
return State.NEW;
}
@Override
public Service stopAsync() {
return null;
}
@Override
public void awaitRunning() {}
@Override
public void awaitRunning(long timeout, TimeUnit unit) throws TimeoutException {}
@Override
public void awaitTerminated() {}
@Override
public void awaitTerminated(long timeout, TimeUnit unit) throws TimeoutException {}
@Override
public Throwable failureCause() {
return null;
}
@Override
public void addListener(Listener listener, Executor executor) {}
};
final ServiceModule serviceModule = new ServiceModule(List.of(dumbService));
assertTrue(serviceModule.lateinit());
}
}