From d4f97b20cca38756897b744d87dbe26379f4fa1b Mon Sep 17 00:00:00 2001 From: Manfred Touron <94029+moul@users.noreply.github.com> Date: Sun, 20 Dec 2020 19:25:28 +0100 Subject: [PATCH 1/2] feat: setup HTTP server --- chaos-bot/Makefile | 8 ++- chaos-bot/discord.go | 142 +++++++++++++++++++++++++++++++------------ chaos-bot/go.mod | 5 ++ chaos-bot/go.sum | 47 ++++++++++++++ chaos-bot/main.go | 12 ++-- 5 files changed, 171 insertions(+), 43 deletions(-) diff --git a/chaos-bot/Makefile b/chaos-bot/Makefile index c389465..c841b7f 100644 --- a/chaos-bot/Makefile +++ b/chaos-bot/Makefile @@ -3,7 +3,13 @@ RUN_OPTS ?= --dev --debug include .env export sed 's/=.*//' .env -run: install +COMPILEDAEMON_OPTIONS ?= -exclude-dir=.git -color=true -build=go\ install -build-dir=. +run: + go install github.com/githubnemo/CompileDaemon + CompileDaemon $(COMPILEDAEMON_OPTIONS) -command="chaos-bot $(RUN_OPTS) discord-bot -discord-token=$(DISCORD_TOKEN)" +.PHONY: run + +install-run: install chaos-bot $(RUN_OPTS) discord-bot --discord-token="$(DISCORD_TOKEN)" install: diff --git a/chaos-bot/discord.go b/chaos-bot/discord.go index 7cd6229..2188ac2 100644 --- a/chaos-bot/discord.go +++ b/chaos-bot/discord.go @@ -4,38 +4,54 @@ import ( "context" "fmt" "log" + "net" + "net/http" "os" "strings" "sync" "time" "github.com/bwmarrin/discordgo" + "github.com/etherlabsio/errors" + "github.com/etherlabsio/pkg/httputil" + "github.com/go-chi/chi" + "github.com/go-chi/chi/middleware" + "github.com/go-chi/httplog" gosocketio "github.com/graarh/golang-socketio" "github.com/hako/durafmt" "github.com/oklog/run" + "github.com/rs/cors" "moul.io/godev" ) -func discordBotCmd(token string, devMode bool, debug bool) error { - log.Printf("starting bot, devMode=%v, debug=%v", devMode, debug) +type discordbotOpts struct { + devMode bool + debug bool + manfredChannel string + discordToken string + serverBind string +} + +func discordBotCmd(opts discordbotOpts) error { + log.Printf("starting bot, args=%s", godev.PrettyJSON(opts)) + + db := &discordBot{ + startedAt: time.Now(), + opts: opts, + } + + var g run.Group - var db *discordBot - var dg *discordgo.Session { // DISCORD - var err error - dg, err = discordgo.New("Bot " + token) + dg, err := discordgo.New("Bot " + opts.discordToken) if err != nil { return err } hostname, _ := os.Hostname() - dg.ChannelMessageSend(manfredChannel, fmt.Sprintf("**COUCOU JE VIENS DE BOOT (%s)!**", hostname)) + dg.ChannelMessageSend(opts.manfredChannel, fmt.Sprintf("**COUCOU JE VIENS DE BOOT (%s)!**", hostname)) - db = &discordBot{ - startedAt: time.Now(), - devMode: devMode, - debug: debug, - } + db.discordSession = dg commands["!info"] = db.doInfo commands["!radiosay"] = db.doRadioSay @@ -45,6 +61,7 @@ func discordBotCmd(token string, devMode bool, debug bool) error { return err } defer dg.Close() + log.Print("Discord bot started") } { // SOCKET IO @@ -55,57 +72,106 @@ func discordBotCmd(token string, devMode bool, debug bool) error { defer sio.Close() sio.c.On("event:join", func(h *gosocketio.Channel, args Message) { - dg.ChannelMessageSend(manfredChannel, fmt.Sprintf("sio event:join: %s", godev.JSON(args))) + db.discordSession.ChannelMessageSend(opts.manfredChannel, fmt.Sprintf("sio event:join: %s", godev.JSON(args))) }) sio.c.On("event:disconnect", func(h *gosocketio.Channel, args Message) { - dg.ChannelMessageSend(manfredChannel, fmt.Sprintf("sio event:disconnect: %s", godev.JSON(args))) + db.discordSession.ChannelMessageSend(opts.manfredChannel, fmt.Sprintf("sio event:disconnect: %s", godev.JSON(args))) }) sio.c.On("event:broadcast", func(h *gosocketio.Channel, args Message) { - dg.ChannelMessageSend(manfredChannel, fmt.Sprintf("sio event:broadcast: %s", godev.JSON(args))) + db.discordSession.ChannelMessageSend(opts.manfredChannel, fmt.Sprintf("sio event:broadcast: %s", godev.JSON(args))) }) db.sio = sio + log.Print("Socket.IO client started") + } + + { // HTTP API + r := chi.NewRouter() + //r.Use(middleware.DefaultCompress) + r.Use(middleware.StripSlashes) + r.Use(middleware.Recoverer) + r.Use(cors.New(cors.Options{ + AllowedOrigins: []string{"*"}, + AllowedMethods: []string{"GET", "POST", "OPTIONS"}, + }).Handler) + logger := httplog.NewLogger("http", httplog.Options{JSON: false}) + r.Use(httplog.RequestLogger(logger)) + //r.Use(middleware.Heartbeat("/ping")) + + httpStatusCodeFrom := func(err error) int { + switch errors.KindOf(err) { + case errors.Invalid: + return http.StatusBadRequest + case errors.Internal: + return http.StatusInternalServerError + default: + return http.StatusOK + } + } + httpErrorEncoder := httputil.JSONErrorEncoder(httpStatusCodeFrom) + httpJSONResponseEncoder := httputil.EncodeJSONResponse(httpErrorEncoder) + + r.Get("/ping", func(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + resp := struct { + Pong string `json:"pong"` + }{ + Pong: "pong", + } + httpJSONResponseEncoder(ctx, w, resp) + }) + + httpListener, err := net.Listen("tcp", db.opts.serverBind) + if err != nil { + return err + } + g.Add(func() error { + return http.Serve(httpListener, r) + }, func(error) { + httpListener.Close() + }) + + log.Printf("HTTP API started (%q)", db.opts.serverBind) } - fmt.Println("Bot is now running. Press CTRL-C to exit.") - var g run.Group g.Add(run.SignalHandler(context.TODO(), os.Interrupt)) + log.Print("Press ctrl-C to exit") return g.Run() } type discordBot struct { - startedAt time.Time - seenMessages int - seenCommands int - seenErrors int - devMode bool - debug bool - lock sync.Mutex - sio *sioClient + startedAt time.Time + seenMessages int + seenCommands int + seenErrors int + discordSession *discordgo.Session + lock sync.Mutex + sio *sioClient + opts discordbotOpts } -func (b *discordBot) onMessageCreate(s *discordgo.Session, m *discordgo.MessageCreate) { +func (db *discordBot) onMessageCreate(s *discordgo.Session, m *discordgo.MessageCreate) { // avoid loop if m.Author.ID == s.State.User.ID { return } - if b.debug { + if db.opts.debug { log.Println(godev.JSON(m)) } - if b.devMode && m.GuildID != "" { + if db.opts.devMode && m.GuildID != "" { return } args := strings.Split(m.Content, " ") - b.seenMessages++ + db.seenMessages++ command, found := commands[args[0]] // FIXME: split the content and support args if !found || command == nil { return } - b.seenCommands++ + db.seenCommands++ - b.lock.Lock() - defer b.lock.Unlock() + db.lock.Lock() + defer db.lock.Unlock() channel := m.ChannelID if m.GuildID == "" { @@ -120,12 +186,12 @@ func (b *discordBot) onMessageCreate(s *discordgo.Session, m *discordgo.MessageC }() err := command(s, m) if err != nil { - b.seenErrors++ + db.seenErrors++ sendError(s, m, err) } } -func (b *discordBot) doRadioSay(s *discordgo.Session, m *discordgo.MessageCreate) error { +func (db *discordBot) doRadioSay(s *discordgo.Session, m *discordgo.MessageCreate) error { content := strings.Split(m.Content, " ") say := strings.Join(content[1:], " ") say = strings.TrimSpace(say) @@ -142,14 +208,14 @@ func (b *discordBot) doRadioSay(s *discordgo.Session, m *discordgo.MessageCreate }.ToJSON(), }, } - return b.sio.c.Emit("broadcast", input) + return db.sio.c.Emit("broadcast", input) } -func (b *discordBot) doInfo(s *discordgo.Session, m *discordgo.MessageCreate) error { - uptime := time.Since(b.startedAt) +func (db *discordBot) doInfo(s *discordgo.Session, m *discordgo.MessageCreate) error { + uptime := time.Since(db.startedAt) msg := fmt.Sprintf( "uptime: %v, messages: %d, commands: %d, errors: %d\n", - durafmt.ParseShort(uptime).String(), b.seenMessages, b.seenCommands, b.seenErrors, + durafmt.ParseShort(uptime).String(), db.seenMessages, db.seenCommands, db.seenErrors, ) msg += fmt.Sprintf("source: https://github.com/ultreme/radio-chaos/tree/master/chaos-bot") s.ChannelMessageSend(m.ChannelID, msg) diff --git a/chaos-bot/go.mod b/chaos-bot/go.mod index f97afec..9a8cfa3 100644 --- a/chaos-bot/go.mod +++ b/chaos-bot/go.mod @@ -4,6 +4,10 @@ go 1.14 require ( github.com/bwmarrin/discordgo v0.22.0 + github.com/etherlabsio/errors v0.2.3 + github.com/etherlabsio/pkg v0.0.0-20191020161600-58998d98f9ce + github.com/go-chi/chi v1.5.1 + github.com/go-chi/httplog v0.1.8 github.com/gohugoio/hugo v0.79.1 github.com/graarh/golang-socketio v0.0.0-20170510162725-2c44953b9b5f github.com/hako/durafmt v0.0.0-20200710122514-c0fb7b4da026 @@ -14,6 +18,7 @@ require ( github.com/mattn/go-sqlite3 v2.0.3+incompatible // indirect github.com/oklog/run v1.1.0 github.com/peterbourgon/ff/v3 v3.0.0 + github.com/rs/cors v1.7.0 github.com/sirupsen/logrus v1.6.0 // indirect github.com/tpyolang/tpyo-cli v1.0.0 github.com/ultreme/histoire-pour-enfant-generator v0.0.0-20200402084311-66b2cd0d2da6 diff --git a/chaos-bot/go.sum b/chaos-bot/go.sum index e410cb4..4991f56 100644 --- a/chaos-bot/go.sum +++ b/chaos-bot/go.sum @@ -67,6 +67,8 @@ github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897/go.mod h1:xTS7Pm1p github.com/alecthomas/repr v0.0.0-20181024024818-d37bc2a10ba1/go.mod h1:xTS7Pm1pD1mvyM075QCDSRqH6qRLXylzS24ZTpRiSzQ= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alicebob/gopher-json v0.0.0-20180125190556-5a6b3ba71ee6/go.mod h1:SGnFV6hVsYE877CKEZ6tDNTjaSXYUk6QqoIK6PrAtcc= +github.com/alicebob/miniredis v2.5.0+incompatible/go.mod h1:8HZjEj4yU0dwhYHky+DxYx+6BMjkBbe5ONFIF1MXffk= github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= github.com/aokoli/goutils v1.0.1 h1:7fpzNGoJ3VA8qcrm++XEE1QUe0mIwNeLa02Nwq7RDkg= github.com/aokoli/goutils v1.0.1/go.mod h1:SijmP0QR8LtwsmDs8Yii5Z/S4trXFGFC2oO5g9DP+DQ= @@ -91,11 +93,13 @@ github.com/bep/golibsass v0.7.0/go.mod h1:DL87K8Un/+pWUS75ggYv41bliGiolxzDKWJAq3 github.com/bep/tmc v0.5.1/go.mod h1:tGYHN8fS85aJPhDLgXETVKp+PR382OvFi2+q2GkGsq0= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= +github.com/bsm/redislock v0.4.0/go.mod h1:c8vN+VP8PVF1HAp5e3dn8nTCA8h4XD8Ku3BeZezZ/ag= github.com/bwmarrin/discordgo v0.22.0 h1:uBxY1HmlVCsW1IuaPjpCGT6A2DBwRn0nvOguQIxDdFM= github.com/bwmarrin/discordgo v0.22.0/go.mod h1:c1WtWUGN6nREDmzIpyTp/iD3VYt4Fpx+bVyfBG7JE+M= github.com/census-instrumentation/opencensus-proto v0.2.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927/go.mod h1:h/aW8ynjgkuj+NQRlZcDbAbM1ORAbXjXX77sX7T289U= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/cli/safeexec v1.0.0/go.mod h1:Z/D4tTN8Vs5gXYHDCbaM1S/anmEDnJb1iW0+EJ5zx3Q= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= @@ -134,8 +138,13 @@ github.com/eidolon/wordwrap v0.0.0-20161011182207-e0f54129b8bb h1:ioQwBmKdOCpMVS github.com/eidolon/wordwrap v0.0.0-20161011182207-e0f54129b8bb/go.mod h1:ZAPs+OyRzeVJFGvXVDVffgCzQfjg3qU9Ig8G/MU3zZ4= github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5 h1:Yzb9+7DPaBjB8zlTR87/ElzFsnQfuHnVUVqpZZIcV5Y= github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0= +github.com/etherlabsio/errors v0.2.3 h1:1/oP/XrR0uTpksVcIPkWJt6ghPpDwH+CP7YG3QgxoCU= +github.com/etherlabsio/errors v0.2.3/go.mod h1:cULADM00/wa0iT9bOnu2M+ZMGuA+rLpIwVvIbOzz7EE= +github.com/etherlabsio/pkg v0.0.0-20191020161600-58998d98f9ce h1:JhGUask5samvedpRh8OyXqhgnm4sp1uQxU1bIyHQrV0= +github.com/etherlabsio/pkg v0.0.0-20191020161600-58998d98f9ce/go.mod h1:+A2VWtZi1qDfrrAKwONLOjD/GloAMaaqeDfwl8Q/V28= github.com/evanw/esbuild v0.6.5/go.mod h1:mptxmSXIzBIKKCe4jo9A5SToEd1G+AKZ9JmY85dYRJ0= github.com/evanw/esbuild v0.8.15/go.mod h1:y2AFBAGVelPqPodpdtxWWqe6n2jYf5FrsJbligmRmuw= +github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fortytw2/leaktest v1.2.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= @@ -145,19 +154,31 @@ github.com/frankban/quicktest v1.7.2/go.mod h1:jaStnuzAqU1AJdCO0l53JDCJrVDKcS03D github.com/frankban/quicktest v1.11.2 h1:mjwHjStlXWibxOohM7HYieIViKyh56mmt3+6viyhDDI= github.com/frankban/quicktest v1.11.2/go.mod h1:K+q6oSqb0W0Ininfk863uOk1lMy69l/P6txr3mVT54s= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/getkin/kin-openapi v0.14.0/go.mod h1:WGRs2ZMM1Q8LR1QBEwUxC6RJEfaBcD0s+pcEVXFuAjw= github.com/getkin/kin-openapi v0.31.0/go.mod h1:WGRs2ZMM1Q8LR1QBEwUxC6RJEfaBcD0s+pcEVXFuAjw= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/go-chi/chi v1.5.1 h1:kfTK3Cxd/dkMu/rKs5ZceWYp+t5CtiE7vmaTv3LjC6w= +github.com/go-chi/chi v1.5.1/go.mod h1:REp24E+25iKvxgeTfHmdUoL5x15kBiDBlnIl5bCwe2k= +github.com/go-chi/httplog v0.1.8 h1:JpMqRek5K5mc2wI/o3K+Nzp8HOu97WTbDFMqSA0Jy/Q= +github.com/go-chi/httplog v0.1.8/go.mod h1:0K10zyeqALZw08ZWrk73zD/C5PN1FkQqdHqGNh7SDNg= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0 h1:wDJmvq38kDhkVxi50ni9ykkdUr1PKgqKOoi01fa0Mdk= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0 h1:MP4Eh7ZCb31lleYCFuwm0oe4/YGak+5l1vA2NOE80nA= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-redis/cache v6.4.0+incompatible/go.mod h1:XNnMdvlNjcZvHjsscEozHAeOeSE5riG9Fj54meG4WT4= +github.com/go-redis/redis v6.15.5+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= +github.com/go-redis/redis v6.15.6+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= github.com/go-sql-driver/mysql v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA= github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/gobuffalo/envy v1.6.5/go.mod h1:N+GkhhZ/93bGZc6ZKhJLP6+m+tCNPKwgSpH9kaifseQ= github.com/gobuffalo/logger v1.0.3 h1:YaXOTHNPCvkqqA7w05A4v0k2tCdpr+sgFlgINbQ6gqc= @@ -189,6 +210,7 @@ github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5y github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -300,6 +322,7 @@ github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxv github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515 h1:T+h1c/A9Gawja4Y9mFVWj2vyii2bbUNDw3kt9VxK2EY= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= @@ -330,9 +353,11 @@ github.com/markbates/safe v1.0.1 h1:yjZkbvRM6IzKj9tlu/zMJLS0n/V351OZWRnF3QfaUxI= github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= github.com/matryer/try v0.0.0-20161228173917-9ac251b645a2/go.mod h1:0KeJpeMD6o+O4hW7qJOT7vyQPKrWmj26uf5wMc/IiIs= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.6 h1:6Su7aK7lXmJ/U79bYtBjLNaha4Fs1Rg9plHpcH+vvnE= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-sqlite3 v1.14.0/go.mod h1:JIl7NbARA7phWnGvh0LKTyg7S9BA+6gx71ShQilpsus= @@ -364,6 +389,14 @@ github.com/moul/advanced-ssh-config v2.8.0+incompatible h1:TwBlAP+vrtYVW+cv+NJqG github.com/moul/advanced-ssh-config v2.8.0+incompatible/go.mod h1:R4jFrcdiyzi23qjl7fBUyk7zV3xoFv5S8ulBBsU2ufw= github.com/muesli/smartcrop v0.3.0/go.mod h1:i2fCI/UorTfgEpPPLWiFBv4pye+YAG78RwcQLUkocpI= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/nats-io/gnatsd v1.4.1/go.mod h1:nqco77VO78hLCJpIcVfygDP2rPGfsEHkGTUk94uh5DQ= +github.com/nats-io/go-nats v1.6.0/go.mod h1:+t7RHT5ApZebkrQdnn6AhQJmhJJiKAvJUio1PiiCtj0= +github.com/nats-io/jwt v0.2.6/go.mod h1:mQxQ0uHQ9FhEVPIcTSKwx2lqZEpXWWcCgA7R6NrWvvY= +github.com/nats-io/nats-server v1.4.1/go.mod h1:c8f/fHd2B6Hgms3LtCaI7y6pC4WD1f4SUxcCud5vhBc= +github.com/nats-io/nats-server/v2 v2.0.0/go.mod h1:RyVdsHHvY4B6c9pWG+uRLpZ0h0XsqiuKp2XCTurP5LI= +github.com/nats-io/nats.go v1.8.1/go.mod h1:BrFz9vVn0fU3AcH9Vn4Kd7W0NpJ651tD5omQ3M8LwxM= +github.com/nats-io/nkeys v0.0.2/go.mod h1:dab7URMsZm6Z/jp9Z5UGa87Uutgc2mVpXLC4B7TDb/4= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= github.com/nicksnyder/go-i18n v1.10.0/go.mod h1:HrK7VCrbOvQoUAQ7Vpy7i87N7JZZZ7R2xBGjv0j365Q= github.com/nicksnyder/go-i18n/v2 v2.1.1/go.mod h1:d++QJC9ZVf7pa48qrsRWhMJ5pSHIPmS3OLqK1niyLxs= @@ -376,7 +409,9 @@ github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= @@ -388,6 +423,7 @@ github.com/peterbourgon/ff/v3 v3.0.0/go.mod h1:UILIFjRH5a/ar8TjXYLTkIvSvekZqPm5E github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -416,6 +452,11 @@ github.com/rogpeppe/go-internal v1.5.2 h1:qLvObTrvO/XRCqmkKxUlOBc48bI3efyDuAZe25 github.com/rogpeppe/go-internal v1.5.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.6.2 h1:aIihoIOHCiLZHxyoNQ+ABL4NKhFTgKLBdMLyEAh98m0= github.com/rogpeppe/go-internal v1.6.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= +github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= +github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= +github.com/rs/zerolog v1.18.1-0.20200514152719-663cbb4c8469 h1:DuXsEWHUTO5lsxxzKM4KUKGDIOi7nawNDs6d+AiulEA= +github.com/rs/zerolog v1.18.1-0.20200514152719-663cbb4c8469/go.mod h1:IzD0RJ65iWH0w97OQQebJEvTZYvsCUm9WVLWBQrJRjo= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday v1.5.3-0.20200218234912-41c5fccfd6f6/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -488,6 +529,7 @@ github.com/urfave/cli v1.22.4/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtX github.com/urfave/cli/v2 v2.1.1/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= +github.com/vmihailenco/msgpack v4.0.4+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk= github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= @@ -496,6 +538,7 @@ github.com/yuin/goldmark v1.1.22/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.31/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark-highlighting v0.0.0-20200307114337-60d527fdb691/go.mod h1:YLF3kDffRfUH/bTxOxHhV6lxwIB3Vfj91rEwNMS9MXo= +github.com/yuin/gopher-lua v0.0.0-20181214045814-db9ae37725ec/go.mod h1:fFiAh+CowNFr0NK5VASokuwKwkbacRmHsVA7Yb1Tqac= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.mongodb.org/mongo-driver v1.0.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.opencensus.io v0.15.0/go.mod h1:UffZAU+4sDEINUGP/B7UfBBkq4fqLu9zXAX7ke6CHW0= @@ -519,6 +562,7 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190422183909-d864b10871cd/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -604,6 +648,7 @@ golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190621203818-d432491b9138/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -621,6 +666,7 @@ golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4 h1:0YWbFKbhXG/wIiuHDSKpS0Iy7FSA+u45VtBMfQcFTTc= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -641,6 +687,7 @@ golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190828213141-aed303cbaa74/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= diff --git a/chaos-bot/main.go b/chaos-bot/main.go index daf282b..a3bd082 100644 --- a/chaos-bot/main.go +++ b/chaos-bot/main.go @@ -9,23 +9,27 @@ import ( "github.com/peterbourgon/ff/v3/ffcli" ) -const manfredChannel = "691928992495960124" - func main() { var ( + discordbotOpts = discordbotOpts{} rootFlagSet = flag.NewFlagSet("chaos-bot", flag.ExitOnError) devMode = rootFlagSet.Bool("dev", false, "only reply in PV") debug = rootFlagSet.Bool("debug", false, "verbose") discordFlagSet = flag.NewFlagSet("discord", flag.ExitOnError) - discordToken = discordFlagSet.String("discord-token", "", "Discord Bot Token") mixerFlagSet = flag.NewFlagSet("mixer-bot", flag.ExitOnError) ) + discordFlagSet.StringVar(&discordbotOpts.discordToken, "discord-token", "", "Discord Bot Token") + discordFlagSet.StringVar(&discordbotOpts.serverBind, "server-bind", ":4747", "API listening address") + discordFlagSet.StringVar(&discordbotOpts.manfredChannel, "manfred-channel", "691928992495960124", "manfred private channel (for debugging)") + discordBot := &ffcli.Command{ Name: "discord-bot", FlagSet: discordFlagSet, Exec: func(_ context.Context, _ []string) error { - return discordBotCmd(*discordToken, *devMode, *debug) + discordbotOpts.debug = *debug + discordbotOpts.devMode = *devMode + return discordBotCmd(discordbotOpts) }, } From 0217a5bda8d005f81796123300bcd8ec493603ae Mon Sep 17 00:00:00 2001 From: Manfred Touron <94029+moul@users.noreply.github.com> Date: Sun, 20 Dec 2020 23:36:45 +0100 Subject: [PATCH 2/2] chore: add a way to send direct messages to manfred --- chaos-bot/Makefile | 2 +- chaos-bot/discord.go | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/chaos-bot/Makefile b/chaos-bot/Makefile index c841b7f..48a0a1f 100644 --- a/chaos-bot/Makefile +++ b/chaos-bot/Makefile @@ -6,7 +6,7 @@ export sed 's/=.*//' .env COMPILEDAEMON_OPTIONS ?= -exclude-dir=.git -color=true -build=go\ install -build-dir=. run: go install github.com/githubnemo/CompileDaemon - CompileDaemon $(COMPILEDAEMON_OPTIONS) -command="chaos-bot $(RUN_OPTS) discord-bot -discord-token=$(DISCORD_TOKEN)" + CompileDaemon $(COMPILEDAEMON_OPTIONS) -command="chaos-bot $(RUN_OPTS) discord-bot -discord-token=$(DISCORD_TOKEN) -manfred-channel=$(MANFRED_CHANNEL)" .PHONY: run install-run: install diff --git a/chaos-bot/discord.go b/chaos-bot/discord.go index 2188ac2..9e1bf1d 100644 --- a/chaos-bot/discord.go +++ b/chaos-bot/discord.go @@ -2,6 +2,7 @@ package main import ( "context" + "encoding/json" "fmt" "log" "net" @@ -120,6 +121,16 @@ func discordBotCmd(opts discordbotOpts) error { httpJSONResponseEncoder(ctx, w, resp) }) + r.Post("/ping-manfred", func(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + resp := struct { + Msg string `json:"msg"` + }{} + json.NewDecoder(r.Body).Decode(&resp) + db.discordSession.ChannelMessageSend(opts.manfredChannel, fmt.Sprintf("HTTP ping: %q", resp.Msg)) + httpJSONResponseEncoder(ctx, w, resp) + }) + httpListener, err := net.Listen("tcp", db.opts.serverBind) if err != nil { return err