Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 9 additions & 13 deletions bridgev2/matrixinvite.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,22 +37,18 @@ func (br *Bridge) handleBotInvite(ctx context.Context, evt *event.Event, sender
log.Err(err).Msg("Failed to get members of room after accepting invite")
}
if len(members) == 2 {
var message string
if sender.ManagementRoom == "" {
message = fmt.Sprintf("Hello, I'm a %s bridge bot.\n\nUse `help` for help or `login` to log in.\n\nThis room has been marked as your management room.", br.Network.GetName().DisplayName)
sender.ManagementRoom = evt.RoomID
err = br.DB.User.Update(ctx, sender.User)
if err != nil {
log.Err(err).Msg("Failed to update user's management room in database")
if err = br.prepareManagementRoom(ctx, sender, evt.RoomID); err != nil {
log.Err(err).Msg("Failed to prepare new management room")
}
} else {
message = fmt.Sprintf("Hello, I'm a %s bridge bot.\n\nUse `%s help` for help.", br.Network.GetName().DisplayName, br.Config.CommandPrefix)
}
_, err = br.Bot.SendMessage(ctx, evt.RoomID, event.EventMessage, &event.Content{
Parsed: format.RenderMarkdown(message, true, false),
}, nil)
if err != nil {
log.Err(err).Msg("Failed to send welcome message to room")
message := fmt.Sprintf("Hello, I'm a %s bridge bot.\n\nUse `%s help` for help.", br.Network.GetName().DisplayName, br.Config.CommandPrefix)
_, err = br.Bot.SendMessage(ctx, evt.RoomID, event.EventMessage, &event.Content{
Parsed: format.RenderMarkdown(message, true, false),
}, nil)
if err != nil {
log.Err(err).Msg("Failed to send welcome message to room")
}
}
}
return EventHandlingResultSuccess
Expand Down
77 changes: 60 additions & 17 deletions bridgev2/user.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import (
"fmt"
"strings"
"sync"
"time"
"unsafe"

"github.com/rs/zerolog"
Expand All @@ -22,6 +23,7 @@ import (
"maunium.net/go/mautrix/bridgev2/database"
"maunium.net/go/mautrix/bridgev2/networkid"
"maunium.net/go/mautrix/event"
"maunium.net/go/mautrix/format"
"maunium.net/go/mautrix/id"
)

Expand Down Expand Up @@ -201,28 +203,70 @@ func (user *User) GetDefaultLogin() *UserLogin {
return user.logins[loginKeys[0]]
}

// one-time setup for a room that has just become a user's management room
func (br *Bridge) prepareManagementRoom(ctx context.Context, user *User, roomID id.RoomID) error {
user.ManagementRoom = roomID
if err := user.Save(ctx); err != nil {
return fmt.Errorf("failed to save management room ID: %w", err)
}

netName := br.Network.GetName()

// this is ignored by many clients
_, err := br.Bot.SendState(ctx, roomID, event.StateRoomName, "", &event.Content{
Parsed: &event.RoomNameEventContent{Name: netName.DisplayName},
}, time.Time{})
if err != nil {
return fmt.Errorf("failed to set room name: %w", err)
}

_, err = br.Bot.SendState(ctx, roomID, event.StateTopic, "", &event.Content{
Parsed: &event.TopicEventContent{Topic: fmt.Sprintf("%s bridge management room", netName.DisplayName)},
}, time.Time{})
if err != nil {
return fmt.Errorf("failed to set room topic: %w", err)
}

_, err = br.Bot.SendState(ctx, roomID, event.StateRoomAvatar, "", &event.Content{
Parsed: &event.RoomAvatarEventContent{URL: netName.NetworkIcon},
}, time.Time{})
if err != nil {
return fmt.Errorf("failed to set room avatar: %w", err)
}

// no bridge info state key to match hungryserv's current behavior
_, err = br.Bot.SendState(ctx, roomID, event.StateBridge, "", &event.Content{
Parsed: &event.BridgeEventContent{
BridgeBot: br.Bot.GetMXID(),
Creator: br.Bot.GetMXID(),
Protocol: netName.AsBridgeInfoSection(),
BeeperIsBridgeBotRoom: true,
},
}, time.Time{})
if err != nil {
return fmt.Errorf("failed to send m.bridge event: %w", err)
}

message := fmt.Sprintf("Hello, I'm a %s bridge bot.\n\nUse `help` for help or `login` to log in.\n\nThis room has been marked as your management room.", netName.DisplayName)
_, err = br.Bot.SendMessage(ctx, roomID, event.EventMessage, &event.Content{
Parsed: format.RenderMarkdown(message, true, false),
}, nil)
if err != nil {
return fmt.Errorf("failed to send welcome message: %w", err)
}
return nil
}

func (user *User) GetManagementRoom(ctx context.Context) (id.RoomID, error) {
user.managementCreateLock.Lock()
defer user.managementCreateLock.Unlock()
if user.ManagementRoom != "" {
return user.ManagementRoom, nil
}
netName := user.Bridge.Network.GetName()
var err error
autoJoin := user.Bridge.Matrix.GetCapabilities().AutoJoinInvites
doublePuppet := user.DoublePuppet(ctx)
req := &mautrix.ReqCreateRoom{
Visibility: "private",
Name: netName.DisplayName,
Topic: fmt.Sprintf("%s bridge management room", netName.DisplayName),
InitialState: []*event.Event{{
Type: event.StateRoomAvatar,
Content: event.Content{
Parsed: &event.RoomAvatarEventContent{
URL: netName.NetworkIcon,
},
},
}},
PowerLevelOverride: &event.PowerLevelsEventContent{
Users: map[id.UserID]int{
user.Bridge.Bot.GetMXID(): 9001,
Expand All @@ -237,19 +281,18 @@ func (user *User) GetManagementRoom(ctx context.Context) (id.RoomID, error) {
// TODO remove this after initial_members is supported in hungryserv
req.BeeperAutoJoinInvites = true
}
user.ManagementRoom, err = user.Bridge.Bot.CreateRoom(ctx, req)
roomID, err := user.Bridge.Bot.CreateRoom(ctx, req)
if err != nil {
return "", fmt.Errorf("failed to create management room: %w", err)
}
if !autoJoin && doublePuppet != nil {
err = doublePuppet.EnsureJoined(ctx, user.ManagementRoom)
err = doublePuppet.EnsureJoined(ctx, roomID)
if err != nil {
zerolog.Ctx(ctx).Err(err).Msg("Failed to auto-join created management room with double puppet")
}
}
err = user.Save(ctx)
if err != nil {
return "", fmt.Errorf("failed to save management room ID: %w", err)
if err = user.Bridge.prepareManagementRoom(ctx, user, roomID); err != nil {
return "", fmt.Errorf("failed to prepare management room: %w", err)
}
return user.ManagementRoom, nil
}
Expand Down
2 changes: 2 additions & 0 deletions event/state.go
Original file line number Diff line number Diff line change
Expand Up @@ -254,6 +254,8 @@ type BridgeEventContent struct {
BeeperRoomType string `json:"com.beeper.room_type,omitempty"`
BeeperRoomTypeV2 string `json:"com.beeper.room_type.v2,omitempty"`

BeeperIsBridgeBotRoom bool `json:"com.beeper.is_bridge_bot_room,omitempty"`

TempSlackRemoteIDMigratedFlag bool `json:"com.beeper.slack_remote_id_migrated,omitempty"`
TempSlackRemoteIDMigratedFlag2 bool `json:"com.beeper.slack_remote_id_really_migrated,omitempty"`
}
Expand Down
Loading