Merge branch 'develop'

This commit is contained in:
zhaoYangguang 2021-02-06 17:37:42 +08:00
commit edb0eb1d08
8 changed files with 43 additions and 91 deletions

View File

@ -29,6 +29,7 @@ type Config struct {
Homeserver struct { Homeserver struct {
Address string `yaml:"address"` Address string `yaml:"address"`
Domain string `yaml:"domain"` Domain string `yaml:"domain"`
ServerName string `yaml:"server_name"`
} `yaml:"homeserver"` } `yaml:"homeserver"`
AppService struct { AppService struct {

View File

@ -4,6 +4,8 @@ homeserver:
address: https://example.com address: https://example.com
# The domain of the homeserver (for MXIDs, etc). # The domain of the homeserver (for MXIDs, etc).
domain: example.com domain: example.com
# If you dont 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. # Application service host/registration related details.
# Changing these values requires regeneration of the registration. # Changing these values requires regeneration of the registration.

View File

@ -138,8 +138,8 @@ func (formatter *Formatter) ParseSkype(content *event.MessageEventContent, RoomM
msgMXID = string(msg.MXID) msgMXID = string(msg.MXID)
} }
mxid, _ = formatter.getMatrixInfoByJID("8:" + match[1] + skypeExt.NewUserSuffix) 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) 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.Domain, mxid) href2 := fmt.Sprintf(`https://%s/#/user/%s`, formatter.bridge.Config.Homeserver.ServerName, mxid)
newContent := fmt.Sprintf(`<mx-reply><blockquote><a href="%s">In reply to</a> <a href="%s">%s</a><br>%s</blockquote></mx-reply>`, newContent := fmt.Sprintf(`<mx-reply><blockquote><a href="%s">In reply to</a> <a href="%s">%s</a><br>%s</blockquote></mx-reply>`,
href1, href1,
href2, href2,
@ -170,9 +170,10 @@ func (formatter *Formatter) ParseSkype(content *event.MessageEventContent, RoomM
if len(matches) > 0 { if len(matches) > 0 {
for _, match := range matches { for _, match := range matches {
mxid, displayname := formatter.getMatrixInfoByJID(match[1] + skypeExt.NewUserSuffix) mxid, displayname := formatter.getMatrixInfoByJID(match[1] + skypeExt.NewUserSuffix)
number := "@" + strings.Replace(match[1], skypeExt.NewUserSuffix, "", 1) // number := "@" + strings.Replace(match[1], skypeExt.NewUserSuffix, "", 1)
originStr = strings.ReplaceAll(originStr, match[0], fmt.Sprintf(`<a href="https://%s/#/%s">%s</a>:`, formatter.bridge.Config.Homeserver.Domain, mxid, displayname)) replaceStr := fmt.Sprintf(`<a href="https://%s/#/%s">%s</a>:`, formatter.bridge.Config.Homeserver.ServerName, mxid, displayname)
originBodyStr = strings.Replace(originStr, number, displayname, -1) originStr = strings.ReplaceAll(originStr, match[0], replaceStr)
originBodyStr = strings.ReplaceAll(originStr, replaceStr, displayname + ":")
} }
if len(backStr) == 0 { if len(backStr) == 0 {
content.Format = event.FormatHTML content.Format = event.FormatHTML

2
go.mod
View File

@ -5,7 +5,7 @@ go 1.14
require ( require (
github.com/chai2010/webp v1.1.0 github.com/chai2010/webp v1.1.0
github.com/gorilla/websocket v1.4.2 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/lib/pq v1.7.0
github.com/mattn/go-sqlite3 v2.0.3+incompatible github.com/mattn/go-sqlite3 v2.0.3+incompatible
github.com/pkg/errors v0.9.1 github.com/pkg/errors v0.9.1

2
go.sum
View File

@ -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.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 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.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/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= 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= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4=

View File

@ -257,7 +257,7 @@ func (mx *MatrixHandler) HandleMembership(evt *event.Event) {
} }
user := mx.bridge.GetUserByMXID(evt.Sender) 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 return
} }
@ -307,7 +307,7 @@ func (mx *MatrixHandler) HandleRoomMetadata(evt *event.Event) {
} }
portal := mx.bridge.GetPortalByMXID(evt.RoomID) 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 return
} }
@ -449,7 +449,7 @@ func (mx *MatrixHandler) HandleRedaction(evt *event.Event) {
} }
portal := mx.bridge.GetPortalByMXID(evt.RoomID) 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) portal.HandleMatrixRedaction(user, evt)
} }
} }

View File

@ -1420,8 +1420,8 @@ func (portal *Portal) sendMessage(intent *appservice.IntentAPI, eventType event.
"net.maunium.whatsapp.puppet": intent.IsCustomPuppet, "net.maunium.whatsapp.puppet": intent.IsCustomPuppet,
} }
} }
fmt.Println() fmt.Println("portal sendMessage timestamp:", timestamp)
fmt.Printf("portal sendMessage0: %+v", content) fmt.Printf("portal sendMessage: %+v", content)
if portal.Encrypted && portal.bridge.Crypto != nil { if portal.Encrypted && portal.bridge.Crypto != nil {
encrypted, err := portal.bridge.Crypto.Encrypt(portal.MXID, eventType, wrappedContent) encrypted, err := portal.bridge.Crypto.Encrypt(portal.MXID, eventType, wrappedContent)
if err != nil { if err != nil {
@ -1431,12 +1431,8 @@ func (portal *Portal) sendMessage(intent *appservice.IntentAPI, eventType event.
wrappedContent.Parsed = encrypted wrappedContent.Parsed = encrypted
} }
if timestamp == 0 { if timestamp == 0 {
fmt.Println()
fmt.Printf("portal sendMessage1: %+v", content)
return intent.SendMessageEvent(portal.MXID, eventType, &wrappedContent) return intent.SendMessageEvent(portal.MXID, eventType, &wrappedContent)
} else { } else {
fmt.Println()
fmt.Printf("portal sendMessage2: %+v", content)
return intent.SendMassagedMessageEvent(portal.MXID, eventType, &wrappedContent, timestamp) return intent.SendMassagedMessageEvent(portal.MXID, eventType, &wrappedContent, timestamp)
} }
} }
@ -2042,7 +2038,7 @@ func (portal *Portal) convertMatrixMessageSkype(sender *User, evt *event.Event)
} }
// mention user message // mention user message
r := regexp.MustCompile(`(?m)<a[^>]+\bhref="(.*?)://` + portal.bridge.Config.Homeserver.Domain + `/#/@([^"]+):(.*?)">(.*?)</a>`) r := regexp.MustCompile(`(?m)<a[^>]+\bhref="(.*?)://` + portal.bridge.Config.Homeserver.ServerName + `/#/@([^"]+):(.*?)">(.*?)</a>`)
matches := r.FindAllStringSubmatch(matchStr, -1) matches := r.FindAllStringSubmatch(matchStr, -1)
fmt.Println("matches: ", matches) fmt.Println("matches: ", matches)
if len(matches) > 0 { 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) { func SendMsg(sender *User, chatThreadId string, content *skype.SendMessage, output chan<- error) (err error) {
fmt.Println("message SendMsg type: ", content.Type) fmt.Println("message SendMsg type: ", content.Type)
switch event.MessageType(content.Type) { if sender.Conn.LoginInfo != nil {
case event.MsgText, event.MsgEmote, event.MsgNotice: switch event.MessageType(content.Type) {
err = sender.Conn.SendText(chatThreadId, content) case event.MsgText, event.MsgEmote, event.MsgNotice:
case event.MsgImage: err = sender.Conn.SendText(chatThreadId, content)
fmt.Println("message SendMsg type m.image: ", content.Type) case event.MsgImage:
err = sender.Conn.SendFile(chatThreadId, content) fmt.Println("message SendMsg type m.image: ", content.Type)
case event.MsgVideo: err = sender.Conn.SendFile(chatThreadId, content)
fmt.Println("message SendMsg type m.video: ", content.Type) case event.MsgVideo:
err = sender.Conn.SendFile(chatThreadId, content) fmt.Println("message SendMsg type m.video: ", content.Type)
case event.MsgAudio: err = sender.Conn.SendFile(chatThreadId, content)
fmt.Println("message SendMsg type m.audio: ", content.Type) case event.MsgAudio:
err = sender.Conn.SendFile(chatThreadId, content) fmt.Println("message SendMsg type m.audio: ", content.Type)
case event.MsgFile: err = sender.Conn.SendFile(chatThreadId, content)
fmt.Println("message SendMsg type m.file: ", content.Type) case event.MsgFile:
err = sender.Conn.SendFile(chatThreadId, content) fmt.Println("message SendMsg type m.file: ", content.Type)
case event.MsgLocation: err = sender.Conn.SendFile(chatThreadId, content)
fmt.Println("message SendMsg type m.location: ", content.Type) case event.MsgLocation:
//err = c.SendFile(chatThreadId, content) fmt.Println("message SendMsg type m.location: ", content.Type)
default: //err = c.SendFile(chatThreadId, content)
err = errors.New("send to skype(unknown message type)") 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 { if err != nil {
output <- fmt.Errorf("message sending responded with %d", err) output <- err
} else { } else {
output <- nil output <- nil
} }

54
user.go
View File

@ -12,8 +12,6 @@ import (
"sync" "sync"
"time" "time"
//"github.com/pkg/errors"
"github.com/skip2/go-qrcode"
log "maunium.net/go/maulogger/v2" log "maunium.net/go/maulogger/v2"
"maunium.net/go/mautrix" "maunium.net/go/mautrix"
@ -328,58 +326,6 @@ func (user *User) IsLoginInProgress() bool {
return user.Conn != nil && user.Conn.IsLoginInProgress() 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) { func (user *User) Login(ce *CommandEvent, name string, password string) (err error) {
if user.contactsPresence == nil { if user.contactsPresence == nil {
user.contactsPresence = make(map[string]*skypeExt.Presence) user.contactsPresence = make(map[string]*skypeExt.Presence)