handlediscord: bridge guild delete

This commit is contained in:
Skip R
2026-02-11 17:37:40 -08:00
parent 82aab381ab
commit 07ba87f9d6
2 changed files with 25 additions and 0 deletions

View File

@@ -31,6 +31,7 @@ import (
"github.com/rs/zerolog" "github.com/rs/zerolog"
"maunium.net/go/mautrix/bridgev2" "maunium.net/go/mautrix/bridgev2"
"maunium.net/go/mautrix/bridgev2/networkid" "maunium.net/go/mautrix/bridgev2/networkid"
"maunium.net/go/mautrix/bridgev2/simplevent"
"maunium.net/go/mautrix/bridgev2/status" "maunium.net/go/mautrix/bridgev2/status"
"go.mau.fi/mautrix-discord/pkg/discordid" "go.mau.fi/mautrix-discord/pkg/discordid"
@@ -314,6 +315,22 @@ func (d *DiscordClient) syncGuilds(ctx context.Context) {
} }
} }
// deleteGuildPortalSpace queues a remote event that deletes a guild space
// (including children).
func (d *DiscordClient) deleteGuildPortalSpace(ctx context.Context, guildID string) {
log := zerolog.Ctx(ctx)
log.Info().Msg("Unbridging guild by deleting the entire space")
d.connector.Bridge.QueueRemoteEvent(d.UserLogin, &simplevent.ChatDelete{
EventMeta: simplevent.EventMeta{
Type: bridgev2.RemoteEventChatDelete,
PortalKey: d.guildPortalKeyFromID(guildID),
},
OnlyForMe: true,
Children: true,
})
}
func (d *DiscordClient) bridgeGuild(ctx context.Context, guildID string) error { func (d *DiscordClient) bridgeGuild(ctx context.Context, guildID string) error {
log := zerolog.Ctx(ctx) log := zerolog.Ctx(ctx)

View File

@@ -242,6 +242,7 @@ func (d *DiscordClient) handleDiscordEvent(rawEvt any) {
log := d.UserLogin.Log.With().Str("action", "handle discord event"). log := d.UserLogin.Log.With().Str("action", "handle discord event").
Type("event_type", rawEvt). Type("event_type", rawEvt).
Logger() Logger()
ctx := log.WithContext(d.UserLogin.Bridge.BackgroundCtx)
switch evt := rawEvt.(type) { switch evt := rawEvt.(type) {
case *discordgo.Ready: case *discordgo.Ready:
@@ -286,6 +287,13 @@ func (d *DiscordClient) handleDiscordEvent(rawEvt any) {
// TODO case *discordgo.MessageReactionRemoveEmoji: (needs impl. in discordgo) // TODO case *discordgo.MessageReactionRemoveEmoji: (needs impl. in discordgo)
case *discordgo.PresenceUpdate: case *discordgo.PresenceUpdate:
return return
case *discordgo.GuildDelete:
if evt.Unavailable {
log.Warn().Str("guild_id", evt.ID).Msg("Guild became unavailable")
// For now, leave the portals alone if the guild only went away due to an outage.
return
}
d.deleteGuildPortalSpace(ctx, evt.ID)
case *discordgo.Event: case *discordgo.Event:
// For presently unknown reasons sometimes discordgo won't unmarshal // For presently unknown reasons sometimes discordgo won't unmarshal
// events into their proper corresponding structs. // events into their proper corresponding structs.