committed by
Rubenlagus
20 changed files with 2501 additions and 730 deletions
File diff suppressed because it is too large
@ -0,0 +1,69 @@ |
|||||
|
package org.telegram.services; |
||||
|
|
||||
|
/** |
||||
|
* @author Ruben Bermudez |
||||
|
* @version 2.0 |
||||
|
* @brief Task to be execute periodically |
||||
|
* @date 28/01/15 |
||||
|
*/ |
||||
|
public abstract class CustomTimerTask { |
||||
|
private String taskName = ""; ///< Task name
|
||||
|
private int times = 1; |
||||
|
|
||||
|
/** |
||||
|
* Constructor |
||||
|
* |
||||
|
* @param taskName Name of the task |
||||
|
*/ |
||||
|
public CustomTimerTask(String taskName, int times) { |
||||
|
this.taskName = taskName; |
||||
|
this.times = times; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Get name |
||||
|
* |
||||
|
* @return name |
||||
|
*/ |
||||
|
public String getTaskName() { |
||||
|
return this.taskName; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Set name |
||||
|
* |
||||
|
* @param taskName new name |
||||
|
*/ |
||||
|
public void setTaskName(String taskName) { |
||||
|
this.taskName = taskName; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Getter for the times |
||||
|
* |
||||
|
* @return Remainint times the task must be executed |
||||
|
*/ |
||||
|
public int getTimes() { |
||||
|
return this.times; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Setter for the times |
||||
|
* |
||||
|
* @param times Number of times the task must be executed |
||||
|
*/ |
||||
|
public void setTimes(int times) { |
||||
|
this.times = times; |
||||
|
} |
||||
|
|
||||
|
public void reduceTimes() { |
||||
|
if (this.times > 0) { |
||||
|
this.times -= 1; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* @abstract Should contain the functionality of the task |
||||
|
*/ |
||||
|
public abstract void execute(); |
||||
|
} |
||||
@ -0,0 +1,108 @@ |
|||||
|
package org.telegram.services; |
||||
|
|
||||
|
import java.time.*; |
||||
|
import java.util.concurrent.Executors; |
||||
|
import java.util.concurrent.ScheduledExecutorService; |
||||
|
import java.util.concurrent.TimeUnit; |
||||
|
|
||||
|
/** |
||||
|
* @author Ruben Bermudez |
||||
|
* @version 2.0 |
||||
|
* @brief Exectue a task periodically |
||||
|
* @date 27/01/25 |
||||
|
*/ |
||||
|
public class TimerExecutor { |
||||
|
private static volatile BotLogger log = BotLogger.getLogger(TimerExecutor.class.getName()); |
||||
|
private static volatile TimerExecutor instance; ///< Instance
|
||||
|
private static final ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1); ///< Thread to execute operations
|
||||
|
|
||||
|
/** |
||||
|
* Private constructor due to singleton |
||||
|
*/ |
||||
|
private TimerExecutor() { |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Singleton pattern |
||||
|
* |
||||
|
* @return Instance of the executor |
||||
|
*/ |
||||
|
public static TimerExecutor getInstance() { |
||||
|
final TimerExecutor currentInstance; |
||||
|
if (instance == null) { |
||||
|
synchronized (TimerExecutor.class) { |
||||
|
if (instance == null) { |
||||
|
instance = new TimerExecutor(); |
||||
|
} |
||||
|
currentInstance = instance; |
||||
|
} |
||||
|
} else { |
||||
|
currentInstance = instance; |
||||
|
} |
||||
|
|
||||
|
return currentInstance; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Add a new CustomTimerTask to be executed |
||||
|
* |
||||
|
* @param task Task to execute |
||||
|
* @param targetHour Hour to execute it |
||||
|
* @param targetMin Minute to execute it |
||||
|
* @param targetSec Second to execute it |
||||
|
*/ |
||||
|
public void startExecutionEveryDayAt(CustomTimerTask task, int targetHour, int targetMin, int targetSec) { |
||||
|
log.warn("Posting new task" + task.getTaskName()); |
||||
|
final Runnable taskWrapper = () -> { |
||||
|
try { |
||||
|
task.execute(); |
||||
|
task.reduceTimes(); |
||||
|
startExecutionEveryDayAt(task, targetHour, targetMin, targetSec); |
||||
|
} catch (Exception e) { |
||||
|
log.severe("Bot threw an unexpected exception at TimerExecutor", e); |
||||
|
} |
||||
|
}; |
||||
|
if (task.getTimes() != 0) { |
||||
|
final long delay = computNextDilay(targetHour, targetMin, targetSec); |
||||
|
executorService.schedule(taskWrapper, delay, TimeUnit.SECONDS); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Find out next daily execution |
||||
|
* |
||||
|
* @param targetHour Target hour |
||||
|
* @param targetMin Target minute |
||||
|
* @param targetSec Target second |
||||
|
* @return time in second to wait |
||||
|
*/ |
||||
|
private long computNextDilay(int targetHour, int targetMin, int targetSec) { |
||||
|
final LocalDateTime localNow = LocalDateTime.now(Clock.systemUTC()); |
||||
|
LocalDateTime localNextTarget = localNow.withHour(targetHour).withMinute(targetMin).withSecond(targetSec); |
||||
|
while (localNow.compareTo(localNextTarget) > 0) { |
||||
|
localNextTarget = localNextTarget.plusDays(1); |
||||
|
} |
||||
|
|
||||
|
final Duration duration = Duration.between(localNow, localNextTarget); |
||||
|
return duration.getSeconds(); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void finalize() { |
||||
|
this.stop(); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Stop the thread |
||||
|
*/ |
||||
|
public void stop() { |
||||
|
executorService.shutdown(); |
||||
|
try { |
||||
|
executorService.awaitTermination(1, TimeUnit.DAYS); |
||||
|
} catch (InterruptedException ex) { |
||||
|
log.severe(ex); |
||||
|
} catch (Exception e) { |
||||
|
log.severe("Bot threw an unexpected exception at TimerExecutor", e); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,40 @@ |
|||||
|
package org.telegram.structure; |
||||
|
|
||||
|
/** |
||||
|
* @author Ruben Bermudez |
||||
|
* @version 1.0 |
||||
|
* @brief Weather Alert representation |
||||
|
* @date 23 of July of 2015 |
||||
|
*/ |
||||
|
public class WeatherAlert { |
||||
|
private int id; |
||||
|
private int userId; |
||||
|
private int cityId; |
||||
|
|
||||
|
public WeatherAlert() { |
||||
|
} |
||||
|
|
||||
|
public int getId() { |
||||
|
return id; |
||||
|
} |
||||
|
|
||||
|
public void setId(int id) { |
||||
|
this.id = id; |
||||
|
} |
||||
|
|
||||
|
public int getUserId() { |
||||
|
return userId; |
||||
|
} |
||||
|
|
||||
|
public void setUserId(int userId) { |
||||
|
this.userId = userId; |
||||
|
} |
||||
|
|
||||
|
public int getCityId() { |
||||
|
return cityId; |
||||
|
} |
||||
|
|
||||
|
public void setCityId(int cityId) { |
||||
|
this.cityId = cityId; |
||||
|
} |
||||
|
} |
||||
File diff suppressed because it is too large
@ -0,0 +1,75 @@ |
|||||
|
helpTransifex= Schieten woorden tekort of heb je last van een babylonische dwaling? Probeer mij dan eens uit voor een Telegram-vertaling.\n\nOm de laatste vertaling voor Telegram te verkrijgen voor een taal\:\n|-- %s TAAL_CODE \: De meest recente iOS-vertaling.\n|-- %s TAAL_CODE \: De meest recente Android-vertaling\n|-- %s TAAL_CODE \: De meest recente Webogram-vertaling.\n|-- %s TAAL_CODE \: De meest recente Tdesktop-vertaling.\n|-- %s TAAL_CODE \: De meest recente OSX-vertaling.\n|-- %s TAAL_CODE \: De meest recente Windows Phone-vertaling.\n\n2. Alleen voor Android beta in je huidige taal\:\n|-- %s TAAL_CODE \: De meest Android-beta vertaling\n\n(TAAL_CODE voorbeeld\: nl) |
||||
|
helpFiles= Het downloadverbod is van kracht want Brein greep de macht, je downloads zijn nu officieel illegaal, maar een bestandje met mij delen, zodat anderen het kunnen vinden, is dat eigenlijk wel zo abnormaal?\n\nBestanden delen via een link\:\n|-- %s BESTANDSID \: Ontvang een bestand met ID.\n|-- %s \: Begin een bestandsupload.\n|-- %s \: Kies een bestand om te verwijderen.\n|-- %s \: Geef een lijst met gedeelde bestanden weer. |
||||
|
helpDirections= Vele wegen leiden naar Rome, maar terug naar Leiden is toch nog een hele klus, bent u het zoeken op de kaart al zat? Vraag het aan mij en ik breng u op het rechte pad\!\n\nOm een routebeschrijving tussen twee locaties te ontvangen\:\n|-- %s \: Start een routebeschrijving. |
||||
|
sendFileToUpload= Stuur mij het bestand dat je wilt delen. Zorg ervoor dat je het stuurt als een bestand en niet als een afbeelding of video. |
||||
|
fileUploaded= Je bestand is geüpload. Stuur deze link naar iedereen die je maar wilt en zij kunnen het bestand ermee downloaden\:\n\n |
||||
|
deleteUploadedFile= Selecteer het bestand dat je wilt verwijderen\: |
||||
|
fileDeleted= Het bestand is verwijderd. |
||||
|
wrongFileId= Sorry, ik kan het bestand met dat ID niet vinden. Mogelijk is er een typefout gemaakt of is het bestand al verwijderd. |
||||
|
listOfFiles= Dit zijn je gedeelde bestanden op het moment\: |
||||
|
noFiles= Je hebt nog geen bestanden gedeeld. |
||||
|
processFinished= Het huidige proces is geannuleerd. |
||||
|
uploadedFileURL= https\://telegram.me/filesbot?start\= |
||||
|
initDirections= Beantwoord dit bericht met je vertrekpunt. |
||||
|
sendDestination= Beantwoord dit bericht met je bestemming. |
||||
|
youNeedReplyDirections= Het spijt me, ik kan je niet helpen tenzij je het bericht dat ik stuurde beantwoord. |
||||
|
chooselanguage= Kies een taal uit de lijst om de taal te wijzigen. |
||||
|
errorLanguage= Deze taal ondersteunen we niet of je hebt een typefout gemaakt. Het proces is geannuleerd. |
||||
|
directionsInit= %s is %s verwijderd van %s en het duurt %s om er te komen met de volgende routebeschrijving\:\n\n |
||||
|
directionsNotFound= Routebeschrijving tussen %s en %s niet gevonden. |
||||
|
errorFetchingDirections= Ophalen van routebeschrijving mislukt |
||||
|
directionsStep= %s voor %s (%s) |
||||
|
languageModified= Je taalinstelling is bijgewerkt. |
||||
|
|
||||
|
|
||||
|
helpWeatherMessage= Zon of regen, hagel of ijs?\nVraag het aan mij en ik maak u weer wijs\!\n\n\t\t%s Om de huidige weersvoorspelling te ontvangen\n\t\t%s Voor een drie-daagse weersvoorspelling\n\t\t%s Waarschuwingen instellen\n\t\t%s Kies een weersvoorspellingstaal\n\t\t%s Kies een eenhedenstelsel |
||||
|
forecast=%sVoorspelling |
||||
|
current=%sHuidig |
||||
|
help=%sHelp |
||||
|
settings=%sInstellingen |
||||
|
cancel=%sAnnuleren |
||||
|
location=%sLocatie |
||||
|
new=%sNieuw |
||||
|
languages=%sTalen |
||||
|
alerts=%sWaarschuwingen |
||||
|
units=%sEenheden |
||||
|
back=%sTerug |
||||
|
delete=%sVerwijderen |
||||
|
showList=%sLijst weergeven |
||||
|
rateMe=%sBeoordeel mij |
||||
|
metricSystem=Metriek stelsel |
||||
|
imperialSystem= Imperiaal stelsel |
||||
|
selectLanguage=Je huidige taal is %s. Kies een taal van de lijst om deze instelling te wijzigen. |
||||
|
languageUpdated=Je taalinstelling is bijgewerkt. |
||||
|
errorLanguageNotFound= Deze taal ondersteunen we niet of je hebt een typefout gemaakt. Kies een taal uit de lijst. |
||||
|
selectUnits=Je huidige eenhedenstelsel is %s. Kies een optie van de lijst om deze instelling te wijzigen. |
||||
|
unitsUpdated=Je gekozen eenheid is bijgewerkt. |
||||
|
errorUnitsNotFound= Dit stelsel ondersteunen we helaas niet, of je hebt een typefout gemaakt. Kies een stelsel van de lijst. |
||||
|
onWeatherNewCommand=Stuur me de stad waarin je geïnteresseerd bent. Gebruik dit formaat\: STAD,LAND |
||||
|
onWeatherLocationCommand=Stuur me de locatie waarin je geïnteresseerd bent. |
||||
|
onCurrentCommandFromHistory=Kies een optie van je recente verzoeken, "nieuw" om een stad te sturen of "locatie" om mij een locatie te sturen en de huidige weersvoorspelling te ontvangen. |
||||
|
onCurrentCommandWithoutHistory=Kies "nieuw" om een stad te sturen of "locatie" om mij een locatie te sturen de huidige weersvoorspelling te ontvangen. |
||||
|
onForecastCommandFromHistory=Kies een optie van je recente verzoeken, "nieuw" om een stad te sturen of "locatie" om mij een locatie te sturen en een drie-daagse weersvoorspelling te ontvangen. |
||||
|
onForecastCommandWithoutHistory=Kies "nieuw" om een stad te sturen of "locatie" om mij een locatie te sturen en een drie-daagse weersvoorspelling te ontvangen. |
||||
|
weatherCurrent= De weersverwachting voor %s is\:\n\n%s |
||||
|
currentWeatherPartMetric=\t- Weer\: %s\n\t- Bewolking\: %s\n\t- Temperatuur\: %s ºC\n |
||||
|
currentWeatherPartImperial=\t- Weer\: %s\n\t- Bewolking\: %s\n\t- Temperatuur\: %s ºF\n |
||||
|
weatherForcast= De weersverwachting voor %s\:\n\n%s |
||||
|
forecastWeatherPartMetric= %s op %s \n\t- Voorspelling\: %s\n\t- Hoogste temperatuur\: %s ºC\n\t- Laagste temperatuur\: %s ºC\n |
||||
|
forecastWeatherPartImperial= %s on %s \n\t- Voorspelling\: %s\n\t- Hoogste temperatuur\: %s ºF\n\t- Laagste temperatuur\: %s ºF\n |
||||
|
weatherAlert= De weersverwachting voor %s\:\n\n%s |
||||
|
alertWeatherPartMetric=\t- Voorspelling\: %s\n\t- Hoogste temperatuur\: %s ºC\n\t- Laagste temperatuur\: %s ºC\n |
||||
|
alertWeatherPartImperial=\t- Voorspelling\: %s\n\t- Hoogste temperatuur\: %s ºF\n\t- Laagste temperatuur\: %s ºF\n |
||||
|
chooseOption=Selecteer een optie uit het menu. |
||||
|
backToMainMenu=Proces geannuleerd, terug naar het hoofdmenu. |
||||
|
onSettingsCommand=Maak een keuze\:\n\t\t%s Taal\: Kies een weersvoorspellings-taal\n\t\t%s Eenheid\: Wijzig je voorkeurseenheid.\n\t\t%s Alerts\: dagelijkse waarschuwingen instellen\n\t\t%s Back\: Terug naar het hoofdmenu |
||||
|
alertsMenuMessage=Hier kan je je waarschuwingen beheren of nieuwe toevoegen. |
||||
|
chooseNewAlertCity=Voor welke stad wil je een waarschuwing instellen? Kies een optie van je recente verzoeken. |
||||
|
newAlertSaved=%s Je waarschuwing voor %s is aangemaakt, je ontvangt twee keer per dag een weersvoorspelling. |
||||
|
initialAlertList=Je hebt %d waarschuwingen\:\n\n%s |
||||
|
partialAlertList=%s%s\n |
||||
|
noAlertList=Geen waarschuwingen gevonden. |
||||
|
alertDeleted=De geselecteerde waarschuwing is verwijderd. |
||||
|
cityNotFound= Stad niet gevonden. |
||||
|
errorFetchingWeather= Sorry, er is iets misgegaan bij het ophalen van het weer. |
||||
|
rateMeMessage=Als je deze bot leuk vindt dan kan je hem hier beoordelen https\://telegram.me/storebot?start\=weatherbot |
||||
Loading…
Reference in new issue