Merge branch 'develop' into kelare-develop
This commit is contained in:
commit
a9c8ea7a73
160
commands.go
160
commands.go
|
@ -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":
|
||||
|
@ -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* "))
|
||||
}
|
||||
|
||||
|
@ -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,6 +915,7 @@ 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) {
|
||||
|
@ -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",
|
||||
}
|
||||
|
||||
|
|
|
@ -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 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.customUser.UpdateAccessToken(puppet)
|
||||
}
|
||||
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 {
|
||||
|
|
23
user.go
23
user.go
|
@ -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,7 +612,7 @@ 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,
|
||||
},
|
||||
|
@ -855,11 +855,11 @@ 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 {
|
||||
user.contactsPresence[sendId] = &skypeExt.Presence{
|
||||
Id: sendId,
|
||||
Availability: info.Availability,
|
||||
Status: info.Status,
|
||||
|
@ -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,7 +1059,7 @@ 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)
|
||||
}
|
||||
|
@ -1086,7 +1086,6 @@ func (user *User) HandleChatUpdate(cmd skype.Resource) {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
//func (user *User) HandleChatUpdate(cmd whatsappExt.ChatUpdate) {
|
||||
// if cmd.Command != whatsappExt.ChatUpdateCommandAction {
|
||||
// return
|
||||
|
|
Loading…
Reference in New Issue