You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

267 lines
14 KiB

11 years ago
package org.telegram.updateshandlers;
import lombok.extern.slf4j.Slf4j;
11 years ago
import org.telegram.BotConfig;
import org.telegram.Commands;
11 years ago
import org.telegram.database.DatabaseManager;
import org.telegram.services.Emoji;
11 years ago
import org.telegram.services.LocalisationService;
import org.telegram.telegrambots.bots.TelegramLongPollingBot;
import org.telegram.telegrambots.meta.api.methods.send.SendDocument;
import org.telegram.telegrambots.meta.api.methods.send.SendMessage;
import org.telegram.telegrambots.meta.api.objects.InputFile;
import org.telegram.telegrambots.meta.api.objects.Message;
import org.telegram.telegrambots.meta.api.objects.Update;
import org.telegram.telegrambots.meta.api.objects.replykeyboard.ReplyKeyboardMarkup;
import org.telegram.telegrambots.meta.api.objects.replykeyboard.ReplyKeyboardRemove;
import org.telegram.telegrambots.meta.api.objects.replykeyboard.buttons.KeyboardRow;
import org.telegram.telegrambots.meta.exceptions.TelegramApiException;
import org.telegram.telegrambots.meta.exceptions.TelegramApiRequestException;
11 years ago
import java.io.InvalidObjectException;
11 years ago
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
11 years ago
import java.util.concurrent.ConcurrentLinkedQueue;
11 years ago
/**
* @author Ruben Bermudez
* @version 1.0
* Handler for updates to Files Bot
* This bot is an example for the use of sendMessage asynchronously
11 years ago
*/
@Slf4j
public class FilesHandlers extends TelegramLongPollingBot {
11 years ago
private static final int INITIAL_UPLOAD_STATUS = 0;
private static final int DELETE_UPLOADED_STATUS = 1;
11 years ago
private final ConcurrentLinkedQueue<Integer> languageMessages = new ConcurrentLinkedQueue<>();
11 years ago
@Override
public String getBotToken() {
return BotConfig.FILES_TOKEN;
11 years ago
}
@Override
public void onUpdateReceived(Update update) {
try {
if (update.hasMessage()) {
try {
SendMessage sendMessageRequest = new SendMessage();
sendMessageRequest.setText("Since this bot was used to spread copyrighted content, we had to disable its functionality until further announcement.\n\nSorry for the troubles, just blame those that used the bot for illegal purposes.");
sendMessageRequest.setChatId(Long.toString(update.getMessage().getChatId()));
execute(sendMessageRequest);
//handleFileUpdate(update);
} catch (TelegramApiRequestException e) {
if (e.getApiResponse().contains("Bot was blocked by the user")) {
if (update.getMessage().getFrom() != null) {
DatabaseManager.getInstance().deleteUserForFile(update.getMessage().getFrom().getId());
}
}
} catch (Exception e) {
log.error(e.getLocalizedMessage(), e);
}
}
} catch (Exception e) {
log.error(e.getLocalizedMessage(), e);
}
11 years ago
}
@Override
public String getBotUsername() {
return BotConfig.FILES_USER;
}
private void handleFileUpdate(Update update) throws InvalidObjectException, TelegramApiException {
11 years ago
Message message = update.getMessage();
if (message != null && message.hasText()) {
11 years ago
if (languageMessages.contains(message.getFrom().getId())) {
onLanguageReceived(message);
11 years ago
} else {
String language = DatabaseManager.getInstance().getUserLanguage(update.getMessage().getFrom().getId());
if (message.getText().startsWith(Commands.setLanguageCommand)) {
onSetLanguageCommand(message, language);
11 years ago
} else {
String[] parts = message.getText().split(" ", 2);
if (parts[0].startsWith(Commands.startCommand)) {
if (parts.length == 2) {
onStartWithParameters(message, language, parts[1]);
11 years ago
} else {
sendHelpMessage(message, language);
11 years ago
}
11 years ago
} else if (!message.isGroupMessage()) {
if (parts[0].startsWith(Commands.uploadCommand)) { // Open upload for user
onUploadCommand(message, language);
11 years ago
} else if (parts[0].startsWith(Commands.cancelCommand)) {
onCancelCommand(message, language);
11 years ago
} else if (parts[0].startsWith(Commands.deleteCommand)) {
onDeleteCommand(message, language, parts);
11 years ago
} else if (parts[0].startsWith(Commands.listCommand)) {
onListCommand(message, language);
11 years ago
} else {
sendHelpMessage(message, language);
11 years ago
}
}
}
}
11 years ago
} else if (message != null && message.hasDocument()
11 years ago
&& DatabaseManager.getInstance().getUserStatusForFile(message.getFrom().getId()) == INITIAL_UPLOAD_STATUS) {
11 years ago
String language = DatabaseManager.getInstance().getUserLanguage(update.getMessage().getFrom().getId());
11 years ago
DatabaseManager.getInstance().addFile(message.getDocument().getFileId(), message.getFrom().getId(), message.getDocument().getFileName());
SendMessage sendMessageRequest = new SendMessage();
sendMessageRequest.setText(LocalisationService.getString("fileUploaded", language) +
LocalisationService.getString("uploadedFileURL", language) + message.getDocument().getFileId());
sendMessageRequest.setChatId(Long.toString(message.getChatId()));
execute(sendMessageRequest);
11 years ago
}
}
private void onListCommand(Message message, String language) throws InvalidObjectException, TelegramApiException {
HashMap<String, String> files = DatabaseManager.getInstance().getFilesByUser(message.getFrom().getId());
SendMessage sendMessageRequest = new SendMessage();
if (files.size() > 0) {
String text = LocalisationService.getString("listOfFiles", language) + ":\n\n";
for (Map.Entry<String, String> entry : files.entrySet()) {
text += LocalisationService.getString("uploadedFileURL", language)
+ entry.getKey() + " " + Emoji.LEFT_RIGHT_ARROW.toString() + " " + entry.getValue() + "\n";
}
sendMessageRequest.setText(text);
} else {
sendMessageRequest.setText(LocalisationService.getString("noFiles", language));
}
sendMessageRequest.setChatId(Long.toString(message.getChatId()));
9 years ago
sendMessageRequest.setReplyMarkup(new ReplyKeyboardRemove());
execute(sendMessageRequest);
}
private void onDeleteCommand(Message message, String language, String[] parts) throws InvalidObjectException, TelegramApiException {
if (DatabaseManager.getInstance().getUserStatusForFile(message.getFrom().getId()) == DELETE_UPLOADED_STATUS &&
parts.length == 2) {
onDeleteCommandWithParameters(message, language, parts[1]);
} else {
onDeleteCommandWithoutParameters(message, language);
}
}
private void onDeleteCommandWithoutParameters(Message message, String language) throws InvalidObjectException, TelegramApiException {
DatabaseManager.getInstance().addUserForFile(message.getFrom().getId(), DELETE_UPLOADED_STATUS);
SendMessage sendMessageRequest = new SendMessage();
sendMessageRequest.setText(LocalisationService.getString("deleteUploadedFile", language));
sendMessageRequest.setChatId(Long.toString(message.getChatId()));
HashMap<String, String> files = DatabaseManager.getInstance().getFilesByUser(message.getFrom().getId());
ReplyKeyboardMarkup replyKeyboardMarkup = new ReplyKeyboardMarkup();
if (files.size() > 0) {
List<KeyboardRow> commands = new ArrayList<>();
for (Map.Entry<String, String> entry : files.entrySet()) {
KeyboardRow commandRow = new KeyboardRow();
commandRow.add(Commands.deleteCommand + " " + entry.getKey() + " " + Emoji.LEFT_RIGHT_ARROW.toString()
+ " " + entry.getValue());
commands.add(commandRow);
}
replyKeyboardMarkup.setResizeKeyboard(true);
replyKeyboardMarkup.setOneTimeKeyboard(true);
replyKeyboardMarkup.setKeyboard(commands);
}
sendMessageRequest.setReplyMarkup(replyKeyboardMarkup);
execute(sendMessageRequest);
}
private void onDeleteCommandWithParameters(Message message, String language, String part) throws InvalidObjectException, TelegramApiException {
String[] innerParts = part.split(Emoji.LEFT_RIGHT_ARROW.toString(), 2);
boolean removed = DatabaseManager.getInstance().deleteFile(innerParts[0].trim());
SendMessage sendMessageRequest = new SendMessage();
if (removed) {
sendMessageRequest.setText(LocalisationService.getString("fileDeleted", language));
} else {
sendMessageRequest.setText(LocalisationService.getString("wrongFileId", language));
}
sendMessageRequest.setChatId(Long.toString(message.getChatId()));
execute(sendMessageRequest);
DatabaseManager.getInstance().deleteUserForFile(message.getFrom().getId());
}
private void onCancelCommand(Message message, String language) throws InvalidObjectException, TelegramApiException {
DatabaseManager.getInstance().deleteUserForFile(message.getFrom().getId());
SendMessage sendMessageRequest = new SendMessage();
sendMessageRequest.setText(LocalisationService.getString("processFinished", language));
sendMessageRequest.setChatId(Long.toString(message.getChatId()));
execute(sendMessageRequest);
}
private void onUploadCommand(Message message, String language) throws InvalidObjectException, TelegramApiException {
DatabaseManager.getInstance().addUserForFile(message.getFrom().getId(), INITIAL_UPLOAD_STATUS);
SendMessage sendMessageRequest = new SendMessage();
sendMessageRequest.setText(LocalisationService.getString("sendFileToUpload", language));
sendMessageRequest.setChatId(Long.toString(message.getChatId()));
execute(sendMessageRequest);
}
private void sendHelpMessage(Message message, String language) throws InvalidObjectException, TelegramApiException {
SendMessage sendMessageRequest = new SendMessage();
String formatedString = String.format(
LocalisationService.getString("helpFiles", language),
Commands.startCommand, Commands.uploadCommand, Commands.deleteCommand,
Commands.listCommand);
sendMessageRequest.setText(formatedString);
sendMessageRequest.setChatId(Long.toString(message.getChatId()));
execute(sendMessageRequest);
}
private void onStartWithParameters(Message message, String language, String part) throws InvalidObjectException, TelegramApiException {
if (DatabaseManager.getInstance().doesFileExists(part.trim())) {
SendDocument sendDocumentRequest = new SendDocument();
sendDocumentRequest.setDocument(new InputFile(part.trim()));
sendDocumentRequest.setChatId(Long.toString(message.getChatId()));
execute(sendDocumentRequest);
} else {
SendMessage sendMessageRequest = new SendMessage();
sendMessageRequest.setText(LocalisationService.getString("wrongFileId", language));
sendMessageRequest.setChatId(Long.toString(message.getChatId()));
execute(sendMessageRequest);
}
}
private void onSetLanguageCommand(Message message, String language) throws InvalidObjectException, TelegramApiException {
SendMessage sendMessageRequest = new SendMessage();
sendMessageRequest.setChatId(Long.toString(message.getChatId()));
ReplyKeyboardMarkup replyKeyboardMarkup = new ReplyKeyboardMarkup();
List<LocalisationService.Language> languages = LocalisationService.getSupportedLanguages();
List<KeyboardRow> commands = new ArrayList<>();
for (LocalisationService.Language languageItem : languages) {
KeyboardRow commandRow = new KeyboardRow();
commandRow.add(languageItem.getCode() + " " + Emoji.LEFT_RIGHT_ARROW.toString() + " " + languageItem.getName());
commands.add(commandRow);
}
replyKeyboardMarkup.setResizeKeyboard(true);
replyKeyboardMarkup.setOneTimeKeyboard(true);
replyKeyboardMarkup.setKeyboard(commands);
replyKeyboardMarkup.setSelective(true);
sendMessageRequest.setReplyMarkup(replyKeyboardMarkup);
sendMessageRequest.setText(LocalisationService.getString("chooselanguage", language));
execute(sendMessageRequest);
languageMessages.add(message.getFrom().getId());
}
private void onLanguageReceived(Message message) throws InvalidObjectException, TelegramApiException {
String[] parts = message.getText().split(Emoji.LEFT_RIGHT_ARROW.toString(), 2);
SendMessage sendMessageRequest = new SendMessage();
sendMessageRequest.setChatId(Long.toString(message.getChatId()));
if (LocalisationService.getLanguageByCode(parts[0].trim()) != null) {
DatabaseManager.getInstance().putUserLanguage(message.getFrom().getId(), parts[0].trim());
sendMessageRequest.setText(LocalisationService.getString("languageModified", parts[0].trim()));
} else {
sendMessageRequest.setText(LocalisationService.getString("errorLanguage"));
}
sendMessageRequest.setReplyToMessageId(message.getMessageId());
9 years ago
ReplyKeyboardRemove replyKeyboardRemove = new ReplyKeyboardRemove();
replyKeyboardRemove.setSelective(true);
sendMessageRequest.setReplyMarkup(replyKeyboardRemove);
execute(sendMessageRequest);
languageMessages.remove(message.getFrom().getId());
}
11 years ago
}