Бот Telegram отправляет фотографии только после того, как я отправил что-то в чат - PullRequest
0 голосов
/ 08 ноября 2018

Есть бот, который берет лучшие фильмы с сайта и отправляет их в чат. Проблема в том, что он отправляет их только тогда, когда вы вводите какое-либо сообщение, и, посылая сообщения снова и снова, бот начинает отправлять их соответственно с самого начала. Я пытался отправить отправку в отдельном потоке, но это не сработало (возможно, я ошибался). В общем, мне нужен бот для отправки фотоизображений из массива, скажем, каждые 30 минут.

Класс, который отвечает за создание массива ссылок изображений:

    import org.jsoup.Jsoup;
    import org.jsoup.nodes.Document;
    import org.jsoup.nodes.Element;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;

    public class NewFilms {
        private static ArrayList<String> absoluteUrls = new ArrayList<>();

        public NewFilms() throws IOException {
            createArrayOfImages();
        }

        private static void  createArrayOfImages() throws IOException {
            Document document = Jsoup.connect("http://gidonline.in/").get();
            List<Element> imageElements = document.select("img[src$=120x170.jpg]");
            for (Element element : imageElements) {
                absoluteUrls.add(element.absUrl("src"));
            }
        }

        public static ArrayList<String> getAbsoluteUrls() {
            return absoluteUrls;
        }
    }

Класс моего бота:

import org.telegram.telegrambots.ApiContextInitializer;
import org.telegram.telegrambots.bots.TelegramLongPollingBot;
import org.telegram.telegrambots.meta.TelegramBotsApi;
import org.telegram.telegrambots.meta.api.methods.send.SendMessage;
import org.telegram.telegrambots.meta.api.methods.send.SendPhoto;
import org.telegram.telegrambots.meta.api.objects.Message;
import org.telegram.telegrambots.meta.api.objects.PhotoSize;
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.KeyboardButton;
import org.telegram.telegrambots.meta.api.objects.replykeyboard.buttons.KeyboardRow;
import org.telegram.telegrambots.meta.exceptions.TelegramApiException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Bot extends TelegramLongPollingBot {
    public static void main(String[] args) throws IOException {
        ApiContextInitializer.init();
        TelegramBotsApi telegramBotsApi = new TelegramBotsApi();
        try {
            telegramBotsApi.registerBot(new Bot());
        } catch (TelegramApiException e) {
            e.printStackTrace();
        }
        System.out.println("TelegramBot successfully started!");

    }

    private void sendMsg(Message message, String text) {
        SendMessage sendMessage = new SendMessage()
                .setChatId(message.getChatId().toString())
                .setText(text);
        try {
            setButtons(sendMessage);
            execute(sendMessage);
        } catch (TelegramApiException e) {
            e.printStackTrace();
        }
    }

    private void sendPhotoMsg(Message message) {
        List<PhotoSize> photos = message.getPhoto();
        String f_ID = photos.stream()
                .sorted(Comparator.comparing(PhotoSize::getFileSize).reversed())
                .findFirst()
                .orElse(null).getFileId();
        int f_WIDTH = photos.stream()
                .sorted(Comparator.comparing(PhotoSize::getFileSize).reversed())
                .findFirst()
                .orElse(null).getWidth();
        int f_HEIGHT = photos.stream()
                .sorted(Comparator.comparing(PhotoSize::getHeight).reversed())
                .findFirst()
                .orElse(null).getHeight();
        // set photo caption
        String caption = "file_id " + f_ID + "\nwidth: " + f_WIDTH + "\nheight: " + f_HEIGHT;

        SendPhoto msg = new SendPhoto()
                .setChatId(message.getChatId())
                .setPhoto(f_ID)
                .setCaption(caption);
        try {
            execute(msg);
        } catch (TelegramApiException e) {
            e.printStackTrace();
        }
    }

    public void onUpdateReceived(Update update) {
        class FiveMinutes extends Thread {
            @Override
            public void run() {
                try {
                    sendEveryFiveMin();
                } catch (IOException | TelegramApiException | InterruptedException e) {
                    e.printStackTrace();
                }
            }

            private void sendEveryFiveMin() throws IOException, TelegramApiException, InterruptedException {
                new NewFilms();
                for (String imagesLink : NewFilms.getAbsoluteUrls()) {
                    SendPhoto msgs = new SendPhoto()
                            .setPhoto(imagesLink)
                            .setChatId(update.getMessage().getChatId().toString());
                    try {
                        execute(msgs);
                    } catch (TelegramApiException e) {
                        e.printStackTrace();
                    }
                    Thread.sleep(3000);
                }
            }
        }

        Model model = new Model();
        Message message = update.getMessage();

        FiveMinutes newThread = new FiveMinutes(); //вот он тот самый поток:)
        newThread.start();

        if (message != null && message.hasText()) {
            switch (message.getText()) {
                case "/help":
                    sendMsg(message, "Чем могу помочь?");
                    break;
                case "/settings":
                    sendMsg(message, "Что будем настраивать?");
                    break;
                case "/hide":
                    SendMessage sendMessage = new SendMessage()
                            .setText("Клавиатура спрячена.")
                            .setChatId(message.getChatId());
                    ReplyKeyboardRemove replyKeyboardRemove = new ReplyKeyboardRemove();
                    sendMessage.setReplyMarkup(replyKeyboardRemove);
                    try {
                        execute(sendMessage);
                    } catch (TelegramApiException e) {
                        e.printStackTrace();
                    }
                    break;
                case "/back":
                    SendMessage sendMessage1 = new SendMessage()
                            .setText("Клавиатура возвращена.")
                            .setChatId(message.getChatId());
                    ReplyKeyboardMarkup replyKeyboardMarkup = new ReplyKeyboardMarkup();
                    sendMessage1.setReplyMarkup(replyKeyboardMarkup);
                    try {
                        setButtons(sendMessage1);
                        execute(sendMessage1);
                    } catch (TelegramApiException e) {
                        e.printStackTrace();
                    }
                    break;
                default:
                    Pattern pattern = Pattern.compile("^@.+$");
                    Matcher matcher = pattern.matcher(message.getText());
                    if (matcher.matches()) {
                        try {
                            sendMsg(message, Weather.getWeather(message.getText().substring(1, message.getText().length()), model));
                        } catch (IOException e) {
                            sendMsg(message, "Такой город не найден!");
                        }
                    } else {
                        Pattern pattern1 = Pattern.compile("^.+$");
                        Matcher matcher1 = pattern.matcher(message.getText());
                        SendMessage backMessage = new SendMessage()
                                .setChatId(message.getChatId().toString())
                                .setText(new StringBuilder(message.getText()).reverse().toString());
                        //backMessage.setReplyToMessageId(message.getMessageId());
                        try{
                            execute(backMessage);
                        } catch (TelegramApiException e) {
                            e.printStackTrace();
                        }
                    }
            }
        }
        else if (update.hasMessage() && update.getMessage().hasPhoto()) {
            assert message != null;
            sendPhotoMsg(message);
        }
    }

    public void setButtons(SendMessage sendMessage) {
        ReplyKeyboardMarkup replyKeyboardMarkup = new ReplyKeyboardMarkup();
        sendMessage.setReplyMarkup(replyKeyboardMarkup);
        replyKeyboardMarkup.setSelective(true);
        replyKeyboardMarkup.setResizeKeyboard(true);
        replyKeyboardMarkup.setOneTimeKeyboard(false);

        List<KeyboardRow> keyboardRowList = new ArrayList<>();

        KeyboardRow keyboardFirstRow = new KeyboardRow();
        keyboardFirstRow.add(new KeyboardButton("/help"));
        keyboardFirstRow.add(new KeyboardButton("/settings"));
        keyboardFirstRow.add(new KeyboardButton("/info"));
        keyboardRowList.add(keyboardFirstRow);

        KeyboardRow keyboardSecondRow = new KeyboardRow();
        keyboardSecondRow.add(new KeyboardButton("/pic"));
        keyboardSecondRow.add(new KeyboardButton("/hide"));
        keyboardSecondRow.add(new KeyboardButton("/back"));
        keyboardRowList.add(keyboardSecondRow);

        replyKeyboardMarkup.setKeyboard(keyboardRowList);
    }

    public String getBotUsername() {
        return "name-of-the-bot";
    }

    public String getBotToken() {
        return "bot-token";
    }
}
...