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 Guava Service Wiki + * explained + * @see ServiceManager + */ public class ServiceModule implements Extension { private final ServiceManager serviceManager; diff --git a/src/main/resources/i18n/message.properties b/src/main/resources/i18n/message.properties index d022a29..f8458cd 100644 --- a/src/main/resources/i18n/message.properties +++ b/src/main/resources/i18n/message.properties @@ -10,6 +10,8 @@ changeLanguage.english=English changeLanguage.italian=Italian changeLanguage.cmdDescription=Select the new language I will use to speak to you changeLanguage.inlineKeyboardButtonName=Change language +selectLanguageTutorial.english=English +selectLanguageTutorial.italian=Italian spell.speakWithAnimals=Speak with animals 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! @@ -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.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 +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! diff --git a/src/main/resources/i18n/message_en_US.properties b/src/main/resources/i18n/message_en_US.properties index d022a29..f8458cd 100644 --- a/src/main/resources/i18n/message_en_US.properties +++ b/src/main/resources/i18n/message_en_US.properties @@ -10,6 +10,8 @@ changeLanguage.english=English changeLanguage.italian=Italian changeLanguage.cmdDescription=Select the new language I will use to speak to you changeLanguage.inlineKeyboardButtonName=Change language +selectLanguageTutorial.english=English +selectLanguageTutorial.italian=Italian spell.speakWithAnimals=Speak with animals 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! @@ -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.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 +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! diff --git a/src/main/resources/i18n/message_it.properties b/src/main/resources/i18n/message_it.properties index 01ae788..cc81ee8 100644 --- a/src/main/resources/i18n/message_it.properties +++ b/src/main/resources/i18n/message_it.properties @@ -1,11 +1,23 @@ 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.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.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. +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.italian=Italiano spell.speakWithAnimals=Parlare con animali 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.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! diff --git a/src/main/resources/i18n/message_it_IT.properties b/src/main/resources/i18n/message_it_IT.properties index 01ae788..cc81ee8 100644 --- a/src/main/resources/i18n/message_it_IT.properties +++ b/src/main/resources/i18n/message_it_IT.properties @@ -1,11 +1,23 @@ 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.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.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. +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.italian=Italiano spell.speakWithAnimals=Parlare con animali 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.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! diff --git a/src/main/resources/template/telegram/notFound.vm b/src/main/resources/template/telegram/notFound.vm new file mode 100644 index 0000000..18916a1 --- /dev/null +++ b/src/main/resources/template/telegram/notFound.vm @@ -0,0 +1,3 @@ +${i18n.notfound.description.insert(${cmdName})} + +${i18n.notfound.howToHelp} \ No newline at end of file diff --git a/src/test/java/com/github/polpetta/mezzotre/util/ServiceModuleTest.java b/src/test/java/com/github/polpetta/mezzotre/util/ServiceModuleTest.java new file mode 100644 index 0000000..a698b78 --- /dev/null +++ b/src/test/java/com/github/polpetta/mezzotre/util/ServiceModuleTest.java @@ -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()); + } +}