/
iquarters.go
180 lines (176 loc) · 5.73 KB
/
iquarters.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
// Package gamesystem 基于zbp的猜歌插件
package gamesystem
import (
"math/rand"
"strconv"
"time"
"github.com/FloatTech/AnimeAPI/wallet"
"github.com/FloatTech/floatbox/math"
"github.com/FloatTech/floatbox/process"
zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/message"
"github.com/FloatTech/ZeroBot-Plugin-Playground/plugin/games/gamesystem"
)
func init() {
// 注册游戏信息
engine, gameManager, err := gamesystem.Register("猜硬币", &gamesystem.GameInfo{
Command: "- 创建猜硬币\n" +
"- [加入|开始]游戏\n" +
"- 开始投币",
Help: "每个人宣言银币正面数量后,掷出参游人数的银币",
Rewards: "正面与宣言的数量相同的场合获得 正面数*10 ATRI币\n" +
"正面与宣言的数量相差2以内的场合获得 正面数*5 ATRI币\n" +
"其他的的场合失去 10 ATRI币",
})
if err != nil {
panic(err)
}
engine.OnFullMatch("创建猜硬币", zero.OnlyGroup, func(ctx *zero.Ctx) bool {
err := gameManager.CreateRoom(ctx.Event.GroupID)
if err != nil {
ctx.SendChain(message.Text("[ERROR]:", err))
return false
}
return true
}).SetBlock(true).Handle(func(ctx *zero.Ctx) {
// 结束后关闭房间
defer gameManager.CloseRoom(ctx.Event.GroupID)
uid := ctx.Event.UserID
userScore := wallet.GetWalletOf(uid)
if userScore < 10 {
ctx.SendChain(message.Text("你的ATRI币不足以满足该游戏"))
return
}
// 等待对方响应
ctx.SendChain(message.Text("你开启了猜硬币游戏。\n其他人可发送“加入游戏”加入游戏或你发送“开始游戏”开始游戏"))
recv, cancel := zero.NewFutureEvent("message", 999, false, zero.OnlyGroup, zero.FullMatchRule("加入游戏", "开始游戏"), zero.CheckGroup(ctx.Event.GroupID)).Repeat()
defer cancel()
answer := ""
var answerid int64
var duel = make(map[int64]int, 2)
uidlist := []int64{uid}
duel[uid] = -1
wait := time.NewTimer(120 * time.Second)
for {
select {
case <-wait.C:
ctx.Send(message.ReplyWithMessage(ctx.Event.MessageID,
message.Text("时间超时,游戏取消")))
return
case c := <-recv:
answer = c.Event.Message.String()
answerid = c.Event.UserID
if answer == "加入游戏" {
_, ok := duel[answerid]
if ok {
ctx.Send(message.ReplyWithMessage(c.Event.MessageID,
message.Text("你已经加入了游戏")))
} else {
challengScore := wallet.GetWalletOf(answerid)
if challengScore < 10 {
ctx.SendChain(message.Text("你的ATRI币不足以满足该游戏"))
return
}
duel[answerid] = -1
uidlist = append(uidlist, answerid)
ctx.Send(message.ReplyWithMessage(c.Event.MessageID,
message.Text("成功加入游戏,等待开房人开始游戏")))
}
}
}
if answer == "开始游戏" && answerid == uid {
break
}
}
wait = time.NewTimer(120 * time.Second)
ctx.SendChain(message.Text("游戏开始,请参游人员宣言正面硬币数量或开房人发送“开始投币”开始投币"))
recv, cancel = zero.NewFutureEvent("message", 999, false, zero.OnlyGroup, zero.RegexRule(`^\d{1,`+strconv.Itoa(len(duel))+`}$|开始投币`), zero.CheckGroup(ctx.Event.GroupID), zero.CheckUser(uidlist...)).Repeat()
defer cancel()
mun := 0
for {
select {
case <-wait.C:
ctx.Send(message.ReplyWithMessage(ctx.Event.MessageID,
message.Text("等待超时,游戏取消\n咕之人扣除 6 ATRI币")))
for uid, guess := range duel {
if guess == -1 {
err := wallet.InsertWalletOf(uid, -6)
if err != nil {
ctx.SendChain(message.At(uid), message.Text("ERROR]:", err))
}
}
}
return
case c := <-recv:
eventID := c.Event.UserID
answer = c.Event.Message.String()
if answer != "开始投币" && duel[eventID] == -1 {
mun++
guess, _ := strconv.Atoi(answer)
duel[eventID] = guess
ctx.SendChain(message.Text("以记录你宣言的数目:", guess))
}
}
if answer == "开始投币" {
if mun >= len(duel) {
break
}
ctx.SendChain(message.Text("还有人没有宣言数量喔"))
}
}
positive := 0
result := "\n"
for i := 0; i < len(duel); i++ {
switch rand.Intn(2) {
case 0:
result += "反 "
case 1:
positive++
result += "正 "
}
}
ctx.SendChain(message.Text("OK,我要开始投掷银币了~"))
process.SleepAbout1sTo2s()
ctx.SendChain(message.Text("一共投掷了", len(duel), "枚银币,其中正面的有", positive, "枚正面。\n具体结果如下", result))
// 数据结算
winmsg := message.Message{}
othermsg := message.Message{}
losemsg := message.Message{}
for uid, guess := range duel {
switch {
case guess == positive:
err := wallet.InsertWalletOf(uid, positive*10)
if err != nil {
ctx.SendChain(message.At(uid), message.Text("ERROR]:", err))
}
winmsg = append(winmsg, message.At(uid))
case math.Abs(guess-positive) <= 2:
err := wallet.InsertWalletOf(uid, positive*5)
if err != nil {
ctx.SendChain(message.At(uid), message.Text("ERROR]:", err))
}
othermsg = append(othermsg, message.At(uid))
default:
err := wallet.InsertWalletOf(uid, -10)
if err != nil {
ctx.SendChain(message.At(uid), message.Text("ERROR]:", err))
}
losemsg = append(losemsg, message.At(uid))
}
}
msg := message.Message{}
if len(winmsg) != 0 {
msg = append(msg, winmsg...)
msg = append(msg, message.Text("\n恭喜获得 ", positive*10, " ATRI币\n\n"))
}
if len(othermsg) != 0 {
msg = append(msg, othermsg...)
msg = append(msg, message.Text("\n恭喜获得 ", positive*5, " ATRI币\n\n"))
}
if len(losemsg) != 0 {
msg = append(msg, losemsg...)
msg = append(msg, message.Text("\n很遗憾失去了 ", 10, " ATRI币\n\n"))
}
ctx.Send(msg)
})
}