-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcommands.go
124 lines (117 loc) · 3.35 KB
/
commands.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
package main
import (
"fmt"
"log"
"time"
"github.com/diamondburned/arikawa/v2/bot"
"github.com/diamondburned/arikawa/v2/discord"
"github.com/diamondburned/arikawa/v2/gateway"
)
// Commands containes the all commands of this bot
type Commands struct {
Ctx *bot.Context
}
// Ping command responses the latency.
func (c *Commands) Ping(e *gateway.MessageCreateEvent) error {
now := time.Now()
msg, err := c.Ctx.SendMessageReply(e.ChannelID, "Loading...", nil, e.ID)
if err != nil {
return err
}
cmdTime := e.Timestamp
if e.EditedTimestamp.IsValid() {
cmdTime = e.EditedTimestamp
}
c.Ctx.DeleteMessage(e.ChannelID, msg.ID)
resp := fmt.Sprintf("🏓\nLatency of message receiving is %v.\nLatency of message sending is %v.", now.Sub(time.Time(cmdTime)), time.Time(msg.Timestamp).Sub(now))
embed := discord.Embed{
Description: resp,
Type: discord.NormalEmbed,
Color: discord.DefaultEmbedColor,
}
c.Ctx.SendEmbedReply(e.ChannelID, embed, e.ID)
return nil
}
// StartGame start a new game
func (c *Commands) StartGame(e *gateway.MessageCreateEvent) error {
_, err := c.Ctx.SendMessageReply(e.ChannelID, "Okay, let's play!", nil, e.ID)
if err != nil {
return err
}
whoWantPlayText := "Who want to play? (Add reaction!)"
msg, err := c.Ctx.SendMessage(e.ChannelID, whoWantPlayText, nil)
if err != nil {
return err
}
reactionAddChan, _ := c.Ctx.ChanFor(func(v interface{}) bool {
ev, ok := v.(*gateway.MessageReactionAddEvent)
if !ok {
return false
}
return ev.MessageID == msg.ID
})
reactionRemoveChan, _ := c.Ctx.ChanFor(func(v interface{}) bool {
ev, ok := v.(*gateway.MessageReactionRemoveEvent)
if !ok {
return false
}
return ev.MessageID == msg.ID
})
go handleWannaPlayReactions(reactionAddChan, reactionRemoveChan, c.Ctx, whoWantPlayText)
return nil
}
func handleWannaPlayReactions(add <-chan interface{}, remove <-chan interface{}, Ctx *bot.Context, whoWantPlayText string) {
type wannaPlay struct {
player Player
count int
}
wannaPlays := make(map[discord.UserID]wannaPlay)
for add != nil && remove != nil {
select {
case e, ok := <-add:
if !ok {
add = nil
continue
}
ev, ok := e.(*gateway.MessageReactionAddEvent)
if !ok {
log.Println("Type error")
}
player := Player{Member: *ev.Member}
if _, ok := wannaPlays[ev.Member.User.ID]; !ok {
wannaPlays[ev.Member.User.ID] = wannaPlay{player: Player{Member: *ev.Member}, count: 1}
} else {
wannaPlay := wannaPlays[ev.Member.User.ID]
wannaPlay.count++
wannaPlays[ev.Member.User.ID] = wannaPlay
}
log.Println("Reaction added by " + player.GetNick())
wannaText := whoWantPlayText
for _, wannaPlay := range wannaPlays {
wannaText += "\n- " + wannaPlay.player.GetNick()
}
Ctx.EditText(ev.ChannelID, ev.MessageID, wannaText)
case e, ok := <-remove:
if !ok {
add = nil
continue
}
ev, ok := e.(*gateway.MessageReactionRemoveEvent)
if !ok {
log.Println("Type error")
}
wannaPlay := wannaPlays[ev.UserID]
wannaPlay.count--
wannaPlays[ev.UserID] = wannaPlay
if wannaPlay.count < 1 {
delete(wannaPlays, ev.UserID)
}
log.Println("Reaction removed by " + wannaPlay.player.GetNick())
wannaText := whoWantPlayText
for _, wannaPlay := range wannaPlays {
wannaText += "\n- " + wannaPlay.player.GetNick()
}
Ctx.EditText(ev.ChannelID, ev.MessageID, wannaText)
}
}
}