()
| 18 | ) |
| 19 | |
| 20 | func init() { |
| 21 | engine.OnRegex(`^(喵喵|猫猫)(PK|pk)\s*\[CQ:at,qq=(\d+).*`, zero.OnlyGroup, getdb).SetBlock(true).Limit(ctxext.LimitByUser).Handle(func(ctx *zero.Ctx) { |
| 22 | id := ctx.Event.MessageID |
| 23 | gidStr := "group" + strconv.FormatInt(ctx.Event.GroupID, 10) |
| 24 | uidStr := strconv.FormatInt(ctx.Event.UserID, 10) |
| 25 | if ctx.State["regex_matched"].([]string)[3] == uidStr { |
| 26 | ctx.SendChain(message.Reply(id), message.Text("猫猫歪头看着你表示咄咄怪事哦~")) |
| 27 | return |
| 28 | } |
| 29 | userInfo, err := catdata.find(gidStr, uidStr) |
| 30 | if err != nil { |
| 31 | ctx.SendChain(message.Text("[ERROR]:", err)) |
| 32 | return |
| 33 | } |
| 34 | if userInfo == (catInfo{}) || userInfo.Name == "" { |
| 35 | ctx.SendChain(message.Reply(id), message.Text("铲屎官你还没有属于你的主子喔,快去买一只吧!")) |
| 36 | return |
| 37 | } |
| 38 | lastTime := time.Unix(userInfo.ArenaTime, 0) |
| 39 | if time.Since(lastTime).Hours() < 24 { |
| 40 | ctx.SendChain(message.Reply(id), message.Text(userInfo.Name, "已经PK过了,让它休息休息吧")) |
| 41 | return |
| 42 | } |
| 43 | duelStr := ctx.State["regex_matched"].([]string)[3] |
| 44 | duelInfo, err := catdata.find(gidStr, duelStr) |
| 45 | if err != nil { |
| 46 | ctx.SendChain(message.Text("[ERROR]:", err)) |
| 47 | return |
| 48 | } |
| 49 | if duelInfo == (catInfo{}) || duelInfo.Name == "" { |
| 50 | ctx.SendChain(message.Reply(id), message.Text("他还没有属于他的猫猫,无法PK")) |
| 51 | return |
| 52 | } |
| 53 | lastTime = time.Unix(duelInfo.ArenaTime, 0) |
| 54 | if time.Since(lastTime).Hours() < 24 { |
| 55 | ctx.SendChain(message.Reply(id), message.Text(ctx.CardOrNickName(duelInfo.User), "的", duelInfo.Name, "已经PK过了,让它休息休息吧")) |
| 56 | return |
| 57 | } |
| 58 | /***************************************************************/ |
| 59 | ctx.SendChain(message.Text("等待对方回应。(发送“取消”撤回PK)\n请对方发送“去吧猫猫”接受PK或“拒绝”结束PK")) |
| 60 | recv, cancel := zero.NewFutureEvent("message", 999, false, zero.OnlyGroup, zero.RegexRule("^(去吧猫猫|取消|拒绝)$"), zero.CheckGroup(ctx.Event.GroupID), zero.CheckUser(zbmath.Str2Int64(duelStr), userInfo.User)).Repeat() |
| 61 | defer cancel() |
| 62 | approve := false |
| 63 | over := time.NewTimer(60 * time.Second) |
| 64 | for { |
| 65 | select { |
| 66 | case <-over.C: |
| 67 | ctx.SendChain(message.Reply(id), message.Text("对方没回应,PK取消")) |
| 68 | return |
| 69 | case c := <-recv: |
| 70 | over.Stop() |
| 71 | switch { |
| 72 | case c.Event.Message.String() == "拒绝" && c.Event.UserID == duelInfo.User: |
| 73 | ctx.SendChain(message.Reply(id), message.Text("对方拒绝了你的PK")) |
| 74 | return |
| 75 | case c.Event.Message.String() == "取消" && c.Event.UserID == userInfo.User: |
| 76 | ctx.SendChain(message.Reply(id), message.Text("你取消了PK")) |
| 77 | return |
nothing calls this directly
no test coverage detected