diff --git a/config/config.go b/config/config.go index fb19b7d..b999fd7 100644 --- a/config/config.go +++ b/config/config.go @@ -29,6 +29,7 @@ type Config struct { Homeserver struct { Address string `yaml:"address"` Domain string `yaml:"domain"` + ServerName string `yaml:"server_name"` } `yaml:"homeserver"` AppService struct { diff --git a/example-config.yaml b/example-config.yaml index d0c4d59..4069c05 100644 --- a/example-config.yaml +++ b/example-config.yaml @@ -4,6 +4,8 @@ homeserver: address: https://example.com # The domain of the homeserver (for MXIDs, etc). domain: example.com + # If you don’t know what this is, no need to modify(for parse "mention user/reply message, etc") + server_name: matrix.to # Application service host/registration related details. # Changing these values requires regeneration of the registration. diff --git a/formatting.go b/formatting.go index 1ef6bd0..8940f3e 100644 --- a/formatting.go +++ b/formatting.go @@ -138,8 +138,8 @@ func (formatter *Formatter) ParseSkype(content *event.MessageEventContent, RoomM msgMXID = string(msg.MXID) } mxid, _ = formatter.getMatrixInfoByJID("8:" + match[1] + skypeExt.NewUserSuffix) - href1 := fmt.Sprintf(`https://%s/#/room/%s/%s?via=%s`, formatter.bridge.Config.Homeserver.Domain, RoomMXID, msgMXID, formatter.bridge.Config.Homeserver.Domain) - href2 := fmt.Sprintf(`https://%s/#/user/%s`, formatter.bridge.Config.Homeserver.Domain, mxid) + href1 := fmt.Sprintf(`https://%s/#/room/%s/%s?via=%s`, formatter.bridge.Config.Homeserver.ServerName, RoomMXID, msgMXID, formatter.bridge.Config.Homeserver.Domain) + href2 := fmt.Sprintf(`https://%s/#/user/%s`, formatter.bridge.Config.Homeserver.ServerName, mxid) newContent := fmt.Sprintf(`
In reply to %s
%s
`, href1, href2, @@ -170,9 +170,10 @@ func (formatter *Formatter) ParseSkype(content *event.MessageEventContent, RoomM if len(matches) > 0 { for _, match := range matches { mxid, displayname := formatter.getMatrixInfoByJID(match[1] + skypeExt.NewUserSuffix) - number := "@" + strings.Replace(match[1], skypeExt.NewUserSuffix, "", 1) - originStr = strings.ReplaceAll(originStr, match[0], fmt.Sprintf(`%s:`, formatter.bridge.Config.Homeserver.Domain, mxid, displayname)) - originBodyStr = strings.Replace(originStr, number, displayname, -1) + // number := "@" + strings.Replace(match[1], skypeExt.NewUserSuffix, "", 1) + replaceStr := fmt.Sprintf(`%s:`, formatter.bridge.Config.Homeserver.ServerName, mxid, displayname) + originStr = strings.ReplaceAll(originStr, match[0], replaceStr) + originBodyStr = strings.ReplaceAll(originStr, replaceStr, displayname + ":") } if len(backStr) == 0 { content.Format = event.FormatHTML diff --git a/go.mod b/go.mod index db6133e..24cf9b1 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.14 require ( github.com/chai2010/webp v1.1.0 github.com/gorilla/websocket v1.4.2 - github.com/kelaresg/go-skypeapi v0.1.2-0.20210120095455-33c3f50415c4 + github.com/kelaresg/go-skypeapi v0.1.2-0.20210128115834-086b2e03dd09 github.com/lib/pq v1.7.0 github.com/mattn/go-sqlite3 v2.0.3+incompatible github.com/pkg/errors v0.9.1 diff --git a/go.sum b/go.sum index beea6be..4c5ae4b 100644 --- a/go.sum +++ b/go.sum @@ -160,6 +160,8 @@ github.com/kelaresg/go-skypeapi v0.1.2-0.20201211120317-8651f9f08575 h1:4M0mtPS+ github.com/kelaresg/go-skypeapi v0.1.2-0.20201211120317-8651f9f08575/go.mod h1:2Mxwa2Flo+PKlVYEM4QBNgs408C/mUSBXRzAb6+B+Zg= github.com/kelaresg/go-skypeapi v0.1.2-0.20210120095455-33c3f50415c4 h1:8tif5ndoTRHAOj4j2Ump9uyDaKoQ/W17dJ2K36G418U= github.com/kelaresg/go-skypeapi v0.1.2-0.20210120095455-33c3f50415c4/go.mod h1:2Mxwa2Flo+PKlVYEM4QBNgs408C/mUSBXRzAb6+B+Zg= +github.com/kelaresg/go-skypeapi v0.1.2-0.20210128115834-086b2e03dd09 h1:Hy1sgotN3qqglcmoT4G295UiX7Ucdyn/mGq/GlwDNgc= +github.com/kelaresg/go-skypeapi v0.1.2-0.20210128115834-086b2e03dd09/go.mod h1:2Mxwa2Flo+PKlVYEM4QBNgs408C/mUSBXRzAb6+B+Zg= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= diff --git a/matrix.go b/matrix.go index a7ed35d..69fcfde 100644 --- a/matrix.go +++ b/matrix.go @@ -257,7 +257,7 @@ func (mx *MatrixHandler) HandleMembership(evt *event.Event) { } user := mx.bridge.GetUserByMXID(evt.Sender) - if user == nil || user.Conn == nil || !user.Whitelisted || !user.IsConnected() { + if user == nil || user.Conn == nil || user.Conn.LoginInfo == nil || !user.Whitelisted || !user.IsConnected() { return } @@ -307,7 +307,7 @@ func (mx *MatrixHandler) HandleRoomMetadata(evt *event.Event) { } portal := mx.bridge.GetPortalByMXID(evt.RoomID) - if user.Conn == nil || portal == nil || portal.IsPrivateChat() { + if user.Conn == nil || user.Conn.LoginInfo == nil || portal == nil || portal.IsPrivateChat() { return } @@ -449,7 +449,7 @@ func (mx *MatrixHandler) HandleRedaction(evt *event.Event) { } portal := mx.bridge.GetPortalByMXID(evt.RoomID) - if user.Conn != nil && portal != nil { + if user.Conn != nil && user.Conn.LoginInfo != nil && portal != nil { portal.HandleMatrixRedaction(user, evt) } } diff --git a/portal.go b/portal.go index ab46068..d7489e0 100644 --- a/portal.go +++ b/portal.go @@ -1420,8 +1420,8 @@ func (portal *Portal) sendMessage(intent *appservice.IntentAPI, eventType event. "net.maunium.whatsapp.puppet": intent.IsCustomPuppet, } } - fmt.Println() - fmt.Printf("portal sendMessage0: %+v", content) + fmt.Println("portal sendMessage timestamp:", timestamp) + fmt.Printf("portal sendMessage: %+v", content) if portal.Encrypted && portal.bridge.Crypto != nil { encrypted, err := portal.bridge.Crypto.Encrypt(portal.MXID, eventType, wrappedContent) if err != nil { @@ -1431,12 +1431,8 @@ func (portal *Portal) sendMessage(intent *appservice.IntentAPI, eventType event. wrappedContent.Parsed = encrypted } if timestamp == 0 { - fmt.Println() - fmt.Printf("portal sendMessage1: %+v", content) return intent.SendMessageEvent(portal.MXID, eventType, &wrappedContent) } else { - fmt.Println() - fmt.Printf("portal sendMessage2: %+v", content) return intent.SendMassagedMessageEvent(portal.MXID, eventType, &wrappedContent, timestamp) } } @@ -2042,7 +2038,7 @@ func (portal *Portal) convertMatrixMessageSkype(sender *User, evt *event.Event) } // mention user message - r := regexp.MustCompile(`(?m)]+\bhref="(.*?)://` + portal.bridge.Config.Homeserver.Domain + `/#/@([^"]+):(.*?)">(.*?)`) + r := regexp.MustCompile(`(?m)]+\bhref="(.*?)://` + portal.bridge.Config.Homeserver.ServerName + `/#/@([^"]+):(.*?)">(.*?)`) matches := r.FindAllStringSubmatch(matchStr, -1) fmt.Println("matches: ", matches) if len(matches) > 0 { @@ -2226,30 +2222,34 @@ func (portal *Portal) HandleMatrixMessage(sender *User, evt *event.Event) { func SendMsg(sender *User, chatThreadId string, content *skype.SendMessage, output chan<- error) (err error) { fmt.Println("message SendMsg type: ", content.Type) - switch event.MessageType(content.Type) { - case event.MsgText, event.MsgEmote, event.MsgNotice: - err = sender.Conn.SendText(chatThreadId, content) - case event.MsgImage: - fmt.Println("message SendMsg type m.image: ", content.Type) - err = sender.Conn.SendFile(chatThreadId, content) - case event.MsgVideo: - fmt.Println("message SendMsg type m.video: ", content.Type) - err = sender.Conn.SendFile(chatThreadId, content) - case event.MsgAudio: - fmt.Println("message SendMsg type m.audio: ", content.Type) - err = sender.Conn.SendFile(chatThreadId, content) - case event.MsgFile: - fmt.Println("message SendMsg type m.file: ", content.Type) - err = sender.Conn.SendFile(chatThreadId, content) - case event.MsgLocation: - fmt.Println("message SendMsg type m.location: ", content.Type) - //err = c.SendFile(chatThreadId, content) - default: - err = errors.New("send to skype(unknown message type)") + if sender.Conn.LoginInfo != nil { + switch event.MessageType(content.Type) { + case event.MsgText, event.MsgEmote, event.MsgNotice: + err = sender.Conn.SendText(chatThreadId, content) + case event.MsgImage: + fmt.Println("message SendMsg type m.image: ", content.Type) + err = sender.Conn.SendFile(chatThreadId, content) + case event.MsgVideo: + fmt.Println("message SendMsg type m.video: ", content.Type) + err = sender.Conn.SendFile(chatThreadId, content) + case event.MsgAudio: + fmt.Println("message SendMsg type m.audio: ", content.Type) + err = sender.Conn.SendFile(chatThreadId, content) + case event.MsgFile: + fmt.Println("message SendMsg type m.file: ", content.Type) + err = sender.Conn.SendFile(chatThreadId, content) + case event.MsgLocation: + fmt.Println("message SendMsg type m.location: ", content.Type) + //err = c.SendFile(chatThreadId, content) + default: + err = errors.New("send to skype(unknown message type)") + } + } else { + err = errors.New("Not logged into Skype or Skype session has expired") } if err != nil { - output <- fmt.Errorf("message sending responded with %d", err) + output <- err } else { output <- nil } diff --git a/user.go b/user.go index 21f92c5..018679c 100644 --- a/user.go +++ b/user.go @@ -12,8 +12,6 @@ import ( "sync" "time" - //"github.com/pkg/errors" - "github.com/skip2/go-qrcode" log "maunium.net/go/maulogger/v2" "maunium.net/go/mautrix" @@ -328,58 +326,6 @@ func (user *User) IsLoginInProgress() bool { return user.Conn != nil && user.Conn.IsLoginInProgress() } -func (user *User) loginQrChannel(ce *CommandEvent, qrChan <-chan string, eventIDChan chan<- id.EventID) { - var qrEventID id.EventID - for code := range qrChan { - if code == "stop" { - return - } - qrCode, err := qrcode.Encode(code, qrcode.Low, 256) - if err != nil { - user.log.Errorln("Failed to encode QR code:", err) - ce.Reply("Failed to encode QR code: %v", err) - return - } - - bot := user.bridge.AS.BotClient() - - resp, err := bot.UploadBytes(qrCode, "image/png") - if err != nil { - user.log.Errorln("Failed to upload QR code:", err) - ce.Reply("Failed to upload QR code: %v", err) - return - } - - if qrEventID == "" { - sendResp, err := bot.SendImage(ce.RoomID, code, resp.ContentURI) - if err != nil { - user.log.Errorln("Failed to send QR code to user:", err) - return - } - qrEventID = sendResp.EventID - eventIDChan <- qrEventID - } else { - _, err = bot.SendMessageEvent(ce.RoomID, event.EventMessage, &event.MessageEventContent{ - MsgType: event.MsgImage, - Body: code, - URL: resp.ContentURI.CUString(), - NewContent: &event.MessageEventContent{ - MsgType: event.MsgImage, - Body: code, - URL: resp.ContentURI.CUString(), - }, - RelatesTo: &event.RelatesTo{ - Type: event.RelReplace, - EventID: qrEventID, - }, - }) - if err != nil { - user.log.Errorln("Failed to send edited QR code to user:", err) - } - } - } -} - func (user *User) Login(ce *CommandEvent, name string, password string) (err error) { if user.contactsPresence == nil { user.contactsPresence = make(map[string]*skypeExt.Presence)