Skip to content

Commit

Permalink
Fix bugs
Browse files Browse the repository at this point in the history
  • Loading branch information
tulir committed Apr 20, 2024
1 parent d15b9e8 commit 404331f
Show file tree
Hide file tree
Showing 10 changed files with 46 additions and 23 deletions.
2 changes: 2 additions & 0 deletions custompuppet.go
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,8 @@ func (user *User) CustomIntent() *appservice.IntentAPI {
}

func (user *User) tryAutomaticDoublePuppeting() {
user.autoDoublePuppetLock.Lock()
defer user.autoDoublePuppetLock.Unlock()
if !user.bridge.Config.CanAutoDoublePuppet(user.MXID) || user.DoublePuppetIntent != nil {
return
}
Expand Down
16 changes: 8 additions & 8 deletions database/message.go
Original file line number Diff line number Diff line change
Expand Up @@ -75,35 +75,35 @@ const (
)

func (mq *MessageQuery) GetBySlackID(ctx context.Context, key PortalKey, slackID string) ([]*Message, error) {
return mq.QueryMany(ctx, getMessageBySlackIDQuery, key, slackID)
return mq.QueryMany(ctx, getMessageBySlackIDQuery, key.TeamID, key.ChannelID, slackID)
}

func (mq *MessageQuery) GetFirstPartBySlackID(ctx context.Context, key PortalKey, slackID string) (*Message, error) {
return mq.QueryOne(ctx, getFirstMessagePartBySlackIDQuery, key, slackID)
return mq.QueryOne(ctx, getFirstMessagePartBySlackIDQuery, key.TeamID, key.ChannelID, slackID)
}

func (mq *MessageQuery) GetLastPartBySlackID(ctx context.Context, key PortalKey, slackID string) (*Message, error) {
return mq.QueryOne(ctx, getLastMessagePartBySlackIDQuery, key, slackID)
return mq.QueryOne(ctx, getLastMessagePartBySlackIDQuery, key.TeamID, key.ChannelID, slackID)
}

func (mq *MessageQuery) GetByMXID(ctx context.Context, eventID id.EventID) (*Message, error) {
return mq.QueryOne(ctx, getMessageByMXIDQuery, eventID)
}

func (mq *MessageQuery) GetFirstInChannel(ctx context.Context, key PortalKey) (*Message, error) {
return mq.QueryOne(ctx, getFirstMessageInChannelQuery, key)
return mq.QueryOne(ctx, getFirstMessageInChannelQuery, key.TeamID, key.ChannelID)
}

func (mq *MessageQuery) GetLastInChannel(ctx context.Context, key PortalKey) (*Message, error) {
return mq.QueryOne(ctx, getLastMessageInChannelQuery, key)
return mq.QueryOne(ctx, getLastMessageInChannelQuery, key.TeamID, key.ChannelID)
}

func (mq *MessageQuery) GetFirstInThread(ctx context.Context, key PortalKey, threadID string) (*Message, error) {
return mq.QueryOne(ctx, getFirstMessageInThreadQuery, key, threadID)
return mq.QueryOne(ctx, getFirstMessageInThreadQuery, key.TeamID, key.ChannelID, threadID)
}

func (mq *MessageQuery) GetLastInThread(ctx context.Context, key PortalKey, threadID string) (*Message, error) {
return mq.QueryOne(ctx, getLastMessageInThreadQuery, key, threadID)
return mq.QueryOne(ctx, getLastMessageInThreadQuery, key.TeamID, key.ChannelID, threadID)
}

type PartType string
Expand Down Expand Up @@ -196,7 +196,7 @@ func (m *Message) SlackURLPath() string {
}

func (m *Message) sqlVariables() []any {
return []any{m.TeamID, m.ChannelID, m.MessageID, m.Part, dbutil.StrPtr(m.ThreadID), m.AuthorID, m.MXID}
return []any{m.TeamID, m.ChannelID, m.MessageID, m.Part, m.ThreadID, m.AuthorID, m.MXID}
}

func (m *Message) Insert(ctx context.Context) error {
Expand Down
2 changes: 1 addition & 1 deletion database/puppet.go
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ func (p *Puppet) Scan(row dbutil.Scannable) (*Puppet, error) {
var avatarURL sql.NullString
err := row.Scan(
&p.TeamID, &p.UserID,
&p.Name, &p.NameSet, &p.Avatar, &avatarURL, &p.IsBot,
&p.Name, &p.Avatar, &avatarURL, &p.IsBot,
&p.NameSet, &p.AvatarSet, &p.ContactInfoSet,
)
if err != nil {
Expand Down
2 changes: 1 addition & 1 deletion database/teaminfo.go
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ type TeamPortal struct {

func (tp *TeamPortal) Scan(row dbutil.Scannable) (*TeamPortal, error) {
var mxid, avatarMXC sql.NullString
err := row.Scan(&tp.ID, &mxid, &tp.Domain, &tp.URL, &tp.NameSet, &tp.AvatarSet, &avatarMXC, &tp.NameSet, &tp.AvatarSet)
err := row.Scan(&tp.ID, &mxid, &tp.Domain, &tp.URL, &tp.Name, &tp.Avatar, &avatarMXC, &tp.NameSet, &tp.AvatarSet)
if err != nil {
return nil, err
}
Expand Down
4 changes: 2 additions & 2 deletions database/upgrades/00-latest-revision.sql
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ CREATE TABLE team_portal (
CREATE TABLE portal (
team_id TEXT NOT NULL,
channel_id TEXT NOT NULL,
receiver TEXT NOT NULL,
receiver TEXT NOT NULL, -- TODO add receiver to primary key
mxid TEXT,

type INT NOT NULL DEFAULT 0,
Expand All @@ -37,7 +37,7 @@ CREATE TABLE portal (

first_slack_id TEXT,

PRIMARY KEY (team_id, channel_id, receiver),
PRIMARY KEY (team_id, channel_id),
CONSTRAINT portal_mxid_unique UNIQUE (mxid),
CONSTRAINT portal_team_fkey FOREIGN KEY (team_id) REFERENCES team_portal (id)
ON DELETE CASCADE ON UPDATE CASCADE
Expand Down
2 changes: 1 addition & 1 deletion database/userteam.go
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ const (
token=$5,
cookie_token=$6,
in_space=$7
WHERE team_id=$1 AND user_id=$2
WHERE team_id=$1 AND user_id=$2 AND user_mxid=$3
`
deleteUserTeamQuery = `
DELETE FROM user_team WHERE team_id=$1 AND user_id=$2
Expand Down
7 changes: 7 additions & 0 deletions portal.go
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,10 @@ func (br *SlackBridge) loadPortal(ctx context.Context, dbPortal *database.Portal
if key == nil {
return nil
}
// Get team beforehand to ensure it exists in the database
if br.GetTeamByID(key.TeamID) == nil {
br.ZLog.Warn().Str("team_id", key.TeamID).Msg("Failed to get team by ID before inserting portal")
}

dbPortal = br.DB.Portal.New()
dbPortal.PortalKey = *key
Expand All @@ -147,6 +151,7 @@ func (br *SlackBridge) newPortal(dbPortal *database.Portal) *Portal {
bridge: br,

matrixMessages: make(chan portalMatrixMessage, br.Config.Bridge.PortalMessageBuffer),
slackMessages: make(chan portalSlackMessage, br.Config.Bridge.PortalMessageBuffer),

Team: br.GetTeamByID(dbPortal.TeamID),
}
Expand Down Expand Up @@ -396,6 +401,7 @@ func (portal *Portal) CreateMatrixRoom(ctx context.Context, source *UserTeam, ch
portal.bridge.portalsLock.Unlock()
portal.updateLogger()
portal.zlog.Info().Msg("Matrix room created")
portal.Team.AddPortalToSpace(ctx, portal)

err = portal.Update(ctx)
if err != nil {
Expand Down Expand Up @@ -1275,6 +1281,7 @@ func (portal *Portal) UpdateInfo(ctx context.Context, source *UserTeam, meta *sl

changed = portal.UpdateName(ctx, meta) || changed
changed = portal.UpdateTopic(ctx, meta) || changed
changed = portal.Team.AddPortalToSpace(ctx, portal) || changed

if changed {
portal.UpdateBridgeInfo(ctx)
Expand Down
2 changes: 1 addition & 1 deletion teamportal.go
Original file line number Diff line number Diff line change
Expand Up @@ -368,7 +368,7 @@ func (team *Team) RemoveMXID(ctx context.Context) {

// }

func (team *Team) AddPortal(ctx context.Context, portal *Portal) bool {
func (team *Team) AddPortalToSpace(ctx context.Context, portal *Portal) bool {
if len(team.MXID) == 0 {
team.log.Error().Msg("Tried to add portal to team that has no matrix ID")
if portal.InSpace {
Expand Down
11 changes: 6 additions & 5 deletions user.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,10 +47,11 @@ type User struct {

teams map[string]*UserTeam

spaceCreateLock sync.Mutex
PermissionLevel bridgeconfig.PermissionLevel
DoublePuppetIntent *appservice.IntentAPI
CommandState *commands.CommandState
spaceCreateLock sync.Mutex
autoDoublePuppetLock sync.Mutex
PermissionLevel bridgeconfig.PermissionLevel
DoublePuppetIntent *appservice.IntentAPI
CommandState *commands.CommandState
}

func (user *User) GetPermissionLevel() bridgeconfig.PermissionLevel {
Expand Down Expand Up @@ -402,7 +403,7 @@ func (user *User) GetSpaceRoom(ctx context.Context) (id.RoomID, error) {
if err != nil {
user.zlog.Err(err).Msg("Failed to save user after creating space room")
}
user.ensureInvited(ctx, nil, user.SpaceRoom, false)
user.ensureInvited(ctx, user.bridge.Bot, user.SpaceRoom, false)
return user.SpaceRoom, nil
}

Expand Down
21 changes: 17 additions & 4 deletions userteam.go
Original file line number Diff line number Diff line change
Expand Up @@ -65,10 +65,18 @@ func (ut *UserTeam) GetRemoteName() string {
}

func (br *SlackBridge) loadUserTeam(ctx context.Context, dbUserTeam *database.UserTeam, key *database.UserTeamMXIDKey) *UserTeam {
var team *Team
var user *User
if dbUserTeam == nil {
if key == nil {
return nil
}
// Get team and user beforehand to ensure they exist in the database
team = br.unlockedGetTeamByID(key.TeamID, false)
if team == nil {
br.ZLog.Warn().Str("team_id", key.TeamID).Msg("Failed to get team by ID before inserting user team")
}
user = br.unlockedGetUserByMXID(key.UserMXID, false)
dbUserTeam = br.DB.UserTeam.New()
dbUserTeam.UserTeamMXIDKey = *key
err := dbUserTeam.Insert(ctx)
Expand All @@ -90,8 +98,12 @@ func (br *SlackBridge) loadUserTeam(ctx context.Context, dbUserTeam *database.Us
}
br.userTeamsByID[userTeam.UserTeamKey] = userTeam

userTeam.Team = br.unlockedGetTeamByID(dbUserTeam.TeamID, true)
userTeam.User = br.unlockedGetUserByMXID(dbUserTeam.UserMXID, true)
if team == nil || user == nil {
team = br.unlockedGetTeamByID(dbUserTeam.TeamID, false)
user = br.unlockedGetUserByMXID(dbUserTeam.UserMXID, false)
}
userTeam.Team = team
userTeam.User = user

existingUT, alreadyExists = userTeam.User.teams[userTeam.TeamID]
if alreadyExists {
Expand Down Expand Up @@ -176,11 +188,12 @@ type slackgoZerolog struct {
}

func (l slackgoZerolog) Output(i int, s string) error {
l.Debug().Msg(s)
l.Debug().Msg(strings.TrimSpace(s))
return nil
}

func (ut *UserTeam) Connect() {
ut.User.tryAutomaticDoublePuppeting()
evt := ut.Log.Trace()
hasTraceLog := evt.Enabled()
evt.Discard()
Expand Down Expand Up @@ -234,7 +247,7 @@ func (ut *UserTeam) Sync(ctx context.Context, meta *slack.TeamInfo) {
}
}
ut.AddToSpace(ctx)
ut.User.ensureInvited(ctx, nil, ut.Team.MXID, false)
ut.User.ensureInvited(ctx, ut.bridge.Bot, ut.Team.MXID, false)
ut.syncPortals(ctx)
ut.SyncEmojis(ctx)
}
Expand Down

0 comments on commit 404331f

Please sign in to comment.