forked from ghaoo/rboot
-
Notifications
You must be signed in to change notification settings - Fork 0
/
vote.go
121 lines (92 loc) · 2.65 KB
/
vote.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
package vote
import (
"fmt"
"github.com/ri0day/rboot"
"strings"
"time"
)
var timeout = 20 * time.Minute
var active bool // 投票是否进行中
// Vote 投票
type Vote struct {
Name string // 投票名称
User string // 发起人
Choices map[string]int // 投票选项
Players map[string]string // 参与人数
startTime time.Time // 开始时间
ticker *time.Ticker // 计时器
}
// New 新建一个投票
func (v *Vote) New(name string, opt string) []*rboot.Message {
// 检查有没有进行中的投票
if active {
return rboot.NewMessages("投票进行中,请稍后...")
}
opts := strings.Split(opt, " ")
if len(opts) < 2 {
return rboot.NewMessages("选项最少两项")
}
v.Choices = make(map[string]int, len(opt))
for _, c := range opts {
v.Choices[c] = 0
}
v.Name = name
v.Players = make(map[string]string)
v.startTime = time.Now()
active = true
go func() {
v.ticker = time.NewTicker(timeout)
select {
case <-v.ticker.C:
v.Stop()
}
}()
msg := fmt.Sprintf("%s 创建了投票: %s\n> 选项:\n", v.User, name)
for i, c := range opts {
msg += fmt.Sprintf("> %d. `%s`\n", i+1, c)
}
msg += "\n*投票请直接输入 @@选项*"
return rboot.NewMessages(msg)
}
// Voting 对正在进行中的投票活动进行投票
func (v *Vote) Voting(user string, opt string) []*rboot.Message {
if !active {
return rboot.NewMessages("没有正在进行中的投票或投票已经结束!")
}
// 检查用户有没有参与
if iopt, ok := v.Players[user]; ok {
return rboot.NewMessages(fmt.Sprintf("%s 你已经参与了投票,你选择的是`%s`", user, iopt))
}
opt = strings.TrimSpace(opt)
// 检查选项是否存在
if _, ok := v.Choices[opt]; !ok {
return rboot.NewMessages("投票失败!没有这个选项胸弟!")
}
v.Players[user] = opt
v.Choices[opt] += 1
return rboot.NewMessages("投票成功!")
}
// Result 返回投票结果
func (v *Vote) Result() []*rboot.Message {
if !active {
return rboot.NewMessages("没有正在进行中的投票或投票已经结束")
}
content := "投票: " + v.Name + "\n"
for choice, count := range v.Choices {
content += fmt.Sprintf(" *%d* 人选择了 `%s` \n", count, choice)
}
content += "\n*发起人*: " + v.User
return rboot.NewMessages(content)
}
// Stop 停止正在进行中的投票
func (v *Vote) Stop() []*rboot.Message {
if !active {
return rboot.NewMessages("没有正在进行中的投票或投票已经结束")
}
result := v.Result()
active = false
v.ticker.Stop()
msg := rboot.NewMessage(fmt.Sprintf("`%s` 投票结束!", v.Name))
result = append(result, msg)
return result
}