E5BotForSQLite/bots/control.go

228 lines
6.5 KiB
Go
Raw Normal View History

2021-03-11 12:57:30 +08:00
package bots
2020-03-27 22:01:19 +08:00
import (
2020-04-08 13:42:10 +08:00
"errors"
2020-03-27 22:01:19 +08:00
"fmt"
"github.com/spf13/viper"
2020-03-27 22:01:19 +08:00
"github.com/tidwall/gjson"
tb "gopkg.in/tucnak/telebot.v2"
2021-03-12 12:54:32 +08:00
"main/core"
2021-03-11 12:57:30 +08:00
"main/logger"
"main/outlook"
"main/util"
"strconv"
2020-03-28 10:22:07 +08:00
"strings"
2020-03-27 22:01:19 +08:00
"time"
)
2020-04-01 20:06:20 +08:00
var SignOk map[int64]int
2020-03-27 23:01:17 +08:00
//If Successfully return "",else return error information
2020-04-08 13:42:10 +08:00
func BindUser(m *tb.Message, cid, cse string) error {
2021-03-11 12:57:30 +08:00
logger.Println("%d Begin Bind\n", m.Chat.ID)
2020-03-28 10:22:07 +08:00
tmp := strings.Split(m.Text, " ")
if len(tmp) != 2 {
2021-03-11 12:57:30 +08:00
logger.Println("%d Bind error:Wrong Bind Format\n", m.Chat.ID)
2020-04-08 13:42:10 +08:00
return errors.New("绑定格式错误")
2020-03-28 10:22:07 +08:00
}
2021-03-11 12:57:30 +08:00
logger.Println("Alias: " + tmp[1])
Alias := tmp[1]
code := util.GetURLValue(tmp[0], "code")
2020-03-31 09:14:27 +08:00
//fmt.Println(code)
2021-03-12 12:54:32 +08:00
access, refresh, err := MSFirGetToken(code, cid, cse)
2020-04-08 13:42:10 +08:00
if err != nil {
2021-03-11 12:57:30 +08:00
logger.Println("%d Bind error:GetRefreshToken %s \n", m.Chat.ID, err.Error())
2020-04-08 13:42:10 +08:00
return err
2020-03-27 22:01:19 +08:00
}
2020-03-27 23:01:17 +08:00
//token has gotten
2020-03-27 22:01:19 +08:00
bot.Send(m.Chat, "Token获取成功!")
2021-03-12 12:54:32 +08:00
info, err := outlook.GetUserInfo(access)
2021-03-11 12:57:30 +08:00
//fmt.Println("TgId:%d Refresh Token: %s\n", m.Chat.ID, refresh)
2020-04-08 13:42:10 +08:00
if err != nil {
2021-03-11 12:57:30 +08:00
logger.Println("%d Bind error:Getinfo %s \n", m.Chat.ID, err.Error())
2020-04-08 13:42:10 +08:00
return err
2020-03-27 22:01:19 +08:00
}
2020-03-27 23:01:17 +08:00
2021-03-12 12:54:32 +08:00
var u core.Client
2021-03-11 12:57:30 +08:00
u.TgId = m.Chat.ID
u.RefreshToken = refresh
//TG的Data传递最高64bytes,一些MsId超过了报错BUTTON_DATA_INVALID (0)采取md5
u.MsId = util.Get16MD5Encode(gjson.Get(info, "id").String())
u.Uptime = time.Now().Unix()
logger.Println(u.Uptime)
u.Alias = Alias
u.ClientId = cid
u.ClientSecret = cse
u.Other = ""
2020-03-27 23:01:17 +08:00
//MS User Is Exist
2021-03-11 12:57:30 +08:00
if MSAppIsExist(u.TgId, u.ClientId) {
logger.Println("%d Bind error:MSUserHasExisted\n", m.Chat.ID)
2020-04-08 13:42:10 +08:00
return errors.New("该应用已经绑定过了,无需重复绑定")
2020-03-27 23:01:17 +08:00
}
//MS information has gotten
2021-03-11 12:57:30 +08:00
bot.Send(m.Chat, "MS_ID(MD5) "+u.MsId+"\nuserPrincipalName "+gjson.Get(info, "userPrincipalName").String()+"\ndisplayName "+gjson.Get(info, "displayName").String()+"\n")
2021-03-12 12:54:32 +08:00
if ok, err := core.AddData(u); !ok {
2021-03-11 12:57:30 +08:00
logger.Println("%d Bind error: %s\n", m.Chat.ID, err)
2020-04-08 13:42:10 +08:00
return err
2020-03-27 23:01:17 +08:00
}
2021-03-11 12:57:30 +08:00
logger.Println("%d Bind Successfully!\n", m.Chat.ID)
2020-04-08 13:42:10 +08:00
return nil
2020-03-27 23:01:17 +08:00
}
2020-03-28 15:21:59 +08:00
//get bind num
2021-03-11 12:57:30 +08:00
func GetBindNum(TgId int64) int {
2021-03-12 12:54:32 +08:00
data := core.QueryDataByTG(TgId)
2020-03-27 23:01:17 +08:00
return len(data)
}
//return true => exist
2021-03-11 12:57:30 +08:00
func MSAppIsExist(TgId int64, ClientId string) bool {
2021-03-12 12:54:32 +08:00
data := core.QueryDataByTG(TgId)
var res core.Client
2020-03-27 23:01:17 +08:00
for _, res = range data {
2021-03-11 12:57:30 +08:00
if res.ClientId == ClientId {
2020-03-27 23:01:17 +08:00
return true
}
2020-03-27 22:01:19 +08:00
}
2020-03-27 23:01:17 +08:00
return false
2020-03-27 22:01:19 +08:00
}
2020-03-28 15:21:59 +08:00
//SignTask
func SignTask() {
var (
SignOk map[int64]int
SignErr []string
UnbindUser []string
num, signOk int
)
2020-04-01 20:06:20 +08:00
SignOk = make(map[int64]int)
2020-03-29 12:51:39 +08:00
fmt.Println("----Task Begin----")
fmt.Println("Time:" + time.Now().Format("2006-01-02 15:04:05"))
2021-03-12 12:54:32 +08:00
data := core.QueryDataAll()
num = len(data)
fmt.Println("Start Sign")
//签到任务
2020-03-28 15:21:59 +08:00
for _, u := range data {
2021-03-11 12:57:30 +08:00
pre := "您的账户: " + u.Alias + "\n在任务执行时出现了错误!\n错误:"
chat, err := bot.ChatByID(strconv.FormatInt(u.TgId, 10))
2020-08-21 09:55:42 +08:00
if err != nil {
logger.Println(err)
continue
}
2020-04-03 08:30:53 +08:00
//生成解绑按钮
var inlineKeys [][]tb.InlineButton
2021-03-11 12:57:30 +08:00
UnBindBtn := tb.InlineButton{Unique: "un" + u.MsId, Text: "点击解绑该账户", Data: u.MsId}
2020-04-03 08:30:53 +08:00
bot.Handle(&UnBindBtn, bUnBindInlineBtn)
inlineKeys = append(inlineKeys, []tb.InlineButton{UnBindBtn})
tmpBtn := &tb.ReplyMarkup{InlineKeyboard: inlineKeys}
2021-03-11 12:57:30 +08:00
se := u.MsId + " ( @" + chat.Username + " )"
2021-03-12 12:54:32 +08:00
access, newRefreshToken, err := outlook.GetToken(u.RefreshToken, u.ClientId, u.ClientSecret)
2020-08-21 09:55:42 +08:00
2020-04-08 13:42:10 +08:00
if err != nil {
2021-03-11 12:57:30 +08:00
logger.Println(u.MsId+" ", err)
2020-04-08 13:51:43 +08:00
bot.Send(chat, pre+gjson.Get(err.Error(), "error").String(), tmpBtn)
2020-04-03 08:30:53 +08:00
SignErr = append(SignErr, se)
2021-03-11 12:57:30 +08:00
ErrorTimes[u.MsId]++
2020-03-28 15:21:59 +08:00
continue
}
2021-03-12 12:54:32 +08:00
if ok, err := outlook.GetOutLookMails(access); !ok {
2021-03-11 12:57:30 +08:00
logger.Println(u.MsId+" ", err)
2020-04-08 13:51:43 +08:00
bot.Send(chat, pre+gjson.Get(err.Error(), "error").String(), tmpBtn)
2021-03-11 12:57:30 +08:00
ErrorTimes[u.MsId]++
2020-04-03 08:30:53 +08:00
SignErr = append(SignErr, se)
2020-03-28 15:21:59 +08:00
continue
}
2021-03-11 12:57:30 +08:00
u.Uptime = time.Now().Unix()
u.RefreshToken = newRefreshToken
2021-03-12 12:54:32 +08:00
if ok, err := core.UpdateData(u); !ok {
2021-03-11 12:57:30 +08:00
logger.Println(u.MsId+" ", err)
2020-04-08 13:42:10 +08:00
bot.Send(chat, pre+err.Error(), tmpBtn)
2020-04-03 08:30:53 +08:00
SignErr = append(SignErr, se)
2021-03-11 12:57:30 +08:00
ErrorTimes[u.MsId]++
continue
}
2021-03-11 12:57:30 +08:00
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 {
2021-03-11 12:57:30 +08:00
chat, err := bot.ChatByID(strconv.FormatInt(u.TgId, 10))
if err != nil {
logger.Println("Send Result ERROR: ", err)
continue
}
//错误上限账户清退
2021-03-11 12:57:30 +08:00
if ErrorTimes[u.MsId] == ErrMaxTimes {
logger.Println(u.MsId + " Error Limit")
2021-03-12 12:54:32 +08:00
if ok, err := core.DelData(u.MsId); !ok {
logger.Println(err)
} else {
2021-03-11 12:57:30 +08:00
UnbindUser = append(UnbindUser, u.MsId+" ( @"+chat.Username+" )")
_, err = bot.Send(chat, "您的账户因达到错误上限而被自动解绑\n后会有期!\n\n别名: "+u.Alias+"\nclient_id: "+u.ClientId+"\nclient_secret: "+u.ClientSecret)
if err != nil {
logger.Println(err)
}
}
}
2021-03-11 12:57:30 +08:00
if !isSend[u.TgId] {
2020-04-03 08:30:53 +08:00
//静默发送,过多消息很烦
2021-03-11 12:57:30 +08:00
_, err = 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})
2020-04-03 13:19:53 +08:00
if err != nil {
logger.Println(err)
}
2021-03-11 12:57:30 +08:00
isSend[u.TgId] = true
2020-03-28 15:21:59 +08:00
}
}
//管理员任务反馈
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 {
2021-01-09 19:31:19 +08:00
chat, err := bot.ChatByID(strconv.FormatInt(a, 10))
if err != nil {
logger.Println(err)
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)
}
2020-03-29 12:51:39 +08:00
fmt.Println("----Task End----")
2020-03-28 15:21:59 +08:00
}
func GetAdmin() []int64 {
var result []int64
admins := strings.Split(viper.GetString("admin"), ",")
for _, v := range admins {
id, _ := strconv.ParseInt(v, 10, 64)
result = append(result, id)
}
return result
}
2020-04-03 13:19:53 +08:00
2021-03-11 12:57:30 +08:00
//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)
//}