Merge branch 'develop' into kelare-develop

This commit is contained in:
zhaoYangguang 2021-11-16 13:36:49 +08:00
commit a9c8ea7a73
3 changed files with 81 additions and 213 deletions

View File

@ -3,10 +3,11 @@ package main
import (
"errors"
"fmt"
"math"
skype "github.com/kelaresg/go-skypeapi"
"github.com/kelaresg/matrix-skype/database"
skypeExt "github.com/kelaresg/matrix-skype/skype-ext"
"math"
"maunium.net/go/mautrix/patch"
"sort"
@ -96,24 +97,8 @@ func (handler *CommandHandler) CommandMux(ce *CommandEvent) {
handler.CommandHelp(ce)
//case "version":
// handler.CommandVersion(ce)
//case "reconnect":
// handler.CommandReconnect(ce)
//case "disconnect":
// handler.CommandDisconnect(ce)
case "ping":
handler.CommandPing(ce)
//case "delete-connection":
// handler.CommandDeleteConnection(ce)
//case "delete-session":
// handler.CommandDeleteSession(ce)
//case "delete-portal":
// handler.CommandDeletePortal(ce)
//case "delete-all-portals":
// handler.CommandDeleteAllPortals(ce)
//case "dev-test":
// handler.CommandDevTest(ce)
//case "set-pl":
// handler.CommandSetPowerLevel(ce)
case "logout":
handler.CommandLogout(ce)
case "login-matrix", "sync", "list", "open", "pm", "invite", "kick", "leave", "join", "create", "share":
@ -269,8 +254,8 @@ func (handler *CommandHandler) CommandLogout(ce *CommandEvent) {
RegistrationExpires: "",
LocationHost: "",
EndpointId: "",
Username: username,
Password: password,
Username: username,
Password: password,
}
ce.User.Conn.Store = &skype.Store{
@ -285,7 +270,7 @@ func (handler *CommandHandler) CommandLogout(ce *CommandEvent) {
}
}
func leavePortals(ce *CommandEvent) {
func leavePortals(ce *CommandEvent) {
portals := ce.User.GetPortals()
//newPortals := ce.User.GetPortalsNew()
//allPortals := newPortals[0:]
@ -314,130 +299,6 @@ func leavePortals(ce *CommandEvent) {
}
}
const cmdDeleteSessionHelp = `delete-session - Delete session information and disconnect from WhatsApp without sending a logout request`
//func (handler *CommandHandler) CommandDeleteSession(ce *CommandEvent) {
// if ce.User.Session == nil && ce.User.Conn == nil {
// ce.Reply("Nothing to purge: no session information stored and no active connection.")
// return
// }
// ce.User.SetSession(nil)
// if ce.User.Conn != nil {
// _, _ = ce.User.Conn.Disconnect()
// ce.User.Conn.RemoveHandlers()
// ce.User.Conn = nil
// }
// ce.Reply("Session information purged")
//}
const cmdReconnectHelp = `reconnect - Reconnect to WhatsApp`
//func (handler *CommandHandler) CommandReconnect(ce *CommandEvent) {
// if ce.User.Conn == nil {
// if ce.User.Session == nil {
// ce.Reply("No existing connection and no session. Did you mean `login`?")
// } else {
// ce.Reply("No existing connection, creating one...")
// ce.User.Connect(false)
// }
// return
// }
//
// wasConnected := true
// sess, err := ce.User.Conn.Disconnect()
// if err == whatsapp.ErrNotConnected {
// wasConnected = false
// } else if err != nil {
// ce.User.log.Warnln("Error while disconnecting:", err)
// } else if len(sess.Wid) > 0 {
// ce.User.SetSession(&sess)
// }
//
// err = ce.User.Conn.Restore()
// if err == whatsapp.ErrInvalidSession {
// if ce.User.Session != nil {
// ce.User.log.Debugln("Got invalid session error when reconnecting, but user has session. Retrying using RestoreWithSession()...")
// var sess whatsapp.Session
// sess, err = ce.User.Conn.RestoreWithSession(*ce.User.Session)
// if err == nil {
// ce.User.SetSession(&sess)
// }
// } else {
// ce.Reply("You are not logged in.")
// return
// }
// } else if err == whatsapp.ErrLoginInProgress {
// ce.Reply("A login or reconnection is already in progress.")
// return
// } else if err == whatsapp.ErrAlreadyLoggedIn {
// ce.Reply("You were already connected.")
// return
// }
// if err != nil {
// ce.User.log.Warnln("Error while reconnecting:", err)
// if err.Error() == "restore session connection timed out" {
// ce.Reply("Reconnection timed out. Is WhatsApp on your phone reachable?")
// } else {
// ce.Reply("Unknown error while reconnecting: %v", err)
// }
// ce.User.log.Debugln("Disconnecting due to failed session restore in reconnect command...")
// sess, err := ce.User.Conn.Disconnect()
// if err != nil {
// ce.User.log.Errorln("Failed to disconnect after failed session restore in reconnect command:", err)
// } else if len(sess.Wid) > 0 {
// ce.User.SetSession(&sess)
// }
// return
// }
// ce.User.ConnectionErrors = 0
//
// var msg string
// if wasConnected {
// msg = "Reconnected successfully."
// } else {
// msg = "Connected successfully."
// }
// ce.Reply(msg)
// ce.User.PostLogin()
//}
const cmdDeleteConnectionHelp = `delete-connection - Disconnect ignoring errors and delete internal connection state.`
//func (handler *CommandHandler) CommandDeleteConnection(ce *CommandEvent) {
// if ce.User.Conn == nil {
// ce.Reply("You don't have a WhatsApp connection.")
// return
// }
// sess, err := ce.User.Conn.Disconnect()
// if err == nil && len(sess.Wid) > 0 {
// ce.User.SetSession(&sess)
// }
// ce.User.Conn.RemoveHandlers()
// ce.User.Conn = nil
// ce.Reply("Successfully disconnected. Use the `reconnect` command to reconnect.")
//}
const cmdDisconnectHelp = `disconnect - Disconnect from WhatsApp (without logging out)`
//func (handler *CommandHandler) CommandDisconnect(ce *CommandEvent) {
// if ce.User.Conn == nil {
// ce.Reply("You don't have a WhatsApp connection.")
// return
// }
// sess, err := ce.User.Conn.Disconnect()
// if err == whatsapp.ErrNotConnected {
// ce.Reply("You were not connected.")
// return
// } else if err != nil {
// ce.User.log.Warnln("Error while disconnecting:", err)
// ce.Reply("Unknown error while disconnecting: %v", err)
// return
// } else if len(sess.Wid) > 0 {
// ce.User.SetSession(&sess)
// }
// ce.Reply("Successfully disconnected. Use the `reconnect` command to reconnect.")
//}
const cmdPingHelp = `ping - Check your connection to Skype.`
func (handler *CommandHandler) CommandPing(ce *CommandEvent) {
@ -481,10 +342,6 @@ func (handler *CommandHandler) CommandHelp(ce *CommandEvent) {
cmdPrefix + cmdHelpHelp,
cmdPrefix + cmdLoginHelp,
cmdPrefix + cmdLogoutHelp,
//cmdPrefix + cmdDeleteSessionHelp,
//cmdPrefix + cmdReconnectHelp,
//cmdPrefix + cmdDisconnectHelp,
//cmdPrefix + cmdDeleteConnectionHelp,
cmdPrefix + cmdPingHelp,
//cmdPrefix + cmdLoginMatrixHelp,
//cmdPrefix + cmdLogoutMatrixHelp,
@ -492,16 +349,12 @@ func (handler *CommandHandler) CommandHelp(ce *CommandEvent) {
cmdPrefix + cmdListHelp,
cmdPrefix + cmdOpenHelp,
cmdPrefix + cmdPMHelp,
//cmdPrefix + cmdSetPowerLevelHelp,
//cmdPrefix + cmdDeletePortalHelp,
//cmdPrefix + cmdDeleteAllPortalsHelp,
cmdPrefix + cmdCreateHelp,
cmdPrefix + cmdInviteHelp,
cmdPrefix + cmdKickHelp,
cmdPrefix + cmdLeaveHelp,
cmdPrefix + cmdJoinHelp,
cmdPrefix + cmdShareHelp,
}, "\n* "))
}
@ -531,7 +384,7 @@ func (handler *CommandHandler) CommandSync(ce *CommandEvent) {
ce.Reply("Sync complete.")
}
func syncAll(user *User, create bool) {
func syncAll(user *User, create bool) {
//ce.Reply("Syncing contacts...")
user.syncPuppets(nil)
//ce.Reply("Syncing chats...")
@ -1012,7 +865,7 @@ func (handler *CommandHandler) CommandKick(ce *CommandEvent) {
handler.log.Debugln("Kicking", userNumbers, "to", converationId)
err := user.Conn.HandleGroupKick(converationId, userNumbers)
if err != nil {
handler.log.Errorln("Kicking err", err)
handler.log.Errorln("Kicking err", err)
ce.Reply("Please confirm that you have permission to kick members.")
} else {
ce.Reply("Remove operation completed.\nIf the member has not been removed, please check your permissions or command parameters")
@ -1040,13 +893,13 @@ func (handler *CommandHandler) CommandLeave(ce *CommandEvent) {
if len(portal.MXID) > 0 {
cli := handler.bridge.Bot
fmt.Println("cli appurl:", cli.Prefix, cli.AppServiceUserID, cli.HomeserverURL.String(), )
fmt.Println("cli appurl:", cli.Prefix, cli.AppServiceUserID, cli.HomeserverURL.String())
//res, errLeave := cli.LeaveRoom(portal.MXID)
//cli.AppServiceUserID = ce.User.MXID
u := cli.BuildURL("rooms", portal.MXID, "leave")
fmt.Println(u)
resp := mautrix.RespLeaveRoom{}
res , err := cli.MakeRequest("POST", u, struct{}{}, &resp)
res, err := cli.MakeRequest("POST", u, struct{}{}, &resp)
fmt.Println("leave res : ", res)
fmt.Println("leave res err: ", err)
//if errLeave != nil {
@ -1062,9 +915,10 @@ func (handler *CommandHandler) CommandLeave(ce *CommandEvent) {
ce.Reply("Leave operation completed and successful.")
}
const cmdShareHelp = `share <_group ID_> - Generate a link to join the group.`
func (handler *CommandHandler) CommandShare(ce *CommandEvent) {
func (handler *CommandHandler) CommandShare(ce *CommandEvent) {
if len(ce.Args) == 0 {
ce.Reply("**Usage:** `share <group id>`")
return
@ -1080,7 +934,7 @@ func (handler *CommandHandler) CommandShare(ce *CommandEvent) {
}
//set enabled
enstr := map[string]string{
"joiningenabled":"true",
"joiningenabled": "true",
}
_, err := user.Conn.SetConversationThreads(converationId, enstr)
if err != nil {
@ -1202,7 +1056,7 @@ func (handler *CommandHandler) CommandCreate(ce *CommandEvent) {
selfMembers := skype.Members{}
member2 := skype.Member{
Id: strings.Replace(ce.User.JID, skypeExt.NewUserSuffix,"", 1),
Id: strings.Replace(ce.User.JID, skypeExt.NewUserSuffix, "", 1),
Role: "Admin",
}

View File

@ -101,11 +101,14 @@ func (puppet *Puppet) StartCustomMXID() error {
}
resp, err := intent.Whoami()
if err != nil {
if strings.Index(err.Error(), "M_UNKNOWN_TOKEN (HTTP 401)") > -1 {
puppet.log.Debugln("StartCustomMXID UpdateAccessToken: ", puppet.MXID)
if puppet.customUser != nil {
err, _ = puppet.customUser.UpdateAccessToken(puppet)
}
// if strings.Index(err.Error(), "M_UNKNOWN_TOKEN (HTTP 401)") > -1 {
// puppet.log.Debugln("StartCustomMXID UpdateAccessToken: ", puppet.MXID)
// if puppet.customUser != nil {
// err, _ = puppet.customUser.UpdateAccessToken(puppet)
// }
// }
if puppet.customUser != nil {
err, _ = puppet.updateCustomAccessTokenIfExpired(err, puppet.customUser)
}
if err != nil {
puppet.clearCustomMXID()
@ -123,6 +126,17 @@ func (puppet *Puppet) StartCustomMXID() error {
return nil
}
func (puppet *Puppet) updateCustomAccessTokenIfExpired(err error, user *User) (newErr error, accessToken string) {
if user == nil {
return err, ""
}
puppet.log.Debugln("StartCustomMXID UpdateAccessToken: ", puppet.MXID)
if strings.Index(err.Error(), "M_UNKNOWN_TOKEN (HTTP 401)") > -1 {
return user.UpdateAccessToken(puppet)
}
return err, ""
}
func (puppet *Puppet) startSyncing() {
if !puppet.bridge.Config.Bridge.SyncWithCustomPuppets {
return
@ -146,7 +160,7 @@ func (puppet *Puppet) stopSyncing() {
func (puppet *Puppet) ProcessResponse(resp *mautrix.RespSync, since string) error {
if !puppet.customUser.IsConnected() {
puppet.log.Debugln("Skipping sync processing: custom user not connected to whatsapp")
puppet.log.Debugln("Skipping sync processing: custom user not connected to skype")
return nil
}
for roomID, events := range resp.Rooms.Join {
@ -237,7 +251,8 @@ func (puppet *Puppet) handleTypingEvent(portal *Portal, evt *event.Event) {
func (puppet *Puppet) OnFailedSync(res *mautrix.RespSync, err error) (time.Duration, error) {
puppet.log.Warnln("Sync error:", err)
return 10 * time.Second, nil
err, _ = puppet.updateCustomAccessTokenIfExpired(err, puppet.customUser)
return 10 * time.Second, err
}
func (puppet *Puppet) GetFilterJSON(_ id.UserID) *mautrix.Filter {

93
user.go
View File

@ -85,10 +85,10 @@ func (bridge *Bridge) GetUserByJID(userID types.SkypeID) *User {
return user
}
func (user *User) getSkypeIdByMixId() (skypeId string){
func (user *User) getSkypeIdByMixId() (skypeId string) {
mixIdArr := strings.Split(string(user.MXID), "&")
idArr := strings.Split(mixIdArr[1], ":"+user.bridge.Config.Homeserver.Domain)
skypeId = strings.Replace(idArr[0], "-",":",2)
skypeId = strings.Replace(idArr[0], "-", ":", 2)
return skypeId
}
@ -363,7 +363,7 @@ func (user *User) Login(ce *CommandEvent, name string, password string) (err err
user.Conn.Subscribes() // subscribe basic event
err = user.Conn.Conn.ContactList(user.Conn.UserProfile.Username)
if err == nil{
if err == nil {
var userIds []string
for _, contact := range user.Conn.Store.Contacts {
if strings.Index(contact.PersonId, "28:") > -1 {
@ -400,7 +400,7 @@ func (user *User) monitorSession(ce *CommandEvent) {
}
}
item, ok := <- user.Conn.Refresh
item, ok := <-user.Conn.Refresh
if !ok {
user.Conn.Refresh = nil
}
@ -463,7 +463,7 @@ func (user *User) tryAutomaticDoublePuppeting() {
return
}
fmt.Println("tryAutomaticDoublePuppeting2", user.MXID)
_,_ = user.UpdateAccessToken(puppet)
_, _ = user.UpdateAccessToken(puppet)
}
func (user *User) UpdateAccessToken(puppet *Puppet) (err error, accessToken string) {
@ -516,7 +516,7 @@ func (user *User) syncPortals(chatMap map[string]skype.Conversation, createAll b
existingKeys := user.GetInCommunityMap()
portalKeys := make([]database.PortalKeyWithMeta, 0, len(chatMap))
for _, chat := range chatMap {
t, err := time.Parse(time.RFC3339,chat.LastMessage.ComposeTime)
t, err := time.Parse(time.RFC3339, chat.LastMessage.ComposeTime)
if err != nil {
t = time.Now()
if chat.Properties.ConversationStatus != "Accepted" && len(chat.ThreadProperties.Lastjoinat) < 1 {
@ -612,12 +612,12 @@ func (user *User) syncPuppets(contacts map[string]skype.Contact) {
if user.Conn.UserProfile.LastName != "" {
username = user.Conn.UserProfile.FirstName + " " + user.Conn.UserProfile.LastName
}
contacts["8:" + user.Conn.UserProfile.Username + skypeExt.NewUserSuffix] = skype.Contact{
contacts["8:"+user.Conn.UserProfile.Username+skypeExt.NewUserSuffix] = skype.Contact{
Profile: skype.UserInfoProfile{
AvatarUrl: user.Conn.UserProfile.AvatarUrl,
},
DisplayName: username,
PersonId: user.Conn.UserProfile.Username,
PersonId: user.Conn.UserProfile.Username,
}
for personId, contact := range contacts {
fmt.Println("Syncing puppet info from contacts", personId)
@ -716,7 +716,7 @@ func (user *User) HandleJSONParseError(err error) {
func (user *User) PortalKey(jid types.SkypeID) database.PortalKey {
fmt.Println("User PortalKey jid: ", jid)
fmt.Println("User PortalKey user.JID: ", user.JID)
fmt.Println("User PortalKey user.JID: ", user.JID)
return database.NewPortalKey(jid, user.JID)
}
@ -855,14 +855,14 @@ func (user *User) HandlePresence(info skype.Resource) {
sendId := info.SendId + skypeExt.NewUserSuffix
puppet := user.bridge.GetPuppetByJID(sendId)
if _,ok := user.contactsPresence[sendId]; ok {
if _, ok := user.contactsPresence[sendId]; ok {
user.contactsPresence[sendId].Availability = info.Availability
user.contactsPresence[sendId].Status = info.Status
} else {
user.contactsPresence[sendId] = &skypeExt.Presence {
Id: sendId,
user.contactsPresence[sendId] = &skypeExt.Presence{
Id: sendId,
Availability: info.Availability,
Status: info.Status,
Status: info.Status,
}
}
@ -876,20 +876,20 @@ func (user *User) HandlePresence(info skype.Resource) {
puppet.typingIn = ""
puppet.typingAt = 0
} else {
_ = puppet.DefaultIntent().SetPresence("online")
_ = puppet.DefaultIntent().SetPresence("online")
}
//case whatsapp.PresenceComposing:
// portal := user.GetPortalByJID(info.Jid)
// if len(puppet.typingIn) > 0 && puppet.typingAt+15 > time.Now().Unix() {
// if puppet.typingIn == portal.MXID {
// return
// }
// _, _ = puppet.IntentFor(portal).UserTyping(puppet.typingIn, false, 0)
// }
// puppet.typingIn = portal.MXID
// puppet.typingAt = time.Now().Unix()
// _, _ = puppet.IntentFor(portal).UserTyping(portal.MXID, true, 15*1000)
// _ = puppet.DefaultIntent().SetPresence("online")
//case whatsapp.PresenceComposing:
// portal := user.GetPortalByJID(info.Jid)
// if len(puppet.typingIn) > 0 && puppet.typingAt+15 > time.Now().Unix() {
// if puppet.typingIn == portal.MXID {
// return
// }
// _, _ = puppet.IntentFor(portal).UserTyping(puppet.typingIn, false, 0)
// }
// puppet.typingIn = portal.MXID
// puppet.typingAt = time.Now().Unix()
// _, _ = puppet.IntentFor(portal).UserTyping(portal.MXID, true, 15*1000)
// _ = puppet.DefaultIntent().SetPresence("online")
}
}
@ -1038,7 +1038,7 @@ func (user *User) HandleChatUpdate(cmd skype.Resource) {
url = url + "/views/swx_avatar"
}
fmt.Println()
fmt.Println("HandleChatUpdateL picture:", url )
fmt.Println("HandleChatUpdateL picture:", url)
fmt.Println()
avatar := &skypeExt.ProfilePicInfo{
URL: url,
@ -1059,34 +1059,33 @@ func (user *User) HandleChatUpdate(cmd skype.Resource) {
go portal.membershipRemove(cmd.Content)
case "":
if skypeExt.ChatActionType(cmd.Type) == skypeExt.ChatActionThread {
if len(cmd.ETag) > 0 && len(cmd.Properties.Capabilities) < 1{
if len(cmd.ETag) > 0 && len(cmd.Properties.Capabilities) < 1 {
portal.Delete()
portal.Cleanup(false)
}
}
//case skypeExt.ChatActionAddTopic:
// go portal.UpdateTopic(cmd.Data.AddTopic.Topic, cmd.Data.SenderJID)
//case skypeExt.ChatActionRemoveTopic:
// go portal.UpdateTopic("", cmd.Data.SenderJID)
//case skypeExt.ChatActionPromote:
// go portal.ChangeAdminStatus(cmd.Data.PermissionChange.JIDs, true)
//case skypeExt.ChatActionDemote:
// go portal.ChangeAdminStatus(cmd.Data.PermissionChange.JIDs, false)
//case skypeExt.ChatActionAnnounce:
// go portal.RestrictMessageSending(cmd.Data.Announce)
//case skypeExt.ChatActionRestrict:
// go portal.RestrictMetadataChanges(cmd.Data.Restrict)
//case skypeExt.ChatActionAdd:
// go portal.membershipAdd(user, cmd.Jid)
//case skypeExt.ChatActionRemove:
// go portal.membershipRemove(cmd.Data.MemberAction.JIDs, cmd.Data.Action)
//case skypeExt.ChatActionIntroduce:
// go portal.membershipAdd(user, cmd.JID)
//case skypeExt.ChatActionAddTopic:
// go portal.UpdateTopic(cmd.Data.AddTopic.Topic, cmd.Data.SenderJID)
//case skypeExt.ChatActionRemoveTopic:
// go portal.UpdateTopic("", cmd.Data.SenderJID)
//case skypeExt.ChatActionPromote:
// go portal.ChangeAdminStatus(cmd.Data.PermissionChange.JIDs, true)
//case skypeExt.ChatActionDemote:
// go portal.ChangeAdminStatus(cmd.Data.PermissionChange.JIDs, false)
//case skypeExt.ChatActionAnnounce:
// go portal.RestrictMessageSending(cmd.Data.Announce)
//case skypeExt.ChatActionRestrict:
// go portal.RestrictMetadataChanges(cmd.Data.Restrict)
//case skypeExt.ChatActionAdd:
// go portal.membershipAdd(user, cmd.Jid)
//case skypeExt.ChatActionRemove:
// go portal.membershipRemove(cmd.Data.MemberAction.JIDs, cmd.Data.Action)
//case skypeExt.ChatActionIntroduce:
// go portal.membershipAdd(user, cmd.JID)
}
}
//func (user *User) HandleChatUpdate(cmd whatsappExt.ChatUpdate) {
// if cmd.Command != whatsappExt.ChatUpdateCommandAction {
// return