Skip to content

Commit

Permalink
legacymigrate: make it work to some extent
Browse files Browse the repository at this point in the history
  • Loading branch information
tulir committed Jul 14, 2024
1 parent 1a998c4 commit 2d9be48
Show file tree
Hide file tree
Showing 8 changed files with 134 additions and 21 deletions.
76 changes: 76 additions & 0 deletions cmd/mautrix-slack/legacymigrate.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,19 @@
package main

import (
"context"
_ "embed"
"fmt"

"github.com/rs/zerolog"
"maunium.net/go/mautrix/appservice"
"maunium.net/go/mautrix/bridgev2/database"
"maunium.net/go/mautrix/bridgev2/matrix"
"maunium.net/go/mautrix/event"
"maunium.net/go/mautrix/id"

"go.mau.fi/mautrix-slack/pkg/connector"
"go.mau.fi/mautrix-slack/pkg/slackid"
)

const legacyMigrateRenameTables = `
Expand All @@ -36,3 +48,67 @@ ALTER TABLE emoji RENAME TO emoji_old;

//go:embed legacymigrate.sql
var legacyMigrateCopyData string

func postMigrate(ctx context.Context) error {
wasMigrated, err := m.DB.TableExists(ctx, "database_was_migrated")
if err != nil {
return fmt.Errorf("failed to check if database_was_migrated table exists: %w", err)
} else if !wasMigrated {
return nil
}
zerolog.Ctx(ctx).Info().Msg("Doing post-migration updates to Matrix rooms")

portals, err := m.Bridge.GetAllPortalsWithMXID(ctx)
if err != nil {
return fmt.Errorf("failed to get all portals: %w", err)
}
for _, portal := range portals {
switch portal.RoomType {
case database.RoomTypeDM:
teamID, _ := slackid.ParsePortalID(portal.ID)
otherUserID := portal.Metadata.(*connector.PortalMetadata).OtherUserID
if otherUserID == "" {
zerolog.Ctx(ctx).Warn().Msg("DM portal has no other user ID")
} else {
ghost, err := m.Bridge.GetGhostByID(ctx, slackid.MakeUserID(teamID, otherUserID))
if err != nil {
return fmt.Errorf("failed to get ghost for %s: %w", otherUserID, err)
}
mx := ghost.Intent.(*matrix.ASIntent).Matrix
err = m.Matrix.Bot.EnsureJoined(ctx, portal.MXID, appservice.EnsureJoinedParams{
BotOverride: mx.Client,
})
if err != nil {
zerolog.Ctx(ctx).Warn().Err(err).Stringer("room_id", portal.MXID).Msg("Failed to ensure bot is joined to DM")
}
pls, err := mx.PowerLevels(ctx, portal.MXID)
if err != nil {
zerolog.Ctx(ctx).Warn().Err(err).Stringer("room_id", portal.MXID).Msg("Failed to get power levels in room")
} else {
userLevel := pls.GetUserLevel(mx.UserID)
pls.EnsureUserLevel(m.Matrix.Bot.UserID, userLevel)
if userLevel > 50 {
pls.SetUserLevel(mx.UserID, 50)
}
_, err = mx.SetPowerLevels(ctx, portal.MXID, pls)
if err != nil {
zerolog.Ctx(ctx).Warn().Err(err).Stringer("room_id", portal.MXID).Msg("Failed to set power levels")
}
}
}
}
_, err = m.Matrix.Bot.SendStateEvent(ctx, portal.MXID, event.StateElementFunctionalMembers, "", &event.ElementFunctionalMembersContent{
ServiceMembers: []id.UserID{m.Matrix.Bot.UserID},
})
if err != nil {
zerolog.Ctx(ctx).Warn().Err(err).Stringer("room_id", portal.MXID).Msg("Failed to set service members")
}
}

_, err = m.DB.Exec(ctx, "DROP TABLE database_was_migrated")
if err != nil {
return fmt.Errorf("failed to drop database_was_migrated table: %w", err)
}
zerolog.Ctx(ctx).Info().Msg("Post-migration updates complete")
return nil
}
19 changes: 15 additions & 4 deletions cmd/mautrix-slack/legacymigrate.sql
Original file line number Diff line number Diff line change
Expand Up @@ -49,11 +49,19 @@ SELECT
topic_set,
in_space,
CASE
WHEN type=1 THEN 'dm'
WHEN type=2 THEN 'group_dm'
WHEN type=2 THEN 'dm'
WHEN type=3 THEN 'group_dm'
ELSE ''
END, -- room_type
'{}' -- metadata
CASE
WHEN type=2 THEN
-- only: postgres
jsonb_build_object
-- only: sqlite (line commented)
-- json_object
('other_user_id', dm_user_id)
ELSE '{}'
END -- metadata
FROM portal_old;

INSERT INTO ghost (
Expand Down Expand Up @@ -189,7 +197,8 @@ SELECT DISTINCT
'', -- portal_receiver
false, -- in_space
false, -- preferred
NULL -- last_read
-- only: postgres
CAST(NULL AS BIGINT) -- last_read
FROM user_team_portal_old;

UPDATE portal
Expand Down Expand Up @@ -225,3 +234,5 @@ DROP TABLE user_team_old;
DROP TABLE puppet_old;
DROP TABLE user_old;
DROP TABLE emoji_old;

CREATE TABLE database_was_migrated();
17 changes: 10 additions & 7 deletions cmd/mautrix-slack/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,14 +28,16 @@ var (
BuildTime = "unknown"
)

var c = &connector.SlackConnector{}
var m = mxmain.BridgeMain{
Name: "mautrix-slack",
Description: "A Matrix-Slack puppeting bridge",
URL: "https://github.com/mautrix/slack",
Version: "0.1.0",
Connector: c,
}

func main() {
m := mxmain.BridgeMain{
Name: "mautrix-slack",
Description: "A Matrix-Slack puppeting bridge",
URL: "https://github.com/mautrix/slack",
Version: "0.1.0",
Connector: &connector.SlackConnector{},
}
m.PostInit = func() {
m.CheckLegacyDB(
16,
Expand All @@ -45,6 +47,7 @@ func main() {
true,
)
}
c.HackyStartupHook = postMigrate
m.InitVersion(Tag, Commit, BuildTime)
m.Run()
}
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ require (
github.com/yuin/goldmark v1.7.4
go.mau.fi/util v0.5.1-0.20240714080209-e8e8154ce82a
gopkg.in/yaml.v3 v3.0.1
maunium.net/go/mautrix v0.19.0-beta.1.0.20240714080619-d1905f623215
maunium.net/go/mautrix v0.19.0-beta.1.0.20240714121051-fb9fb5ae4405
)

require (
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -73,5 +73,5 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
maunium.net/go/mauflag v1.0.0 h1:YiaRc0tEI3toYtJMRIfjP+jklH45uDHtT80nUamyD4M=
maunium.net/go/mauflag v1.0.0/go.mod h1:nLivPOpTpHnpzEh8jEdSL9UqO9+/KBJFmNRlwKfkPeA=
maunium.net/go/mautrix v0.19.0-beta.1.0.20240714080619-d1905f623215 h1:cy3Ge8DMOQj+a6G8QhWEcg8FWsx2wEwTgSATHzg3wIE=
maunium.net/go/mautrix v0.19.0-beta.1.0.20240714080619-d1905f623215/go.mod h1:ldNVOQXaljMk4YLzlohp+DniMQtCSzTVcwjEFBlYQLM=
maunium.net/go/mautrix v0.19.0-beta.1.0.20240714121051-fb9fb5ae4405 h1:ltVzYFIc2mef32PG3qXMlpddreHToSqmZFSdEKAxjiU=
maunium.net/go/mautrix v0.19.0-beta.1.0.20240714121051-fb9fb5ae4405/go.mod h1:ldNVOQXaljMk4YLzlohp+DniMQtCSzTVcwjEFBlYQLM=
22 changes: 16 additions & 6 deletions pkg/connector/chatinfo.go
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,7 @@ func (s *SlackClient) wrapChatInfo(ctx context.Context, info *slack.Channel, fet
var avatar *bridgev2.Avatar
var roomType database.RoomType
var err error
var extraUpdates func(ctx context.Context, portal *bridgev2.Portal) bool
switch {
case info.IsMpIM:
roomType = database.RoomTypeGroupDM
Expand Down Expand Up @@ -180,6 +181,14 @@ func (s *SlackClient) wrapChatInfo(ctx context.Context, info *slack.Channel, fet
}
ghost.UpdateInfoIfNecessary(ctx, s.UserLogin, bridgev2.RemoteEventUnknown)
info.Name = ghost.Name
extraUpdates = func(ctx context.Context, portal *bridgev2.Portal) bool {
meta := portal.Metadata.(*PortalMetadata)
if meta.OtherUserID != info.User {
meta.OtherUserID = info.User
return true
}
return false
}
case info.Name != "":
members = s.generateMemberList(ctx, info, fetchMembers)
default:
Expand All @@ -201,12 +210,13 @@ func (s *SlackClient) wrapChatInfo(ctx context.Context, info *slack.Channel, fet
IsNoteToSelf: info.IsIM && info.User == s.UserID,
})
return &bridgev2.ChatInfo{
Name: ptr.Ptr(name),
Topic: ptr.Ptr(info.Topic.Value),
Avatar: avatar,
Members: &members,
Type: &roomType,
ParentID: ptr.Ptr(slackid.MakeTeamPortalID(s.TeamID)),
Name: ptr.Ptr(name),
Topic: ptr.Ptr(info.Topic.Value),
Avatar: avatar,
Members: &members,
Type: &roomType,
ParentID: ptr.Ptr(slackid.MakeTeamPortalID(s.TeamID)),
ExtraUpdates: extraUpdates,
}, nil
}

Expand Down
7 changes: 7 additions & 0 deletions pkg/connector/connector.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ type SlackConnector struct {
Config Config
DB *slackdb.SlackDB
MsgConv *msgconv.MessageConverter

HackyStartupHook func(context.Context) error
}

var (
Expand All @@ -48,6 +50,11 @@ func (s *SlackConnector) SetMaxFileSize(maxSize int64) {
}

func (s *SlackConnector) Start(ctx context.Context) error {
if s.HackyStartupHook != nil {
if err := s.HackyStartupHook(ctx); err != nil {
return err
}
}
return s.DB.Upgrade(ctx)
}

Expand Down
8 changes: 7 additions & 1 deletion pkg/connector/dbmeta.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,9 @@ import (

func (s *SlackConnector) GetDBMetaTypes() database.MetaTypes {
return database.MetaTypes{
Portal: nil,
Portal: func() any {
return &PortalMetadata{}
},
Ghost: nil,
Message: nil,
Reaction: nil,
Expand All @@ -32,6 +34,10 @@ func (s *SlackConnector) GetDBMetaTypes() database.MetaTypes {
}
}

type PortalMetadata struct {
OtherUserID string `json:"other_user_id,omitempty"`
}

type UserLoginMetadata struct {
Email string `json:"email"`
Token string `json:"token"`
Expand Down

0 comments on commit 2d9be48

Please sign in to comment.