change to gorm

This commit is contained in:
iyear 2021-06-14 21:40:03 +08:00
parent 3e5ed2b26c
commit d82ace223b

View File

@ -3,7 +3,7 @@ package bots
import ( import (
"errors" "errors"
"fmt" "fmt"
"github.com/iyear/E5SubBot/core" "github.com/iyear/E5SubBot/model"
"github.com/iyear/E5SubBot/util" "github.com/iyear/E5SubBot/util"
"github.com/spf13/viper" "github.com/spf13/viper"
"github.com/tidwall/gjson" "github.com/tidwall/gjson"
@ -17,162 +17,165 @@ import (
var SignOk map[int64]int var SignOk map[int64]int
// BindUser If Successfully return "",else return error information // BindUser If Successfully return "",else return error information
func BindUser(m *tb.Message, cid, cse string) error { func BindUser(m *tb.Message, ClientId, ClientSecret string) error {
tmp := strings.Split(m.Text, " ") tmp := strings.Split(m.Text, " ")
if len(tmp) != 2 { if len(tmp) != 2 {
return errors.New("wrong format") return errors.New("wrong format")
} }
Alias := tmp[1]
client := core.NewClient(cid, cse)
code := util.GetURLValue(tmp[0], "code") code := util.GetURLValue(tmp[0], "code")
//fmt.Println(code) Alias := tmp[1]
err := client.GetTokenWithCode(code) cli := model.NewClient(ClientId, ClientSecret)
if err != nil { if err := cli.GetTokenWithCode(code); err != nil {
return err return err
} }
bot.Send(m.Chat, "Token获取成功!") bot.Send(m.Chat, "Token获取成功!")
info, err := client.GetUserInfo()
//fmt.Println("TgId:%d Refresh Token: %s\n", m.Chat.ID, refresh) info, err := cli.GetUserInfo()
if err != nil { if err != nil {
return err return err
} }
var u core.Client var u = &model.Client{
u.TgId = m.Chat.ID TgId: m.Chat.ID,
u.RefreshToken = client.RefreshToken //TG的Data传递最高64bytes,一些MsId超过了报错BUTTON_DATA_INVALID (0)采取md5
//TG的Data传递最高64bytes,一些MsId超过了报错BUTTON_DATA_INVALID (0)采取md5 RefreshToken: cli.RefreshToken,
u.MsId = util.Get16MD5Encode(gjson.Get(info, "id").String()) MsId: util.Get16MD5Encode(gjson.Get(info, "id").String()),
u.Uptime = time.Now().Unix() Alias: Alias,
u.Alias = Alias ClientId: ClientId,
u.ClientId = cid ClientSecret: ClientSecret,
u.ClientSecret = cse Other: "",
u.Other = "" }
//MS User Is Exist //MS User Is Exist
if MSAppIsExist(u.TgId, u.ClientId) { if MSAppIsExist(u.TgId, u.ClientId) {
return errors.New("该应用已经绑定过了,无需重复绑定") return errors.New("该应用已经绑定过了,无需重复绑定")
} }
//MS information has gotten //MS information has gotten
bot.Send(m.Chat, "MS_ID(MD5) "+u.MsId+"\nuserPrincipalName "+gjson.Get(info, "userPrincipalName").String()+"\ndisplayName "+gjson.Get(info, "displayName").String()+"\n") bot.Send(m.Chat,
if ok, err := core.AddData(u); !ok { fmt.Sprintf("MS_ID(MD5) %s\nuserPrincipalName %s\ndisplayName %s\n",
return err u.MsId,
gjson.Get(info, "userPrincipalName").String(),
gjson.Get(info, "displayName").String()),
)
if result := model.DB.Create(&u); result.Error != nil {
return result.Error
} }
return nil return nil
} }
// GetBindNum get bind num // GetBindNum get bind num
func GetBindNum(TgId int64) int { func GetBindNum(TgId int64) int {
data := core.QueryDataByTG(TgId) var bindings []*model.Client
return len(data) result := model.DB.Where("tg_id = ?", TgId).Find(&bindings)
return int(result.RowsAffected)
} }
// MSAppIsExist return true => exist // MSAppIsExist return true => exist
func MSAppIsExist(TgId int64, ClientId string) bool { func MSAppIsExist(TgId int64, ClientId string) bool {
data := core.QueryDataByTG(TgId) result := model.DB.
var res core.Client Where("tg_id = ? AND client_id = ?", TgId, ClientId).
for _, res = range data { First(&model.Client{})
if res.ClientId == ClientId { return util.IF(result.RowsAffected == 0, false, true).(bool)
return true
}
}
return false
} }
func SignTask() { // func SignTask() {
var ( // var (
SignOk map[int64]int // SignOk map[int64]int
SignErr []string // SignErr []string
UnbindUser []string // UnbindUser []string
num, signOk int // num, signOk int
) // )
SignOk = make(map[int64]int) // SignOk = make(map[int64]int)
fmt.Println("----Task Begin----") // fmt.Println("----Task Begin----")
fmt.Println("Time:" + time.Now().Format("2006-01-02 15:04:05")) // fmt.Println("Time:" + time.Now().Format("2006-01-02 15:04:05"))
data := core.QueryDataAll() // data := model.QueryDataAll()
num = len(data) // num = len(data)
fmt.Println("Start Sign") // fmt.Println("Start Sign")
//签到任务 // //签到任务
for _, u := range data { // for _, u := range data {
pre := "您的账户: " + u.Alias + "\n在任务执行时出现了错误!\n错误:" // pre := "您的账户: " + u.Alias + "\n在任务执行时出现了错误!\n错误:"
chat, err := bot.ChatByID(strconv.FormatInt(u.TgId, 10)) // chat, err := bot.ChatByID(strconv.FormatInt(u.TgId, 10))
if err != nil { // if err != nil {
zap.S().Errorw("wrong chat id","error",err,"tg_id",u.TgId) // zap.S().Errorw("wrong chat id", "error", err, "tg_id", u.TgId)
continue // continue
} // }
//生成解绑按钮 // //生成解绑按钮
var inlineKeys [][]tb.InlineButton // var inlineKeys [][]tb.InlineButton
UnBindBtn := tb.InlineButton{Unique: "un" + u.MsId, Text: "点击解绑该账户", Data: u.MsId} // UnBindBtn := tb.InlineButton{Unique: "un" + u.MsId, Text: "点击解绑该账户", Data: u.MsId}
bot.Handle(&UnBindBtn, bUnBindInlineBtn) // bot.Handle(&UnBindBtn, bUnBindInlineBtn)
inlineKeys = append(inlineKeys, []tb.InlineButton{UnBindBtn}) // inlineKeys = append(inlineKeys, []tb.InlineButton{UnBindBtn})
tmpBtn := &tb.ReplyMarkup{InlineKeyboard: inlineKeys} // tmpBtn := &tb.ReplyMarkup{InlineKeyboard: inlineKeys}
//
// se := u.MsId + " ( @" + chat.Username + " )"
// client := model.NewClient(u.ClientId, u.ClientSecret)
// if err := client.GetOutlookMails(); err != nil {
// zap.S().Errorw("failed to get outlook mails", "error", err, "ms_id", u.MsId)
// bot.Send(chat, pre+err.Error(), tmpBtn)
// ErrorTimes[u.MsId]++
// SignErr = append(SignErr, se)
// continue
// }
// u.Uptime = time.Now().Unix()
// u.RefreshToken = newRefreshToken
// if ok, err := model.UpdateData(u); !ok {
// zap.S().Errorw("failed to update db data", "error", err, "ms_id", u.MsId)
// bot.Send(chat, pre+err.Error(), tmpBtn)
// SignErr = append(SignErr, se)
// ErrorTimes[u.MsId]++
// continue
// }
// fmt.Println(u.MsId + " Sign OK!")
// SignOk[u.TgId]++
// signOk++
// }
// fmt.Println("Sign End,Start Send")
// var isSend map[int64]bool
// isSend = make(map[int64]bool)
// //用户任务反馈
// for _, u := range data {
// chat, err := bot.ChatByID(strconv.FormatInt(u.TgId, 10))
// if err != nil {
// zap.S().Errorw("failed to get chat", "error", err, "tg_id", u.TgId)
// continue
// }
// //错误上限账户清退
// if ErrorTimes[u.MsId] == ErrMaxTimes {
// zap.S().Errorw("binding max num limit", "ms_id", u.MsId)
// if ok, err := model.DelData(u.MsId); !ok {
// zap.S().Errorw("failed to delete db data", "error", err, "ms_id", u.MsId)
// } else {
// UnbindUser = append(UnbindUser, u.MsId+" ( @"+chat.Username+" )")
// bot.Send(chat, "您的账户因达到错误上限而被自动解绑\n后会有期!\n\n别名: "+u.Alias+"\nclient_id: "+u.ClientId+"\nclient_secret: "+u.ClientSecret)
// }
//
// }
// if !isSend[u.TgId] {
// //静默发送,过多消息很烦
// bot.Send(chat, "任务反馈\n时间: "+time.Now().Format("2006-01-02 15:04:05")+"\n结果: "+strconv.Itoa(SignOk[u.TgId])+"/"+strconv.Itoa(GetBindNum(u.TgId)), &tb.SendOptions{DisableNotification: true})
// isSend[u.TgId] = true
// }
// }
// //管理员任务反馈
// var ErrUserStr string
// var UnbindUserStr string
// for _, eu := range SignErr {
// ErrUserStr = ErrUserStr + eu + "\n"
// }
// for _, ubu := range UnbindUser {
// UnbindUserStr = UnbindUserStr + ubu + "\n"
// }
// for _, a := range admin {
// chat, err := bot.ChatByID(strconv.FormatInt(a, 10))
// if err != nil {
// zap.S().Errorw("failed to get chat", "error", err, "tg_id", a)
// continue
// }
// bot.Send(chat, "任务反馈(管理员)\n完成时间: "+time.Now().Format("2006-01-02 15:04:05")+"\n结果: "+strconv.Itoa(signOk)+"/"+strconv.Itoa(num)+"\n错误账户:\n"+ErrUserStr+"\n清退账户:\n"+UnbindUserStr)
// }
// fmt.Println("----Task End----")
//}
se := u.MsId + " ( @" + chat.Username + " )" func GetAdmins() []int64 {
client := core.NewClient(u.ClientId, u.ClientSecret)
if err := client.GetOutlookMails(); err != nil {
zap.S().Errorw("failed to get outlook mails","error",err,"ms_id",u.MsId)
bot.Send(chat, pre+err.Error(), tmpBtn)
ErrorTimes[u.MsId]++
SignErr = append(SignErr, se)
continue
}
u.Uptime = time.Now().Unix()
u.RefreshToken = newRefreshToken
if ok, err := core.UpdateData(u); !ok {
zap.S().Errorw("failed to update db data","error",err,"ms_id",u.MsId)
bot.Send(chat, pre+err.Error(), tmpBtn)
SignErr = append(SignErr, se)
ErrorTimes[u.MsId]++
continue
}
fmt.Println(u.MsId + " Sign OK!")
SignOk[u.TgId]++
signOk++
}
fmt.Println("Sign End,Start Send")
var isSend map[int64]bool
isSend = make(map[int64]bool)
//用户任务反馈
for _, u := range data {
chat, err := bot.ChatByID(strconv.FormatInt(u.TgId, 10))
if err != nil {
zap.S().Errorw("failed to get chat","error",err,"tg_id",u.TgId)
continue
}
//错误上限账户清退
if ErrorTimes[u.MsId] == ErrMaxTimes {
zap.S().Errorw("binding max num limit","ms_id",u.MsId)
if ok, err := core.DelData(u.MsId); !ok {
zap.S().Errorw("failed to delete db data","error",err,"ms_id",u.MsId)
} else {
UnbindUser = append(UnbindUser, u.MsId+" ( @"+chat.Username+" )")
bot.Send(chat, "您的账户因达到错误上限而被自动解绑\n后会有期!\n\n别名: "+u.Alias+"\nclient_id: "+u.ClientId+"\nclient_secret: "+u.ClientSecret)
}
}
if !isSend[u.TgId] {
//静默发送,过多消息很烦
bot.Send(chat, "任务反馈\n时间: "+time.Now().Format("2006-01-02 15:04:05")+"\n结果: "+strconv.Itoa(SignOk[u.TgId])+"/"+strconv.Itoa(GetBindNum(u.TgId)), &tb.SendOptions{DisableNotification: true})
isSend[u.TgId] = true
}
}
//管理员任务反馈
var ErrUserStr string
var UnbindUserStr string
for _, eu := range SignErr {
ErrUserStr = ErrUserStr + eu + "\n"
}
for _, ubu := range UnbindUser {
UnbindUserStr = UnbindUserStr + ubu + "\n"
}
for _, a := range admin {
chat, err := bot.ChatByID(strconv.FormatInt(a, 10))
if err != nil {
zap.S().Errorw("failed to get chat","error",err,"tg_id",a)
continue
}
bot.Send(chat, "任务反馈(管理员)\n完成时间: "+time.Now().Format("2006-01-02 15:04:05")+"\n结果: "+strconv.Itoa(signOk)+"/"+strconv.Itoa(num)+"\n错误账户:\n"+ErrUserStr+"\n清退账户:\n"+UnbindUserStr)
}
fmt.Println("----Task End----")
}
func GetAdmin() []int64 {
var result []int64 var result []int64
admins := strings.Split(viper.GetString("admin"), ",") admins := strings.Split(viper.GetString("admin"), ",")
for _, v := range admins { for _, v := range admins {
@ -181,20 +184,3 @@ func GetAdmin() []int64 {
} }
return result return result
} }
//func InitLogger() {
// if !util.PathExists(bLogBasePath) {
// os.Mkdir(bLogBasePath, 0773)
// }
//
// path := bLogBasePath + time.Now().Format("2006-01-02") + ".log"
// f, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0773)
// if err != nil {
// logger.Println(err)
// }
// writers := []io.Writer{
// f,
// os.Stdout}
// faoWriter := io.MultiWriter(writers...)
// //logger = log.New(faoWriter, "【E5Sub】", log.Ldate|log.Ltime|log.Lshortfile)
//}