diff --git a/src/main/java/de/ph87/kleinanzeigen/kleinanzeigen/offer/OfferService.java b/src/main/java/de/ph87/kleinanzeigen/kleinanzeigen/offer/OfferService.java index d580ee9..146f183 100644 --- a/src/main/java/de/ph87/kleinanzeigen/kleinanzeigen/offer/OfferService.java +++ b/src/main/java/de/ph87/kleinanzeigen/kleinanzeigen/offer/OfferService.java @@ -66,6 +66,10 @@ public class OfferService { findByDto(dto).ifPresent(offer -> offer.setTelegramMessageId(telegramMessageId)); } + public void setHide(final OfferDto dto, final boolean hide) { + findByDto(dto).ifPresent(offer -> offer.setHide(hide)); + } + private Optional findByDto(final OfferDto dto) { return repository.findById(dto.getId()); } diff --git a/src/main/java/de/ph87/kleinanzeigen/telegram/TelegramService.java b/src/main/java/de/ph87/kleinanzeigen/telegram/TelegramService.java index d73b71e..f1ae825 100644 --- a/src/main/java/de/ph87/kleinanzeigen/telegram/TelegramService.java +++ b/src/main/java/de/ph87/kleinanzeigen/telegram/TelegramService.java @@ -67,9 +67,9 @@ public class TelegramService { public void onOfferChanged(final OfferDto offer) { if (offer.is_existing_()) { if (offer.getTelegramMessageId() == null) { - send(offer); - }else{ - updateMessage(offer.getTelegramMessageId(), offer.getTelegramMessageId().getChatId()); + send(offer); + } else { + updateMessage(CHAT_ID, offer.getTelegramMessageId()); } } else { remove(List.of(offer)); @@ -108,7 +108,7 @@ public class TelegramService { case HIDE -> hide(message); case REMEMBER -> remember(message, true); case UNREMEMBER -> remember(message, false); - default -> updateMessage(message, message.getChatId()); + default -> updateMessage(message.getChatId(), message.getMessageId()); } } catch (JsonProcessingException e) { log.error("Failed to read InlineDto.", e); @@ -117,30 +117,40 @@ public class TelegramService { private void hide(final MaybeInaccessibleMessage message) { offerService.hideByTelegramMessageId(message.getMessageId(), true); - remove(message); + _remove(message.getMessageId()); } private void remember(final MaybeInaccessibleMessage message, final boolean remember) { offerService.rememberByTelegramMessageId(message.getMessageId(), remember).ifPresentOrElse( offer -> updateMessage(offer, message.getChatId(), message.getMessageId()), - () -> remove(message) + () -> _remove(message.getMessageId()) ); } - private void updateMessage(final MaybeInaccessibleMessage message, final Long chatId) { - offerService.findByTelegramMessageId(message.getMessageId()).ifPresentOrElse( - offer -> updateMessage(offer, chatId, message.getMessageId()), - () -> remove(message) + private void updateMessage(final long chatId, final int messageId) { + offerService.findByTelegramMessageId(messageId).ifPresentOrElse( + offer -> updateMessage(offer, chatId, messageId), + () -> _remove(messageId) ); } private void updateMessage(final OfferDto offer, final long chatId, final int messageId) { + if (offer.isHide()) { + return; + } try { final EditMessageCaption edit = new EditMessageCaption(chatId + "", messageId, null, createText(offer), createKeyboard(offer), null, null); edit.setParseMode("Markdown"); bot.execute(edit); } catch (TelegramApiException | JsonProcessingException e) { - log.error("Failed to edit Message to #{}.", chatId, e); + if (e.toString().endsWith("Bad Request: message to edit not found")) { + log.info("Message has been deleted by User. Marking has hidden: {}", offer); + offerService.setHide(offer, true); + } else if (e.toString().endsWith("Bad Request: message is not modified: specified new message content and reply markup are exactly the same as a current content and reply markup of the message")) { + log.debug("Ignoring complaint from telegram-bot-api about unmodified message: {}", offer); + } else { + log.error("Failed to edit Message to #{}.", chatId, e); + } } } @@ -160,11 +170,12 @@ public class TelegramService { } private String createText(final OfferDto offer) { - return "[%s](%s)\n%s\n%s".formatted( + return "%s\n%s\n%s\n%s\nv%d".formatted( offer.getTitle().replaceAll("\\[", "(").replaceAll("]", ")"), - offer.getArticleURL(), offer.combineLocation(), - offer.getDescription() + offer.getDescription(), + offer.getArticleURL(), + offer.getVersion() ); } @@ -189,19 +200,12 @@ public class TelegramService { } private void remove(final List offers) { - _remove(offers.stream().map(OfferDto::getTelegramMessageId).filter(Objects::nonNull).toList()); + _remove(offers.stream().map(OfferDto::getTelegramMessageId).filter(Objects::nonNull).toArray(Integer[]::new)); } - private void remove(final MaybeInaccessibleMessage... messages) { - _remove(Arrays.stream(messages).map(MaybeInaccessibleMessage::getMessageId).toList()); - } - - private void _remove(final List messageIds) { - if (messageIds.isEmpty()) { - return; - } + private void _remove(final Integer... messageIds) { try { - bot.execute(new DeleteMessages(CHAT_ID + "", messageIds)); + bot.execute(new DeleteMessages(CHAT_ID + "", Arrays.stream(messageIds).toList())); } catch (TelegramApiException e) { log.error("Failed to remove Message to #{}.", CHAT_ID, e); }