1 files changed, 29 insertions, 4 deletions
diff --git a/MatrixContentFilter/Handlers/InviteHandler.cs b/MatrixContentFilter/Handlers/InviteHandler.cs
index 75e5506..2883529 100644
--- a/MatrixContentFilter/Handlers/InviteHandler.cs
+++ b/MatrixContentFilter/Handlers/InviteHandler.cs
@@ -1,21 +1,46 @@
using LibMatrix.EventTypes.Spec;
using LibMatrix.Helpers;
using LibMatrix.Utilities.Bot.Services;
+using MatrixContentFilter.Services;
+using Microsoft.Extensions.Logging;
namespace MatrixContentFilter.Handlers;
-public static class InviteHandler {
- public static async Task HandleAsync(InviteHandlerHostedService.InviteEventArgs invite) {
+public class InviteHandler(ILogger<InviteHandler> logger, ConfigurationService cfg, InfoCacheService infoCache) : InviteHandlerHostedService.IInviteHandler {
+ public async Task HandleInviteAsync(InviteHandlerHostedService.InviteEventArgs invite) {
var room = invite.Homeserver.GetRoom(invite.RoomId);
- if (!invite.MemberEvent.Sender!.EndsWith("rory.gay")) {
+ var controlRoom = invite.Homeserver.GetRoom(cfg.ControlRoom.RoomId);
+ var logRoom = invite.Homeserver.GetRoom(cfg.LogRoom.RoomId);
+
+ await logRoom.SendMessageEventAsync(new MessageBuilder().WithBody($"Processing invite to {invite.RoomId}...").Build());
+
+ var roomName = invite.RoomId;
+ var inviterName = await infoCache.GetDisplayNameAsync(invite.RoomId, invite.MemberEvent.Sender!);
+ try {
+ roomName = await infoCache.GetRoomNameAsync(invite.RoomId);
+ }
+ catch (Exception) {
+ logger.LogWarning("Failed to get room name for {RoomId}", invite.RoomId);
+ }
+
+ var controlRoomMembers = await controlRoom.GetMembersListAsync(joinedOnly: true);
+
+ if (!controlRoomMembers.Any(m => m.StateKey != invite.MemberEvent.Sender)) {
await room.LeaveAsync($"{invite.MemberEvent.Sender} is not allowed to invite this bot!");
+ await controlRoom.SendMessageEventAsync(new MessageBuilder()
+ .WithColoredBody("#FF0000", msb =>
+ msb.WithMention(invite.MemberEvent.Sender!, inviterName).WithBody(" attempted to invite the bot to ").WithMention(invite.RoomId, roomName).WithBody(", but is not a member of the control room!")
+ .WithNewline().WithBody("If you trust this room, the bot should be invited by anyone who can read this message!")
+ )
+ .Build());
return;
}
try {
await room.JoinAsync(reason: $"I was invited by {invite.MemberEvent.Sender}");
await room.SendMessageEventAsync(new RoomMessageEventContent("m.notice", "Hello! I've arrived!"));
- } catch (Exception e) {
+ }
+ catch (Exception e) {
var newroom = await invite.Homeserver.CreateRoom(new() {
Name = $"Join error report",
Invite = [invite.MemberEvent.Sender]
|