package org.telegram.updateshandlers; import org.telegram.BotConfig; import org.telegram.BuildVars; import org.telegram.Commands; import org.telegram.SenderHelper; import org.telegram.api.*; import org.telegram.database.DatabaseManager; import org.telegram.methods.SendMessage; import org.telegram.services.*; import org.telegram.structure.WeatherAlert; import org.telegram.updatesreceivers.UpdatesThread; import org.telegram.updatesreceivers.Webhook; import javax.swing.text.JTextComponent; import java.util.ArrayList; import java.util.List; /** * @author Ruben Bermudez * @version 1.0 * @brief Handler for updates to Weather Bot * @date 24 of June of 2015 */ public class WeatherHandlers implements UpdatesCallback { private static final String TOKEN = BotConfig.TOKENWEATHER; private static final int STARTSTATE = 0; private static final int MAINMENU = 1; private static final int CURRENTWEATHER = 2; private static final int CURRENTNEWWEATHER = 3; private static final int CURRENTLOCATIONWEATHER = 4; private static final int FORECASTWEATHER = 5; private static final int FORECASTNEWWEATHER = 6; private static final int FORECASTLOCATIONWEATHER = 7; private static final int ALERT = 8; private static final int ALERTNEW = 9; private static final int ALERTDELETE = 10; private static final int SETTINGS = 11; private static final int LANGUAGE = 12; private static final int UNITS = 13; private static final String webhookPath = "weatherBot"; public WeatherHandlers() { Webhook webhook; if (BuildVars.useWebHook) { webhook = new Webhook(this, webhookPath); SenderHelper.SendWebhook(webhook.getURL(), TOKEN); } else { SenderHelper.SendWebhook("", TOKEN); new UpdatesThread(TOKEN, this); } startAlertTimers(); } private static void startAlertTimers() { TimerExecutor.getInstance().startExecutionEveryDayAt(new CustomTimerTask("First day alert", -1) { @Override public void execute() { sendAlerts(); } }, 0, 0, 0); TimerExecutor.getInstance().startExecutionEveryDayAt(new CustomTimerTask("Second day alert", -1) { @Override public void execute() { sendAlerts(); } }, 12, 0, 0); } private static void sendAlerts() { List allAlerts = DatabaseManager.getInstance().getAllAlerts(); for (WeatherAlert weatherAlert : allAlerts) { String[] userOptions = DatabaseManager.getInstance().getUserWeatherOptions(weatherAlert.getUserId()); String weather = WeatherService.getInstance().fetchWeatherAlert(weatherAlert.getCityId(), weatherAlert.getUserId(), userOptions[0], userOptions[1]); SendMessage sendMessage = new SendMessage(); sendMessage.setChatId(weatherAlert.getUserId()); sendMessage.setText(weather); sendBuiltMessage(sendMessage); } } @Override public void onUpdateReceived(Update update) { Message message = update.getMessage(); if (message != null) { handleIncomingMessage(message); } } private static void onCancelCommand(Integer chatId, Integer userId, Integer messageId, ReplyKeyboard replyKeyboard, String language) { SendMessage sendMessage = new SendMessage(); sendMessage.setChatId(chatId); sendMessage.setReplayMarkup(getMainMenuKeyboard(language)); sendMessage.setReplayToMessageId(messageId); sendMessage.setReplayMarkup(replyKeyboard); sendMessage.setText(LocalisationService.getInstance().getString("backToMainMenu", language)); sendBuiltMessage(sendMessage); DatabaseManager.getInstance().insertWeatherState(userId, chatId, MAINMENU); } // region Incoming messages handlers private static void handleIncomingMessage(Message message) { final int state = DatabaseManager.getInstance().getWeatherState(message.getFrom().getId(), message.getChatId()); final String language = DatabaseManager.getInstance().getUserWeatherOptions(message.getFrom().getId())[0]; if (message.isGroupMessage() && message.hasText()) { if (isCommandForOther(message.getText())) { return; } else if (message.getText().startsWith(Commands.STOPCOMMAND)){ sendHideKeyboard(message.getFrom().getId(), message.getChatId(), message.getMessageId()); return; } } switch(state) { case MAINMENU: messageOnMainMenu(message, language); break; case CURRENTWEATHER: case CURRENTNEWWEATHER: case CURRENTLOCATIONWEATHER: messageOnCurrentWeather(message, language, state); break; case FORECASTWEATHER: case FORECASTNEWWEATHER: case FORECASTLOCATIONWEATHER: messageOnForecastWeather(message, language, state); break; case ALERT: case ALERTNEW: case ALERTDELETE: messageOnAlert(message, language, state); break; case SETTINGS: messageOnSetting(message, language); break; case LANGUAGE: messageOnLanguage(message, language); break; case UNITS: messageOnUnits(message, language); break; default: sendMessageDefault(message, language); break; } } private static void sendHideKeyboard(Integer userId, Integer chatId, Integer messageId) { SendMessage sendMessage = new SendMessage(); sendMessage.setChatId(chatId); sendMessage.setReplayToMessageId(messageId); sendMessage.setText(Emoji.WAVING_HAND_SIGN.toString()); ReplyKeyboardHide replyKeyboardHide = new ReplyKeyboardHide(); replyKeyboardHide.setSelective(true); replyKeyboardHide.setHideKeyboard(true); sendMessage.setReplayMarkup(replyKeyboardHide); SenderHelper.SendMessage(sendMessage, TOKEN); DatabaseManager.getInstance().insertWeatherState(userId, chatId, STARTSTATE); } private static boolean isCommandForOther(String text) { boolean isSimpleCommand = text.equals("/start") || text.equals("/help") || text.equals("/stop"); boolean isCommandForMe = text.equals("/start@weatherbot") || text.equals("/help@weatherbot") || text.equals("/stop@weatherbot"); return text.startsWith("/") && !isSimpleCommand && !isCommandForMe; } // endregion Incoming messages handlers // region Alerts Menu Option selected private static void messageOnAlert(Message message, String language, int state) { switch(state) { case ALERT: onAlertOptionSelected(message, language); break; case ALERTNEW: onAlertNewOptionSelected(message, language); break; case ALERTDELETE: onAlertDeleteOptionSelected(message, language); break; } } private static void onAlertDeleteOptionSelected(Message message, String language) { if (message.hasText()) { if (message.getText().equals(getCancelCommand(language))) { onAlertDeleteBackOptionSelected(message, language); } else if (DatabaseManager.getInstance().getAlertCitiesNameByUser(message.getFrom().getId()).contains(message.getText())) { onAlertDeleteCityOptionSelected(message, language); } else { sendChooseOptionMessage(message.getChatId(), message.getMessageId(), getAlertsListKeyboard(message.getFrom().getId(), language), language); } } } private static void onAlertDeleteCityOptionSelected(Message message, String language) { DatabaseManager.getInstance().deleteAlertCity(message.getFrom().getId(), message.getText()); SendMessage sendMessage = new SendMessage(); sendMessage.setReplayToMessageId(message.getMessageId()); sendMessage.setChatId(message.getChatId()); sendMessage.setReplayMarkup(getAlertsKeyboard(language)); sendMessage.setText(LocalisationService.getInstance().getString("alertDeleted", language)); sendBuiltMessage(sendMessage); DatabaseManager.getInstance().insertWeatherState(message.getFrom().getId(), message.getChatId(), ALERT); } private static void onAlertDeleteBackOptionSelected(Message message, String language) { SendMessage sendMessage = new SendMessage(); sendMessage.setReplayToMessageId(message.getMessageId()); sendMessage.setChatId(message.getChatId()); sendMessage.setReplayMarkup(getAlertsKeyboard(language)); sendMessage.setText(LocalisationService.getInstance().getString("alertsMenuMessage", language)); sendBuiltMessage(sendMessage); DatabaseManager.getInstance().insertWeatherState(message.getFrom().getId(), message.getChatId(), ALERT); } private static void onAlertNewOptionSelected(Message message, String language) { if (message.hasText()) { if (message.getText().equals(getCancelCommand(language))) { SendMessage sendMessage = new SendMessage(); sendMessage.setChatId(message.getChatId()); sendMessage.setReplayToMessageId(message.getMessageId()); sendMessage.setReplayMarkup(getAlertsKeyboard(language)); sendMessage.setText(LocalisationService.getInstance().getString("alertsMenuMessage", language)); sendBuiltMessage(sendMessage); DatabaseManager.getInstance().insertWeatherState(message.getFrom().getId(), message.getChatId(), ALERT); } else { onNewAlertCityReceived(message, language); } } } private static void onNewAlertCityReceived(Message message, String language) { int userId = message.getFrom().getId(); Integer cityId = DatabaseManager.getInstance().getRecentWeatherIdByCity(userId, message.getText()); if (cityId != null) { DatabaseManager.getInstance().createNewWeatherAlert(userId, cityId, message.getText()); SendMessage sendMessageRequest = new SendMessage(); sendMessageRequest.setReplayMarkup(getAlertsKeyboard(language)); sendMessageRequest.setReplayToMessageId(message.getMessageId()); sendMessageRequest.setText(getChooseNewAlertSetMessage(message.getText(), language)); sendMessageRequest.setChatId(message.getChatId()); sendBuiltMessage(sendMessageRequest); DatabaseManager.getInstance().insertWeatherState(userId, message.getChatId(), ALERT); } else { sendChooseOptionMessage(message.getChatId(), message.getMessageId(), getRecentsKeyboard(message.getFrom().getId(), language, false), language); } } private static void onAlertOptionSelected(Message message, String language) { if (message.hasText()) { if (message.getText().equals(getNewCommand(language))) { onNewAlertCommand(message, language); } else if (message.getText().equals(getDeleteCommand(language))) { onDeleteAlertCommand(message, language); } else if (message.getText().equals(getListCommand(language))) { onListAlertCommand(message, language); } else if (message.getText().equals(getBackCommand(language))) { onBackAlertCommand(message, language); } else { sendChooseOptionMessage(message.getChatId(), message.getMessageId(), getAlertsKeyboard(language), language); } } } private static void onBackAlertCommand(Message message, String language) { SendMessage sendMessage = new SendMessage(); ReplyKeyboardMarkup replyKeyboardMarkup = getSettingsKeyboard(language); sendMessage.setReplayMarkup(replyKeyboardMarkup); sendMessage.setReplayToMessageId(message.getMessageId()); sendMessage.setChatId(message.getChatId()); sendMessage.setText(getSettingsMessage(language)); sendBuiltMessage(sendMessage); DatabaseManager.getInstance().insertWeatherState(message.getFrom().getId(), message.getChatId(), SETTINGS); } private static void onListAlertCommand(Message message, String language) { SendMessage sendMessage = new SendMessage(); sendMessage.setChatId(message.getChatId()); sendMessage.setReplayToMessageId(message.getMessageId()); sendMessage.setReplayMarkup(getAlertsKeyboard(language)); sendMessage.setText(getAlertListMessage(message.getFrom().getId(), language)); sendMessage.setReplayToMessageId(message.getMessageId()); sendBuiltMessage(sendMessage); } private static void onDeleteAlertCommand(Message message, String language) { SendMessage sendMessage = new SendMessage(); sendMessage.setChatId(message.getChatId()); ReplyKeyboardMarkup replyKeyboardMarkup = getAlertsListKeyboard(message.getFrom().getId(), language); if (replyKeyboardMarkup != null) { sendMessage.setReplayMarkup(replyKeyboardMarkup); sendMessage.setText(LocalisationService.getInstance().getString("chooseNewAlertCity", language)); DatabaseManager.getInstance().insertWeatherState(message.getFrom().getId(), message.getChatId(), ALERTDELETE); } else { sendMessage.setReplayMarkup(getAlertsKeyboard(language)); sendMessage.setText(LocalisationService.getInstance().getString("noAlertList", language)); } sendMessage.setReplayToMessageId(message.getMessageId()); sendBuiltMessage(sendMessage); } private static void onNewAlertCommand(Message message, String language) { SendMessage sendMessage = new SendMessage(); sendMessage.setChatId(message.getChatId()); sendMessage.setReplayMarkup(getRecentsKeyboard(message.getFrom().getId(), language, false)); sendMessage.setText(LocalisationService.getInstance().getString("chooseNewAlertCity", language)); sendMessage.setReplayToMessageId(message.getMessageId()); sendBuiltMessage(sendMessage); DatabaseManager.getInstance().insertWeatherState(message.getFrom().getId(), message.getChatId(), ALERTNEW); } // endregion Alerts Menu Option selected // region Settings Menu Option selected private static void messageOnSetting(Message message, String language) { if (message.hasText()) { if (message.getText().startsWith(getLanguagesCommand(language))) { onLanguageCommand(message, language); } else if (message.getText().startsWith(getUnitsCommand(language))) { onUnitsCommand(message, language); } else if (message.getText().startsWith(getAlertsCommand(language))) { onAlertsCommand(message, language); } else if (message.getText().startsWith(getBackCommand(language))) { sendMessageDefault(message, language); } else { sendChooseOptionMessage(message.getChatId(), message.getMessageId(), getSettingsKeyboard(language), language); } } } private static void onAlertsCommand(Message message, String language) { SendMessage sendMessage = new SendMessage(); sendMessage.setReplayToMessageId(message.getMessageId()); sendMessage.setChatId(message.getChatId()); sendMessage.setReplayMarkup(getAlertsKeyboard(language)); sendMessage.setText(LocalisationService.getInstance().getString("alertsMenuMessage", language)); sendBuiltMessage(sendMessage); DatabaseManager.getInstance().insertWeatherState(message.getFrom().getId(), message.getChatId(), ALERT); } private static void onUnitsCommand(Message message, String language) { SendMessage sendMessage = new SendMessage(); sendMessage.setReplayToMessageId(message.getMessageId()); sendMessage.setChatId(message.getChatId()); sendMessage.setReplayMarkup(getUnitsKeyboard(language)); sendMessage.setText(getUnitsMessage(message.getFrom().getId(), language)); sendBuiltMessage(sendMessage); DatabaseManager.getInstance().insertWeatherState(message.getFrom().getId(), message.getChatId(), UNITS); } private static void onLanguageCommand(Message message, String language) { SendMessage sendMessage = new SendMessage(); sendMessage.setReplayToMessageId(message.getMessageId()); sendMessage.setChatId(message.getChatId()); sendMessage.setReplayMarkup(getLanguagesKeyboard(language)); sendMessage.setText(getLanguageMessage(language)); sendBuiltMessage(sendMessage); DatabaseManager.getInstance().insertWeatherState(message.getFrom().getId(), message.getChatId(), LANGUAGE); } // endregion Settings Menu Option selected // region Units Menu Option selected private static void messageOnUnits(Message message, String language) { if (message.hasText()) { if (message.getText().trim().equals(getCancelCommand(language))) { onBackUnitsCommand(message, language); } else if (message.getText().trim().equals(LocalisationService.getInstance().getString("metricSystem", language))) { onUnitsChosen(message.getFrom().getId(), message.getChatId(), message.getMessageId(), WeatherService.METRICSYSTEM, language); } else if (message.getText().trim().equals(LocalisationService.getInstance().getString("imperialSystem", language))) { onUnitsChosen(message.getFrom().getId(), message.getChatId(), message.getMessageId(), WeatherService.IMPERIALSYSTEM, language); } else { onUnitsError(message.getChatId(), message.getMessageId(), language); } } } private static void onBackUnitsCommand(Message message, String language) { SendMessage sendMessage = new SendMessage(); ReplyKeyboardMarkup replyKeyboardMarkup = getSettingsKeyboard(language); sendMessage.setReplayMarkup(replyKeyboardMarkup); sendMessage.setReplayToMessageId(message.getMessageId()); sendMessage.setChatId(message.getChatId()); sendMessage.setText(getSettingsMessage(language)); sendBuiltMessage(sendMessage); DatabaseManager.getInstance().insertWeatherState(message.getFrom().getId(), message.getChatId(), SETTINGS); } private static void onUnitsError(Integer chatId, Integer messageId, String language) { SendMessage sendMessageRequest = new SendMessage(); sendMessageRequest.setChatId(chatId); sendMessageRequest.setReplayMarkup(getUnitsKeyboard(language)); sendMessageRequest.setText(LocalisationService.getInstance().getString("errorUnitsNotFound", language)); sendMessageRequest.setReplayToMessageId(messageId); sendBuiltMessage(sendMessageRequest); } private static void onUnitsChosen(Integer userId, Integer chatId, Integer messageId, String units, String language) { DatabaseManager.getInstance().putUserWeatherUnitsOption(userId, units); SendMessage sendMessageRequest = new SendMessage(); sendMessageRequest.setChatId(chatId); sendMessageRequest.setText(LocalisationService.getInstance().getString("unitsUpdated", language)); sendMessageRequest.setReplayToMessageId(messageId); sendMessageRequest.setReplayMarkup(getMainMenuKeyboard(language)); sendBuiltMessage(sendMessageRequest); DatabaseManager.getInstance().insertWeatherState(userId, chatId, MAINMENU); } // endregion Units Menu Option selected // region Language Menu Option selected private static void messageOnLanguage(Message message, String language) { if (message.hasText()) { if (message.getText().trim().equals(getCancelCommand(language))) { onBackLanguageCommand(message, language); } else if (LocalisationService.getInstance().getSupportedLanguages().values().contains(message.getText().trim())) { onLanguageChosen(message.getFrom().getId(), message.getChatId(), message.getMessageId(), message.getText().trim()); } else { onLanguageError(message.getChatId(), message.getMessageId(), language); } } } private static void onBackLanguageCommand(Message message, String language) { SendMessage sendMessage = new SendMessage(); ReplyKeyboardMarkup replyKeyboardMarkup = getSettingsKeyboard(language); sendMessage.setReplayMarkup(replyKeyboardMarkup); sendMessage.setReplayToMessageId(message.getMessageId()); sendMessage.setChatId(message.getChatId()); sendMessage.setText(getSettingsMessage(language)); sendBuiltMessage(sendMessage); DatabaseManager.getInstance().insertWeatherState(message.getFrom().getId(), message.getChatId(), SETTINGS); } private static void onLanguageError(Integer chatId, Integer messageId, String language) { SendMessage sendMessageRequest = new SendMessage(); sendMessageRequest.setChatId(chatId); sendMessageRequest.setReplayMarkup(getLanguagesKeyboard(language)); sendMessageRequest.setText(LocalisationService.getInstance().getString("errorLanguageNotFound", language)); sendMessageRequest.setReplayToMessageId(messageId); sendBuiltMessage(sendMessageRequest); } private static void onLanguageChosen(Integer userId, Integer chatId, Integer messageId, String language) { String languageCode = LocalisationService.getInstance().getLanguageCodeByName(language); DatabaseManager.getInstance().putUserWeatherLanguageOption(userId, languageCode); SendMessage sendMessageRequest = new SendMessage(); sendMessageRequest.setChatId(chatId); sendMessageRequest.setText(LocalisationService.getInstance().getString("languageUpdated", languageCode)); sendMessageRequest.setReplayToMessageId(messageId); sendMessageRequest.setReplayMarkup(getMainMenuKeyboard(languageCode)); sendBuiltMessage(sendMessageRequest); DatabaseManager.getInstance().insertWeatherState(userId, chatId, MAINMENU); } // endregion Language Menu Option selected // region Forecast Weather Menu Option selected private static void messageOnForecastWeather(Message message, String language, int state) { switch(state) { case FORECASTWEATHER: onForecastWeather(message, language); break; case FORECASTNEWWEATHER: onForecastNewWeather(message, language); break; case FORECASTLOCATIONWEATHER: onForecastWeatherLocation(message, language); break; } } private static void onForecastWeather(Message message, String language) { if (message.hasText()) { if (message.getText().startsWith(getNewCommand(language))) { onNewForecastWeatherCommand(message.getChatId(), message.getFrom().getId(), message.getMessageId(), language); } else if (message.getText().startsWith(getLocationCommand(language))) { onLocationForecastWeatherCommand(message.getChatId(), message.getFrom().getId(), message.getMessageId(), language); } else if (message.getText().startsWith(getCancelCommand(language))) { onCancelCommand(message.getChatId(), message.getFrom().getId(), message.getMessageId(), getMainMenuKeyboard(language), language); } else { onForecastWeatherCityReceived(message.getChatId(), message.getFrom().getId(), message.getMessageId(), message.getText(), language); } } } private static void onForecastNewWeather(Message message, String language) { if (message.isReply()) { onForecastWeatherReceived(message.getChatId(), message.getFrom().getId(), message.getMessageId(), message.getText(), language); } else { sendMessageDefault(message, language); } } private static void onForecastWeatherCityReceived(Integer chatId, Integer userId, Integer messageId, String text, String language) { Integer cityId = DatabaseManager.getInstance().getRecentWeatherIdByCity(userId, text); if (cityId != null) { String unitsSystem = DatabaseManager.getInstance().getUserWeatherOptions(userId)[1]; String weather = WeatherService.getInstance().fetchWeatherForecast(cityId.toString(), userId, language, unitsSystem); SendMessage sendMessageRequest = new SendMessage(); sendMessageRequest.setReplayMarkup(getMainMenuKeyboard(language)); sendMessageRequest.setReplayToMessageId(messageId); sendMessageRequest.setText(weather); sendMessageRequest.setChatId(chatId); sendBuiltMessage(sendMessageRequest); DatabaseManager.getInstance().insertWeatherState(userId, chatId, MAINMENU); } else { sendChooseOptionMessage(chatId, messageId, getRecentsKeyboard(userId, language), language); } } private static void onLocationForecastWeatherCommand(Integer chatId, Integer userId, Integer messageId, String language) { ForceReplyKeyboard forceReplyKeyboard = getForceReply(); SendMessage sendMessage = new SendMessage(); sendMessage.setChatId(chatId); sendMessage.setReplayToMessageId(messageId); sendMessage.setReplayMarkup(forceReplyKeyboard); sendMessage.setText(LocalisationService.getInstance().getString("onWeatherLocationCommand", language)); sendBuiltMessage(sendMessage); DatabaseManager.getInstance().insertWeatherState(userId, chatId, FORECASTLOCATIONWEATHER); } private static void onNewForecastWeatherCommand(Integer chatId, Integer userId, Integer messageId, String language) { ForceReplyKeyboard forceReplyKeyboard = getForceReply(); SendMessage sendMessage = new SendMessage(); sendMessage.setChatId(chatId); sendMessage.setReplayToMessageId(messageId); sendMessage.setReplayMarkup(forceReplyKeyboard); sendMessage.setText(LocalisationService.getInstance().getString("onWeatherNewCommand", language)); sendBuiltMessage(sendMessage); DatabaseManager.getInstance().insertWeatherState(userId, chatId, FORECASTNEWWEATHER); } private static void onForecastWeatherLocation(Message message, String language) { if (message.isReply() && message.hasLocation()) { onForecastWeatherLocationReceived(message, language); } else { sendMessageDefault(message, language); } } // endregion Forecast Weather Menu Option selected // region Current Weather Menu Option selected private static void messageOnCurrentWeather(Message message, String language, int state) { switch(state) { case CURRENTWEATHER: onCurrentWeather(message, language); break; case CURRENTNEWWEATHER: onCurrentNewWeather(message, language); break; case CURRENTLOCATIONWEATHER: onCurrentWeatherLocation(message, language); break; } } private static void onCurrentWeather(Message message, String language) { if (message.hasText()) { if (message.getText().startsWith(getNewCommand(language))) { onNewCurrentWeatherCommand(message.getChatId(), message.getFrom().getId(), message.getMessageId(), language); } else if (message.getText().startsWith(getLocationCommand(language))) { onLocationCurrentWeatherCommand(message.getChatId(), message.getFrom().getId(), message.getMessageId(), language); } else if (message.getText().startsWith(getCancelCommand(language))) { onCancelCommand(message.getChatId(), message.getFrom().getId(), message.getMessageId(), getMainMenuKeyboard(language), language); } else { onCurrentWeatherCityReceived(message.getChatId(), message.getFrom().getId(), message.getMessageId(), message.getText(), language); } } } private static void onCurrentNewWeather(Message message, String language) { if (message.isReply()) { onCurrentWeatherReceived(message.getChatId(), message.getFrom().getId(), message.getMessageId(), message.getText(), language); } else { sendMessageDefault(message, language); } } private static void onCurrentWeatherCityReceived(Integer chatId, Integer userId, Integer messageId, String text, String language) { Integer cityId = DatabaseManager.getInstance().getRecentWeatherIdByCity(userId, text); if (cityId != null) { String unitsSystem = DatabaseManager.getInstance().getUserWeatherOptions(userId)[1]; String weather = WeatherService.getInstance().fetchWeatherCurrent(cityId.toString(), userId, language, unitsSystem); SendMessage sendMessageRequest = new SendMessage(); sendMessageRequest.setReplayMarkup(getMainMenuKeyboard(language)); sendMessageRequest.setReplayToMessageId(messageId); sendMessageRequest.setText(weather); sendMessageRequest.setChatId(chatId); sendBuiltMessage(sendMessageRequest); DatabaseManager.getInstance().insertWeatherState(userId, chatId, MAINMENU); } else { sendChooseOptionMessage(chatId, messageId, getRecentsKeyboard(userId, language), language); } } private static void onLocationCurrentWeatherCommand(Integer chatId, Integer userId, Integer messageId, String language) { ForceReplyKeyboard forceReplyKeyboard = getForceReply(); SendMessage sendMessage = new SendMessage(); sendMessage.setChatId(chatId); sendMessage.setReplayToMessageId(messageId); sendMessage.setReplayMarkup(forceReplyKeyboard); sendMessage.setText(LocalisationService.getInstance().getString("onWeatherLocationCommand", language)); sendBuiltMessage(sendMessage); DatabaseManager.getInstance().insertWeatherState(userId, chatId, CURRENTLOCATIONWEATHER); } private static void onNewCurrentWeatherCommand(Integer chatId, Integer userId, Integer messageId, String language) { ForceReplyKeyboard forceReplyKeyboard = getForceReply(); SendMessage sendMessage = new SendMessage(); sendMessage.setChatId(chatId); sendMessage.setReplayToMessageId(messageId); sendMessage.setReplayMarkup(forceReplyKeyboard); sendMessage.setText(LocalisationService.getInstance().getString("onWeatherNewCommand", language)); sendBuiltMessage(sendMessage); DatabaseManager.getInstance().insertWeatherState(userId, chatId, CURRENTNEWWEATHER); } private static void onCurrentWeatherLocation(Message message, String language) { if (message.isReply() && message.hasLocation()) { onCurrentWeatherLocationReceived(message, language); } else { sendMessageDefault(message, language); } } // endregion Current Weather Menu Option selected // region Main menu options selected private static void messageOnMainMenu(Message message, String language) { if (message.hasText()) { if (message.getText().equals(getCurrentCommand(language))) { onCurrentChoosen(message, language); } else if (message.getText().equals(getForecastCommand(language))) { onForecastChoosen(message, language); } else if (message.getText().equals(getSettingsCommand(language))) { onSettingsChoosen(message, language); } else if (message.getText().equals(getRateCommand(language))) { sendRateMessage(message.getChatId(), message.getMessageId(), null, language); } else { sendChooseOptionMessage(message.getChatId(), message.getMessageId(), getMainMenuKeyboard(language), language); } } else { sendChooseOptionMessage(message.getChatId(), message.getMessageId(), getMainMenuKeyboard(language), language); } } private static void onSettingsChoosen(Message message, String language) { SendMessage sendMessage = new SendMessage(); ReplyKeyboardMarkup replyKeyboardMarkup = getSettingsKeyboard(language); sendMessage.setReplayMarkup(replyKeyboardMarkup); sendMessage.setReplayToMessageId(message.getMessageId()); sendMessage.setChatId(message.getChatId()); sendMessage.setText(getSettingsMessage(language)); sendBuiltMessage(sendMessage); DatabaseManager.getInstance().insertWeatherState(message.getFrom().getId(), message.getChatId(), SETTINGS); } private static void onForecastChoosen(Message message, String language) { SendMessage sendMessage = new SendMessage(); ReplyKeyboardMarkup replyKeyboardMarkup = getRecentsKeyboard(message.getFrom().getId(), language); sendMessage.setReplayMarkup(replyKeyboardMarkup); sendMessage.setReplayToMessageId(message.getMessageId()); sendMessage.setChatId(message.getChatId()); if (replyKeyboardMarkup.getKeyboard().size() > 3) { sendMessage.setText(LocalisationService.getInstance().getString("onForecastCommandFromHistory", language)); } else { sendMessage.setText(LocalisationService.getInstance().getString("onForecastCommandWithoutHistory", language)); } sendBuiltMessage(sendMessage); DatabaseManager.getInstance().insertWeatherState(message.getFrom().getId(), message.getChatId(), FORECASTWEATHER); } private static void onCurrentChoosen(Message message, String language) { SendMessage sendMessage = new SendMessage(); ReplyKeyboardMarkup replyKeyboardMarkup = getRecentsKeyboard(message.getFrom().getId(), language); sendMessage.setReplayMarkup(replyKeyboardMarkup); sendMessage.setReplayToMessageId(message.getMessageId()); sendMessage.setChatId(message.getChatId()); if (replyKeyboardMarkup.getKeyboard().size() > 3) { sendMessage.setText(LocalisationService.getInstance().getString("onCurrentCommandFromHistory", language)); } else { sendMessage.setText(LocalisationService.getInstance().getString("onCurrentCommandWithoutHistory", language)); } sendBuiltMessage(sendMessage); DatabaseManager.getInstance().insertWeatherState(message.getFrom().getId(), message.getChatId(), CURRENTWEATHER); } // endregion Main menu options selected // region Get Messages private static String getSettingsMessage(String language) { String baseString = LocalisationService.getInstance().getString("onSettingsCommand", language); return String.format(baseString, Emoji.GLOBE_WITH_MERIDIANS.toString(), Emoji.STRAIGHT_RULER.toString(), Emoji.ALARM_CLOCK.toString(), Emoji.BACK_WITH_LEFTWARDS_ARROW_ABOVE.toString()); } private static String getHelpMessage(String language) { String baseString = LocalisationService.getInstance().getString("helpWeatherMessage", language); return String.format(baseString, Emoji.BLACK_RIGHT_POINTING_TRIANGLE.toString(), Emoji.BLACK_RIGHT_POINTING_DOUBLE_TRIANGLE.toString(), Emoji.ALARM_CLOCK.toString(), Emoji.EARTH_GLOBE_EUROPE_AFRICA.toString(), Emoji.STRAIGHT_RULER.toString()); } private static String getLanguageMessage(String language) { String baseString = LocalisationService.getInstance().getString("selectLanguage", language); return String.format(baseString, language); } private static String getUnitsMessage(Integer userId, String language) { String baseString = LocalisationService.getInstance().getString("selectUnits", language); return String.format(baseString, DatabaseManager.getInstance().getUserWeatherOptions(userId)[1]); } private static String getChooseNewAlertSetMessage(String city, String language) { String baseString = LocalisationService.getInstance().getString("newAlertSaved", language); return String.format(baseString, Emoji.THUMBS_UP_SIGN.toString(), city); } private static String getAlertListMessage(int userId, String language) { String alertListMessage; List alertCities = DatabaseManager.getInstance().getAlertCitiesNameByUser(userId); if (alertCities.size() > 0) { String baseAlertListString = LocalisationService.getInstance().getString("initialAlertList", language); String partialAlertListString = LocalisationService.getInstance().getString("partialAlertList", language); String fullListOfAlerts = ""; for (String alertCity : alertCities) { fullListOfAlerts += String.format(partialAlertListString, Emoji.ALARM_CLOCK.toString(), alertCity); } alertListMessage = String.format(baseAlertListString, alertCities.size(), fullListOfAlerts); } else { alertListMessage = LocalisationService.getInstance().getString("noAlertList", language); } return alertListMessage; } // endregion Get Messages // region ReplyKeyboards private static ReplyKeyboardMarkup getMainMenuKeyboard(String language) { ReplyKeyboardMarkup replyKeyboardMarkup = new ReplyKeyboardMarkup(); replyKeyboardMarkup.setSelective(true); replyKeyboardMarkup.setResizeKeyboard(true); replyKeyboardMarkup.setOneTimeKeyboad(false); List> keyboard = new ArrayList<>(); List keyboardFirstRow = new ArrayList<>(); keyboardFirstRow.add(getCurrentCommand(language)); keyboardFirstRow.add(getForecastCommand(language)); List keyboardSecondRow = new ArrayList<>(); keyboardSecondRow.add(getSettingsCommand(language)); keyboardSecondRow.add(getRateCommand(language)); keyboard.add(keyboardFirstRow); keyboard.add(keyboardSecondRow); replyKeyboardMarkup.setKeyboard(keyboard); return replyKeyboardMarkup; } private static ReplyKeyboardMarkup getLanguagesKeyboard(String language) { ReplyKeyboardMarkup replyKeyboardMarkup = new ReplyKeyboardMarkup(); replyKeyboardMarkup.setSelective(true); replyKeyboardMarkup.setResizeKeyboard(true); replyKeyboardMarkup.setOneTimeKeyboad(false); List> keyboard = new ArrayList<>(); for (String languageName : LocalisationService.getInstance().getSupportedLanguages().values()) { List row = new ArrayList<>(); row.add(languageName); keyboard.add(row); } List row = new ArrayList<>(); row.add(getCancelCommand(language)); keyboard.add(row); replyKeyboardMarkup.setKeyboard(keyboard); return replyKeyboardMarkup; } private static ReplyKeyboardMarkup getUnitsKeyboard(String language) { ReplyKeyboardMarkup replyKeyboardMarkup = new ReplyKeyboardMarkup(); replyKeyboardMarkup.setSelective(true); replyKeyboardMarkup.setResizeKeyboard(true); replyKeyboardMarkup.setOneTimeKeyboad(false); List> keyboard = new ArrayList<>(); List row = new ArrayList<>(); row.add(LocalisationService.getInstance().getString("metricSystem", language)); keyboard.add(row); row = new ArrayList<>(); row.add(LocalisationService.getInstance().getString("imperialSystem", language)); keyboard.add(row); row = new ArrayList<>(); row.add(getCancelCommand(language)); keyboard.add(row); replyKeyboardMarkup.setKeyboard(keyboard); return replyKeyboardMarkup; } private static ReplyKeyboardMarkup getSettingsKeyboard(String language) { ReplyKeyboardMarkup replyKeyboardMarkup = new ReplyKeyboardMarkup(); replyKeyboardMarkup.setSelective(true); replyKeyboardMarkup.setResizeKeyboard(true); replyKeyboardMarkup.setOneTimeKeyboad(false); List> keyboard = new ArrayList<>(); List keyboardFirstRow = new ArrayList<>(); keyboardFirstRow.add(getLanguagesCommand(language)); keyboardFirstRow.add(getUnitsCommand(language)); List keyboardSecondRow = new ArrayList<>(); keyboardSecondRow.add(getAlertsCommand(language)); keyboardSecondRow.add(getBackCommand(language)); keyboard.add(keyboardFirstRow); keyboard.add(keyboardSecondRow); replyKeyboardMarkup.setKeyboard(keyboard); return replyKeyboardMarkup; } private static ReplyKeyboardMarkup getRecentsKeyboard(Integer userId, String language) { return getRecentsKeyboard(userId, language, true); } private static ReplyKeyboardMarkup getRecentsKeyboard(Integer userId, String language, boolean allowNew) { ReplyKeyboardMarkup replyKeyboardMarkup = new ReplyKeyboardMarkup(); replyKeyboardMarkup.setSelective(true); replyKeyboardMarkup.setResizeKeyboard(true); replyKeyboardMarkup.setOneTimeKeyboad(true); List> keyboard = new ArrayList<>(); for (String recentWeather : DatabaseManager.getInstance().getRecentWeather(userId)) { List row = new ArrayList<>(); row.add(recentWeather); keyboard.add(row); } List row = new ArrayList<>(); if (allowNew) { row.add(getLocationCommand(language)); keyboard.add(row); row = new ArrayList<>(); row.add(getNewCommand(language)); keyboard.add(row); row = new ArrayList<>(); } row.add(getCancelCommand(language)); keyboard.add(row); replyKeyboardMarkup.setKeyboard(keyboard); return replyKeyboardMarkup; } private static ReplyKeyboardMarkup getAlertsKeyboard(String language) { ReplyKeyboardMarkup replyKeyboardMarkup = new ReplyKeyboardMarkup(); replyKeyboardMarkup.setSelective(true); replyKeyboardMarkup.setResizeKeyboard(true); replyKeyboardMarkup.setOneTimeKeyboad(true); List> keyboard = new ArrayList<>(); List row = new ArrayList<>(); row.add(getNewCommand(language)); row.add(getDeleteCommand(language)); keyboard.add(row); row = new ArrayList<>(); row.add(getListCommand(language)); row.add(getBackCommand(language)); keyboard.add(row); replyKeyboardMarkup.setKeyboard(keyboard); return replyKeyboardMarkup; } private static ReplyKeyboardMarkup getAlertsListKeyboard(Integer userId, String language) { ReplyKeyboardMarkup replyKeyboardMarkup = null; List alertCitiesNames = DatabaseManager.getInstance().getAlertCitiesNameByUser(userId); if (alertCitiesNames.size() > 0) { replyKeyboardMarkup = new ReplyKeyboardMarkup(); replyKeyboardMarkup.setSelective(true); replyKeyboardMarkup.setResizeKeyboard(true); replyKeyboardMarkup.setOneTimeKeyboad(true); List> keyboard = new ArrayList<>(); for (String alertCityName: alertCitiesNames) { List row = new ArrayList<>(); row.add(alertCityName); keyboard.add(row); } List row = new ArrayList<>(); row.add(getCancelCommand(language)); keyboard.add(row); replyKeyboardMarkup.setKeyboard(keyboard); } return replyKeyboardMarkup; } private static ForceReplyKeyboard getForceReply() { ForceReplyKeyboard forceReplyKeyboard = new ForceReplyKeyboard(); forceReplyKeyboard.setForceReply(true); forceReplyKeyboard.setSelective(true); return forceReplyKeyboard; } // endregion ReplyKeyboards // region getCommnads private static String getRateCommand(String language) { return String.format(LocalisationService.getInstance().getString("rateMe", language), Emoji.HUNDRED_POINTS_SYMBOL.toString()); } private static String getListCommand(String language) { return String.format(LocalisationService.getInstance().getString("showList", language), Emoji.CLIPBOARD.toString()); } private static String getDeleteCommand(String language) { return String.format(LocalisationService.getInstance().getString("delete", language), Emoji.HEAVY_MINUS_SIGN.toString()); } private static String getLanguagesCommand(String language) { return String.format(LocalisationService.getInstance().getString("languages", language), Emoji.GLOBE_WITH_MERIDIANS.toString()); } private static String getUnitsCommand(String language) { return String.format(LocalisationService.getInstance().getString("units", language), Emoji.STRAIGHT_RULER.toString()); } private static String getAlertsCommand(String language) { return String.format(LocalisationService.getInstance().getString("alerts", language), Emoji.ALARM_CLOCK.toString()); } private static String getBackCommand(String language) { return String.format(LocalisationService.getInstance().getString("back", language), Emoji.BACK_WITH_LEFTWARDS_ARROW_ABOVE.toString()); } private static String getNewCommand(String language) { return String.format(LocalisationService.getInstance().getString("new", language), Emoji.HEAVY_PLUS_SIGN.toString()); } private static String getLocationCommand(String language) { return String.format(LocalisationService.getInstance().getString("location", language), Emoji.ROUND_PUSHPIN.toString()); } private static String getSettingsCommand(String language) { return String.format(LocalisationService.getInstance().getString("settings", language), Emoji.WRENCH.toString()); } private static String getCurrentCommand(String language) { return String.format(LocalisationService.getInstance().getString("current", language), Emoji.BLACK_RIGHT_POINTING_TRIANGLE.toString()); } private static String getHelpCommand(String language) { return String.format(LocalisationService.getInstance().getString("help", language), Emoji.BLACK_QUESTION_MARK_ORNAMENT.toString()); } private static String getForecastCommand(String language) { return String.format(LocalisationService.getInstance().getString("forecast", language), Emoji.BLACK_RIGHT_POINTING_DOUBLE_TRIANGLE.toString()); } private static String getCancelCommand(String language) { return String.format(LocalisationService.getInstance().getString("cancel", language), Emoji.CROSS_MARK.toString()); } // endregion getCommnads // region Send common messages private static void sendMessageDefault(Message message, String language) { ReplyKeyboardMarkup replyKeyboardMarkup = getMainMenuKeyboard(language); sendHelpMessage(message.getChatId(), message.getMessageId(), replyKeyboardMarkup, language); DatabaseManager.getInstance().insertWeatherState(message.getFrom().getId(), message.getChatId(), MAINMENU); } private static void sendChooseOptionMessage(Integer chatId, Integer messageId, ReplyKeyboard replyKeyboard, String language) { SendMessage sendMessage = new SendMessage(); sendMessage.setChatId(chatId); sendMessage.setReplayToMessageId(messageId); sendMessage.setReplayMarkup(replyKeyboard); sendMessage.setText(LocalisationService.getInstance().getString("chooseOption", language)); sendBuiltMessage(sendMessage); } private static void sendHelpMessage(Integer chatId, Integer messageId, ReplyKeyboardMarkup replyKeyboardMarkup, String language) { SendMessage sendMessage = new SendMessage(); sendMessage.setChatId(chatId); sendMessage.setReplayToMessageId(messageId); if (replyKeyboardMarkup != null) { sendMessage.setReplayMarkup(replyKeyboardMarkup); } sendMessage.setText(getHelpMessage(language)); sendBuiltMessage(sendMessage); } private static void sendRateMessage(Integer chatId, Integer messageId, ReplyKeyboardMarkup replyKeyboardMarkup, String language) { SendMessage sendMessage = new SendMessage(); sendMessage.setChatId(chatId); sendMessage.setReplayToMessageId(messageId); if (replyKeyboardMarkup != null) { sendMessage.setReplayMarkup(replyKeyboardMarkup); } sendMessage.setText(LocalisationService.getInstance().getString("rateMeMessage", language)); sendBuiltMessage(sendMessage); } // endregion Send common messages // region Send weather private static void onForecastWeatherLocationReceived(Message message, String language) { String unitsSystem = DatabaseManager.getInstance().getUserWeatherOptions(message.getFrom().getId())[1]; String weather = WeatherService.getInstance().fetchWeatherForecastByLocation(message.getLocation().getLongitude(), message.getLocation().getLatitude(), message.getFrom().getId(), language, unitsSystem); SendMessage sendMessageRequest = new SendMessage(); sendMessageRequest.setReplayMarkup(getMainMenuKeyboard(language)); sendMessageRequest.setReplayToMessageId(message.getMessageId()); sendMessageRequest.setText(weather); sendMessageRequest.setChatId(message.getChatId()); sendBuiltMessage(sendMessageRequest); DatabaseManager.getInstance().insertWeatherState(message.getFrom().getId(), message.getChatId(), MAINMENU); } private static void onForecastWeatherReceived(Integer chatId, Integer userId, Integer messageId, String text, String language) { String unitsSystem = DatabaseManager.getInstance().getUserWeatherOptions(userId)[1]; String weather = WeatherService.getInstance().fetchWeatherForecast(text, userId, language, unitsSystem); SendMessage sendMessageRequest = new SendMessage(); sendMessageRequest.setReplayMarkup(getMainMenuKeyboard(language)); sendMessageRequest.setReplayToMessageId(messageId); sendMessageRequest.setText(weather); sendMessageRequest.setChatId(chatId); sendBuiltMessage(sendMessageRequest); DatabaseManager.getInstance().insertWeatherState(userId, chatId, MAINMENU); } private static void onCurrentWeatherLocationReceived(Message message, String language) { String unitsSystem = DatabaseManager.getInstance().getUserWeatherOptions(message.getFrom().getId())[1]; String weather = WeatherService.getInstance().fetchWeatherCurrentByLocation(message.getLocation().getLongitude(), message.getLocation().getLatitude(), message.getFrom().getId(), language, unitsSystem); SendMessage sendMessageRequest = new SendMessage(); sendMessageRequest.setReplayMarkup(getMainMenuKeyboard(language)); sendMessageRequest.setReplayToMessageId(message.getMessageId()); sendMessageRequest.setText(weather); sendMessageRequest.setChatId(message.getChatId()); sendBuiltMessage(sendMessageRequest); DatabaseManager.getInstance().insertWeatherState(message.getFrom().getId(), message.getChatId(), MAINMENU); } private static void onCurrentWeatherReceived(Integer chatId, Integer userId, Integer messageId, String text, String language) { String unitsSystem = DatabaseManager.getInstance().getUserWeatherOptions(userId)[1]; String weather = WeatherService.getInstance().fetchWeatherCurrent(text, userId, language, unitsSystem); SendMessage sendMessageRequest = new SendMessage(); sendMessageRequest.setReplayMarkup(getMainMenuKeyboard(language)); sendMessageRequest.setReplayToMessageId(messageId); sendMessageRequest.setText(weather); sendMessageRequest.setChatId(chatId); sendBuiltMessage(sendMessageRequest); DatabaseManager.getInstance().insertWeatherState(userId, chatId, MAINMENU); } // endregion Send weather // region Helper Methods private static void sendBuiltMessage(SendMessage sendMessage) { SenderHelper.SendMessage(sendMessage, TOKEN); } // endregion Helper Methods }