Skip to content

Commit c83fa5b

Browse files
authored
fix(telegram): send progress updates as new messages (#19)
1 parent fba705e commit c83fa5b

6 files changed

Lines changed: 28 additions & 47 deletions

File tree

golemcore/telegram/plugin.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
id: golemcore/telegram
22
provider: golemcore
33
name: telegram
4-
version: 1.2.1
4+
version: 1.2.2
55
pluginApiVersion: 1
66
engineVersion: ">=0.0.0 <1.0.0"
77
entrypoint: me.golemcore.plugins.golemcore.telegram.TelegramPluginBootstrap

golemcore/telegram/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
<relativePath>../../pom.xml</relativePath>
1010
</parent>
1111

12-
<version>1.2.1</version>
12+
<version>1.2.2</version>
1313
<artifactId>golemcore-telegram-plugin</artifactId>
1414
<name>golemcore/telegram</name>
1515
<description>Telegram channel plugin for GolemCore</description>

golemcore/telegram/src/main/java/me/golemcore/plugins/golemcore/telegram/adapter/inbound/telegram/TelegramAdapter.java

Lines changed: 2 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@
5353
import org.telegram.telegrambots.meta.api.methods.send.SendMessage;
5454
import org.telegram.telegrambots.meta.api.methods.send.SendPhoto;
5555
import org.telegram.telegrambots.meta.api.methods.send.SendVoice;
56-
import org.telegram.telegrambots.meta.api.methods.updatingmessages.EditMessageText;
5756
import org.telegram.telegrambots.meta.api.objects.Document;
5857
import org.telegram.telegrambots.meta.exceptions.TelegramApiRequestException;
5958
import org.telegram.telegrambots.meta.api.objects.InputFile;
@@ -149,7 +148,6 @@ public class TelegramAdapter implements ChannelPort, LongPollingSingleThreadUpda
149148
private volatile String registeredBotToken;
150149
private final Object lifecycleLock = new Object();
151150
private final Map<String, InviteAttemptState> inviteAttemptStates = new ConcurrentHashMap<>();
152-
private final Map<String, ProgressStatusMessage> progressMessages = new ConcurrentHashMap<>();
153151

154152
/**
155153
* Package-private setter for testing — allows injecting a mock TelegramClient.
@@ -776,24 +774,11 @@ public CompletableFuture<Void> sendProgressUpdate(String chatId, ProgressUpdate
776774
return;
777775
}
778776
if (update.type() == ProgressUpdateType.CLEAR) {
779-
progressMessages.remove(chatId);
780777
return;
781778
}
782779

783780
String rendered = renderProgressUpdate(update);
784-
ProgressStatusMessage current = progressMessages.get(chatId);
785-
if (current != null && rendered.equals(current.text())) {
786-
return;
787-
}
788-
if (current != null && tryEditProgressMessage(chatId, current.messageId(), rendered)) {
789-
progressMessages.put(chatId, new ProgressStatusMessage(current.messageId(), rendered));
790-
return;
791-
}
792-
793-
Integer messageId = sendProgressMessage(chatId, rendered);
794-
if (messageId != null) {
795-
progressMessages.put(chatId, new ProgressStatusMessage(messageId, rendered));
796-
}
781+
sendProgressMessage(chatId, rendered);
797782
});
798783
}
799784

@@ -860,24 +845,8 @@ private Integer sendProgressMessage(String chatId, String rendered) {
860845
}
861846
}
862847

863-
private boolean tryEditProgressMessage(String chatId, int messageId, String rendered) {
864-
try {
865-
EditMessageText edit = EditMessageText.builder()
866-
.chatId(chatId)
867-
.messageId(messageId)
868-
.text(TelegramHtmlFormatter.format(rendered))
869-
.parseMode("HTML")
870-
.build();
871-
executeWithRetry(() -> telegramClient.execute(edit));
872-
return true;
873-
} catch (Exception e) {
874-
log.debug("Failed to edit progress update in chat {}: {}", chatId, e.getMessage());
875-
return false;
876-
}
877-
}
878-
879848
private String renderProgressUpdate(ProgressUpdate update) {
880-
String prefix = update.type() == ProgressUpdateType.INTENT ? "Working on this:\n" : "Progress update:\n";
849+
String prefix = update.type() == ProgressUpdateType.INTENT ? "" : "Progress update:\n";
881850
return prefix + update.text();
882851
}
883852

@@ -931,9 +900,6 @@ private String truncateCaption(String caption) {
931900
return caption.substring(0, TELEGRAM_MAX_CAPTION_LENGTH - 3) + "...";
932901
}
933902

934-
private record ProgressStatusMessage(int messageId, String text) {
935-
}
936-
937903
private static String truncateForLog(String text, int maxLen) {
938904
if (text == null || text.length() <= maxLen)
939905
return text;

golemcore/telegram/src/test/java/me/golemcore/plugins/golemcore/telegram/adapter/inbound/telegram/TelegramAdapterMessageTest.java

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import me.golemcore.plugin.api.runtime.security.AllowlistValidator;
1111
import org.junit.jupiter.api.BeforeEach;
1212
import org.junit.jupiter.api.Test;
13+
import org.mockito.ArgumentCaptor;
1314

1415
import org.springframework.context.ApplicationEventPublisher;
1516
import org.springframework.test.util.ReflectionTestUtils;
@@ -19,7 +20,6 @@
1920
import org.telegram.telegrambots.meta.api.methods.send.SendMessage;
2021
import org.telegram.telegrambots.meta.api.methods.send.SendPhoto;
2122
import org.telegram.telegrambots.meta.api.methods.send.SendVoice;
22-
import org.telegram.telegrambots.meta.api.methods.updatingmessages.EditMessageText;
2323
import org.telegram.telegrambots.meta.exceptions.TelegramApiException;
2424
import org.telegram.telegrambots.meta.exceptions.TelegramApiRequestException;
2525
import org.telegram.telegrambots.meta.generics.TelegramClient;
@@ -109,31 +109,32 @@ void shouldSendNewProgressMessage() throws Exception {
109109
when(telegramClient.execute(any(SendMessage.class))).thenReturn(telegramMessage);
110110

111111
adapter.sendProgressUpdate(CHAT_ID, new ProgressUpdate(
112-
ProgressUpdateType.SUMMARY,
113-
"Ran a few checks and grouped the result.",
112+
ProgressUpdateType.INTENT,
113+
"Working on: checking the current state before making changes.",
114114
java.util.Map.of())).get();
115115

116-
verify(telegramClient).execute(any(SendMessage.class));
116+
ArgumentCaptor<SendMessage> captor = ArgumentCaptor.forClass(SendMessage.class);
117+
verify(telegramClient).execute(captor.capture());
118+
assertEquals("Working on: checking the current state before making changes.", captor.getValue().getText());
117119
}
118120

119121
@Test
120-
void shouldEditExistingProgressMessage() throws Exception {
122+
void shouldSendNewMessageForEachProgressUpdate() throws Exception {
121123
org.telegram.telegrambots.meta.api.objects.message.Message telegramMessage = mock(
122124
org.telegram.telegrambots.meta.api.objects.message.Message.class);
123125
when(telegramMessage.getMessageId()).thenReturn(77);
124126
when(telegramClient.execute(any(SendMessage.class))).thenReturn(telegramMessage);
125-
when(telegramClient.execute(any(EditMessageText.class))).thenReturn(mock(java.io.Serializable.class));
126127

127128
adapter.sendProgressUpdate(CHAT_ID, new ProgressUpdate(
128129
ProgressUpdateType.INTENT,
129-
"Checking the current state before making changes.",
130+
"Working on: checking the current state before making changes.",
130131
java.util.Map.of())).get();
131132
adapter.sendProgressUpdate(CHAT_ID, new ProgressUpdate(
132133
ProgressUpdateType.SUMMARY,
133134
"Reviewed the repo and grouped the latest shell runs.",
134135
java.util.Map.of())).get();
135136

136-
verify(telegramClient).execute(any(EditMessageText.class));
137+
verify(telegramClient, atLeast(2)).execute(any(SendMessage.class));
137138
}
138139

139140
// ===== sendPhoto =====
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
id: golemcore/telegram
22
owner: golemcore
33
name: telegram
4-
latest: 1.2.1
4+
latest: 1.2.2
55
versions:
66
- 1.0.0
77
- 1.1.0
88
- 1.2.0
99
- 1.2.1
10+
- 1.2.2
1011
source: "https://github.com/alexk-dev/golemcore-plugins/tree/main/golemcore/telegram"
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
id: golemcore/telegram
2+
version: 1.2.2
3+
pluginApiVersion: 1
4+
engineVersion: ">=0.0.0 <1.0.0"
5+
artifactUrl: "dist/golemcore/telegram/1.2.2/golemcore-telegram-plugin-1.2.2.jar"
6+
checksumSha256: "bc4152aaa6963f7937d78ef18a0b02215c18d26e31421b7f42b8c438c6a8ddfc"
7+
publishedAt: "2026-03-18T17:25:22Z"
8+
sourceCommit: "8d91116cb9bbca97ea64e0f65a192e18954f0ee5"
9+
entrypoint: me.golemcore.plugins.golemcore.telegram.TelegramPluginBootstrap
10+
sourceUrl: "https://github.com/alexk-dev/golemcore-plugins/tree/main/golemcore/telegram"
11+
license: "Apache-2.0"
12+
maintainers:
13+
- alexk-dev

0 commit comments

Comments
 (0)