217 lines
6.3 KiB
Go
217 lines
6.3 KiB
Go
package steamplaying
|
||
|
||
import (
|
||
"fmt"
|
||
"regexp"
|
||
"time"
|
||
|
||
"git.lxtend.com/qqbot/action"
|
||
"git.lxtend.com/qqbot/constants"
|
||
"git.lxtend.com/qqbot/handler"
|
||
"git.lxtend.com/qqbot/model"
|
||
"git.lxtend.com/qqbot/util"
|
||
)
|
||
|
||
func init() {
|
||
// Register the handler with the server
|
||
handler.RegisterHandler("绑steam", bindSteam, constants.LEVEL_USER)
|
||
handler.RegisterHelpInform("绑steam", "steam", "绑定您的steam账号。可以通过右上角-账户明细页面 https://store.steampowered.com/account/ 查看,位于页面左上角")
|
||
handler.RegisterHandler("群绑定steam", bindSteamInGroup, constants.LEVEL_USER)
|
||
handler.RegisterHelpInform("群绑定steam", "steam", "在群内启用你的steam游戏状态查询")
|
||
// handler.RegisterHandler("群通报steam", bindSteamInGroupBroadCast, constants.LEVEL_USER)
|
||
// handler.RegisterHelpInform("群通报steam", "在群内启用你的steam游戏上线通报")
|
||
handler.RegisterHandler("解绑steam", unbindSteam, constants.LEVEL_USER)
|
||
handler.RegisterHelpInform("解绑steam", "steam", "解绑您的steam账号,并解绑所有群监听")
|
||
handler.RegisterHandler("群解绑steam", unbindSteamInGroup, constants.LEVEL_USER)
|
||
handler.RegisterHelpInform("群解绑steam", "steam", "解绑本群群监听steam游戏状态")
|
||
handler.RegisterHandler("查房", checkSteamPlaying, constants.LEVEL_USER)
|
||
handler.RegisterHelpInform("查房", "steam", "查看群内成员的steam游戏状态")
|
||
go RoundCheckSteamPlaying()
|
||
}
|
||
|
||
func bindSteam(msg model.Message) model.Reply {
|
||
token := util.SplitN(msg.RawMsg, 2)
|
||
if len(token) < 2 {
|
||
return model.Reply{
|
||
ReplyMsg: "请输入steamID",
|
||
ReferOriginMsg: true,
|
||
FromMsg: msg,
|
||
}
|
||
} else {
|
||
re := regexp.MustCompile(`https://steamcommunity\.com/profiles/([0-9]+)`)
|
||
steamIdInUrl := re.FindStringSubmatch(token[1])
|
||
if steamIdInUrl != nil {
|
||
token[1] = steamIdInUrl[1]
|
||
}
|
||
if valid, err := checkSteamIDValid(token[1]); !valid {
|
||
return model.Reply{
|
||
ReplyMsg: fmt.Sprintf("steamID无效: %v", err),
|
||
ReferOriginMsg: true,
|
||
FromMsg: msg,
|
||
}
|
||
} else if err != nil {
|
||
return model.Reply{
|
||
ReplyMsg: fmt.Sprintf("steamID验证失败: %v", err),
|
||
ReferOriginMsg: true,
|
||
FromMsg: msg,
|
||
}
|
||
}
|
||
if err := bindSteamUser(msg.UserId, token[1]); err != nil {
|
||
return model.Reply{
|
||
ReplyMsg: fmt.Sprintf("绑定失败: %v", err),
|
||
ReferOriginMsg: true,
|
||
FromMsg: msg,
|
||
}
|
||
}
|
||
}
|
||
return model.Reply{
|
||
ReplyMsg: fmt.Sprintf("绑定steam用户%s成功", token[1]),
|
||
ReferOriginMsg: true,
|
||
FromMsg: msg,
|
||
}
|
||
}
|
||
|
||
func bindSteamInGroup(msg model.Message) model.Reply {
|
||
if user, err := getSteamUser(msg.UserId); err != nil {
|
||
return model.Reply{
|
||
ReplyMsg: fmt.Sprintf("查询steam绑定失败: %v", err),
|
||
ReferOriginMsg: true,
|
||
FromMsg: msg,
|
||
}
|
||
} else if err := bindUserInGroup(msg.GroupInfo.GroupId, user.SteamID); err != nil {
|
||
return model.Reply{
|
||
ReplyMsg: fmt.Sprintf("绑定至群监听列表失败: %v", err),
|
||
ReferOriginMsg: true,
|
||
FromMsg: msg,
|
||
}
|
||
}
|
||
return model.Reply{
|
||
ReplyMsg: "绑定至群监听列表成功",
|
||
ReferOriginMsg: true,
|
||
FromMsg: msg,
|
||
}
|
||
}
|
||
|
||
func unbindSteam(msg model.Message) model.Reply {
|
||
if user, err := getSteamUser(msg.UserId); err != nil {
|
||
return model.Reply{
|
||
ReplyMsg: fmt.Sprintf("解绑失败: %v", err),
|
||
ReferOriginMsg: true,
|
||
FromMsg: msg,
|
||
}
|
||
} else {
|
||
if err := unbindUserInAllGroup(user.SteamID); err != nil {
|
||
return model.Reply{
|
||
ReplyMsg: fmt.Sprintf("解绑所有群监听列表失败: %v", err),
|
||
ReferOriginMsg: true,
|
||
FromMsg: msg,
|
||
}
|
||
}
|
||
if err := unbindSteamUser(msg.UserId); err != nil {
|
||
return model.Reply{
|
||
ReplyMsg: fmt.Sprintf("解绑失败: %v", err),
|
||
ReferOriginMsg: true,
|
||
FromMsg: msg,
|
||
}
|
||
}
|
||
}
|
||
return model.Reply{
|
||
ReplyMsg: "解绑成功",
|
||
ReferOriginMsg: true,
|
||
FromMsg: msg,
|
||
}
|
||
}
|
||
|
||
func unbindSteamInGroup(msg model.Message) model.Reply {
|
||
if user, err := getSteamUser(msg.UserId); err != nil {
|
||
return model.Reply{
|
||
ReplyMsg: fmt.Sprintf("群监听解绑失败: %v", err),
|
||
ReferOriginMsg: true,
|
||
FromMsg: msg,
|
||
}
|
||
} else {
|
||
if err := unbindUserInGroup(msg.GroupInfo.GroupId, user.SteamID); err != nil {
|
||
return model.Reply{
|
||
ReplyMsg: fmt.Sprintf("群监听解绑失败: %v", err),
|
||
ReferOriginMsg: true,
|
||
FromMsg: msg,
|
||
}
|
||
}
|
||
}
|
||
return model.Reply{
|
||
ReplyMsg: "群监听解绑成功,本群内将不再查询你的steam游戏状态",
|
||
ReferOriginMsg: true,
|
||
FromMsg: msg,
|
||
}
|
||
}
|
||
|
||
func checkSteamPlaying(msg model.Message) model.Reply {
|
||
users, err := getSteamUsersInGroup(msg.GroupInfo.GroupId)
|
||
if err != nil {
|
||
return model.Reply{
|
||
ReplyMsg: fmt.Sprintf("获取群成员steam列表失败: %v", err),
|
||
ReferOriginMsg: true,
|
||
FromMsg: msg,
|
||
}
|
||
}
|
||
var steamIds []string
|
||
for _, user := range users {
|
||
steamIds = append(steamIds, user.SteamID)
|
||
}
|
||
gameList, err := checkSteamGameStatus(steamIds)
|
||
if err != nil {
|
||
return model.Reply{
|
||
ReplyMsg: fmt.Sprintf("获取游戏列表失败: %v", err),
|
||
ReferOriginMsg: true,
|
||
FromMsg: msg,
|
||
}
|
||
}
|
||
return model.Reply{
|
||
ReplyMsg: gameList,
|
||
ReferOriginMsg: true,
|
||
FromMsg: msg,
|
||
}
|
||
}
|
||
|
||
func RoundCheckSteamPlaying() {
|
||
once := true
|
||
playingMap := map[int64]map[string]string{}
|
||
for {
|
||
groups, err := getAllGroupID()
|
||
if err != nil {
|
||
fmt.Println("获取群列表失败: ", err)
|
||
continue
|
||
}
|
||
|
||
for _, group := range groups {
|
||
time.Sleep(15 * time.Second)
|
||
if _, ok := playingMap[group]; !ok {
|
||
playingMap[group] = map[string]string{}
|
||
}
|
||
users, err := getSteamUsersInGroup(group)
|
||
if err != nil {
|
||
fmt.Println("获取群成员steam列表失败: ", err)
|
||
continue
|
||
}
|
||
var steamIds []string
|
||
for _, user := range users {
|
||
steamIds = append(steamIds, user.SteamID)
|
||
}
|
||
gameList, err := checkDiffSteamGameStatus(steamIds, playingMap[group])
|
||
if err != nil {
|
||
fmt.Println("获取游戏列表失败: ", err)
|
||
continue
|
||
}
|
||
if gameList != "" && !once {
|
||
msg := model.Reply{
|
||
ReplyMsg: "速报:\n" + gameList,
|
||
ReferOriginMsg: false,
|
||
FromMsg: model.Message{GroupInfo: model.GroupInfo{GroupId: group}},
|
||
}
|
||
action.ActionManager.SendMsg(msg)
|
||
}
|
||
}
|
||
once = false
|
||
}
|
||
}
|