Как переслать медиагруппу от adminChatId другим сохраненным chatId от имени бота, используя LongPollingBot?

Вот такие методы реализовал:

  • Метод получения update и обработки сообщений
@Override
public void execute(Update update) {
    log.info("Обработка сообщения от администратора началась!");
    Message message = update.getMessage();
    long chatId = message.getChatId();
    Integer messageId = message.getMessageId();

    List<User> allUsers = userRepository.findAll();
    for (User user : allUsers) {
        long chatIdUser = user.getChatId();
        
        if (message.getMediaGroupId() == null) {
            log.info("не является медиагруппой");
            sendBotMessageService.sendCopyMessageFromAdmin(chatIdUser, message);
        } else {
            log.info("является медиагруппой");
            messageIdsForMediaGroup.computeIfAbsent(chatId, k -> new LinkedHashSet<>()).add(messageId);

            Set<Integer> messageIds = messageIdsForMediaGroup.get(chatId);
            List<Integer> msgIds = new ArrayList<>(messageIds);
            log.info("idsList: " + msgIds);

            sendBotMessageService.sendCopyMediaGroupFromAdmin(chatIdUser, chatId, msgIds);
        }
    }
}
  • Метод отправки скопированного одного сообщения:
@Override
public void sendCopyMessageFromAdmin(long chatId, Message message) {
    CopyMessage copyMessage = new CopyMessage();
    copyMessage.setChatId(chatId);
    copyMessage.setFromChatId(message.getChatId());
    copyMessage.setMessageId(message.getMessageId());
    copyMessage.enableHtml(true);
    try {
        telegramBot.execute(copyMessage);
        log.info("Сообщение от администратора отправилось");
    } catch (TelegramApiException e) {
        log.error("Сообщение от администратора НЕ отправилось! " + e.getMessage());
    }
}
  • Метод отправки скопированной медиагруппы:
@Override
public void sendCopyMediaGroupFromAdmin(long chatId, long chatIdAdmin, List<Integer> messageIds) {
    CopyMessages copyMessages = new CopyMessages();
    copyMessages.setChatId(chatId);
    copyMessages.setFromChatId(chatIdAdmin);
    copyMessages.setMessageIds(messageIds);
    try {
        telegramBot.execute(copyMessages);
        log.info("Медиагруппа от администратора отправлена!");
    } catch (TelegramApiException e) {
        log.error("Медиагруппа от администратора НЕ отправилась!: " + e.getMessage());
    }
}

Одиночные сообщения копируются правильно, всё работает.

Но вот с медиагруппой не всё так просто, так как медиагруппа - это набор сообщений, соответственно update приходит столько раз - сколько админ отправил фото/видео альбомом.

Соответственно схема такая: -> update -> сохранение id первого файла -> отправка копии одного файла -> update -> сохранение id уже второго файла -> отправка уже 2-х файлов альбомом... и так далее.

Собственно сам вопрос:

Какое можно поставить условие выполнению метода отправки, что бы дождаться всех полученных update медиагруппы, или я в не правильном направлении думаю, и нужна другая реализация?

Либо, можно ли как то узнать какое сообщение будет являться последним?

P.S.: мы не знаем количество получаемых фото/видео, поэтому счетчик мимо.


Ответы (1 шт):

Автор решения: Res.Hak. TV

Решил проблему таким способом: может это костыль, а может и вариантов то особо нету)) значит сделал отправку сообщения администратору с кнопкой "подтвердить пересылку" и обернул это дело в условный оператор с установленным булевым флагом

if (isOneSendMessage) {
            inlineKeyboardMarkup.setKeyboard(installKeyboard.confirm());
            sendBotMessageService.sendMessage(chatId, CONFIRMATION, inlineKeyboardMarkup);
            isOneSendMessage = false;
        }

это для того что бы не пришло это сообщение несколько раз, а только после первого апдейта. Дальше оборачиваем в условный оператор нашу главную задачу по рассылки с условием нажатой кнопки, и в нем же булевый флаг переводим обратно в true.

Таким образом администратор отправляет медиагруппу(можно с подписью), ему приходит сообщение о подтверждении рассылки, администратор нажимает кнопку, и сообщения корректно рассылаются всем доступным chatId ) еще изменил запрос к БД что бы брались только те chatId, которые не являются администраторами)

ps: нужно еще реализовать задержку для большого объема чатов, так как telegram на сколько я знаю обрабатывает около 30 запросов в секунду)

→ Ссылка