Allow leaving main space and add command to rejoin it
This commit is contained in:
33
commands.go
33
commands.go
@@ -19,6 +19,7 @@ package main
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/skip2/go-qrcode"
|
"github.com/skip2/go-qrcode"
|
||||||
@@ -46,6 +47,7 @@ func (br *DiscordBridge) RegisterCommands() {
|
|||||||
cmdReconnect,
|
cmdReconnect,
|
||||||
cmdDisconnect,
|
cmdDisconnect,
|
||||||
cmdGuilds,
|
cmdGuilds,
|
||||||
|
cmdRejoinSpace,
|
||||||
cmdDeleteAllPortals,
|
cmdDeleteAllPortals,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -221,6 +223,37 @@ func fnReconnect(ce *WrappedCommandEvent) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var cmdRejoinSpace = &commands.FullHandler{
|
||||||
|
Func: wrapCommand(fnRejoinSpace),
|
||||||
|
Name: "rejoin-space",
|
||||||
|
Help: commands.HelpMeta{
|
||||||
|
Section: commands.HelpSectionUnclassified,
|
||||||
|
Description: "Ask the bridge for an invite to a space you left",
|
||||||
|
Args: "<_guild ID_/main/dms>",
|
||||||
|
},
|
||||||
|
RequiresLogin: true,
|
||||||
|
}
|
||||||
|
|
||||||
|
func fnRejoinSpace(ce *WrappedCommandEvent) {
|
||||||
|
if len(ce.Args) == 0 {
|
||||||
|
ce.Reply("**Usage**: `$cmdprefix rejoin-space <guild ID/main/dms>`")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
user := ce.User
|
||||||
|
if ce.Args[0] == "main" {
|
||||||
|
user.ensureInvited(nil, user.GetSpaceRoom(), false)
|
||||||
|
ce.Reply("Invited you to your main space ([link](%s))", user.GetSpaceRoom().URI(ce.Bridge.AS.HomeserverDomain).MatrixToURL())
|
||||||
|
} else if ce.Args[0] == "dms" {
|
||||||
|
user.ensureInvited(nil, user.GetDMSpaceRoom(), false)
|
||||||
|
ce.Reply("Invited you to your DM space ([link](%s))", user.GetDMSpaceRoom().URI(ce.Bridge.AS.HomeserverDomain).MatrixToURL())
|
||||||
|
} else if _, err := strconv.Atoi(ce.Args[0]); err == nil {
|
||||||
|
ce.Reply("Rejoining guild spaces is not yet implemented")
|
||||||
|
} else {
|
||||||
|
ce.Reply("**Usage**: `$cmdprefix rejoin-space <guild ID/main/dms>`")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var cmdGuilds = &commands.FullHandler{
|
var cmdGuilds = &commands.FullHandler{
|
||||||
Func: wrapCommand(fnGuilds),
|
Func: wrapCommand(fnGuilds),
|
||||||
Name: "guilds",
|
Name: "guilds",
|
||||||
|
|||||||
119
user.go
119
user.go
@@ -260,84 +260,81 @@ func (user *User) SetManagementRoom(roomID id.RoomID) {
|
|||||||
user.Update()
|
user.Update()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (user *User) getSpaceRoom(ptr *id.RoomID, checked *bool, name, topic string, parent id.RoomID) id.RoomID {
|
func (user *User) getSpaceRoom(ptr *id.RoomID, name, topic string, parent id.RoomID) id.RoomID {
|
||||||
if len(*ptr) == 0 {
|
if len(*ptr) > 0 {
|
||||||
user.spaceCreateLock.Lock()
|
return *ptr
|
||||||
defer user.spaceCreateLock.Unlock()
|
}
|
||||||
if len(*ptr) > 0 {
|
user.spaceCreateLock.Lock()
|
||||||
return *ptr
|
defer user.spaceCreateLock.Unlock()
|
||||||
}
|
if len(*ptr) > 0 {
|
||||||
|
return *ptr
|
||||||
|
}
|
||||||
|
|
||||||
initialState := []*event.Event{{
|
initialState := []*event.Event{{
|
||||||
Type: event.StateRoomAvatar,
|
Type: event.StateRoomAvatar,
|
||||||
|
Content: event.Content{
|
||||||
|
Parsed: &event.RoomAvatarEventContent{
|
||||||
|
URL: user.bridge.Config.AppService.Bot.ParsedAvatar,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}}
|
||||||
|
|
||||||
|
if parent != "" {
|
||||||
|
parentIDStr := parent.String()
|
||||||
|
initialState = append(initialState, &event.Event{
|
||||||
|
Type: event.StateSpaceParent,
|
||||||
|
StateKey: &parentIDStr,
|
||||||
Content: event.Content{
|
Content: event.Content{
|
||||||
Parsed: &event.RoomAvatarEventContent{
|
Parsed: &event.SpaceParentEventContent{
|
||||||
URL: user.bridge.Config.AppService.Bot.ParsedAvatar,
|
Canonical: true,
|
||||||
},
|
Via: []string{user.bridge.AS.HomeserverDomain},
|
||||||
},
|
|
||||||
}}
|
|
||||||
|
|
||||||
if parent != "" {
|
|
||||||
parentIDStr := parent.String()
|
|
||||||
initialState = append(initialState, &event.Event{
|
|
||||||
Type: event.StateSpaceParent,
|
|
||||||
StateKey: &parentIDStr,
|
|
||||||
Content: event.Content{
|
|
||||||
Parsed: &event.SpaceParentEventContent{
|
|
||||||
Canonical: true,
|
|
||||||
Via: []string{user.bridge.AS.HomeserverDomain},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
resp, err := user.bridge.Bot.CreateRoom(&mautrix.ReqCreateRoom{
|
|
||||||
Visibility: "private",
|
|
||||||
Name: name,
|
|
||||||
Topic: topic,
|
|
||||||
InitialState: initialState,
|
|
||||||
CreationContent: map[string]interface{}{
|
|
||||||
"type": event.RoomTypeSpace,
|
|
||||||
},
|
|
||||||
PowerLevelOverride: &event.PowerLevelsEventContent{
|
|
||||||
Users: map[id.UserID]int{
|
|
||||||
user.bridge.Bot.UserID: 9001,
|
|
||||||
user.MXID: 50,
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
}
|
||||||
|
|
||||||
if err != nil {
|
resp, err := user.bridge.Bot.CreateRoom(&mautrix.ReqCreateRoom{
|
||||||
user.log.Errorln("Failed to auto-create space room:", err)
|
Visibility: "private",
|
||||||
} else {
|
Name: name,
|
||||||
*ptr = resp.RoomID
|
Topic: topic,
|
||||||
user.Update()
|
InitialState: initialState,
|
||||||
user.ensureInvited(nil, *ptr, false)
|
CreationContent: map[string]interface{}{
|
||||||
|
"type": event.RoomTypeSpace,
|
||||||
|
},
|
||||||
|
PowerLevelOverride: &event.PowerLevelsEventContent{
|
||||||
|
Users: map[id.UserID]int{
|
||||||
|
user.bridge.Bot.UserID: 9001,
|
||||||
|
user.MXID: 50,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
if parent != "" {
|
if err != nil {
|
||||||
_, err = user.bridge.Bot.SendStateEvent(parent, event.StateSpaceChild, resp.RoomID.String(), &event.SpaceChildEventContent{
|
user.log.Errorln("Failed to auto-create space room:", err)
|
||||||
Via: []string{user.bridge.AS.HomeserverDomain},
|
} else {
|
||||||
Order: " 0000",
|
*ptr = resp.RoomID
|
||||||
})
|
user.Update()
|
||||||
if err != nil {
|
user.ensureInvited(nil, *ptr, false)
|
||||||
user.log.Errorfln("Failed to add space room %s to parent space %s: %v", resp.RoomID, parent, err)
|
|
||||||
}
|
if parent != "" {
|
||||||
|
_, err = user.bridge.Bot.SendStateEvent(parent, event.StateSpaceChild, resp.RoomID.String(), &event.SpaceChildEventContent{
|
||||||
|
Via: []string{user.bridge.AS.HomeserverDomain},
|
||||||
|
Order: " 0000",
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
user.log.Errorfln("Failed to add space room %s to parent space %s: %v", resp.RoomID, parent, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if !*checked && !user.bridge.StateStore.IsInRoom(*ptr, user.MXID) {
|
|
||||||
user.ensureInvited(nil, *ptr, false)
|
|
||||||
}
|
}
|
||||||
*checked = true
|
|
||||||
|
|
||||||
return *ptr
|
return *ptr
|
||||||
}
|
}
|
||||||
|
|
||||||
func (user *User) GetSpaceRoom() id.RoomID {
|
func (user *User) GetSpaceRoom() id.RoomID {
|
||||||
return user.getSpaceRoom(&user.SpaceRoom, &user.spaceMembershipChecked, "Discord", "Your Discord bridged chats", "")
|
return user.getSpaceRoom(&user.SpaceRoom, "Discord", "Your Discord bridged chats", "")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (user *User) GetDMSpaceRoom() id.RoomID {
|
func (user *User) GetDMSpaceRoom() id.RoomID {
|
||||||
return user.getSpaceRoom(&user.DMSpaceRoom, &user.dmSpaceMembershipChecked, "Direct Messages", "Your Discord direct messages", user.GetSpaceRoom())
|
return user.getSpaceRoom(&user.DMSpaceRoom, "Direct Messages", "Your Discord direct messages", user.GetSpaceRoom())
|
||||||
}
|
}
|
||||||
|
|
||||||
func (user *User) tryAutomaticDoublePuppeting() {
|
func (user *User) tryAutomaticDoublePuppeting() {
|
||||||
|
|||||||
Reference in New Issue
Block a user