这些是我实施的方法:
- 接收更新和处理消息的方法
@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它的出现次数与管理员发送照片/视频相册的次数一样多。
因此,方案如下:->更新->保存id第一个文件->发送一个文件的副本->更新->保存id第二个文件->将 2 个文件作为相册发送...等等。
问题本身:
为了等待所有接收到的媒体组,可以为发送方法的执行设置什么条件update,或者我是否在思考错误的方向,需要不同的实现?
或者,是否有可能以某种方式找出哪条消息是最后一条?
附言:我们不知道收到的照片/视频的数量,因此计数器无效。
我是这样解决这个问题的:也许这是一个拐杖,或者也许真的没有任何选择)所以我向管理员发送了一条带有“确认转发”按钮的消息,并将其包装在一个带有布尔标志设置的条件运算符中
这样,该消息就不会出现多次,而只会在第一次更新后出现。接下来,我们将按下按钮的条件与发送的主要任务包装在条件运算符中,并在其中将布尔标志切换回 true。
因此,管理员发送一个媒体组(可能带有签名),他收到有关邮件确认的消息,管理员按下按钮,并且消息被正确发送到所有可用的聊天ID)我还更改了对数据库的查询,以便只获取那些不是管理员的聊天ID)
附言:我们仍然需要对大量聊天实施延迟,因为据我所知,电报每秒处理大约 30 个请求)