This commit is contained in:
Patrick Haßel 2024-07-26 08:28:23 +02:00
parent a856c8e01c
commit 038b0b76c9
3 changed files with 57 additions and 28 deletions

View File

@ -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())) {
private void update(@NonNull final MessageDto message, final boolean forceResend) {
if (resend(message, forceResend)) {
return;
}
if (deleteFromTelegram(message)) {
return;
}
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;
return true;
}
}
return false;
}
// hide: delete message from telegram
private boolean deleteFromTelegram(final MessageDto message) {
if (message.getHide() != null && message.getTelegramMessageId() != null) {
remove(message.getChat().getId(), message.getTelegramMessageId());
messageService.clearTelegramMessageId(message);
return;
}
// message
if (message.getTelegramMessageId() == null) {
return;
return true;
}
return false;
}
private void _update(final MessageDto message) {
try {
final EditMessageCaption edit = new EditMessageCaption(
message.getChat().getId() + "",

View File

@ -15,4 +15,6 @@ public interface MessageRepository extends ListCrudRepository<Message, Long> {
Optional<Message> findByChatAndOffer(Chat chat, Offer offer);
Optional<Message> findFirstByChat_IdAndHideNotNullOrderByHideDesc(long chatId);
}

View File

@ -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<MessageDto> undo(final long chatId) {
return messageRepository.findFirstByChat_IdAndHideNotNullOrderByHideDesc(chatId).stream().peek(message -> message.setHide(null)).map(this::toDto).findFirst();
}
}