From f7e0ed5d52f7d47379cf84aed4c842752b7e144b Mon Sep 17 00:00:00 2001 From: Henesy Date: Wed, 13 Jan 2021 02:40:34 +0000 Subject: [PATCH] add roll --- devbuild | 2 +- mux.go | 2 + x/mux/fortunes.go | 2 + x/mux/roll.go | 127 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 132 insertions(+), 1 deletion(-) create mode 100644 x/mux/roll.go diff --git a/devbuild b/devbuild index f033f2b36b4a3c39c26c97bdf99b6ac6593b9f46..f45d7f3b5bd2026c69b380483ef23993ab6abbd8 100755 --- a/devbuild +++ b/devbuild @@ -1,5 +1,5 @@ #!/bin/bash # Rebuild script for hosting server export DG_TOKEN=$HB_TOKEN -go build; ./glenda > ./glenda.log +go clean && go build; ./glenda diff --git a/mux.go b/mux.go index 0462eb0db82be241f4915bd561fe29e57bb337c0..310bcab2a944409048695c552485823a8bf0d891 100644 --- a/mux.go +++ b/mux.go @@ -61,4 +61,6 @@ func init() { Router.Route("uptime", "Current bot uptime", Router.Uptime) Router.Route("gridlink", "Convert griddisk paths to 'incoming' URL's", Router.GridLink) + + Router.Route("roll", "Roll dice in the form XdY", Router.Roll) } diff --git a/x/mux/fortunes.go b/x/mux/fortunes.go index d12656f649cc1f138e293bf65174c9b053e74607..94d7fdade5b3dc1796b39e1cf4868c6a22d47d8b 100644 --- a/x/mux/fortunes.go +++ b/x/mux/fortunes.go @@ -31,6 +31,8 @@ func (m *Mux) Fortunes(ds *discordgo.Session, dm *discordgo.Message, ctx *Contex f = "henesy" } else if strings.Contains(dm.Content, "davros") { f = "davros" + } else if strings.Contains(dm.Content, "mao") { + f = "mao" } else { f = Config.Db["extrafortunes"] } diff --git a/x/mux/roll.go b/x/mux/roll.go new file mode 100644 index 0000000000000000000000000000000000000000..0f6c37d6048a966f55898e54f84508e86cc8cd71 --- /dev/null +++ b/x/mux/roll.go @@ -0,0 +1,127 @@ +package mux + +import ( + "github.com/bwmarrin/discordgo" + "strings" + "fmt" + "strconv" + "math/big" + "crypto/rand" +) + +// Roll dice in the form XdY +func (m *Mux) Roll(ds *discordgo.Session, dm *discordgo.Message, ctx *Context) { + resp := ".\n" + input := dm.Content + usage := func(s string) { + ds.ChannelMessageSend(dm.ChannelID, fmt.Sprintf("Malformed input. %s. \n\nExample usage: \n`g!roll 2d6 3d4` to roll two six-sided die and three four-sided die.", s)) + } + + explode := false + infExplode := false + if strings.HasSuffix(input, "!!") { + infExplode = true + input = input[:len(input)-2] + } else if strings.HasSuffix(input, "!") { + input = input[:len(input)-1] + explode = true + } + + fields := strings.Fields(input) + if len(fields) < 2 { + usage("No arguments provided") + return + } + // Strip g!roll + fields = fields[1:] + + for _, entry := range fields { + resp += entry + ":\n" + resp += "```\n" + + // {2, 6} + parts := strings.Split(entry, "d") + //fmt.Println(parts) + if len(parts) != 2 { + usage("Die entries must be in the form XdY where X and Y are valid, positive, integers") + return + } + + count, err := strconv.ParseInt(parts[0], 10, 64) + if err != nil { + usage("Invalid numeric for count: " + err.Error()) + return + } + if count <= 0 { + usage("Count must be > 0") + return + } + + sides, err := strconv.ParseInt(parts[1], 10, 64) + if err != nil { + usage("Invalid numeric for sides: " + err.Error()) + return + } + if sides <= 0 { + usage("Sides must be > 0") + return + } + + // Do the rolls + for i := int64(0); i < count; i++ { + bSides := big.NewInt(sides) + + roll := func() (*big.Int, error) { + n, err := rand.Int(rand.Reader, bSides) + if err != nil { + usage("Could not perform rng") + fmt.Println("rng fail →", err) + return n, err + } + n.Add(n, big.NewInt(int64(1))) + return n, err + } + + insert := func(r string, n *big.Int) string { + return r + fmt.Sprintf("%s ", n.String()) + } + + + n, err := roll() + if err != nil { + return + } + resp = insert(resp, n) + + if explode && n.Cmp(bSides) == 0 { + n, err := roll() + if err != nil { + return + } + resp = insert(resp, n) + } else if infExplode && n.Cmp(bSides) == 0 { + inf: + for { + n, err := roll() + if err != nil { + return + } + resp = insert(resp, n) + + if n.Cmp(bSides) == 0 { + continue inf + } else { + break inf + } + } + } + + } + resp += "\n```\n" + } + + ds.ChannelMessageSend(dm.ChannelID, resp) + + return +} +