qq_bot/handler/steamplaying/steam_playing.go

217 lines
6.3 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}
}