diff --git a/go.mod b/go.mod index 6e996c8..944cb55 100644 --- a/go.mod +++ b/go.mod @@ -9,6 +9,8 @@ require ( github.com/rs/xid v1.3.0 github.com/rs/zerolog v1.26.1 github.com/spf13/viper v1.10.1 + github.com/vanng822/go-premailer v1.20.1 + github.com/yuin/goldmark v1.4.4 golang.org/x/crypto v0.0.0-20211215165025-cf75a172585e gorm.io/driver/mysql v1.2.1 gorm.io/driver/postgres v1.2.3 @@ -17,6 +19,8 @@ require ( ) require ( + github.com/PuerkitoBio/goquery v1.5.1 // indirect + github.com/andybalholm/cascadia v1.1.0 // indirect github.com/fsnotify/fsnotify v1.5.1 // indirect github.com/gin-contrib/sse v0.1.0 // indirect github.com/go-playground/locales v0.13.0 // indirect @@ -24,6 +28,7 @@ require ( github.com/go-playground/validator/v10 v10.4.1 // indirect github.com/go-sql-driver/mysql v1.6.0 // indirect github.com/golang/protobuf v1.5.2 // indirect + github.com/gorilla/css v1.0.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/jackc/chunkreader/v2 v2.0.1 // indirect github.com/jackc/pgconn v1.10.1 // indirect @@ -50,6 +55,8 @@ require ( github.com/spf13/pflag v1.0.5 // indirect github.com/subosito/gotenv v1.2.0 // indirect github.com/ugorji/go/codec v1.1.7 // indirect + github.com/vanng822/css v1.0.1 // indirect + golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d // indirect golang.org/x/sys v0.0.0-20211210111614-af8b64212486 // indirect golang.org/x/text v0.3.7 // indirect google.golang.org/protobuf v1.27.1 // indirect diff --git a/go.sum b/go.sum index 38b75e8..c995562 100644 --- a/go.sum +++ b/go.sum @@ -1,6 +1,10 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc= github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= +github.com/PuerkitoBio/goquery v1.5.1 h1:PSPBGne8NIUWw+/7vFBV+kG2J/5MOjbzc7154OaKCSE= +github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc= +github.com/andybalholm/cascadia v1.1.0 h1:BuuO6sSfQNFRu1LppgbD25Hr2vLYW25JvxHs5zzsLTo= +github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= @@ -10,6 +14,7 @@ github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7Do github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= @@ -42,6 +47,8 @@ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/gorilla/css v1.0.0 h1:BQqNyPTi50JCFMTw/b67hByjMVXZRwGha6wxVGkeihY= +github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= @@ -176,6 +183,7 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= @@ -183,7 +191,15 @@ github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69 github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= +github.com/unrolled/render v1.0.3/go.mod h1:gN9T0NhL4Bfbwu8ann7Ry/TGHYfosul+J0obPf6NBdM= +github.com/vanng822/css v1.0.1 h1:10yiXc4e8NI8ldU6mSrWmSWMuyWgPr9DZ63RSlsgDw8= +github.com/vanng822/css v1.0.1/go.mod h1:tcnB1voG49QhCrwq1W0w5hhGasvOg+VQp9i9H1rCM1w= +github.com/vanng822/go-premailer v1.20.1 h1:2LTSIULXxNV5IOB5BSD3dlfOG95cq8qqExtRZMImTGA= +github.com/vanng822/go-premailer v1.20.1/go.mod h1:RAxbRFp6M/B171gsKu8dsyq+Y5NGsUUvYfg+WQWusbE= +github.com/vanng822/r2router v0.0.0-20150523112421-1023140a4f30/go.mod h1:1BVq8p2jVr55Ost2PkZWDrG86PiJ/0lxqcXoAcGxvWU= github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.4 h1:zNWRjYUW32G9KirMXYHQHVNFkXvMI7LpgNW2AgYAoIs= +github.com/yuin/goldmark v1.4.4/go.mod h1:rmuwmfZ0+bvzB24eSC//bk1R1Zp3hM0OXYv/G2LIilg= github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= @@ -212,12 +228,17 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d h1:LO7XpTYMwTqxjLcGWPijK3vRXg1aWdlNOVOHRq45d7c= +golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -230,6 +251,7 @@ golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 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/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= diff --git a/messenger/base.go b/messenger/base.go new file mode 100644 index 0000000..5e38084 --- /dev/null +++ b/messenger/base.go @@ -0,0 +1,22 @@ +package messenger + +type App struct { + Name string + Link string + Logo string + Copyright string +} + +type Base struct { + App App + Title string + Intros []string + Outros []string + Markdown string + + Greeting string + Receiver string + + Signature string + Sender string +} diff --git a/messenger/base.gohtml b/messenger/base.gohtml index 4adfac3..892f8a1 100644 --- a/messenger/base.gohtml +++ b/messenger/base.gohtml @@ -268,11 +268,11 @@ - - {{ if .Hermes.Product.Logo }} - + + {{ if .App.Logo }} + {{ else }} - {{ .Hermes.Product.Name }} + {{ .App.Name }} {{ end }} @@ -284,172 +284,38 @@ -

{{if .Email.Body.Title }}{{ .Email.Body.Title }}{{ else }}{{ .Email.Body.Greeting }} {{ .Email.Body.Name }},{{ end }}

- {{ with .Email.Body.Intros }} +

{{if .Greeting}}{{.Greeting}}{{else}}Hi{{end}} {{ .Receiver }},

+ {{/* Intros */}} + {{ with .Intros }} {{ if gt (len .) 0 }} {{ range $line := . }}

{{ $line }}

{{ end }} {{ end }} {{ end }} - {{ if (ne .Email.Body.FreeMarkdown "") }} - {{ .Email.Body.FreeMarkdown.ToHTML }} + + {{/* Main Body */}} + {{ if (ne .Markdown "") }} + {{ .Markdown | ToHTML }} {{ else }} - {{ with .Email.Body.Dictionary }} - {{ if gt (len .) 0 }} -
- {{ range $entry := . }} -
{{ $entry.Key }}:
-
{{ $entry.Value }}
- {{ end }} -
- {{ end }} - {{ end }} - - {{ with .Email.Body.Table }} - {{ $data := .Data }} - {{ $columns := .Columns }} - {{ if gt (len $data) 0 }} - - - - -
- - - {{ $col := index $data 0 }} - {{ range $entry := $col }} - - {{ end }} - - {{ range $row := $data }} - - {{ range $cell := $row }} - - {{ end }} - - {{ end }} -
-

{{ $entry.Key }}

-
- {{ $cell.Value }} -
-
- {{ end }} - {{ end }} - - {{ with .Email.Body.Actions }} - {{ if gt (len .) 0 }} - {{ range $action := . }} -

{{ $action.Instructions }}

- {{ $length := len $action.Button.Text }} - {{ $width := add (mul $length 9) 20 }} - {{if (lt $width 200)}}{{$width = 200}}{{else if (gt $width 570)}}{{$width = 570}}{{else}}{{end}} - {{safe "" }} - {{safe ""}} - - - - -
-
- {{ if $action.Button.Text }} - - {{ $action.Button.Text }} - - {{end}} - {{ if $action.InviteCode }} - {{ $action.InviteCode }} - {{end}} -
-
- {{safe "" }} - {{ end }} +

No Body

+ {{ end }} + + {{/* Outros */}} + {{ with .Outros }} + {{ if gt (len .) 0 }} + {{ range $line := . }} +

{{ $line }}

{{ end }} {{ end }} {{ end }} - {{ with .Email.Body.Outros }} - {{ if gt (len .) 0 }} - {{ range $line := . }} -

{{ $line }}

- {{ end }} - {{ end }} - {{ end }} + + {{/* End Email */}}

- {{.Email.Body.Signature}}, + {{.Signature}},
- {{.Hermes.Product.Name}} + {{ if .Sender }}{{.Sender}}{{else}}{{.App.Name}}{{end}}

- {{ if (eq .Email.Body.FreeMarkdown "") }} - {{ with .Email.Body.Actions }} - - - {{ range $action := . }} - {{if $action.Button.Text}} - - - - {{ end }} - {{ end }} - -
-

{{$.Hermes.Product.TroubleText | replace "{ACTION}" $action.Button.Text}}

-

{{ $action.Button.Link }}

-
- {{ end }} - {{ end }} @@ -461,7 +327,7 @@

- {{.Hermes.Product.Copyright}} + {{.App.Copyright}}

diff --git a/messenger/base.gohtml.bak b/messenger/base.gohtml.bak new file mode 100644 index 0000000..4adfac3 --- /dev/null +++ b/messenger/base.gohtml.bak @@ -0,0 +1,476 @@ + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
+ + \ No newline at end of file diff --git a/messenger/engine.go b/messenger/engine.go new file mode 100644 index 0000000..03f6c41 --- /dev/null +++ b/messenger/engine.go @@ -0,0 +1,47 @@ +package messenger + +import ( + "bytes" + _ "embed" + "html/template" + + "github.com/vanng822/go-premailer/premailer" + "github.com/yuin/goldmark" + "github.com/yuin/goldmark/extension" +) + +//go:embed base.gohtml +var mailTmpl string + +var engine *template.Template +var app App + +func init() { + md := goldmark.New( + goldmark.WithExtensions(extension.GFM), + ) + engine = template.Must(template.New("email").Funcs(template.FuncMap{ + "ToHTML": func(mdtext string) (string, error) { + var buf bytes.Buffer + if err := md.Convert([]byte(mdtext), &buf); err != nil { + return "", err + } + return buf.String(), nil + }, + }).Parse(mailTmpl)) +} + +func Parse(b *Base) (string, error) { + b.App = app + buf := &bytes.Buffer{} + err := engine.Execute(buf, b) + if err != nil { + return "", err + } + pre, err := premailer.NewPremailerFromString(buf.String(), premailer.NewOptions()) + if err != nil { + return "", err + } + html, err := pre.Transform() + return html, err +} diff --git a/messenger/messenger.go b/messenger/messenger.go index 8393a7d..d4f5a68 100644 --- a/messenger/messenger.go +++ b/messenger/messenger.go @@ -1,5 +1,5 @@ package messenger func init() { - + // viper.SetDefault() } diff --git a/messenger/service.go b/messenger/service.go new file mode 100644 index 0000000..edfb7db --- /dev/null +++ b/messenger/service.go @@ -0,0 +1,23 @@ +package messenger + +import ( + "fmt" + "time" + + "github.com/spf13/viper" + "kumoly.io/kumoly/app/system" +) + +type Messenger struct { + system.BaseService +} + +func (srv Messenger) GetName() string { return "messenger.Messenger" } + +func (srv *Messenger) Init() error { + app.Name = viper.GetString("name") + app.Copyright = fmt.Sprintf("Copyright © %v %s. All rights reserved.", + time.Now().Year(), viper.GetString("name")) + app.Link = viper.GetString("server.url") + return nil +} diff --git a/messenger/text.tmpl b/messenger/text.tmpl new file mode 100644 index 0000000..08776f2 --- /dev/null +++ b/messenger/text.tmpl @@ -0,0 +1,61 @@ +

{{if .Email.Body.Title }}{{ .Email.Body.Title }}{{ else }}{{ .Email.Body.Greeting }} {{ .Email.Body.Name }},{{ end }}

+{{ with .Email.Body.Intros }} + {{ range $line := . }} +

{{ $line }}

+ {{ end }} +{{ end }} +{{ if (ne .Email.Body.FreeMarkdown "") }} + {{ .Email.Body.FreeMarkdown.ToHTML }} +{{ else }} + {{ with .Email.Body.Dictionary }} + + {{ end }} + {{ with .Email.Body.Table }} + {{ $data := .Data }} + {{ $columns := .Columns }} + {{ if gt (len $data) 0 }} + + + {{ $col := index $data 0 }} + {{ range $entry := $col }} + + {{ end }} + + {{ range $row := $data }} + + {{ range $cell := $row }} + + {{ end }} + + {{ end }} +
{{ $entry.Key }}
+ {{ $cell.Value }} +
+ {{ end }} + {{ end }} + {{ with .Email.Body.Actions }} + {{ range $action := . }} +

+ {{ $action.Instructions }} + {{ if $action.InviteCode }} + {{ $action.InviteCode }} + {{ end }} + {{ if $action.Button.Link }} + {{ $action.Button.Link }} + {{ end }} +

+ {{ end }} + {{ end }} +{{ end }} +{{ with .Email.Body.Outros }} + {{ range $line := . }} +

{{ $line }}

+ {{ end }} +{{ end }} +

{{.Email.Body.Signature}},
{{.Hermes.Product.Name}} - {{.Hermes.Product.Link}}

+

{{.Hermes.Product.Copyright}}

+` \ No newline at end of file diff --git a/system/system.go b/system/system.go index 78c0c36..021af7d 100644 --- a/system/system.go +++ b/system/system.go @@ -116,6 +116,12 @@ func (sys *System) Start() { } l.Info().Msg("Starting...") + if e := l.Trace(); e.Enabled() { + config, err := ConfigShow("") + if err == nil { + e.Str("config", config).Msg("config") + } + } sys.status = sys_main sys.main()