136 lines
2.4 KiB
Go
136 lines
2.4 KiB
Go
|
package google
|
||
|
|
||
|
import (
|
||
|
"encoding/xml"
|
||
|
"fmt"
|
||
|
"io/ioutil"
|
||
|
"strings"
|
||
|
"time"
|
||
|
|
||
|
"git.trj.tw/golang/mtfosbot/model"
|
||
|
lineapi "git.trj.tw/golang/mtfosbot/module/apis/line"
|
||
|
"git.trj.tw/golang/mtfosbot/module/context"
|
||
|
)
|
||
|
|
||
|
type feed struct {
|
||
|
XMLName xml.Name `xml:"feed"`
|
||
|
Entry []entry `xml:"entry"`
|
||
|
}
|
||
|
type entry struct {
|
||
|
XMLName xml.Name `xml:"entry"`
|
||
|
Title string `xml:"title"`
|
||
|
ID string `xml:"id"`
|
||
|
Link link `xml:"link"`
|
||
|
Author []author `xml:"author"`
|
||
|
}
|
||
|
type link struct {
|
||
|
XMLName xml.Name `xml:"link"`
|
||
|
Href string `xml:"href,attr"`
|
||
|
}
|
||
|
type author struct {
|
||
|
XMLName xml.Name `xml:"author"`
|
||
|
Name string `xml:"name"`
|
||
|
URI string `xml:"uri"`
|
||
|
}
|
||
|
|
||
|
// VerifyWebhook -
|
||
|
func VerifyWebhook(c *context.Context) {
|
||
|
hubMode, ok := c.GetQuery("hub.mode")
|
||
|
if !ok {
|
||
|
c.DataFormat(nil)
|
||
|
return
|
||
|
}
|
||
|
challenge, ok := c.GetQuery("hub.challenge")
|
||
|
if !ok {
|
||
|
c.DataFormat(nil)
|
||
|
return
|
||
|
}
|
||
|
id, ok := c.GetQuery("id")
|
||
|
if !ok {
|
||
|
c.DataFormat(nil)
|
||
|
return
|
||
|
}
|
||
|
if hubMode == "subscribe" {
|
||
|
t := time.Now().Unix() + 86400
|
||
|
yt, err := model.GetYoutubeChannelWithID(id)
|
||
|
if err != nil {
|
||
|
c.ServerError(nil)
|
||
|
return
|
||
|
}
|
||
|
if yt == nil {
|
||
|
c.NotFound("channel not found")
|
||
|
return
|
||
|
}
|
||
|
err = yt.UpdateExpire(t)
|
||
|
if err != nil {
|
||
|
c.ServerError(nil)
|
||
|
}
|
||
|
}
|
||
|
c.String(200, challenge)
|
||
|
}
|
||
|
|
||
|
// GetNotifyWebhook -
|
||
|
func GetNotifyWebhook(c *context.Context) {
|
||
|
byteBody, err := ioutil.ReadAll(c.Request.Body)
|
||
|
defer c.Request.Body.Close()
|
||
|
if err != nil {
|
||
|
c.DataFormat(nil)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
id, ok := c.GetQuery("id")
|
||
|
if !ok {
|
||
|
c.DataFormat(nil)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
hook := &feed{}
|
||
|
err = xml.Unmarshal(byteBody, &hook)
|
||
|
if err != nil {
|
||
|
c.DataFormat(nil)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
if len(hook.Entry) == 0 {
|
||
|
c.Success(nil)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
yt, err := model.GetYoutubeChannelWithID(id)
|
||
|
if err != nil || yt == nil {
|
||
|
c.ServerError(nil)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
if hook.Entry[0].ID == yt.LastVideo {
|
||
|
c.Success(nil)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
err = yt.UpdateLastVideo(hook.Entry[0].ID)
|
||
|
if err != nil {
|
||
|
c.ServerError(nil)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
for _, v := range yt.Groups {
|
||
|
if v.Notify {
|
||
|
str := v.Tmpl
|
||
|
if len(str) == 0 {
|
||
|
str = fmt.Sprintf("%s\n%s", hook.Entry[0].Title, hook.Entry[0].Link.Href)
|
||
|
} else {
|
||
|
str = strings.Replace(str, "{link}", hook.Entry[0].Link.Href, -1)
|
||
|
str = strings.Replace(str, "{txt}", hook.Entry[0].Title, -1)
|
||
|
}
|
||
|
|
||
|
msg := &lineapi.TextMessage{
|
||
|
Text: str,
|
||
|
}
|
||
|
|
||
|
lineapi.PushMessage(v.ID, msg)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
c.Success(nil)
|
||
|
}
|