update command "create"

This commit is contained in:
zhaoYangguang 2020-12-03 22:25:14 +08:00
parent b2471e801f
commit c4ed489406
2 changed files with 86 additions and 29 deletions

View File

@ -1,6 +1,7 @@
package main package main
import ( import (
"errors"
"fmt" "fmt"
skype "github.com/kelaresg/go-skypeapi" skype "github.com/kelaresg/go-skypeapi"
"github.com/kelaresg/matrix-skype/database" "github.com/kelaresg/matrix-skype/database"
@ -38,6 +39,7 @@ func NewCommandHandler(bridge *Bridge) *CommandHandler {
type CommandEvent struct { type CommandEvent struct {
Bot *appservice.IntentAPI Bot *appservice.IntentAPI
Bridge *Bridge Bridge *Bridge
Portal *Portal
Handler *CommandHandler Handler *CommandHandler
RoomID id.RoomID RoomID id.RoomID
User *User User *User
@ -142,7 +144,7 @@ func (handler *CommandHandler) CommandMux(ce *CommandEvent) {
handler.CommandCreate(ce) handler.CommandCreate(ce)
} }
default: default:
ce.Reply("Unknown Command") handler.CommandSpecialMux(ce)
} }
} }
@ -1151,50 +1153,105 @@ func (handler *CommandHandler) CommandJoin(ce *CommandEvent) {
// } // }
//} //}
const cmdCreateHelp = `create <_topic_> <_member user id_>,... - Create a group.` const cmdCreateHelp = `create - Create a group chat.`
func (handler *CommandHandler) CommandCreate(ce *CommandEvent) { func (handler *CommandHandler) CommandCreate(ce *CommandEvent) {
if len(ce.Args) < 2 { if ce.Portal != nil {
ce.Reply("**Usage:** `create <topic> <member user id>,...`") ce.Reply("This is already a portal room")
return return
} }
user := ce.User members, err := ce.Bot.JoinedMembers(ce.RoomID)
topic := ce.Args[0] if err != nil {
members := skype.Members{} ce.Reply("Failed to get room members: %v", err)
return
}
// The user who created the group must be in the members and have "Admin" rights var roomNameEvent event.RoomNameEventContent
userId := ce.User.Conn.UserProfile.Username err = ce.Bot.StateEvent(ce.RoomID, event.StateRoomName, "", &roomNameEvent)
if err != nil && !errors.Is(err, mautrix.MNotFound) {
ce.Reply("Failed to get room name")
return
} else if len(roomNameEvent.Name) == 0 {
ce.Reply("Please set a name for the room first")
return
}
var encryptionEvent event.EncryptionEventContent
err = ce.Bot.StateEvent(ce.RoomID, event.StateEncryption, "", &encryptionEvent)
if err != nil && !errors.Is(err, mautrix.MNotFound) {
ce.Reply("Failed to get room encryption status")
return
}
var participants []string
for userID := range members.Joined {
jid, ok := handler.bridge.ParsePuppetMXID(userID)
if ok && jid != ce.User.JID {
participants = append(participants, jid)
}
}
selfMembers := skype.Members{}
member2 := skype.Member{ member2 := skype.Member{
Id: "8:" + userId, Id: strings.Replace(ce.User.JID, skypeExt.NewUserSuffix,"", 1),
Role: "Admin", Role: "Admin",
} }
members.Members = append(members.Members, member2) selfMembers.Members = append(selfMembers.Members, member2)
members.Properties = skype.Properties{ selfMembers.Properties = skype.Properties{
HistoryDisclosed: "true", HistoryDisclosed: "true",
Topic: topic, Topic: roomNameEvent.Name,
}
handler.log.Debugln("Create Group", roomNameEvent.Name, "with", selfMembers)
err = ce.User.Conn.HandleGroupCreate(selfMembers)
if err != nil {
ce.Reply("Failed to create group: %v", err)
return
} }
handler.log.Debugln("Create Group", topic, "with", members) participantMembers := skype.Members{}
err := user.Conn.HandleGroupCreate(members) for _, participant := range participants {
inputArr := strings.Split(ce.Args[1], ",") participantArr := strings.Split(participant, "@")
members = skype.Members{} memberId := id.Dec(participantArr[0])
for _, memberId := range inputArr { cond1 := "8-live-"
members.Members = append(members.Members, skype.Member{ cond2 := "8-"
if strings.HasPrefix(memberId, cond1) {
memberId = strings.Replace(memberId, cond1, "8:live:", 1)
} else if strings.HasPrefix(memberId, cond2){
memberId = strings.Replace(memberId, cond2, "8:", 1)
}
participantMembers.Members = append(participantMembers.Members, skype.Member{
Id: memberId, Id: memberId,
Role: "Admin", Role: "Admin",
}) })
} }
conversationId, ok := <-user.Conn.CreateChan conversationId, ok := <-ce.User.Conn.CreateChan
if ok { if ok {
err = user.Conn.AddMember(members, conversationId) portal := handler.bridge.GetPortalByJID(database.GroupPortalKey(conversationId))
portal.roomCreateLock.Lock()
defer portal.roomCreateLock.Unlock()
if len(portal.MXID) != 0 {
portal.log.Warnln("Detected race condition in room creation")
// TODO race condition, clean up the old room
} }
portal.MXID = ce.RoomID
portal.Name = roomNameEvent.Name
portal.Encrypted = encryptionEvent.Algorithm == id.AlgorithmMegolmV1
if !portal.Encrypted && handler.bridge.Config.Bridge.Encryption.Default {
_, err = portal.MainIntent().SendStateEvent(portal.MXID, event.StateEncryption, "", &event.EncryptionEventContent{Algorithm: id.AlgorithmMegolmV1})
if err != nil { if err != nil {
ce.Reply("Please confirm that parameters is correct.") portal.log.Warnln("Failed to enable e2be:", err)
} else {
ce.Reply("Syncing group list...")
time.Sleep(time.Duration(3) * time.Second)
ce.Reply("Syncing group list completed")
} }
portal.Encrypted = true
}
portal.Update()
portal.UpdateBridgeInfo()
err = ce.User.Conn.AddMember(participantMembers, conversationId)
ce.Reply("Successfully created Skype group %s", portal.Key.JID)
}
//ce.User.addPortalToCommunity(portal)
} }

View File

@ -226,7 +226,7 @@ func (mx *MatrixHandler) HandlePuppetInvite(evt *event.Event, inviter *User, pup
_, _ = intent.SendNotice(evt.RoomID, "Please invite the bridge bot first if you want to bridge to a WhatsApp group.") _, _ = intent.SendNotice(evt.RoomID, "Please invite the bridge bot first if you want to bridge to a WhatsApp group.")
_, _ = intent.LeaveRoom(evt.RoomID) _, _ = intent.LeaveRoom(evt.RoomID)
} else { } else {
_, _ = intent.SendNotice(evt.RoomID, "This puppet will remain inactive until this room is bridged to a WhatsApp group.") _, _ = intent.SendNotice(evt.RoomID, "This puppet will remain inactive until this room is bridged to a Skype group.")
} }
} }