Как переслать медиагруппу от 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 шт):
Решил проблему таким способом: может это костыль, а может и вариантов то особо нету)) значит сделал отправку сообщения администратору с кнопкой "подтвердить пересылку" и обернул это дело в условный оператор с установленным булевым флагом
if (isOneSendMessage) {
inlineKeyboardMarkup.setKeyboard(installKeyboard.confirm());
sendBotMessageService.sendMessage(chatId, CONFIRMATION, inlineKeyboardMarkup);
isOneSendMessage = false;
}
это для того что бы не пришло это сообщение несколько раз, а только после первого апдейта. Дальше оборачиваем в условный оператор нашу главную задачу по рассылки с условием нажатой кнопки, и в нем же булевый флаг переводим обратно в true.
Таким образом администратор отправляет медиагруппу(можно с подписью), ему приходит сообщение о подтверждении рассылки, администратор нажимает кнопку, и сообщения корректно рассылаются всем доступным chatId ) еще изменил запрос к БД что бы брались только те chatId, которые не являются администраторами)
ps: нужно еще реализовать задержку для большого объема чатов, так как telegram на сколько я знаю обрабатывает около 30 запросов в секунду)