Watch
1
0
Fork
You've already forked mautrix-discord
0
mirror of https://github.com/mautrix/discord.git synced 2026-11-11 16:49:18 -05:00
mautrix-discord/pkg/connector/guilds.go
2026-11-02 15:25:00 +00:00

84 lines
2.6 KiB
Go

// mautrix-discord - A Matrix-Discord puppeting bridge.
// Copyright (C) 2026 Tulir Asokan
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
package connector
import (
"context"
"fmt"
"slices"
"maunium.net/go/mautrix/bridgev2"
"go.mau.fi/mautrix-discord/pkg/discordid"
)
func (d *DiscordClient) guildBridgingMode(guildID string) discordid.GuildBridgingMode {
d.guildModesLock.RLock()
defer d.guildModesLock.RUnlock()
meta := d.userLoginMetadata()
if mode, ok := meta.GuildBridgingModes[guildID]; ok {
return mode
}
if meta.BridgedGuildIDs[guildID] || slices.Contains(d.connector.Config.Guilds.BridgingGuildIDs, guildID) {
return discordid.GuildBridgeEverything
}
return discordid.GuildBridgeNothing
}
func (d *DiscordClient) setGuildBridgingMode(ctx context.Context, guildID string, mode discordid.GuildBridgingMode) error {
d.guildModesLock.Lock()
defer d.guildModesLock.Unlock()
meta := d.userLoginMetadata()
if meta.GuildBridgingModes == nil {
meta.GuildBridgingModes = make(map[string]discordid.GuildBridgingMode)
}
previous, existed := meta.GuildBridgingModes[guildID]
meta.GuildBridgingModes[guildID] = mode
if err := d.UserLogin.Save(ctx); err != nil {
if existed {
meta.GuildBridgingModes[guildID] = previous
} else {
delete(meta.GuildBridgingModes, guildID)
}
return err
}
return nil
}
func (d *DiscordClient) unbridgeGuild(ctx context.Context, guildID string) (int, error) {
if err := d.setGuildBridgingMode(ctx, guildID, discordid.GuildBridgeNothing); err != nil {
return 0, err
}
guild, err := d.connector.Bridge.GetExistingPortalByKey(ctx, d.guildPortalKey(guildID))
if err != nil {
return 0, err
}
if guild == nil || guild.MXID == "" {
return 0, nil
}
portals, err := d.connector.collectAllGuildPortals(ctx, guild)
if err != nil {
return 0, err
}
var deleteErr error
bridgev2.DeleteManyPortals(ctx, portals, func(portal *bridgev2.Portal, deleting bool, err error) {
if err != nil {
deleteErr = fmt.Errorf("failed to delete %s: %w", portal.ID, err)
}
})
return len(portals), deleteErr
}