go-wxhelper/plugin/plugins/command/leigod.go
2024-07-04 14:10:46 +08:00

206 lines
5.3 KiB
Go

package command
import (
"encoding/json"
"errors"
"fmt"
"go-wechat/client"
"go-wechat/model/entity"
"go-wechat/model/model"
"go-wechat/model/vo"
"go-wechat/utils"
"gorm.io/gorm"
"log"
"strings"
)
// leiGod
// @description: 雷神加速器相关接口
type leiGodI interface {
binding(string, string, bool) string // 绑定雷神加速器账号
info() string // 账户详情
pause() string // 暂停加速
}
type leiGod struct {
userId string // 用户Id
}
// newLeiGod
// @description: 创建一个雷神加速器实例
// @param userId
// @return leiGodI
func newLeiGod(userId string) leiGodI {
return &leiGod{userId: userId}
}
// LeiGodCmd
// @description: 雷神加速器指令
// @param userId
// @param cmd
// @param args
// @return string
func LeiGodCmd(userId, cmd string, args ...string) {
lg := newLeiGod(userId)
var replyMsg string
switch cmd {
case "绑定", "b":
var force bool
if len(args) == 3 && args[2] == "-f" {
force = true
}
replyMsg = lg.binding(args[0], args[1], force)
case "详情", "i":
replyMsg = lg.info()
case "暂停", "p":
replyMsg = lg.pause()
default:
replyMsg = "指令错误"
}
// 返回消息
if strings.TrimSpace(replyMsg) != "" {
utils.SendMessage(userId, "", replyMsg, 0)
}
}
// binding
// @description: 绑定雷神加速器账号
// @receiver l
// @param account
// @param password
// @param force
// @return flag
func (l leiGod) binding(account, password string, force bool) (replyMsg string) {
log.Printf("用户[%s]绑定雷神加速器账号[%s] -> %s", l.userId, account, password)
// 取出已绑定的账号
var data entity.PluginData
client.MySQL.Where("user_id = ?", l.userId).Where("plugin_code = 'leigod'").First(&data)
var ac vo.LeiGodAccount
if data.UserId != "" {
if err := json.Unmarshal([]byte(data.Data), &ac); err != nil {
log.Printf("用户[%s]已绑定雷神账号解析失败: %v", l.userId, err)
return
}
log.Printf("用户[%s]已绑定账号[%s]", l.userId, ac.Account)
}
// 如果已经绑定账号,且不是强制绑定,则返回
if ac.Account != "" && !force {
replyMsg = "您已绑定账号[" + ac.Account + "],如需更换请使用 -f 参数: \n/雷神 绑定 账号 密码 -f"
return
}
accountStr := fmt.Sprintf("{\"account\": \"%s\", \"password\":\"%s\"}", account, password)
// 绑定账号
var err error
if data.UserId != "" {
// 修改
err = client.MySQL.Model(&data).
Where("user_id = ?", l.userId).
Where("plugin_code = 'leigod'").
Update("data", accountStr).Error
} else {
// 新增
data = entity.PluginData{
UserId: l.userId,
PluginCode: "leigod",
Data: accountStr,
}
err = client.MySQL.Create(&data).Error
}
if err != nil {
log.Printf("用户[%s]绑定雷神账号失败: %v", l.userId, err)
replyMsg = "绑定失败: " + err.Error()
} else {
replyMsg = "绑定成功"
}
return
}
// info
// @description: 账户详情
// @receiver l
// @return replyMsg
func (l leiGod) info() (replyMsg string) {
log.Printf("用户[%s]获取雷神账户详情", l.userId)
// 取出已绑定的账号
var data entity.PluginData
err := client.MySQL.Where("user_id = ?", l.userId).Where("plugin_code = 'leigod'").First(&data).Error
if err != nil {
log.Printf("用户[%s]获取雷神账户详情失败: %v", l.userId, err)
if errors.Is(err, gorm.ErrRecordNotFound) {
replyMsg = "您还未绑定账号,请先绑定后再使用,绑定指定:\n/雷神 绑定 你的账号 你的密码"
} else {
replyMsg = "系统错误: " + err.Error()
}
return
}
// 解析为结构体
var ac vo.LeiGodAccount
if err = json.Unmarshal([]byte(data.Data), &ac); err != nil {
log.Printf("用户[%s]已绑定雷神账号解析失败: %v", l.userId, err)
replyMsg = "系统炸了,请耐心等待修复"
return
}
lgu := utils.LeiGodUtil(ac.Account, ac.Password)
if err = lgu.Login(); err != nil {
return "登录失败: " + err.Error()
}
var ui model.LeiGodUserInfoResp
if ui, err = lgu.Info(); err != nil {
return "获取详情失败: " + err.Error()
}
replyMsg = fmt.Sprintf("#账户 %s\n#剩余时长 %s\n#暂停状态 %s\n#最后暂停时间 %s",
ui.Mobile, ui.ExpiryTime, ui.PauseStatus, ui.LastPauseTime)
return
}
// pause
// @description: 暂停加速
// @receiver l
// @return flag
func (l leiGod) pause() (replyMsg string) {
log.Printf("用户[%s]暂停加速", l.userId)
// 取出已绑定的账号
var data entity.PluginData
err := client.MySQL.Where("user_id = ?", l.userId).Where("plugin_code = 'leigod'").First(&data).Error
if err != nil {
log.Printf("用户[%s]获取雷神账户详情失败: %v", l.userId, err)
if errors.Is(err, gorm.ErrRecordNotFound) {
replyMsg = "您还未绑定账号,请先绑定后再使用,绑定指定:\n/雷神 绑定 你的账号 你的密码"
} else {
replyMsg = "系统错误: " + err.Error()
}
return
}
// 解析为结构体
var ac vo.LeiGodAccount
if err = json.Unmarshal([]byte(data.Data), &ac); err != nil {
log.Printf("用户[%s]已绑定雷神账号解析失败: %v", l.userId, err)
replyMsg = "系统炸了,请耐心等待修复"
return
}
lgu := utils.LeiGodUtil(ac.Account, ac.Password)
if err = lgu.Login(); err != nil {
return "登录失败: " + err.Error()
}
if err = lgu.Pause(); err != nil {
return "暂停失败: " + err.Error()
}
return "暂停成功"
}