about summary refs log tree commit diff
path: root/MatrixContentFilter/Handlers/InviteHandler.cs
diff options
context:
space:
mode:
Diffstat (limited to 'MatrixContentFilter/Handlers/InviteHandler.cs')
-rw-r--r--MatrixContentFilter/Handlers/InviteHandler.cs33
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]