diff --git a/captcha.go b/captcha.go index fb65874..eb831f2 100644 --- a/captcha.go +++ b/captcha.go @@ -69,8 +69,7 @@ func (a *goBlog) captchaMiddleware(next http.Handler) http.Handler { // Maybe it's a form _ = r.ParseForm() // Encode form - sw, _ := io.WriteString(bodyEncoder, r.Form.Encode()) - written = int64(sw) + written = int64(noError(io.WriteString(bodyEncoder, r.Form.Encode()))) } _ = bodyEncoder.Close() if written >= limit { diff --git a/commentsAdmin.go b/commentsAdmin.go index 99a8f0b..13d3ece 100644 --- a/commentsAdmin.go +++ b/commentsAdmin.go @@ -20,8 +20,7 @@ type commentsPaginationAdapter struct { func (p *commentsPaginationAdapter) Nums() (int64, error) { p.getNums.Do(func() { - nums, _ := p.db.countComments(p.config) - p.nums = int64(nums) + p.nums = int64(noError(p.db.countComments(p.config))) }) return p.nums, nil } diff --git a/contact.go b/contact.go index 86d7dd8..b9008e1 100644 --- a/contact.go +++ b/contact.go @@ -56,17 +56,15 @@ func (a *goBlog) sendContactSubmission(w http.ResponseWriter, r *http.Request) { // Add message text to message _, _ = message.WriteString(formMessage) // Send submission - if err := a.sendContactEmail(bc.Contact, message.String(), formEmail); err != nil { - log.Println(err.Error()) - } + go func() { + if err := a.sendContactEmail(bc.Contact, message.String(), formEmail); err != nil { + log.Println(err.Error()) + } + }() // Send notification - a.sendNotification(message.String()) + go a.sendNotification(message.String()) // Give feedback - a.render(w, r, a.renderContact, &renderData{ - Data: &contactRenderData{ - sent: true, - }, - }) + a.render(w, r, a.renderContactSent, &renderData{}) } func (*goBlog) sendContactEmail(cc *configContact, body, replyTo string) error { diff --git a/feeds.go b/feeds.go index 2632545..e836894 100644 --- a/feeds.go +++ b/feeds.go @@ -55,8 +55,8 @@ func (a *goBlog) generateFeed(blog string, f feedType, w http.ResponseWriter, r Description: a.postSummary(p), Id: p.Path, Content: buf.String(), - Created: timeNoErr(dateparse.ParseLocal(p.Published)), - Updated: timeNoErr(dateparse.ParseLocal(p.Updated)), + Created: noError(dateparse.ParseLocal(p.Published)), + Updated: noError(dateparse.ParseLocal(p.Updated)), }) bufferpool.Put(buf) } diff --git a/go.mod b/go.mod index cf8c19c..3750618 100644 --- a/go.mod +++ b/go.mod @@ -42,7 +42,7 @@ require ( github.com/mattn/go-sqlite3 v1.14.16 github.com/mergestat/timediff v0.0.3 github.com/microcosm-cc/bluemonday v1.0.22 - github.com/mmcdole/gofeed v1.2.0 + github.com/mmcdole/gofeed v1.2.1 github.com/paulmach/go.geojson v1.4.0 github.com/posener/wstest v1.2.0 github.com/pquerna/otp v1.4.0 @@ -63,10 +63,10 @@ require ( github.com/yuin/goldmark v1.5.4 // master github.com/yuin/goldmark-emoji v1.0.2-0.20210607094911-0487583eca38 - golang.org/x/crypto v0.6.0 - golang.org/x/net v0.7.0 + golang.org/x/crypto v0.7.0 + golang.org/x/net v0.8.0 golang.org/x/sync v0.1.0 - golang.org/x/text v0.7.0 + golang.org/x/text v0.8.0 gopkg.in/yaml.v3 v3.0.1 maunium.net/go/mautrix v0.14.0 nhooyr.io/websocket v1.8.7 @@ -88,7 +88,7 @@ require ( github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/gin-gonic/gin v1.7.7 // indirect github.com/go-ap/errors v0.0.0-20221205040414-01c1adfc98ea // indirect - github.com/golang/glog v1.0.0 // indirect + github.com/golang/glog v1.1.0 // indirect github.com/golang/protobuf v1.5.2 // indirect github.com/gorilla/css v1.0.0 // indirect github.com/gorilla/securecookie v1.1.1 // indirect @@ -124,10 +124,10 @@ require ( github.com/valyala/fastjson v1.6.4 // indirect go.uber.org/atomic v1.10.0 // indirect go.uber.org/multierr v1.9.0 // indirect - golang.org/x/exp v0.0.0-20230224173230-c95f2b4c22f2 // indirect - golang.org/x/image v0.5.0 // indirect - golang.org/x/oauth2 v0.5.0 // indirect - golang.org/x/sys v0.5.0 // indirect + golang.org/x/exp v0.0.0-20230304125523-9ff063c70017 // indirect + golang.org/x/image v0.6.0 // indirect + golang.org/x/oauth2 v0.6.0 // indirect + golang.org/x/sys v0.6.0 // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/protobuf v1.28.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect diff --git a/go.sum b/go.sum index a52cad8..bfa1ec9 100644 --- a/go.sum +++ b/go.sum @@ -164,8 +164,8 @@ github.com/gobwas/ws v1.0.2 h1:CoAavW/wd/kulfZmSIBt6p24n4j7tHgNVCjsfHVNUbo= github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ= -github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= +github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= +github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -324,8 +324,8 @@ github.com/microcosm-cc/bluemonday v1.0.22 h1:p2tT7RNzRdCi0qmwxG+HbqD6ILkmwter1Z github.com/microcosm-cc/bluemonday v1.0.22/go.mod h1:ytNkv4RrDrLJ2pqlsSI46O6IVXmZOBBD4SaJyDwwTkM= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mmcdole/gofeed v1.2.0 h1:kuq7tJnDf0pnsDzF820ukuySHxFimAcizpG15gYHIns= -github.com/mmcdole/gofeed v1.2.0/go.mod h1:TEyTG4gw4Q5Co+Hgahx/Oi3E0JHLM8BXtWC+mkJtRsw= +github.com/mmcdole/gofeed v1.2.1 h1:tPbFN+mfOLcM1kDF1x2c/N68ChbdBatkppdzf/vDe1s= +github.com/mmcdole/gofeed v1.2.1/go.mod h1:2wVInNpgmC85q16QTTuwbuKxtKkHLCDDtf0dCmnrNr4= github.com/mmcdole/goxpp v1.1.0 h1:WwslZNF7KNAXTFuzRtn/OKZxFLJAAyOA9w82mDz2ZGI= github.com/mmcdole/goxpp v1.1.0/go.mod h1:v+25+lT2ViuQ7mVxcncQ8ch1URund48oH+jhjiwEgS8= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -457,8 +457,8 @@ golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.6.0 h1:qfktjS5LUO+fFKeJXZ+ikTRijMmljikvG68fpMMruSc= -golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= +golang.org/x/crypto v0.7.0 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A= +golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -469,13 +469,13 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20230224173230-c95f2b4c22f2 h1:Jvc7gsqn21cJHCmAWx0LiimpP18LZmUxkT5Mp7EZ1mI= -golang.org/x/exp v0.0.0-20230224173230-c95f2b4c22f2/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= +golang.org/x/exp v0.0.0-20230304125523-9ff063c70017 h1:3Ea9SZLCB0aRIhSEjM+iaGIlzzeDJdpi579El/YIhEE= +golang.org/x/exp v0.0.0-20230304125523-9ff063c70017/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.5.0 h1:5JMiNunQeQw++mMOz48/ISeNu3Iweh/JaZU8ZLqHRrI= -golang.org/x/image v0.5.0/go.mod h1:FVC7BI/5Ym8R25iw5OLsgshdUBbT1h5jZTpA+mvAdZ4= +golang.org/x/image v0.6.0 h1:bR8b5okrPI3g/gyZakLZHeWxAR8Dn5CyxXv1hLH5g/4= +golang.org/x/image v0.6.0/go.mod h1:MXLdDR43H7cDJq5GEGXEVeeNhPgi+YYEQ2pC1byI1x0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -498,6 +498,7 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -535,8 +536,10 @@ golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20210916014120-12bc252f5db8/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211020060615-d418f374d309/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -546,8 +549,8 @@ golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.5.0 h1:HuArIo48skDwlrvM3sEdHXElYslAMsf3KwRkkW4MC4s= -golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= +golang.org/x/oauth2 v0.6.0 h1:Lh8GPgSKBfWSwFvtuWOfeI3aAAnbXTSutYxJiOJFgIw= +golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -605,12 +608,13 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.5.0 h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -619,8 +623,9 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -673,6 +678,7 @@ golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/notifications.go b/notifications.go index 5b837ee..ca86089 100644 --- a/notifications.go +++ b/notifications.go @@ -10,6 +10,7 @@ import ( "time" "github.com/go-chi/chi/v5" + "github.com/sourcegraph/conc/pool" "github.com/vcraescu/go-paginator/v2" "go.goblog.app/app/pkgs/bufferpool" ) @@ -31,14 +32,20 @@ func (a *goBlog) sendNotification(text string) { log.Println("Failed to save notification:", err.Error()) } if cfg := a.cfg.Notifications; cfg != nil { - if err := a.sendNtfy(cfg.Ntfy, n.Text); err != nil { - log.Println("Failed to send notification to Ntfy:", err.Error()) - } - if _, _, err := a.sendTelegram(cfg.Telegram, n.Text, "", false); err != nil { - log.Println("Failed to send notification to Telegram:", err.Error()) - } - if _, err := a.sendMatrix(cfg.Matrix, n.Text); err != nil { - log.Println("Failed to send notification to Matrix:", err.Error()) + p := pool.New().WithErrors() + p.Go(func() error { + return a.sendNtfy(cfg.Ntfy, n.Text) + }) + p.Go(func() error { + _, _, err := a.sendTelegram(cfg.Telegram, n.Text, "", false) + return err + }) + p.Go(func() error { + _, err := a.sendMatrix(cfg.Matrix, n.Text) + return err + }) + if err := p.Wait(); err != nil { + log.Println("Failed to send notification:", err.Error()) } } } @@ -112,8 +119,7 @@ type notificationsPaginationAdapter struct { func (p *notificationsPaginationAdapter) Nums() (int64, error) { if p.nums == 0 { - nums, _ := p.db.countNotifications(p.config) - p.nums = int64(nums) + p.nums = int64(noError(p.db.countNotifications(p.config))) } return p.nums, nil } diff --git a/pkgs/htmlbuilder/htmlbuilder.go b/pkgs/htmlbuilder/htmlbuilder.go index 63cc90e..9e1e5c9 100644 --- a/pkgs/htmlbuilder/htmlbuilder.go +++ b/pkgs/htmlbuilder/htmlbuilder.go @@ -65,8 +65,20 @@ func (h *HtmlBuilder) WriteElementOpen(tag string, attrs ...any) { h.WriteUnescaped(`>`) } +func (h *HtmlBuilder) WriteElementsOpen(tags ...string) { + for _, tag := range tags { + h.WriteElementOpen(tag) + } +} + func (h *HtmlBuilder) WriteElementClose(tag string) { h.WriteUnescaped(``) } + +func (h *HtmlBuilder) WriteElementsClose(tags ...string) { + for _, tag := range tags { + h.WriteElementClose(tag) + } +} diff --git a/posts.go b/posts.go index 655ab81..692d043 100644 --- a/posts.go +++ b/posts.go @@ -139,8 +139,7 @@ type postPaginationAdapter struct { func (p *postPaginationAdapter) Nums() (int64, error) { if p.nums == 0 { - nums, _ := p.a.db.countPosts(p.config) - p.nums = int64(nums) + p.nums = int64(noError(p.a.db.countPosts(p.config))) } return p.nums, nil } diff --git a/sessions.go b/sessions.go index 736c69e..c4f36b7 100644 --- a/sessions.go +++ b/sessions.go @@ -126,9 +126,9 @@ func (s *dbSessionStore) load(session *sessions.Session) (err error) { if err = gob.NewDecoder(bytes.NewReader(data)).Decode(&session.Values); err != nil { return err } - session.Values[sessionCreatedOn] = timeNoErr(dateparse.ParseLocal(createdStr)) - session.Values[sessionModifiedOn] = timeNoErr(dateparse.ParseLocal(modifiedStr)) - session.Values[sessionExpiresOn] = timeNoErr(dateparse.ParseLocal(expiresStr)) + session.Values[sessionCreatedOn] = noError(dateparse.ParseLocal(createdStr)) + session.Values[sessionModifiedOn] = noError(dateparse.ParseLocal(modifiedStr)) + session.Values[sessionExpiresOn] = noError(dateparse.ParseLocal(expiresStr)) return nil } diff --git a/sitemap.go b/sitemap.go index 6934c72..6d4e9d0 100644 --- a/sitemap.go +++ b/sitemap.go @@ -170,7 +170,7 @@ func (a *goBlog) serveSitemapBlogPosts(w http.ResponseWriter, r *http.Request) { // Add posts to sitemap for _, p := range posts { item := &sitemap.URL{Loc: a.fullPostURL(p)} - lastMod := timeNoErr(dateparse.ParseLocal(defaultIfEmpty(p.Updated, p.Published))) + lastMod := noError(dateparse.ParseLocal(defaultIfEmpty(p.Updated, p.Published))) if !lastMod.IsZero() { item.LastMod = &lastMod } diff --git a/ui.go b/ui.go index b3e5a16..c50c14a 100644 --- a/ui.go +++ b/ui.go @@ -706,7 +706,6 @@ type contactRenderData struct { title string description string privacy string - sent bool } func (a *goBlog) renderContact(hb *htmlbuilder.HtmlBuilder, rd *renderData) { @@ -721,14 +720,6 @@ func (a *goBlog) renderContact(hb *htmlbuilder.HtmlBuilder, rd *renderData) { a.renderTitleTag(hb, rd.Blog, renderedTitle) }, func(hb *htmlbuilder.HtmlBuilder) { - if cd.sent { - hb.WriteElementOpen("main") - hb.WriteElementOpen("p") - hb.WriteEscaped(a.ts.GetTemplateStringVariant(rd.Blog.Lang, "messagesent")) - hb.WriteElementClose("p") - hb.WriteElementClose("main") - return - } hb.WriteElementOpen("main") // Title if renderedTitle != "" { @@ -758,8 +749,18 @@ func (a *goBlog) renderContact(hb *htmlbuilder.HtmlBuilder, rd *renderData) { } else { hb.WriteElementOpen("input", "type", "submit", "value", a.ts.GetTemplateStringVariant(rd.Blog.Lang, "contactsend")) } - hb.WriteElementClose("form") - hb.WriteElementClose("main") + hb.WriteElementsClose("form", "main") + }, + ) +} + +func (a *goBlog) renderContactSent(hb *htmlbuilder.HtmlBuilder, rd *renderData) { + a.renderBase( + hb, rd, nil, + func(hb *htmlbuilder.HtmlBuilder) { + hb.WriteElementsOpen("main", "p") + hb.WriteEscaped(a.ts.GetTemplateStringVariant(rd.Blog.Lang, "messagesent")) + hb.WriteElementsClose("p", "main") }, ) } diff --git a/utils.go b/utils.go index 77123b2..61f8583 100644 --- a/utils.go +++ b/utils.go @@ -334,7 +334,7 @@ func containsStrings(s string, subStrings ...string) bool { return false } -func timeNoErr(t time.Time, _ error) time.Time { +func noError[T any](t T, _ error) T { return t } diff --git a/webmentionAdmin.go b/webmentionAdmin.go index a4283f0..7e795e2 100644 --- a/webmentionAdmin.go +++ b/webmentionAdmin.go @@ -23,8 +23,7 @@ var _ paginator.Adapter = (*webmentionPaginationAdapter)(nil) func (p *webmentionPaginationAdapter) Nums() (int64, error) { p.getNums.Do(func() { - nums, _ := p.db.countWebmentions(p.config) - p.nums = int64(nums) + p.nums = int64(noError(p.db.countWebmentions(p.config))) }) return p.nums, nil }