diff --git a/slack-api-model/src/main/java/com/slack/api/model/event/AgentSessionStoppedEvent.java b/slack-api-model/src/main/java/com/slack/api/model/event/AgentSessionStoppedEvent.java new file mode 100644 index 000000000..5d5b313b1 --- /dev/null +++ b/slack-api-model/src/main/java/com/slack/api/model/event/AgentSessionStoppedEvent.java @@ -0,0 +1,23 @@ +package com.slack.api.model.event; + +import lombok.Data; + +import java.util.List; + +/** + * The user clicked the native stop button while the agent session was processing. + *
+ * https://docs.slack.dev/reference/events/agent_session_stopped
+ */
+@Data
+public class AgentSessionStoppedEvent implements Event {
+
+ public static final String TYPE_NAME = "agent_session_stopped";
+
+ private final String type = TYPE_NAME;
+ private String channel;
+ private String user;
+ private String threadTs;
+ private List
+ * https://docs.slack.dev/reference/events/agent_session_title_changed
+ */
+@Data
+public class AgentSessionTitleChangedEvent implements Event {
+
+ public static final String TYPE_NAME = "agent_session_title_changed";
+
+ private final String type = TYPE_NAME;
+ private String channel;
+ private String user;
+ private String teamId;
+ private String threadTs;
+ private String title;
+ private String previousTitle;
+ private String eventTs;
+}
diff --git a/slack-api-model/src/test/java/test_locally/api/model/event/AgentSessionStoppedEventTest.java b/slack-api-model/src/test/java/test_locally/api/model/event/AgentSessionStoppedEventTest.java
new file mode 100644
index 000000000..6dfed9f9a
--- /dev/null
+++ b/slack-api-model/src/test/java/test_locally/api/model/event/AgentSessionStoppedEventTest.java
@@ -0,0 +1,46 @@
+package test_locally.api.model.event;
+
+import com.google.gson.Gson;
+import com.slack.api.model.event.AgentSessionStoppedEvent;
+import org.junit.Test;
+import test_locally.unit.GsonFactory;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+public class AgentSessionStoppedEventTest {
+
+ @Test
+ public void typeName() {
+ assertThat(AgentSessionStoppedEvent.TYPE_NAME, is("agent_session_stopped"));
+ }
+
+ @Test
+ public void deserialize() {
+ String json = "{\n" +
+ " \"type\": \"agent_session_stopped\",\n" +
+ " \"channel\": \"C0123ABC456\",\n" +
+ " \"user\": \"U0123ABC456\",\n" +
+ " \"streaming_message_ts\": [\"1787267140.336949\"],\n" +
+ " \"thread_ts\": \"1787267126.742989\",\n" +
+ " \"event_ts\": \"1787267141.948630\"\n" +
+ "}";
+ AgentSessionStoppedEvent event = GsonFactory.createSnakeCase().fromJson(json, AgentSessionStoppedEvent.class);
+ assertThat(event.getType(), is("agent_session_stopped"));
+ assertThat(event.getChannel(), is("C0123ABC456"));
+ assertThat(event.getUser(), is("U0123ABC456"));
+ assertThat(event.getStreamingMessageTs().size(), is(1));
+ assertThat(event.getStreamingMessageTs().get(0), is("1787267140.336949"));
+ assertThat(event.getThreadTs(), is("1787267126.742989"));
+ assertThat(event.getEventTs(), is("1787267141.948630"));
+ }
+
+ @Test
+ public void serialize() {
+ Gson gson = GsonFactory.createSnakeCase();
+ AgentSessionStoppedEvent event = new AgentSessionStoppedEvent();
+ String generatedJson = gson.toJson(event);
+ String expectedJson = "{\"type\":\"agent_session_stopped\"}";
+ assertThat(generatedJson, is(expectedJson));
+ }
+}
diff --git a/slack-api-model/src/test/java/test_locally/api/model/event/AgentSessionTitleChangedEventTest.java b/slack-api-model/src/test/java/test_locally/api/model/event/AgentSessionTitleChangedEventTest.java
new file mode 100644
index 000000000..12877d05b
--- /dev/null
+++ b/slack-api-model/src/test/java/test_locally/api/model/event/AgentSessionTitleChangedEventTest.java
@@ -0,0 +1,49 @@
+package test_locally.api.model.event;
+
+import com.google.gson.Gson;
+import com.slack.api.model.event.AgentSessionTitleChangedEvent;
+import org.junit.Test;
+import test_locally.unit.GsonFactory;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+public class AgentSessionTitleChangedEventTest {
+
+ @Test
+ public void typeName() {
+ assertThat(AgentSessionTitleChangedEvent.TYPE_NAME, is("agent_session_title_changed"));
+ }
+
+ @Test
+ public void deserialize() {
+ String json = "{\n" +
+ " \"type\": \"agent_session_title_changed\",\n" +
+ " \"channel\": \"C0123ABC456\",\n" +
+ " \"user\": \"U0123ABC456\",\n" +
+ " \"team_id\": \"T0123ABC456\",\n" +
+ " \"thread_ts\": \"1787267269.063879\",\n" +
+ " \"title\": \"New title\",\n" +
+ " \"previous_title\": \"Old title\",\n" +
+ " \"event_ts\": \"1787267281.002810\"\n" +
+ "}";
+ AgentSessionTitleChangedEvent event = GsonFactory.createSnakeCase().fromJson(json, AgentSessionTitleChangedEvent.class);
+ assertThat(event.getType(), is("agent_session_title_changed"));
+ assertThat(event.getChannel(), is("C0123ABC456"));
+ assertThat(event.getUser(), is("U0123ABC456"));
+ assertThat(event.getTeamId(), is("T0123ABC456"));
+ assertThat(event.getThreadTs(), is("1787267269.063879"));
+ assertThat(event.getTitle(), is("New title"));
+ assertThat(event.getPreviousTitle(), is("Old title"));
+ assertThat(event.getEventTs(), is("1787267281.002810"));
+ }
+
+ @Test
+ public void serialize() {
+ Gson gson = GsonFactory.createSnakeCase();
+ AgentSessionTitleChangedEvent event = new AgentSessionTitleChangedEvent();
+ String generatedJson = gson.toJson(event);
+ String expectedJson = "{\"type\":\"agent_session_title_changed\"}";
+ assertThat(generatedJson, is(expectedJson));
+ }
+}
diff --git a/slack-app-backend/src/main/java/com/slack/api/app_backend/events/handler/AgentSessionStoppedHandler.java b/slack-app-backend/src/main/java/com/slack/api/app_backend/events/handler/AgentSessionStoppedHandler.java
new file mode 100644
index 000000000..745b8a1fa
--- /dev/null
+++ b/slack-app-backend/src/main/java/com/slack/api/app_backend/events/handler/AgentSessionStoppedHandler.java
@@ -0,0 +1,13 @@
+package com.slack.api.app_backend.events.handler;
+
+import com.slack.api.app_backend.events.EventHandler;
+import com.slack.api.app_backend.events.payload.AgentSessionStoppedPayload;
+import com.slack.api.model.event.AgentSessionStoppedEvent;
+
+public abstract class AgentSessionStoppedHandler extends EventHandler