Skip to content

Commit 369234b

Browse files
authored
Add support for message.app_home Slack event (#29)
Introduced handling for the 'message.app_home' Slack event by adding the MessageAppHomeEvent model, handler interface, and middleware. Updated service registration and event deserialization logic to support the new event type. Sample usage was added in the HelloWorld project. +semver:minor
1 parent d46739a commit 369234b

9 files changed

Lines changed: 90 additions & 2 deletions

File tree

Samples/HelloWorld/Program.cs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@
1818
.AddMessageActionsHandler<DoOtherStuff>()
1919
.AddAppMentionHandler<DoStuff>()
2020
.AddTeamJoinHandler<OnTeamJoins>()
21-
.AddEmojiChangedHandler<OnEmojiChanged>();
21+
.AddEmojiChangedHandler<OnEmojiChanged>()
22+
.AddMessageAppHomeHandler<OnMessageAppHome>();
2223

2324

2425
var app = builder.Build();
@@ -72,3 +73,13 @@ public Task<EventHandledResponse> Handle(EventMetaData eventMetadata, EmojiChang
7273
return Task.FromResult(new EventHandledResponse("OK"));
7374
}
7475
}
76+
77+
class OnMessageAppHome : IHandleMessageAppHome
78+
{
79+
public Task<EventHandledResponse> Handle(EventMetaData eventMetadata, MessageAppHomeEvent @event)
80+
{
81+
var str = JsonSerializer.Serialize(@event);
82+
Console.WriteLine(str);
83+
return Task.FromResult(new EventHandledResponse("OK"));
84+
}
85+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
using Slackbot.Net.Endpoints.Models.Events;
2+
3+
namespace Slackbot.Net.Endpoints.Abstractions;
4+
5+
public interface IHandleMessageAppHome
6+
{
7+
Task<EventHandledResponse> Handle(EventMetaData eventMetadata, MessageAppHomeEvent appHomeMessage);
8+
}

source/src/Slackbot.Net.Endpoints/EventTypes.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,5 @@ public static class EventTypes
99
public const string AppHomeOpened = "app_home_opened";
1010
public const string TeamJoin = "team_join";
1111
public const string EmojiChanged = "emoji_changed";
12+
public const string MessageAppHome = "message.app_home";
1213
}

source/src/Slackbot.Net.Endpoints/Hosting/IAppBuilderExtensions.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ public static IApplicationBuilder UseSlackbot(this IApplicationBuilder app, bool
2121
app.MapWhen(InteractiveEvents.ShouldRun, b => b.UseMiddleware<InteractiveEvents>());
2222
app.MapWhen(TeamJoinEvents.ShouldRun, b => b.UseMiddleware<TeamJoinEvents>());
2323
app.MapWhen(EmojiChangedEvents.ShouldRun, b => b.UseMiddleware<EmojiChangedEvents>());
24+
app.MapWhen(MessageAppHomeEvents.ShouldRun, b => b.UseMiddleware<MessageAppHomeEvents>());
2425

2526
return app;
2627
}

source/src/Slackbot.Net.Endpoints/Hosting/ISlackbotHandlersBuilder.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,5 @@ public ISlackbotHandlersBuilder AddInteractiveBlockActionsHandler<T>()
1818
public ISlackbotHandlersBuilder AddMessageActionsHandler<T>() where T : class, IHandleMessageActions;
1919
public ISlackbotHandlersBuilder AddTeamJoinHandler<T>() where T : class, IHandleTeamJoin;
2020
public ISlackbotHandlersBuilder AddEmojiChangedHandler<T>() where T : class, IHandleEmojiChanged;
21+
public ISlackbotHandlersBuilder AddMessageAppHomeHandler<T>() where T : class, IHandleMessageAppHome;
2122
}

source/src/Slackbot.Net.Endpoints/Hosting/SlackBotHandlersBuilder.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,4 +65,10 @@ public ISlackbotHandlersBuilder AddEmojiChangedHandler<T>() where T : class, IHa
6565
services.AddSingleton<IHandleEmojiChanged, T>();
6666
return this;
6767
}
68+
69+
public ISlackbotHandlersBuilder AddMessageAppHomeHandler<T>() where T : class, IHandleMessageAppHome
70+
{
71+
services.AddSingleton<IHandleMessageAppHome, T>();
72+
return this;
73+
}
6874
}

source/src/Slackbot.Net.Endpoints/Middlewares/HttpItemsManager.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,9 @@ private static SlackEvent ToEventType(JsonElement eventJson, string raw)
7878
case EventTypes.TeamJoin:
7979
return JsonSerializer.Deserialize<TeamJoinEvent>(json, WebOptions);
8080
case EventTypes.EmojiChanged:
81-
return JsonSerializer.Deserialize<EmojiChangedEvent>(json, WebOptions);
81+
return JsonSerializer.Deserialize<EmojiChangedEvent>(json, WebOptions);
82+
case EventTypes.MessageAppHome:
83+
return JsonSerializer.Deserialize<MessageAppHomeEvent>(json, WebOptions);
8284
default:
8385
var unknownSlackEvent = JsonSerializer.Deserialize<UnknownSlackEvent>(json, WebOptions);
8486
unknownSlackEvent.RawJson = raw;
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
using Microsoft.AspNetCore.Http;
2+
using Microsoft.Extensions.Logging;
3+
using Slackbot.Net.Endpoints.Abstractions;
4+
using Slackbot.Net.Endpoints.Models.Events;
5+
6+
namespace Slackbot.Net.Endpoints.Middlewares;
7+
8+
public class MessageAppHomeEvents(
9+
RequestDelegate next,
10+
ILogger<MessageAppHomeEvents> logger,
11+
IEnumerable<IHandleMessageAppHome> responseHandlers
12+
)
13+
{
14+
public async Task Invoke(HttpContext context)
15+
{
16+
var messageAppHomeEvent = (MessageAppHomeEvent)context.Items[HttpItemKeys.SlackEventKey];
17+
var metadata = (EventMetaData)context.Items[HttpItemKeys.EventMetadataKey];
18+
var handler = responseHandlers.FirstOrDefault();
19+
20+
if (handler == null)
21+
{
22+
logger.LogError("No handler registered for IHandleMessageAppHome");
23+
}
24+
else
25+
{
26+
logger.LogInformation("Handling using {HandlerType}", handler.GetType());
27+
try
28+
{
29+
logger.LogInformation("Handling using {HandlerType}", handler.GetType());
30+
var response = await handler.Handle(metadata, messageAppHomeEvent);
31+
logger.LogInformation("Handler response: {Response}", response.Response);
32+
}
33+
catch (Exception e)
34+
{
35+
logger.LogError(e, e.Message);
36+
}
37+
}
38+
39+
context.Response.StatusCode = 200;
40+
}
41+
42+
public static bool ShouldRun(HttpContext ctx)
43+
{
44+
return ctx.Items.ContainsKey(HttpItemKeys.EventTypeKey)
45+
&& ctx.Items[HttpItemKeys.EventTypeKey].ToString() == EventTypes.MessageAppHome;
46+
}
47+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
namespace Slackbot.Net.Endpoints.Models.Events;
2+
3+
public class MessageAppHomeEvent : SlackEvent
4+
{
5+
public string Text { get; set; }
6+
public string User { get; set; }
7+
public string Channel { get; set; }
8+
public string Ts { get; set; }
9+
public string Event_Ts { get; set; }
10+
public string Thread_Ts { get; set; }
11+
}

0 commit comments

Comments
 (0)