mirror of
https://github.com/mautrix/discord.git
synced 2026-11-11 16:49:18 -05:00
84 lines
2.6 KiB
Go
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
|
|
}
|