Skip to content

Commit 48df343

Browse files
authored
Fix #1414 botMessage handler in Assistant middleware does not work when other event listeners do not exist (#1415)
1 parent c662295 commit 48df343

File tree

3 files changed

+25
-5
lines changed

3 files changed

+25
-5
lines changed

bolt/src/main/java/com/slack/api/bolt/middleware/builtin/Assistant.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import java.util.concurrent.ExecutorService;
2727

2828
import static com.slack.api.bolt.util.EventsApiPayloadParser.buildEventPayload;
29+
import static com.slack.api.bolt.util.EventsApiPayloadParser.getEventTypeAndSubtype;
2930

3031
public class Assistant implements Middleware {
3132

@@ -51,6 +52,17 @@ public class Assistant implements Middleware {
5152
private AssistantEventHandler<MessageFileShareEvent> userMessageWithFiles;
5253
private AssistantEventHandler<MessageEvent> botMessage;
5354

55+
static {
56+
// *** Building event type cache data ***
57+
// app.event / app.message handlers invoke getEventTypeAndSubtype method when their listeners are added.
58+
// However, Assistant middleware does not, since it operates as a global middleware.
59+
// This workaround ensures that the event type cache data is created before receiving requests.
60+
getEventTypeAndSubtype(AssistantThreadStartedEvent.class);
61+
getEventTypeAndSubtype(AssistantThreadContextChangedEvent.class);
62+
getEventTypeAndSubtype(MessageEvent.class);
63+
getEventTypeAndSubtype(MessageFileShareEvent.class);
64+
}
65+
5466
public Assistant() {
5567
this(null, buildDefaultExecutorService(), buildDefaultLogger());
5668
}

bolt/src/main/java/com/slack/api/bolt/request/builtin/EventRequest.java

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -122,9 +122,12 @@ public EventRequest(
122122
JsonObject context = thread.get("context").getAsJsonObject();
123123
if (context != null) {
124124
AssistantThreadContext threadContext = AssistantThreadContext.builder()
125-
.enterpriseId(context.get("enterprise_id") != null ? context.get("enterprise_id").getAsString() : null)
126-
.teamId(context.get("team_id") != null ? context.get("team_id").getAsString() : null)
127-
.channelId(context.get("channel_id") != null ? context.get("channel_id").getAsString() : null)
125+
// enterprise_id here can be a null value
126+
// others cannot be null as of Jan 2025, but added the same logic to all for future safety
127+
.enterpriseId(context.get("enterprise_id") != null && !context.get("enterprise_id").isJsonNull() ? context.get("enterprise_id").getAsString() : null)
128+
.teamId(context.get("team_id") != null && !context.get("team_id").isJsonNull() ? context.get("team_id").getAsString() : null)
129+
.channelId(context.get("channel_id") != null && !context.get("channel_id").isJsonNull() ? context.get("channel_id").getAsString() : null)
130+
.threadEntryPoint(context.get("thread_entry_point") != null && !context.get("thread_entry_point").isJsonNull() ? context.get("thread_entry_point").getAsString() : null)
128131
.build();
129132
this.getContext().setThreadContext(threadContext);
130133
}
@@ -134,9 +137,12 @@ public EventRequest(
134137
// message events (user replies)
135138
this.getContext().setAssistantThreadEvent(true);
136139
this.getContext().setChannelId(event.get("channel").getAsString());
137-
if (event.get("thread_ts") != null) {
140+
if (event.get("thread_ts") != null
141+
&& !event.get("thread_ts").isJsonNull()) {
138142
this.getContext().setThreadTs(event.get("thread_ts").getAsString());
139-
} else if (event.get("message") != null && event.get("message").getAsJsonObject().get("thread_ts") != null) {
143+
} else if (event.get("message") != null
144+
&& event.get("message").getAsJsonObject().get("thread_ts") != null
145+
&& !event.get("message").getAsJsonObject().get("thread_ts").isJsonNull()) {
140146
// message_changed
141147
this.getContext().setThreadTs(event.get("message").getAsJsonObject().get("thread_ts").getAsString());
142148
}

slack-api-model/src/main/java/com/slack/api/model/assistant/AssistantThreadContext.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,14 @@ public class AssistantThreadContext {
1212
private String enterpriseId;
1313
private String teamId;
1414
private String channelId;
15+
private String threadEntryPoint; // "sunroof" etc.
1516

1617
public Map<String, Object> toMap() {
1718
Map<String, Object> map = new HashMap<>();
1819
map.put("enterpriseId", this.enterpriseId);
1920
map.put("teamId", this.teamId);
2021
map.put("channelId", this.channelId);
22+
map.put("thread_entry_point", this.threadEntryPoint);
2123
return map;
2224
}
2325
}

0 commit comments

Comments
 (0)