admin_backend/common/feishu.go
2025-03-04 12:05:23 +08:00

388 lines
9.9 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package common
import (
"backend/Type"
"bytes"
"encoding/json"
"fmt"
"net/http"
"time"
)
func SendFeishuMsg(msg string) error {
// 创建请求体
payload := map[string]interface{}{
"msg_type": "text",
"content": map[string]string{
"text": msg,
},
}
payloadBytes, err := json.Marshal(payload)
if err != nil {
return err
}
// 创建HTTP请求
req, err := http.NewRequest("POST", GetFeishuUrl(), bytes.NewBuffer(payloadBytes))
if err != nil {
return err
}
req.Header.Set("Content-Type", "application/json")
// 发送请求
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
return err
}
defer resp.Body.Close()
// 检查响应状态码
if resp.StatusCode != http.StatusOK {
return fmt.Errorf("failed to send message, status code: %d", resp.StatusCode)
}
return nil
}
func SendNoticeMsg(AppName, ServerName, notice string) error {
str := fmt.Sprintf(`
## **端口扫描异常**
- 项目名称: %s
- 服务器名称: %s
- 异常信息: %s
<at id="all"></at>
`, AppName, ServerName, notice)
// 创建请求体
payload := map[string]interface{}{
"msg_type": "interactive",
"card": map[string]interface{}{
"type": "template",
"data": map[string]interface{}{
"template_id": "AAqBcOkbPmfUZ",
"template_version_name": "1.0.3",
"template_variable": map[string]interface{}{
"appName": AppName,
"msg": str,
},
},
},
}
payloadBytes, err := json.Marshal(payload)
if err != nil {
return err
}
// 创建HTTP请求
req, err := http.NewRequest("POST", GetNoticeUrl(), bytes.NewBuffer(payloadBytes))
if err != nil {
return err
}
req.Header.Set("Content-Type", "application/json")
// 发送请求
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
return err
}
defer resp.Body.Close()
// 检查响应状态码
if resp.StatusCode != http.StatusOK {
return fmt.Errorf("failed to send message, status code: %d", resp.StatusCode)
}
return nil
}
// table_raw_array_1
func SendOperationMsg(data *Type.Operation) error {
// retainStr := ""
// for _, v := range data.Retain {
// retainStr += fmt.Sprintf("| %s | %d | %d | %.2f | %.2f%% | %.2f%% | %.2f%% | %.2f%% |\n", v.Date, v.Register, v.Login, v.Recharge, 100*float64(v.SecondRemain)/float64(v.Register), 100*float64(v.ThirdRemain)/float64(v.Register), 100*float64(v.SeventhRemain)/float64(v.Register), 100*float64(v.ThirtiethRemain)/float64(v.Register))
// }
RetainData := make([]map[string]interface{}, 0)
for _, v := range data.Retain {
var retain2, retain3, retain7 string
if v.Register == 0 {
retain2 = "0.00%"
retain3 = "0.00%"
retain7 = "0.00%"
} else {
retain2 = fmt.Sprintf("%.2f%%", 100*float64(v.SecondRemain)/float64(v.Register))
retain3 = fmt.Sprintf("%.2f%%", 100*float64(v.ThirdRemain)/float64(v.Register))
retain7 = fmt.Sprintf("%.2f%%", 100*float64(v.SeventhRemain)/float64(v.Register))
}
RetainData = append(RetainData, map[string]interface{}{
"Date": v.Date,
"Reg": v.Register,
"Login": v.Login,
"Pay": v.Recharge,
"Retain2": retain2,
"Retain3": retain3,
"Retain7": retain7,
// "Retain14": fmt.Sprintf("%.2f%%", 100*float64(v.ThirtiethRemain)/float64(v.Register)),
})
}
var c1, c2 string
if data.Retain[0].PerOnlineTime > data.Retain[1].PerOnlineTime {
c1 = FONT_COLOR_UP
} else {
c1 = FONT_COLOR_DOWN
}
if data.Retain[0].PerOrderNum > data.Retain[1].PerOrderNum {
c2 = FONT_COLOR_UP
} else {
c2 = FONT_COLOR_DOWN
}
str := fmt.Sprintf(`
# 日期 %s
-----------------------------
## 总体数据
- **注册**%d
- **充值**%.2f
- **流失率**%.2f%%
> 超过7天未登录视为流失
## 昨日数据
- **注册**%d
- **充值**%.2f
- **登录**%d
- **平均在线时长**<font color="%s">%.2f</font>分钟
- **平均完成订单数**<font color="%s">%.2f</font>
----------------------
## 留存数据
`, time.Now().In(time.UTC).Format("2006-01-02"),
data.Register, data.Recharge, data.ChurnRate, data.Retain[0].Register, data.Retain[0].Recharge, data.Retain[0].Login,
c1, data.Retain[0].PerOnlineTime, c2, data.Retain[0].PerOrderNum)
// 创建请求体
payload := map[string]interface{}{
"msg_type": "interactive",
"card": map[string]interface{}{
"type": "template",
"data": map[string]interface{}{
"template_id": "AAqBcfmUwQya1",
"template_version_name": "1.0.8",
"template_variable": map[string]interface{}{
"msg": str,
"appName": "merge_pet_london",
"table_raw_array_1": RetainData,
},
},
},
}
payloadBytes, err := json.Marshal(payload)
if err != nil {
return err
}
// 创建HTTP请求
req, err := http.NewRequest("POST", GetOperationUrl(), bytes.NewBuffer(payloadBytes))
if err != nil {
return err
}
req.Header.Set("Content-Type", "application/json")
// 发送请求
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
return err
}
defer resp.Body.Close()
// 检查响应状态码
if resp.StatusCode != http.StatusOK {
return fmt.Errorf("failed to send message, status code: %d", resp.StatusCode)
}
return nil
}
func SendUpdateCard() error {
payload := map[string]interface{}{
"msg_type": "interactive",
"card": map[string]interface{}{
"type": "template",
"data": map[string]interface{}{
"template_id": "AAqBmWrjPeHVp",
"template_version_name": "1.0.3",
// "template_variable": map[string]interface{}{},
},
},
}
payloadBytes, err := json.Marshal(payload)
if err != nil {
return err
}
// 创建HTTP请求
req, err := http.NewRequest("POST", GetOperationUrl(), bytes.NewBuffer(payloadBytes))
if err != nil {
return err
}
req.Header.Set("Content-Type", "application/json")
// 发送请求
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
return err
}
defer resp.Body.Close()
// 检查响应状态码
if resp.StatusCode != http.StatusOK {
return fmt.Errorf("failed to send message, status code: %d", resp.StatusCode)
}
return nil
}
func SendServerInfoCard(data *Type.ServerInfo) error {
table := make([]map[string]interface{}, 0)
for _, v := range data.ServerList {
table = append(table, map[string]interface{}{
"AppId": data.AppName,
"server": v.ServerName,
"status": v.Status,
"Mem": v.Mem,
"playerNum": v.PlayerNum,
})
}
payload := map[string]interface{}{
"msg_type": "interactive",
"card": map[string]interface{}{
"type": "template",
"data": map[string]interface{}{
"template_id": "AAqBmWrjPeHVp",
"template_version_name": "1.0.7",
"template_variable": map[string]interface{}{
"AppId": data.AppName,
"Mem": data.Mem,
"Cpu": data.Cpu,
"table_raw_array_1": table,
},
},
},
}
payloadBytes, err := json.Marshal(payload)
if err != nil {
return err
}
// 创建HTTP请求
req, err := http.NewRequest("POST", GetFeishuUrl(), bytes.NewBuffer(payloadBytes))
if err != nil {
return err
}
req.Header.Set("Content-Type", "application/json")
// 发送请求
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
return err
}
defer resp.Body.Close()
// 检查响应状态码
if resp.StatusCode != http.StatusOK {
return fmt.Errorf("failed to send message, status code: %d", resp.StatusCode)
}
return nil
}
// table_raw_array_1
func SendWeekOperationMsg(data *Type.Operation) error {
// retainStr := ""
// for _, v := range data.Retain {
// retainStr += fmt.Sprintf("| %s | %d | %d | %.2f | %.2f%% | %.2f%% | %.2f%% | %.2f%% |\n", v.Date, v.Register, v.Login, v.Recharge, 100*float64(v.SecondRemain)/float64(v.Register), 100*float64(v.ThirdRemain)/float64(v.Register), 100*float64(v.SeventhRemain)/float64(v.Register), 100*float64(v.ThirtiethRemain)/float64(v.Register))
// }
RetainData := make([]map[string]interface{}, 0)
for _, v := range data.Retain {
RetainData = append(RetainData, map[string]interface{}{
"Date": v.Date,
"Reg": v.Register,
"Login": v.Login,
"Pay": v.Recharge,
"Retain2": fmt.Sprintf("%.2f%%", 100*float64(v.SecondRemain)/float64(v.Register)),
"Retain3": fmt.Sprintf("%.2f%%", 100*float64(v.ThirdRemain)/float64(v.Register)),
"Retain7": fmt.Sprintf("%.2f%%", 100*float64(v.SeventhRemain)/float64(v.Register)),
// "Retain14": fmt.Sprintf("%.2f%%", 100*float64(v.ThirtiethRemain)/float64(v.Register)),
})
}
str := fmt.Sprintf(`
# 日期 %s
-----------------------------
## 总体数据
- **注册**%d
- **充值**%.2f
- **流失率**%.2f%%
> 超过7天未登录视为流失
## 昨日数据
- **注册**%d
- **充值**%.2f
- **登录**%d
- **平均在线时长**%.2f分钟
- **平均完成订单数**%.2f
----------------------
## 留存数据
`, time.Now().In(time.UTC).Format("2006-01-02"), data.Register, data.Recharge, data.ChurnRate, data.Retain[0].Register, data.Retain[0].Recharge, data.Retain[0].Login, data.Retain[0].PerOnlineTime, data.Retain[0].PerOrderNum)
// 创建请求体
payload := map[string]interface{}{
"msg_type": "interactive",
"card": map[string]interface{}{
"type": "template",
"data": map[string]interface{}{
"template_id": "AAqBcfmUwQya1",
"template_version_name": "1.0.5",
"template_variable": map[string]interface{}{
"msg": str,
"appName": "merge_pet_london",
"table_raw_array_1": RetainData,
},
},
},
}
payloadBytes, err := json.Marshal(payload)
if err != nil {
return err
}
// 创建HTTP请求
req, err := http.NewRequest("POST", GetOperationUrl(), bytes.NewBuffer(payloadBytes))
if err != nil {
return err
}
req.Header.Set("Content-Type", "application/json")
// 发送请求
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
return err
}
defer resp.Body.Close()
// 检查响应状态码
if resp.StatusCode != http.StatusOK {
return fmt.Errorf("failed to send message, status code: %d", resp.StatusCode)
}
return nil
}