diff --git a/go.mod b/go.mod index 0c18c8d..d43fbef 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,8 @@ module git.sr.ht/~thrrgilag/pnut-bridge go 1.16 require ( - git.sr.ht/~thrrgilag/woodstock v0.0.0-20210613221914-3b9e0ef92799 + git.sr.ht/~thrrgilag/woodstock v0.0.0-20210714032038-b22c4f10cc34 + github.com/gabriel-vasile/mimetype v1.3.1 // indirect github.com/gorilla/websocket v1.4.2 github.com/smartystreets/goconvey v1.6.4 // indirect gopkg.in/ini.v1 v1.62.0 diff --git a/go.sum b/go.sum index 642b5ed..9b5e2c8 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,9 @@ git.sr.ht/~thrrgilag/woodstock v0.0.0-20210613221914-3b9e0ef92799 h1:iiUiZTW7yksLArreiNO1KcAkMmAvmMquz6etgaKzpCU= git.sr.ht/~thrrgilag/woodstock v0.0.0-20210613221914-3b9e0ef92799/go.mod h1:giZm2mNVkz9BeA31LtUC2gwIYfUSUPQINp+tI8EGFTc= +git.sr.ht/~thrrgilag/woodstock v0.0.0-20210714032038-b22c4f10cc34 h1:nTH4UWrZTwEhkFvuR4Y4vV6KMSoZuF+3qFmgGs9Vm2I= +git.sr.ht/~thrrgilag/woodstock v0.0.0-20210714032038-b22c4f10cc34/go.mod h1:giZm2mNVkz9BeA31LtUC2gwIYfUSUPQINp+tI8EGFTc= +github.com/gabriel-vasile/mimetype v1.3.1 h1:qevA6c2MtE1RorlScnixeG0VA1H4xrXyhyX3oWBynNQ= +github.com/gabriel-vasile/mimetype v1.3.1/go.mod h1:fA8fi6KUiG7MgQQ+mEWotXoEOvmxRtOJlERCzSmRvr8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= @@ -12,8 +16,15 @@ github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIK github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20210505024714-0287a6fb4125 h1:Ugb8sMTWuWRC3+sz5WeN/4kejDx9BvIwnPUiJBjJE+8= +golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= gopkg.in/ini.v1 v1.62.0 h1:duBzk771uxoUuOlyRLkHsygud9+5lrlGjdFBb4mSKDU= gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= diff --git a/pnut-bridge.go b/pnut-bridge.go index c67d56b..51c2eba 100644 --- a/pnut-bridge.go +++ b/pnut-bridge.go @@ -2,16 +2,23 @@ package main import ( "bytes" + "encoding/base64" "encoding/json" "flag" + "image" + _ "image/gif" + _ "image/jpeg" + _ "image/png" "io/ioutil" "log" "net/http" "net/url" "os" + "strings" "time" "git.sr.ht/~thrrgilag/woodstock" + "github.com/gabriel-vasile/mimetype" "github.com/gorilla/websocket" "gopkg.in/ini.v1" ) @@ -97,6 +104,8 @@ type PnutOembed struct { Type string `json:"type"` Title string `json:"title"` Url string `json:"url"` + Width int `json:"width"` + Height int `json:"height"` } func subscribe(connection_id string, access_token string, rooms []Room) { @@ -207,28 +216,35 @@ func bridgeMsgHandler(conf *Config, msg MbMessage) { client.SetAccessToken(conf.PnutAccessToken) channel_id := getPnutChannel(conf.Rooms, msg.Gateway) text := msg.Username + " " + msg.Text + var raw []woodstock.Raw for _, file := range msg.Extra.File { - text = text + "\n" + file.URL - // log.Println("name, ", file.Name) - // log.Println("url, ", file.URL) - // fdata, err := base64.StdEncoding.DecodeString(file.Data) - // if err != nil { - // log.Println("!! error decoding file", err) - // } - // mtype := mimetype.Detect(fdata) - // log.Println("type, ", mtype) - // if strings.HasPrefix(mtype, "image") { - // oembed := PnutOembed{ - // Version: "1.0", - // Type: "photo", - // Title: file.Name, - // Url: file.URL, - // } - // // TODO finish this when woodstock is fixed - // } + fdata, err := base64.StdEncoding.DecodeString(file.Data) + if err != nil { + log.Println("!! error decoding file", err) + } + mtype := mimetype.Detect(fdata) + ir := bytes.NewReader(fdata) + im, _, err := image.DecodeConfig(ir) + if err != nil { + log.Println("Couldn't decode image?", err) + } + if strings.HasPrefix(mtype.String(), "image") { + oembed := PnutOembed{ + Version: "1.0", + Type: "photo", + Title: file.Name, + Url: file.URL, + Width: im.Width, + Height: im.Height, + } + raw = append(raw, woodstock.Raw{Type: "io.pnut.core.oembed", Value: oembed}) + } else { + text = text + "\n" + file.URL + } } log.Printf(">> sending message from %s to channel %s ...", msg.Gateway, channel_id) - _, err := client.CreateMessage(channel_id, text) + newmessage := woodstock.NewMessage{Text: text, Raw: raw} + _, err := client.CreateMessage(channel_id, newmessage) if err != nil { log.Println("!! problem posting message to pnut.io", err) }