/
number_guesser.go
96 lines (81 loc) · 2.34 KB
/
number_guesser.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
package games
import (
"fmt"
"math/rand"
"github.com/innogames/slack-bot/v2/bot"
"github.com/innogames/slack-bot/v2/bot/matcher"
"github.com/innogames/slack-bot/v2/bot/msg"
)
const (
maxNumber = 1000
maxTries = 10
)
type game struct {
randomNumber int
tries int
}
type runningGames map[string]*game
type numberGuesserCommand struct {
bot.BaseCommand
games runningGames
}
// NewNumberGuesserCommand is a very small game to guess a random number
func NewNumberGuesserCommand(base bot.BaseCommand) bot.Command {
return &numberGuesserCommand{base, runningGames{}}
}
func (c *numberGuesserCommand) GetMatcher() matcher.Matcher {
return matcher.NewGroupMatcher(
matcher.NewTextMatcher("start number guesser", c.start),
matcher.NewRegexpMatcher(`guess number (?P<number>\d+)`, c.guess),
)
}
func (c *numberGuesserCommand) start(match matcher.Result, message msg.Message) {
if _, ok := c.games[message.GetUser()]; ok {
c.SendMessage(message, "There is already a game :smile: use `guess number XX` instead")
return
}
randomNumber := rand.Intn(maxNumber) //nolint:gosec
game := &game{
randomNumber: randomNumber,
tries: 0,
}
c.games[message.GetUser()] = game
c.SendMessage(message, fmt.Sprintf("I chose a number between 0 an %d. Good luck! Use `guess number XX`", maxNumber))
}
func (c *numberGuesserCommand) guess(match matcher.Result, message msg.Message) {
currentGame, ok := c.games[message.GetUser()]
if !ok {
c.SendMessage(message, "There is no game running. Use `start number guesser`")
return
}
guess := match.GetInt("number")
currentGame.tries++
if guess == currentGame.randomNumber {
c.SendMessage(message, fmt.Sprintf("Wow! you got it in %d tries :beers:", currentGame.tries))
delete(c.games, message.GetUser())
return
}
if currentGame.tries >= maxTries {
c.SendMessage(message, "Too many tries already...game over!")
delete(c.games, message.GetUser())
return
}
if guess < currentGame.randomNumber {
c.SendMessage(message, "Higher :arrow_up_small:")
} else {
c.SendMessage(message, "Lower :arrow_down_small:")
}
}
func (c *numberGuesserCommand) GetHelp() []bot.Help {
return []bot.Help{
{
Command: "start number guesser",
Description: "small game to guess a random number",
Category: category,
Examples: []string{
"start number guesser",
"guess number 100",
},
},
}
}