kefu/controller/shout.go

423 lines
11 KiB
Go
Raw Permalink Normal View History

2024-12-10 02:50:12 +00:00
package controller
import (
"encoding/json"
"fmt"
"github.com/gin-contrib/sessions"
"github.com/gin-gonic/gin"
"github.com/silenceper/wechat/v2/officialaccount/message"
"kefu/common"
"kefu/lib"
"kefu/models"
"kefu/tools"
"kefu/types"
"kefu/ws"
"log"
"regexp"
"strconv"
"strings"
)
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, 5) {
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, subject, entId, content string) {
if !tools.LimitFreqSingle("send_notice_email:"+username, 1, 10) {
log.Println("send_notice_email limit")
return
}
configs := models.FindEntConfigByEntid(entId)
smtp := ""
email := ""
password := ""
for _, config := range configs {
if config.ConfKey == "NoticeEmailAddress" {
email = config.ConfValue
}
if config.ConfKey == "NoticeEmailPassword" {
password = config.ConfValue
}
if config.ConfKey == "NoticeEmailSmtp" {
smtp = config.ConfValue
}
}
if smtp == "" || email == "" || password == "" {
return
}
log.Println("发送访客通知邮件:" + smtp + "," + email + "," + password)
err := tools.SendSmtp(smtp, email, password, []string{email}, subject, content)
if err != nil {
log.Println("发送访客通知邮件失败:")
log.Println(err)
}
}
func SendEntSmtpEmail(subject, msg, entId string) {
if !tools.LimitFreqSingle("send_ent_email:"+entId, 1, 2) {
log.Println("send_ent_email limit")
return
}
configs := models.FindEntConfigByEntid(entId)
smtp := ""
email := ""
password := ""
for _, config := range configs {
if config.ConfKey == "NoticeEmailAddress" {
email = config.ConfValue
}
if config.ConfKey == "NoticeEmailPassword" {
password = config.ConfValue
}
if config.ConfKey == "NoticeEmailSmtp" {
smtp = config.ConfValue
}
}
if smtp == "" || email == "" || password == "" {
return
}
err := tools.SendSmtp(smtp, email, password, []string{email}, subject, msg)
if err != nil {
log.Println(err)
}
}
func SendAppGetuiPush(kefu string, title, content string) {
clientModel := &models.User_client{
Kefu: kefu,
}
clientInfos := clientModel.FindClients()
if len(clientInfos) == 0 {
return
}
appid := models.FindConfig("GetuiAppID")
appkey := models.FindConfig("GetuiAppKey")
appsecret := models.FindConfig("GetuiAppSecret")
appmastersecret := models.FindConfig("GetuiMasterSecret")
token := models.FindConfig("GetuiToken")
getui := &lib.Getui{
AppId: appid,
AppKey: appkey,
AppSecret: appsecret,
AppMasterSecret: appmastersecret,
}
for _, client := range clientInfos {
res, err := getui.PushSingle(token, client.Client_id, title, content)
//不正确的账号
if res == 20001 && err.Error() == "target user is invalid" {
clientModel2 := &models.User_client{
Kefu: kefu,
Client_id: client.Client_id,
}
clientModel2.DeleteClient()
}
if res == 10001 {
token, _ = getui.GetGetuiToken()
models.UpdateConfig("GetuiToken", token)
getui.PushSingle(token, client.Client_id, title, content)
}
}
}
// 发送邮件验证码
func SendEmailAuthCode(c *gin.Context) {
email := c.PostForm("email")
//验证邮箱
matched, _ := regexp.MatchString("\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*", email)
if !matched {
c.JSON(200, gin.H{
"code": types.ApiCode.INVALID,
"msg": "邮箱格式不正确",
})
return
}
if !tools.LimitFreqSingle("send_email_authcode:"+email, 1, 50) {
log.Println("send_email_authcode limit " + email)
c.JSON(200, gin.H{
"code": types.ApiCode.FREQ_LIMIT,
"msg": types.ApiCode.GetMessage(types.ApiCode.FREQ_LIMIT),
})
return
}
smtp := models.FindConfig("NoticeEmailSmtp")
sender := models.FindConfig("NoticeEmailAddress")
password := models.FindConfig("NoticeEmailPassword")
if smtp == "" || sender == "" || password == "" {
c.JSON(200, gin.H{
"code": types.ApiCode.INVALID,
"msg": "系统没有配置发送邮箱",
})
return
}
ranNum := tools.RandNum(6)
session := sessions.DefaultMany(c, "go-session")
session.Set("emailCode"+email, ranNum)
_ = session.Save()
content := strings.Replace(common.NoticeTemplate, "[:content]", "你好,验证码为 "+ranNum, -1)
log.Println("发送邮件验证码:" + smtp + "," + sender + "," + password + "," + email + "," + content)
logContent := fmt.Sprintf("'%s'获取邮箱验证码 %s", email, ranNum)
go models.CreateFlyLog(email, c.ClientIP(), logContent, "user")
err := tools.SendSmtp(smtp, sender, password, []string{email}, "在线客服系统验证码", content)
if err != nil {
logContent := "发送邮件验证码失败:" + err.Error()
log.Println(logContent)
go models.CreateFlyLog(email, c.ClientIP(), logContent, "user")
c.JSON(200, gin.H{
"code": types.ApiCode.EMAIL_FAILD,
"msg": err.Error(),
})
return
}
c.JSON(200, gin.H{
"code": 200,
"msg": "ok",
})
}
// 发送注册通知邮件
func SendRegisterEmail(username, nickname, loginEmail string) {
smtp := models.FindConfig("NoticeEmailSmtp")
sender := models.FindConfig("NoticeEmailAddress")
password := models.FindConfig("NoticeEmailPassword")
if smtp == "" || sender == "" || password == "" {
return
}
content := fmt.Sprintf("账户:%s邮箱%s昵称%s注册成功", username, nickname, loginEmail)
err := tools.SendSmtp(smtp, sender, password, []string{sender}, "在线客服系统注册成功", content)
if err != nil {
log.Println("发送邮件失败:", err)
}
}
// 发送短信验证码
func SendSmsCode(c *gin.Context) {
phone := c.Query("phone")
//验证
matched, _ := regexp.MatchString("1[3-9]\\d{9}$", phone)
if !matched {
c.JSON(200, gin.H{
"code": types.ApiCode.INVALID,
"msg": types.ApiCode.GetMessage(types.ApiCode.INVALID),
})
return
}
if !tools.LimitFreqSingle("sendsms:"+c.ClientIP(), 1, 50) {
c.JSON(200, gin.H{
"code": types.ApiCode.FREQ_LIMIT,
"msg": types.ApiCode.GetMessage(types.ApiCode.FREQ_LIMIT),
})
return
}
ranNum := tools.RandNum(6)
session := sessions.DefaultMany(c, "go-session-a")
session.Set("smsCode"+phone, ranNum)
_ = session.Save()
log.Println("发送短信验证码:", phone, ranNum)
err := lib.SendSms(phone, ranNum)
if err != nil {
log.Println("发送短信验证码:", err)
c.JSON(200, gin.H{
"code": types.ApiCode.EMAIL_FAILD,
"msg": err.Error(),
})
return
}
kefuName, _ := c.Get("kefu_name")
entId, _ := c.Get("ent_id")
logContent := fmt.Sprintf("'%s'手机%s发送短信验证码'%s'", kefuName, phone, ranNum)
go models.CreateFlyLog(entId.(string), c.ClientIP(), logContent, "sms")
c.JSON(200, gin.H{
"code": 200,
"msg": "ok",
})
}
// 发送微信模板消息
func PostSendWechatTemplate(c *gin.Context) {
entId := c.PostForm("ent_id")
kefuName := c.PostForm("kefu_name")
tel := c.PostForm("tel")
customer := models.FindCustomerWhere("kefu_name = ? and tel = ?", kefuName, tel)
if customer.AcountOpenid == "" {
c.JSON(200, gin.H{
"code": 200,
"msg": "未查询到绑定的公众号OpenID",
})
return
}
templateId := c.PostForm("template_id")
url := c.PostForm("url")
keyword1 := c.PostForm("keyword1")
keyword2 := c.PostForm("keyword2")
keyword3 := c.PostForm("keyword3")
keyword4 := c.PostForm("keyword4")
keyword5 := c.PostForm("keyword5")
keyword6 := c.PostForm("keyword6")
remark := c.PostForm("remark")
wechatConfig, _ := lib.NewWechatLib(entId)
msgData := make(map[string]*message.TemplateDataItem)
msgData["keyword1"] = &message.TemplateDataItem{
Value: keyword1,
Color: "",
}
msgData["keyword2"] = &message.TemplateDataItem{
Value: keyword2,
Color: "",
}
msgData["keyword3"] = &message.TemplateDataItem{
Value: keyword3,
Color: "",
}
msgData["keyword4"] = &message.TemplateDataItem{
Value: keyword4,
Color: "",
}
msgData["keyword5"] = &message.TemplateDataItem{
Value: keyword5,
Color: "",
}
msgData["keyword6"] = &message.TemplateDataItem{
Value: keyword6,
Color: "",
}
msgData["remark"] = &message.TemplateDataItem{
Value: remark,
Color: "",
}
msg := &message.TemplateMessage{
ToUser: customer.AcountOpenid,
Data: msgData,
TemplateID: templateId,
URL: url,
}
_, err := SendWechatTemplate(wechatConfig, msg)
if err != nil {
c.JSON(200, gin.H{
"code": 400,
"msg": err.Error(),
})
return
}
c.JSON(200, gin.H{
"code": 200,
"msg": "ok",
})
}
// 发送微信模板消息
func PostSendWechatTemplateByOpenid(c *gin.Context) {
openid := c.PostForm("openid")
entId := c.PostForm("ent_id")
if openid == "" {
c.JSON(200, gin.H{
"code": 400,
"msg": "请传递公众号OpenID",
})
return
}
templateId := c.PostForm("template_id")
url := c.PostForm("url")
keyword1 := c.PostForm("keyword1")
keyword2 := c.PostForm("keyword2")
keyword3 := c.PostForm("keyword3")
keyword4 := c.PostForm("keyword4")
keyword5 := c.PostForm("keyword5")
keyword6 := c.PostForm("keyword6")
remark := c.PostForm("remark")
systemBussinesId := models.FindConfig("SystemBussinesId")
if entId == "" {
entId = systemBussinesId
}
wechatConfig, _ := lib.NewWechatLib(entId)
msgData := make(map[string]*message.TemplateDataItem)
msgData["keyword1"] = &message.TemplateDataItem{
Value: keyword1,
Color: "",
}
msgData["keyword2"] = &message.TemplateDataItem{
Value: keyword2,
Color: "",
}
msgData["keyword3"] = &message.TemplateDataItem{
Value: keyword3,
Color: "",
}
msgData["keyword4"] = &message.TemplateDataItem{
Value: keyword4,
Color: "",
}
msgData["keyword5"] = &message.TemplateDataItem{
Value: keyword5,
Color: "",
}
msgData["keyword6"] = &message.TemplateDataItem{
Value: keyword6,
Color: "",
}
msgData["remark"] = &message.TemplateDataItem{
Value: remark,
Color: "",
}
msg := &message.TemplateMessage{
ToUser: openid,
Data: msgData,
TemplateID: templateId,
URL: url,
}
_, err := SendWechatTemplate(wechatConfig, msg)
if err != nil {
c.JSON(200, gin.H{
"code": 400,
"msg": err.Error(),
})
return
}
c.JSON(200, gin.H{
"code": 200,
"msg": "ok",
})
}