From ec4dbf1e070d8445cc36c7f0a228959bf4b319c4 Mon Sep 17 00:00:00 2001 From: zhaoYangguang <1163765691@qq.com> Date: Tue, 16 Nov 2021 18:02:40 +0800 Subject: [PATCH 1/2] format file --- config/config.go | 6 +-- portal.go | 124 +++++++++++++++++++++-------------------------- 2 files changed, 58 insertions(+), 72 deletions(-) diff --git a/config/config.go b/config/config.go index b999fd7..36ea561 100644 --- a/config/config.go +++ b/config/config.go @@ -27,9 +27,9 @@ import ( type Config struct { Homeserver struct { - Address string `yaml:"address"` - Domain string `yaml:"domain"` - ServerName string `yaml:"server_name"` + Address string `yaml:"address"` + Domain string `yaml:"domain"` + ServerName string `yaml:"server_name"` } `yaml:"homeserver"` AppService struct { diff --git a/portal.go b/portal.go index 7c7004c..3247d30 100644 --- a/portal.go +++ b/portal.go @@ -2,14 +2,13 @@ package main import ( "bytes" + "github.com/gabriel-vasile/mimetype" "maunium.net/go/mautrix/patch" "encoding/hex" "encoding/xml" "fmt" - skype "github.com/kelaresg/go-skypeapi" - skypeExt "github.com/kelaresg/matrix-skype/skype-ext" "html" "image" "image/gif" @@ -24,6 +23,9 @@ import ( "sync" "time" + skype "github.com/kelaresg/go-skypeapi" + skypeExt "github.com/kelaresg/matrix-skype/skype-ext" + "github.com/pkg/errors" log "maunium.net/go/maulogger/v2" "maunium.net/go/mautrix" @@ -205,16 +207,16 @@ func (portal *Portal) handleMessage(msg PortalMessage) { portal.HandleTextMessage(msg.source, data) case "RichText/UriObject": //portal.HandleMediaMessage(msg.source, data.Download, data.Thumbnail, data.Info, data.ContextInfo, data.Type, data.Caption, 0, false) - portal.HandleMediaMessageSkype(msg.source, data.Download, data.MessageType,nil, data,false) + portal.HandleMediaMessageSkype(msg.source, data.Download, data.MessageType, nil, data, false) case "RichText/Media_Video": //portal.HandleMediaMessage(msg.source, data.Download, data.Thumbnail, data.Info, data.ContextInfo, data.Type, data.Caption, 0, false) - portal.HandleMediaMessageSkype(msg.source, data.Download, data.MessageType,nil, data,false) + portal.HandleMediaMessageSkype(msg.source, data.Download, data.MessageType, nil, data, false) case "RichText/Media_AudioMsg": //portal.HandleMediaMessage(msg.source, data.Download, data.Thumbnail, data.Info, data.ContextInfo, data.Type, data.Caption, 0, false) - portal.HandleMediaMessageSkype(msg.source, data.Download, data.MessageType,nil, data,false) + portal.HandleMediaMessageSkype(msg.source, data.Download, data.MessageType, nil, data, false) case "RichText/Media_GenericFile": //portal.HandleMediaMessage(msg.source, data.Download, data.Thumbnail, data.Info, data.ContextInfo, data.Type, data.Caption, 0, false) - portal.HandleMediaMessageSkype(msg.source, data.Download, data.MessageType,nil, data,false) + portal.HandleMediaMessageSkype(msg.source, data.Download, data.MessageType, nil, data, false) case "RichText/Contacts": portal.HandleContactMessageSkype(msg.source, data) case "RichText/Location": @@ -297,7 +299,7 @@ func (portal *Portal) markHandledSkype(source *User, message *skype.Resource, mx } msg.Content = message.Content - if len(message.Id)>0 { + if len(message.Id) > 0 { msg.ID = message.Id } msg.Insert() @@ -341,7 +343,7 @@ func (portal *Portal) getMessageIntentSkype(user *User, info skype.Resource) *ap fmt.Println() fmt.Println("getMessageIntentSkype") fmt.Println() - return portal.bridge.GetPuppetByJID(info.SendId+skypeExt.NewUserSuffix).IntentFor(portal) + return portal.bridge.GetPuppetByJID(info.SendId + skypeExt.NewUserSuffix).IntentFor(portal) } func (portal *Portal) handlePrivateChatFromMe(fromMe bool) func() { @@ -566,12 +568,12 @@ func (portal *Portal) UpdateMetadata(user *User) bool { } // portal.Topic = "" //if metadata.Status != 0 { - // 401: access denied - // 404: group does (no longer) exist - // 500: ??? happens with status@broadcast + // 401: access denied + // 404: group does (no longer) exist + // 500: ??? happens with status@broadcast - // TODO: update the room, e.g. change priority level - // to send messages to moderator + // TODO: update the room, e.g. change priority level + // to send messages to moderator // return false //} @@ -665,8 +667,8 @@ func (portal *Portal) SyncSkype(user *User, chat skype.Conversation) { update = portal.UpdateMetadata(user) || update } // if !portal.IsStatusBroadcastRoom() { - //fmt.Println("SyncSkype portal.UpdateAvatar", portal.MXID) - // update = portal.UpdateAvatar(user, nil) || update + //fmt.Println("SyncSkype portal.UpdateAvatar", portal.MXID) + // update = portal.UpdateAvatar(user, nil) || update // } if update { fmt.Println("SyncSkype portal.Update", portal.MXID) @@ -1009,7 +1011,7 @@ func (portal *Portal) handleHistory(user *User, messages []skype.Resource) { } t, _ := time.Parse(time.RFC3339, message.ComposeTime) message.Timestamp = t.Unix() - portal.handleMessage(PortalMessage{ portal.Key.JID, user, message, uint64(message.Timestamp)}) + portal.handleMessage(PortalMessage{portal.Key.JID, user, message, uint64(message.Timestamp)}) } } @@ -1088,7 +1090,7 @@ func (portal *Portal) CreateMatrixRoom(user *User) error { var metadata *skypeExt.GroupInfo if portal.IsPrivateChat() { - puppet := portal.bridge.GetPuppetByJID(portal.Key.JID+skypeExt.NewUserSuffix) + puppet := portal.bridge.GetPuppetByJID(portal.Key.JID + skypeExt.NewUserSuffix) if portal.bridge.Config.Bridge.PrivateChatPortalMeta { portal.Name = puppet.Displayname portal.AvatarURL = puppet.AvatarURL @@ -1288,7 +1290,7 @@ func (portal *Portal) IsStatusBroadcastRoom() bool { func (portal *Portal) MainIntent() *appservice.IntentAPI { if portal.IsPrivateChat() { fmt.Println("IsPrivateChat") - return portal.bridge.GetPuppetByJID(portal.Key.JID+skypeExt.NewUserSuffix).DefaultIntent() + return portal.bridge.GetPuppetByJID(portal.Key.JID + skypeExt.NewUserSuffix).DefaultIntent() } fmt.Println("not IsPrivateChat") return portal.bridge.Bot @@ -1469,15 +1471,15 @@ func (portal *Portal) HandleTextMessage(source *User, message skype.Resource) { msg := source.bridge.DB.Message.GetByJID(portal.Key, message.SkypeEditedId) if msg != nil && len(msg.MXID) > 0 { inRelateTo := &event.RelatesTo{ - Type: event.RelReplace, + Type: event.RelReplace, EventID: msg.MXID, } content.SetRelatesTo(inRelateTo) content.NewContent = &event.MessageEventContent{ - MsgType: content.MsgType, - Body: content.Body, + MsgType: content.MsgType, + Body: content.Body, FormattedBody: content.FormattedBody, - Format: content.Format, + Format: content.Format, } } } @@ -1491,7 +1493,7 @@ func (portal *Portal) HandleTextMessage(source *User, message skype.Resource) { } func (portal *Portal) trySendMessage(intent *appservice.IntentAPI, eventType event.Type, content interface{}, source *User, message skype.Resource) (resp *mautrix.RespSendEvent, err error) { - resp, err = portal.sendMessage(intent, eventType, content, message.Timestamp * 1000) + resp, err = portal.sendMessage(intent, eventType, content, message.Timestamp*1000) if err != nil { portal.log.Errorfln("Failed to handle message %s: %v", message.Id, err) if strings.Index(err.Error(), "M_UNKNOWN_TOKEN (HTTP 401)") > -1 { @@ -1499,7 +1501,7 @@ func (portal *Portal) trySendMessage(intent *appservice.IntentAPI, eventType eve err, accessToken := source.UpdateAccessToken(puppet) if err == nil && accessToken != "" { intent.AccessToken = accessToken - resp, err = portal.sendMessage(intent, eventType, content, message.Timestamp * 1000) + resp, err = portal.sendMessage(intent, eventType, content, message.Timestamp*1000) if err != nil { portal.log.Errorfln("Failed to handle message %s: %v", message.Id, err) } @@ -1511,7 +1513,7 @@ func (portal *Portal) trySendMessage(intent *appservice.IntentAPI, eventType eve UserID: intent.UserID, }) if err == nil { - resp, err = portal.sendMessage(intent, eventType, content, message.Timestamp * 1000) + resp, err = portal.sendMessage(intent, eventType, content, message.Timestamp*1000) } } } @@ -1526,14 +1528,14 @@ func (portal *Portal) HandleLocationMessageSkype(source *User, message skype.Res if intent == nil { return } - locationMessage, err:= message.ParseLocation() + locationMessage, err := message.ParseLocation() if err != nil { portal.log.Errorfln("Failed to parse contact message of %s: %v", message, err) return } latitude, _ := strconv.Atoi(locationMessage.Latitude) - longitude, _:= strconv.Atoi(locationMessage.Longitude) + longitude, _ := strconv.Atoi(locationMessage.Longitude) geo := fmt.Sprintf("geo:%.6f,%.6f", float32(latitude)/1000000, float32(longitude)/1000000) content := &event.MessageEventContent{ MsgType: event.MsgText, @@ -1567,7 +1569,7 @@ func (portal *Portal) HandleContactMessageSkype(source *User, message skype.Reso if intent == nil { return } - contactMessage, err:= message.ParseContact() + contactMessage, err := message.ParseContact() if err != nil { portal.log.Errorfln("Failed to parse contact message of %s: %v", message, err) return @@ -1723,15 +1725,9 @@ func (portal *Portal) HandleMediaMessageSkype(source *User, download func(conn * } else { content.URL = uploaded.ContentURI.CUString() } - // portal.SetReplySkype(content, info) - fmt.Println() - fmt.Println("mediaMessage.UrlThumbnail", mediaMessage.UrlThumbnail) - fmt.Println() - fmt.Printf("%+v", mediaMessage) - fmt.Println() thumbnail, err = skype.Download(mediaMessage.UrlThumbnail, source.Conn.Conn, 0) - if err != nil { + if err != nil { portal.log.Errorfln("Failed to download thumbnail for %s: %v", err) } @@ -1756,14 +1752,6 @@ func (portal *Portal) HandleMediaMessageSkype(source *User, download func(conn * Height: thumbnailCfg.Height, MimeType: thumbnailMime, } - fmt.Println("content.Info") - fmt.Printf("%+v", content) - fmt.Println() - fmt.Printf("%+v", *content.Info.ThumbnailInfo) - fmt.Println() - fmt.Println() - fmt.Printf("%+v", content.Info.ThumbnailInfo) - fmt.Println() } } @@ -1948,8 +1936,8 @@ func (portal *Portal) convertMatrixMessageSkype(sender *User, evt *event.Event) clientMessageId := currentTimeNanoStr + fmt.Sprintf("%04v", rand.New(rand.NewSource(time.Now().UnixNano())).Intn(10000)) info := &skype.SendMessage{ ClientMessageId: clientMessageId, - Jid: portal.Key.JID,//receiver id(conversation id) - Timestamp: time.Now().Unix(), + Jid: portal.Key.JID, //receiver id(conversation id) + Timestamp: time.Now().Unix(), } replyToID := content.GetReplyTo() @@ -1960,7 +1948,7 @@ func (portal *Portal) convertMatrixMessageSkype(sender *User, evt *event.Event) a = strings.Replace(a, "8:", "", 1) tsMs := strconv.FormatInt(time.Now().UnixNano()/1e6, 10) r := []rune(tsMs) - ts := string(r[:len(r) - 3]) + ts := string(r[:len(r)-3]) msg := portal.bridge.DB.Message.GetByMXID(content.RelatesTo.EventID) if msg != nil && len(msg.JID) > 0 { info.SkypeEditedId = msg.JID @@ -2020,7 +2008,7 @@ func (portal *Portal) convertMatrixMessageSkype(sender *User, evt *event.Event) conversation := msg.Chat.Receiver cuid := msg.JID r := []rune(messageId) - timestamp := string(r[:len(r) - 3]) + timestamp := string(r[:len(r)-3]) quoteMessage := msg.Content puppet := sender.bridge.GetPuppetByJID(msg.Sender) @@ -2056,11 +2044,10 @@ func (portal *Portal) convertMatrixMessageSkype(sender *User, evt *event.Event) if evt.Type == event.EventSticker { content.MsgType = event.MsgImage } - - fmt.Println("convertMatrixMessage content.MsgType: ", content.MsgType) - fmt.Println("convertMatrixMessage content.Body: ", content.Body) - fmt.Println("convertMatrixMessage content.NewBody: ", content.NewContent) - fmt.Println("convertMatrixMessage content.FormattedBody: ", content.FormattedBody) + portal.log.Debugln("convertMatrixMessage content.MsgType: ", content.MsgType) + portal.log.Debugln("convertMatrixMessage content.Body: ", content.Body) + portal.log.Debugln("convertMatrixMessage content.NewBody: ", content.NewContent) + portal.log.Debugln("convertMatrixMessage content.FormattedBody: ", content.FormattedBody) info.Type = string(content.MsgType) switch content.MsgType { case event.MsgText, event.MsgEmote, event.MsgNotice: @@ -2106,15 +2093,15 @@ func (portal *Portal) convertMatrixMessageSkype(sender *User, evt *event.Event) if len(content.FormattedBody) > 0 { info.SendTextMessage = &skype.SendTextMessage{ - Content : content.FormattedBody, + Content: content.FormattedBody, } } else { info.SendTextMessage = &skype.SendTextMessage{ - Content : content.Body, + Content: content.Body, } } case event.MsgImage: - caption, fileSize , data := portal.preprocessMatrixMediaSkype(relaybotFormatted, content, evt.ID) + caption, fileSize, data := portal.preprocessMatrixMediaSkype(relaybotFormatted, content, evt.ID) //if media == nil { // return nil, sender, content //} @@ -2127,7 +2114,7 @@ func (portal *Portal) convertMatrixMessageSkype(sender *User, evt *event.Event) Duration: 0, } case event.MsgVideo: - _, fileSize , data := portal.preprocessMatrixMediaSkype(relaybotFormatted, content, evt.ID) + _, fileSize, data := portal.preprocessMatrixMediaSkype(relaybotFormatted, content, evt.ID) duration := uint32(content.GetInfo().Duration) info.SendMediaMessage = &skype.SendMediaMessage{ FileName: content.Body, @@ -2137,7 +2124,7 @@ func (portal *Portal) convertMatrixMessageSkype(sender *User, evt *event.Event) Duration: int(duration), } case event.MsgAudio: - _, fileSize , data := portal.preprocessMatrixMediaSkype(relaybotFormatted, content, evt.ID) + _, fileSize, data := portal.preprocessMatrixMediaSkype(relaybotFormatted, content, evt.ID) duration := uint32(content.GetInfo().Duration) info.SendMediaMessage = &skype.SendMediaMessage{ FileName: content.Body, @@ -2147,7 +2134,7 @@ func (portal *Portal) convertMatrixMessageSkype(sender *User, evt *event.Event) Duration: int(duration), } case event.MsgFile: - _, fileSize , data := portal.preprocessMatrixMediaSkype(relaybotFormatted, content, evt.ID) + _, fileSize, data := portal.preprocessMatrixMediaSkype(relaybotFormatted, content, evt.ID) info.SendMediaMessage = &skype.SendMediaMessage{ FileName: content.Body, FileType: content.GetInfo().MimeType, @@ -2197,12 +2184,11 @@ func (portal *Portal) sendDeliveryReceipt(eventID id.EventID) { var timeout = errors.New("message sending timed out") func (portal *Portal) HandleMatrixMessage(sender *User, evt *event.Event) { - fmt.Println("portal HandleMatrixMessage sender.JID: ", sender.JID) - fmt.Println("portal HandleMatrixMessage portal.Key.Receiver: ", portal.Key.Receiver) - fmt.Println("portal HandleMatrixMessage portal.Key.JID: ", portal.Key.JID) - if !portal.HasRelaybot() && ( - (portal.IsPrivateChat() && sender.JID != portal.Key.Receiver) || - portal.sendMatrixConnectionError(sender, evt.ID)) { + portal.log.Debugln("HandleMatrixMessage sender.JID: ", sender.JID) + portal.log.Debugln("HandleMatrixMessage portal.Key.Receiver: ", portal.Key.Receiver) + portal.log.Debugln("HandleMatrixMessage portal.Key.JID: ", portal.Key.JID) + if !portal.HasRelaybot() && ((portal.IsPrivateChat() && sender.JID != portal.Key.Receiver) || + portal.sendMatrixConnectionError(sender, evt.ID)) { return } portal.log.Debugfln("Received event %s", evt.ID) @@ -2222,9 +2208,9 @@ func (portal *Portal) HandleMatrixMessage(sender *User, evt *event.Event) { fmt.Println("portal HandleMatrixMessage start markHandledSkype: ") portal.markHandledSkype(sender, &skype.Resource{ ClientMessageId: info.ClientMessageId, - Jid: portal.Key.JID,//receiver id(conversation id) - Timestamp: time.Now().Unix(), - Content: content, + Jid: portal.Key.JID, //receiver id(conversation id) + Timestamp: time.Now().Unix(), + Content: content, }, evt.ID) portal.log.Debugln("Sending event", evt.ID, "to Skype") @@ -2450,7 +2436,7 @@ func (portal *Portal) HandleMatrixLeave(sender *User) { } func (portal *Portal) HandleMatrixKick(sender *User, evt *event.Event) { - jid, _:= portal.bridge.ParsePuppetMXID(id.UserID(evt.GetStateKey())) + jid, _ := portal.bridge.ParsePuppetMXID(id.UserID(evt.GetStateKey())) puppet := portal.bridge.GetPuppetByJID(jid) if puppet != nil { jid = strings.Replace(jid, skypeExt.NewUserSuffix, "", 1) @@ -2463,7 +2449,7 @@ func (portal *Portal) HandleMatrixKick(sender *User, evt *event.Event) { } func (portal *Portal) HandleMatrixInvite(sender *User, evt *event.Event) { - jid, _:= portal.bridge.ParsePuppetMXID(id.UserID(evt.GetStateKey())) + jid, _ := portal.bridge.ParsePuppetMXID(id.UserID(evt.GetStateKey())) puppet := portal.bridge.GetPuppetByJID(jid) if puppet != nil { jid = strings.Replace(jid, skypeExt.NewUserSuffix, "", 1) From a84094b6017f7ac1e6311a608c680594996a5c66 Mon Sep 17 00:00:00 2001 From: zhaoYangguang <1163765691@qq.com> Date: Tue, 16 Nov 2021 18:03:03 +0800 Subject: [PATCH 2/2] fix mention user --- portal.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/portal.go b/portal.go index 3247d30..b1fd51b 100644 --- a/portal.go +++ b/portal.go @@ -2067,15 +2067,15 @@ func (portal *Portal) convertMatrixMessageSkype(sender *User, evt *event.Event) // mention user message r := regexp.MustCompile(`(?m)]+\bhref="(.*?)://` + portal.bridge.Config.Homeserver.ServerName + `/#/@([^"]+):(.*?)">(.*?)`) matches := r.FindAllStringSubmatch(matchStr, -1) - fmt.Println("matches: ", matches) + portal.log.Debugln("matches: ", matches) if len(matches) > 0 { for _, match := range matches { if len(match) > 2 { skyId := patch.ParseLocalPart(html.UnescapeString(match[2]), false) - skyId = strings.ReplaceAll(skyId, "skype&", "") + skyId = strings.ReplaceAll(skyId, patch.AsUserPrefix, "") skyId = strings.ReplaceAll(skyId, "-", ":") // Adapt to the message format sent by the matrix front end - matchStr = strings.ReplaceAll(matchStr, match[0] + ":", fmt.Sprintf(`%s`, skyId, match[4])) + matchStr = strings.ReplaceAll(matchStr, match[0]+":", fmt.Sprintf(`%s`, skyId, match[4])) matchStr = strings.ReplaceAll(matchStr, match[0], fmt.Sprintf(`%s`, skyId, match[4])) } }