You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
go-fly/controller/shout.go

156 lines
4.1 KiB

package controller
import (
"encoding/json"
"fmt"
"github.com/taoshihan1991/imaptool/models"
"github.com/taoshihan1991/imaptool/tools"
"github.com/taoshihan1991/imaptool/ws"
"log"
"strconv"
"time"
)
func SendServerJiang(title string, content string, domain string) string {
noticeServerJiang, err := strconv.ParseBool(models.FindConfig("NoticeServerJiang"))
serverJiangAPI := models.FindConfig("ServerJiangAPI")
if err != nil || !noticeServerJiang || serverJiangAPI == "" {
log.Println("do not notice serverjiang:", serverJiangAPI, noticeServerJiang)
return ""
}
sendStr := fmt.Sprintf("%s%s", title, content)
desp := title + ":" + content + "[登录](http://" + domain + "/main)"
url := serverJiangAPI + "?text=" + sendStr + "&desp=" + desp
//log.Println(url)
res := tools.Get(url)
return res
}
func SendVisitorLoginNotice(kefuName, visitorName, avator, content, visitorId string) {
if !tools.LimitFreqSingle("sendnotice:"+visitorId, 1, 120) {
log.Println("SendVisitorLoginNotice limit")
return
}
userInfo := make(map[string]string)
userInfo["username"] = visitorName
userInfo["avator"] = avator
userInfo["content"] = content
msg := ws.TypeMessage{
Type: "notice",
Data: userInfo,
}
str, _ := json.Marshal(msg)
ws.OneKefuMessage(kefuName, str)
}
func SendNoticeEmail(username, msg string) {
smtp := models.FindConfig("NoticeEmailSmtp")
email := models.FindConfig("NoticeEmailAddress")
password := models.FindConfig("NoticeEmailPassword")
if smtp == "" || email == "" || password == "" {
return
}
err := tools.SendSmtp(smtp, email, password, []string{email}, "[通知]"+username, msg)
if err != nil {
log.Println(err)
}
}
func SendAppGetuiPush(kefu string, title, content string) {
token := models.FindConfig("GetuiToken")
if token == "" {
token = getGetuiToken()
if token == "" {
return
}
}
format := `
{
"request_id":"%s",
"settings":{
"ttl":3600000
},
"audience":{
"cid":[
"%s"
]
},
"push_message":{
"notification":{
"title":"%s",
"body":"%s",
"click_type":"url",
"url":"https//:xxx"
}
}
}
`
clients := models.FindClients(kefu)
if len(clients) == 0 {
return
}
//clientIds := make([]string, 0)
for _, client := range clients {
//clientIds = append(clientIds, client.Client_id)
req := fmt.Sprintf(format, tools.Md5(tools.Uuid()), client.Client_id, title, content)
num := sendPushApi(token, req)
if num == 10001 {
token = getGetuiToken()
sendPushApi(token, req)
}
}
}
func sendPushApi(token string, req string) int {
appid := models.FindConfig("GetuiAppID")
if appid == "" {
return 0
}
url := "https://restapi.getui.com/v2/" + appid + "/push/single/cid"
headers := make(map[string]string)
headers["Content-Type"] = "application/json;charset=utf-8"
headers["token"] = token
res, err := tools.PostHeader(url, []byte(req), headers)
tools.Logger().Infoln(url, req, err, res)
if err == nil && res != "" {
var pushRes GetuiResponse
json.Unmarshal([]byte(res), &pushRes)
if pushRes.Code == 10001 {
return 10001
}
}
return 200
}
func getGetuiToken() string {
appid := models.FindConfig("GetuiAppID")
appkey := models.FindConfig("GetuiAppKey")
//appsecret := models.FindConfig("GetuiAppSecret")
appmastersecret := models.FindConfig("GetuiMasterSecret")
if appid == "" {
return ""
}
type req struct {
Sign string `json:"sign"`
Timestamp string `json:"timestamp"`
Appkey string `json:"appkey"`
}
timestamp := strconv.FormatInt(time.Now().UnixNano()/1e6, 10)
reqJson := req{
Sign: tools.Sha256(appkey + timestamp + appmastersecret),
Timestamp: timestamp,
Appkey: appkey,
}
reqStr, _ := json.Marshal(reqJson)
url := "https://restapi.getui.com/v2/" + appid + "/auth"
res, err := tools.Post(url, "application/json;charset=utf-8", reqStr)
log.Println(url, string(reqStr), err, res)
if err == nil && res != "" {
var pushRes GetuiResponse
json.Unmarshal([]byte(res), &pushRes)
if pushRes.Code == 0 {
token := pushRes.Data["token"].(string)
models.UpdateConfig("GetuiToken", token)
return token
}
}
return ""
}