diff --git a/database/message.go b/database/message.go index fff6f86..fc7ebdc 100644 --- a/database/message.go +++ b/database/message.go @@ -51,6 +51,11 @@ func (mq *MessageQuery) GetByMXID(mxid id.EventID) *Message { "FROM message WHERE mxid=$1", mxid) } +func (mq *MessageQuery) GetByID(id string) *Message { + return mq.get("SELECT id, chat_jid, chat_receiver, jid, mxid, sender, timestamp, content " + + "FROM message WHERE id=$1", id) +} + func (mq *MessageQuery) GetLastInChat(chat PortalKey) *Message { msg := mq.get("SELECT id, chat_jid, chat_receiver, jid, mxid, sender, timestamp, content " + "FROM message WHERE chat_jid=$1 AND chat_receiver=$2 ORDER BY timestamp DESC LIMIT 1", chat.JID, chat.Receiver) diff --git a/formatting.go b/formatting.go index c30c3f0..94d55aa 100644 --- a/formatting.go +++ b/formatting.go @@ -96,8 +96,8 @@ func (formatter *Formatter) getMatrixInfoByJID(jid types.SkypeID) (mxid id.UserI return } -func (formatter *Formatter) ParseSkype(content *event.MessageEventContent) { - // parse a tag +func (formatter *Formatter) ParseSkype(content *event.MessageEventContent, RoomMXID id.RoomID) { + // parse '' tag reg:= regexp.MustCompile(`(?U)((.*))`) bodyMatch := reg.FindAllStringSubmatch(content.Body, -1) for _, match := range bodyMatch { @@ -113,7 +113,7 @@ func (formatter *Formatter) ParseSkype(content *event.MessageEventContent) { } content.Body = html.UnescapeString(content.Body) - // parse @user message + // parse mention user message r := regexp.MustCompile(`]+\bid="([^"]+)"(.*?)*`) matches := r.FindAllStringSubmatch(content.Body, -1) displayname := "" @@ -130,30 +130,37 @@ func (formatter *Formatter) ParseSkype(content *event.MessageEventContent) { if output != content.Body { output = strings.Replace(output, "\n", "
", -1) content.FormattedBody = output + content.Format = event.FormatHTML - // parse quote message + // parse quote message(set reply) content.Body = strings.ReplaceAll(content.Body, "\n", "") - quoteReg := regexp.MustCompile(`]+\bauthor="([^"]+)" authorname="([^"]+)" timestamp="([^"]+)".*>.*?(.*?).*?(.*)`) + quoteReg := regexp.MustCompile(`]+\bauthor="([^"]+)" authorname="([^"]+)" timestamp="([^"]+)" conversation.* messageid="([^"]+)".*>.*?(.*?).*?(.*)`) quoteMatches := quoteReg.FindAllStringSubmatch(content.Body, -1) if len(quoteMatches) > 0 { for _, match := range quoteMatches { + msgMXID := "" + msg := formatter.bridge.DB.Message.GetByID(match[4]) + if msg != nil { + msgMXID = string(msg.MXID) + } mxid, displayname = formatter.getMatrixInfoByJID("8:" + match[1] + skypeExt.NewUserSuffix) - //href1 := fmt.Sprintf(`https://matrix.to/#/!kpouCkfhzvXgbIJmkP:oliver.matrix.host/$fHQNRydqqqAVS8usHRmXn0nIBM_FC-lo2wI2Uol7wu8?via=oliver.matrix.host`) - href1 := "" - //mxid `@skype&8-live-xxxxxx:name.matrix.server` - href2 := fmt.Sprintf(`https://%s/#/%s`, formatter.bridge.Config.Homeserver.Domain, mxid) - newContent := fmt.Sprintf(`
%s
%s
%s`, + 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) + newContent := fmt.Sprintf(`
In reply to %s
%s
%s`, href1, href2, mxid, - match[4], - match[5]) + match[5], + match[6]) content.FormattedBody = newContent - content.Body = match[4] + "\n" + match[5] + content.Body = fmt.Sprintf("> <%s> %s\n\n%s", mxid, match[5], match[6]) + inRelateTo := &event.RelatesTo{ + Type: event.RelReply, + EventID: id.EventID(msgMXID), + } + content.SetRelatesTo(inRelateTo) } } - - content.Format = event.FormatHTML } } diff --git a/formatting_test.go b/formatting_test.go index 6070483..472fa2c 100644 --- a/formatting_test.go +++ b/formatting_test.go @@ -87,7 +87,7 @@ func TestFormatter_ParseSkype(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - testFormatter.ParseSkype(tt.args.content) + testFormatter.ParseSkype(tt.args.content, "") if !reflect.DeepEqual(tt.args.content, tt.expect.content) { t.Errorf("content = %v, wanted %v", tt.args.content, tt.expect.content) } diff --git a/portal.go b/portal.go index 3407d40..901f003 100644 --- a/portal.go +++ b/portal.go @@ -298,8 +298,8 @@ func (portal *Portal) markHandledSkype(source *User, message *skype.Resource, mx msg.ID = message.Id } msg.Insert() -fmt.Println("markHandledSkype1", msg.Chat.JID) -fmt.Println("markHandledSkype2", msg.JID) + fmt.Println("markHandledSkype1", msg.Chat.JID) + fmt.Println("markHandledSkype2", msg.JID) portal.recentlyHandledLock.Lock() index := portal.recentlyHandledIndex portal.recentlyHandledIndex = (portal.recentlyHandledIndex + 1) % recentlyHandledLength @@ -1317,6 +1317,16 @@ func (portal *Portal) SetReplySkype(content *event.MessageEventContent, info sky portal.log.Warnln("Failed to get reply target:", err) return } + if evt.Type == event.EventEncrypted { + _ = evt.Content.ParseRaw(evt.Type) + decryptedEvt, err := portal.bridge.Crypto.Decrypt(evt) + if err != nil { + portal.log.Warnln("Failed to decrypt reply target:", err) + } else { + evt = decryptedEvt + } + } + _ = evt.Content.ParseRaw(evt.Type) content.SetReply(evt) } return @@ -1450,8 +1460,8 @@ func (portal *Portal) HandleTextMessage(source *User, message skype.Resource) { MsgType: event.MsgText, } - portal.bridge.Formatter.ParseSkype(content) - portal.SetReplySkype(content, message) + portal.bridge.Formatter.ParseSkype(content, portal.MXID) + // portal.SetReplySkype(content, message) fmt.Println() fmt.Printf("portal HandleTextMessage2: %+v", content) @@ -1492,7 +1502,7 @@ func (portal *Portal) HandleLocationMessageSkype(source *User, message skype.Res GeoURI: geo, } - portal.SetReplySkype(content, message) + // portal.SetReplySkype(content, message) _, _ = intent.UserTyping(portal.MXID, false, 0) resp, err := portal.sendMessage(intent, event.EventMessage, content, message.Timestamp * 1000) @@ -1522,7 +1532,7 @@ func (portal *Portal) HandleContactMessageSkype(source *User, message skype.Reso MsgType: event.MsgText, } - portal.SetReplySkype(content, message) + // portal.SetReplySkype(content, message) _, _ = intent.UserTyping(portal.MXID, false, 0) resp, err := portal.sendMessage(intent, event.EventMessage, content, message.Timestamp * 1000) @@ -1659,7 +1669,7 @@ func (portal *Portal) HandleMediaMessageSkype(source *User, download func(conn * } else { content.URL = uploaded.ContentURI.CUString() } - portal.SetReplySkype(content, info) + // portal.SetReplySkype(content, info) fmt.Println() fmt.Println("mediaMessage.UrlThumbnail", mediaMessage.UrlThumbnail)