From 038b0b76c92f94ac506235fcc94b97b17452b80b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20Ha=C3=9Fel?= Date: Fri, 26 Jul 2024 08:28:23 +0200 Subject: [PATCH] undo --- .../telegram/TelegramService.java | 77 ++++++++++++------- .../chat/message/MessageRepository.java | 2 + .../telegram/chat/message/MessageService.java | 6 ++ 3 files changed, 57 insertions(+), 28 deletions(-) diff --git a/src/main/java/de/ph87/kleinanzeigen/telegram/TelegramService.java b/src/main/java/de/ph87/kleinanzeigen/telegram/TelegramService.java index a97047c..b1efa16 100644 --- a/src/main/java/de/ph87/kleinanzeigen/telegram/TelegramService.java +++ b/src/main/java/de/ph87/kleinanzeigen/telegram/TelegramService.java @@ -75,7 +75,7 @@ public class TelegramService { .stream() .filter(m -> m.getChat().getId() == chat.getId()) .findFirst() - .ifPresentOrElse(this::update, () -> send(offer, chat)); + .ifPresentOrElse(message -> update(message, false), () -> send(offer, chat)); } } @@ -91,7 +91,7 @@ public class TelegramService { log.info("Telegram bot stopped"); } - private void onUpdateReceived(final Update update) { + private void onUpdateReceived(@NonNull final Update update) { try { if (update.hasMessage() && update.getMessage().hasText()) { handleMessage(update.getMessage()); @@ -103,11 +103,19 @@ public class TelegramService { } } - private void handleMessage(final Message tlgMessage) throws AccessDenied { - chatService.setEnabled(tlgMessage.getChatId(), !tlgMessage.getText().equals("/stop"), tlgMessage.getFrom().getUserName()); + private void handleMessage(@NonNull final Message tlgMessage) throws AccessDenied { + switch (tlgMessage.getText()) { + case "/stop" -> chatService.setEnabled(tlgMessage.getChatId(), false, tlgMessage.getFrom().getUserName()); + case "undo" -> undo(tlgMessage); + } } - private void handleCallback(final CallbackQuery callback) throws AccessDenied { + private void undo(@NonNull final Message tlgMessage) { + messageService.undo(tlgMessage.getChatId()).ifPresent(message -> update(message, true)); + remove(tlgMessage); + } + + private void handleCallback(@NonNull final CallbackQuery callback) throws AccessDenied { final MaybeInaccessibleMessage tlgMessage = callback.getMessage(); chatService.setEnabled(tlgMessage.getChatId(), true, callback.getFrom().getUserName()); try { @@ -123,19 +131,19 @@ public class TelegramService { } } - private void hide(final MaybeInaccessibleMessage tlgMessage) { - messageService.setHide(tlgMessage, true).ifPresentOrElse(this::update, () -> remove(tlgMessage)); + private void hide(@NonNull final MaybeInaccessibleMessage tlgMessage) { + messageService.setHide(tlgMessage, true).ifPresentOrElse(message -> update(message, false), () -> remove(tlgMessage)); } - private void remember(final MaybeInaccessibleMessage tlgMessage, final boolean remember) { - messageService.setRemember(tlgMessage, remember).ifPresentOrElse(this::update, () -> remove(tlgMessage)); + private void remember(@NonNull final MaybeInaccessibleMessage tlgMessage, final boolean remember) { + messageService.setRemember(tlgMessage, remember).ifPresentOrElse(message -> update(message, false), () -> remove(tlgMessage)); } - private void update(final MaybeInaccessibleMessage tlgMessage) { - messageService.findDtoByTelegramMessage(tlgMessage).ifPresentOrElse(this::update, () -> remove(tlgMessage)); + private void update(@NonNull final MaybeInaccessibleMessage tlgMessage) { + messageService.findDtoByTelegramMessage(tlgMessage).ifPresentOrElse(message -> update(message, false), () -> remove(tlgMessage)); } - private void send(final OfferDto offerDto, final ChatDto chatDto) { + private void send(@NonNull final OfferDto offerDto, @NonNull final ChatDto chatDto) { try { final InputFile inputFile = offerDto.getImageURL() == null ? new InputFile(new ByteArrayInputStream(NO_IMAGE), "[Kein Bild]") : new InputFile(offerDto.getImageURL()); final SendPhoto send = new SendPhoto(chatDto.getId() + "", inputFile); @@ -151,28 +159,41 @@ public class TelegramService { } } - private void update(@NonNull final MessageDto message) { - // resendOnPriceChange - if (message.getOffer().isResendOnPriceChange() && message.getOffer().getPriceChanged() != null && message.getHide() != null && !message.getOffer().getPriceChanged().isBefore(message.getHide())) { - messageService.setHide(message, false); - if (message.getTelegramMessageId() == null) { - send(message.getOffer(), message.getChat()); - return; - } - } - - // hide: delete message from telegram - if (message.getHide() != null && message.getTelegramMessageId() != null) { - remove(message.getChat().getId(), message.getTelegramMessageId()); - messageService.clearTelegramMessageId(message); + private void update(@NonNull final MessageDto message, final boolean forceResend) { + if (resend(message, forceResend)) { + return; + } + if (deleteFromTelegram(message)) { return; } - - // message if (message.getTelegramMessageId() == null) { return; } + _update(message); + } + private boolean resend(final MessageDto message, final boolean forceResend) { + final boolean resendOnPriceChange = message.getOffer().isResendOnPriceChange() && message.getOffer().getPriceChanged() != null && message.getHide() != null && !message.getOffer().getPriceChanged().isBefore(message.getHide()); + if (forceResend || resendOnPriceChange) { + messageService.setHide(message, false); + if (message.getTelegramMessageId() == null) { + send(message.getOffer(), message.getChat()); + return true; + } + } + return false; + } + + private boolean deleteFromTelegram(final MessageDto message) { + if (message.getHide() != null && message.getTelegramMessageId() != null) { + remove(message.getChat().getId(), message.getTelegramMessageId()); + messageService.clearTelegramMessageId(message); + return true; + } + return false; + } + + private void _update(final MessageDto message) { try { final EditMessageCaption edit = new EditMessageCaption( message.getChat().getId() + "", diff --git a/src/main/java/de/ph87/kleinanzeigen/telegram/chat/message/MessageRepository.java b/src/main/java/de/ph87/kleinanzeigen/telegram/chat/message/MessageRepository.java index 8223a68..3c5d30b 100644 --- a/src/main/java/de/ph87/kleinanzeigen/telegram/chat/message/MessageRepository.java +++ b/src/main/java/de/ph87/kleinanzeigen/telegram/chat/message/MessageRepository.java @@ -15,4 +15,6 @@ public interface MessageRepository extends ListCrudRepository { Optional findByChatAndOffer(Chat chat, Offer offer); + Optional findFirstByChat_IdAndHideNotNullOrderByHideDesc(long chatId); + } diff --git a/src/main/java/de/ph87/kleinanzeigen/telegram/chat/message/MessageService.java b/src/main/java/de/ph87/kleinanzeigen/telegram/chat/message/MessageService.java index 7966c9e..d503a49 100644 --- a/src/main/java/de/ph87/kleinanzeigen/telegram/chat/message/MessageService.java +++ b/src/main/java/de/ph87/kleinanzeigen/telegram/chat/message/MessageService.java @@ -6,6 +6,7 @@ import de.ph87.kleinanzeigen.kleinanzeigen.offer.OfferService; import de.ph87.kleinanzeigen.telegram.chat.Chat; import de.ph87.kleinanzeigen.telegram.chat.ChatDto; import de.ph87.kleinanzeigen.telegram.chat.ChatService; +import lombok.NonNull; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.EnableScheduling; @@ -80,4 +81,9 @@ public class MessageService { return new MessageDto(message, chatDto, offerDto); } + @NonNull + public Optional undo(final long chatId) { + return messageRepository.findFirstByChat_IdAndHideNotNullOrderByHideDesc(chatId).stream().peek(message -> message.setHide(null)).map(this::toDto).findFirst(); + } + }