From 8d26fba95dc79fc63587f50ad546a13de34e64fa Mon Sep 17 00:00:00 2001 From: Mitchell Date: Thu, 15 Mar 2018 20:48:25 -0500 Subject: [PATCH] added embedded messages resolves #9 --- .gitignore | 1 + Gopkg.lock | 41 ++++++++++++++++++++++++++++++++ Gopkg.toml | 38 ++++++++++++++++++++++++++++++ config.template.json | 2 +- config/config.go | 15 ++++++------ main.go | 14 ++++++++--- makefile | 11 ++++++--- readme.md | 34 +++++++++++---------------- serverstatus/serverstatus.go | 45 ++++++++++++++++++++++++++++-------- 9 files changed, 155 insertions(+), 46 deletions(-) create mode 100644 Gopkg.lock create mode 100644 Gopkg.toml diff --git a/.gitignore b/.gitignore index 6298cc1..0c74ef2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ config.json dist +vendor diff --git a/Gopkg.lock b/Gopkg.lock new file mode 100644 index 0000000..e93da37 --- /dev/null +++ b/Gopkg.lock @@ -0,0 +1,41 @@ +# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. + + +[[projects]] + branch = "master" + name = "github.com/anvie/port-scanner" + packages = [ + ".", + "predictors", + "predictors/webserver" + ] + revision = "8159197d3770eb6dbf3a9706a6d40462ebb69cec" + +[[projects]] + name = "github.com/bwmarrin/discordgo" + packages = ["."] + revision = "4a33b9bc7c56cfdb9bb244e33e83cb3941fe2bdc" + version = "v0.18.0" + +[[projects]] + name = "github.com/gorilla/websocket" + packages = ["."] + revision = "ea4d1f681babbce9545c9c5f3d5194a789c89f5b" + version = "v1.2.0" + +[[projects]] + branch = "master" + name = "golang.org/x/crypto" + packages = [ + "nacl/secretbox", + "poly1305", + "salsa20/salsa" + ] + revision = "c4a91bd4f524f10d064139674cf55852e055ad01" + +[solve-meta] + analyzer-name = "dep" + analyzer-version = 1 + inputs-digest = "0832269100c492c595c4fe5f02e10d70889b9fa4d6a869c3ad59584cda0c5d31" + solver-name = "gps-cdcl" + solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml new file mode 100644 index 0000000..6037c8c --- /dev/null +++ b/Gopkg.toml @@ -0,0 +1,38 @@ +# Gopkg.toml example +# +# Refer to https://golang.github.io/dep/docs/Gopkg.toml.html +# for detailed Gopkg.toml documentation. +# +# required = ["github.com/user/thing/cmd/thing"] +# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"] +# +# [[constraint]] +# name = "github.com/user/project" +# version = "1.0.0" +# +# [[constraint]] +# name = "github.com/user/project2" +# branch = "dev" +# source = "github.com/myfork/project2" +# +# [[override]] +# name = "github.com/x/y" +# version = "2.4.0" +# +# [prune] +# non-go = false +# go-tests = true +# unused-packages = true + + +[[constraint]] + branch = "master" + name = "github.com/anvie/port-scanner" + +[[constraint]] + name = "github.com/bwmarrin/discordgo" + version = "0.18.0" + +[prune] + go-tests = true + unused-packages = true diff --git a/config.template.json b/config.template.json index eb0712a..198f92a 100644 --- a/config.template.json +++ b/config.template.json @@ -1,7 +1,7 @@ { "Token": "your bot token", "RoomIDList":["room id list goes here"], - "RoleToNotify": "@everyone", + "RolesToNotify": ["<@&roleid>", "<@userid>"], "GameStatus": "current playing game", "Servers": [ { diff --git a/config/config.go b/config/config.go index 26174a2..ebf4bd1 100644 --- a/config/config.go +++ b/config/config.go @@ -2,6 +2,7 @@ package config import ( "encoding/json" + "fmt" "io/ioutil" "log" "os" @@ -11,11 +12,11 @@ import ( var Config configStruct type configStruct struct { - Token string `json:"Token"` - RoomIDList []string `json:"RoomIDList"` - RoleToNotify string `json:"RoleToNotify"` - Servers []server `json:"Servers"` - GameStatus string `json:"GameStatus"` + Token string `json:"Token"` + RoomIDList []string `json:"RoomIDList"` + RolesToNotify []string `json:"RolesToNotify"` + Servers []server `json:"Servers"` + GameStatus string `json:"GameStatus"` } type server struct { @@ -27,7 +28,7 @@ type server struct { func Configure() { - log.Println("Reading config file...") + fmt.Println("Reading config file...") file, e := ioutil.ReadFile("./config.json") @@ -36,8 +37,6 @@ func Configure() { os.Exit(1) } - log.Printf("%s\n", string(file)) - err := json.Unmarshal(file, &Config) if err != nil { diff --git a/main.go b/main.go index 6a8ea9e..0f6185e 100644 --- a/main.go +++ b/main.go @@ -1,9 +1,11 @@ package main import ( - "github.com/mgerb/serverstatus/bot" - "github.com/mgerb/serverstatus/config" - "github.com/mgerb/serverstatus/serverstatus" + "fmt" + + "github.com/mgerb/ServerStatus/bot" + "github.com/mgerb/ServerStatus/config" + "github.com/mgerb/ServerStatus/serverstatus" ) // Variables used for command line parameters @@ -11,6 +13,12 @@ var ( BotID string ) +var version = "undefined" + +func init() { + fmt.Println("Starting Server Status " + version) +} + func main() { //read config file config.Configure() diff --git a/makefile b/makefile index 57eec2f..d582a52 100644 --- a/makefile +++ b/makefile @@ -1,14 +1,16 @@ +VERSION := $(shell git describe --tags) + run: go run ./src/main.go linux: - go build -o ./dist/ServerStatus-linux ./main.go + go build -o ./dist/ServerStatus-linux -ldflags="-X main.version=${VERSION}" ./main.go mac: - GOOS=darwin GOARCH=amd64 go build -o ./dist/ServerStatus-mac ./main.go + GOOS=darwin GOARCH=amd64 go build -o ./dist/ServerStatus-mac -ldflags="-X main.version=${VERSION}" ./main.go windows: - GOOS=windows GOARCH=386 go build -o ./dist/ServerStatus-windows.exe ./main.go + GOOS=windows GOARCH=386 go build -o ./dist/ServerStatus-windows.exe -ldflags="-X main.version=${VERSION}" ./main.go clean: rm -rf ./dist @@ -16,4 +18,7 @@ clean: copyfiles: cp config.template.json ./dist/config.json +zip: + zip -r dist.zip dist + all: linux mac windows copyfiles diff --git a/readme.md b/readme.md index 89a94db..a91ec5a 100644 --- a/readme.md +++ b/readme.md @@ -1,24 +1,28 @@ -## Server Status - -Scans a list of servers checking whether the ports are open or not. +# Server Status +Scans a list of TCP servers checking checking which are currently online. This bot will send a chat notification when the status of a server changes (goes on or offline). I originally made this bot to check if private World of Warcraft servers were up or not. It's actually much more useful than that and can be used for most servers. -It has been brought to my attention that this bot currently does not work for Ark servers. - -### Note - updated for Felmyst server! -The config template contains IP/Ports for the new Felmyst game and logon servers +NOTE: This bot currently does not work for UDP servers. ## Configuration - - Download the latest release [here](https://github.com/mgerb/ServerStatus/releases) - Add your bot token as well as other configurations to config.json - Execute the OS specific binary! -## Compiling from source +### Mentioning Roles/Users +- you must first get your role/user id +- for user `<@userid>` +- for role `<@&roleid>` +## Usage +To get the current status of your servers simply type `!ServerStatus` in chat. + +![Server Status](https://i.imgur.com/ZzQSBJp.png) + +## Compiling from source - Make sure Go and Make are installed - make all @@ -26,19 +30,7 @@ The config template contains IP/Ports for the new Felmyst game and logon servers https://github.com/reactiflux/discord-irc/wiki/Creating-a-discord-bot-&-getting-a-token ### How to get your room ID - To get IDs, turn on Developer Mode in the Discord client (User Settings -> Appearance) and then right-click your name/icon anywhere in the client and select Copy ID. -## List server status in discord channel - -`!ServerStatus` - -``` -Elysium PvP is online! -Zethkur PvP is online! -Anathema PvP is online! -Darrowshire PvE is online! -Elysium Authentication Server is online! -``` diff --git a/serverstatus/serverstatus.go b/serverstatus/serverstatus.go index d27d867..8da791e 100644 --- a/serverstatus/serverstatus.go +++ b/serverstatus/serverstatus.go @@ -2,22 +2,32 @@ package serverstatus import ( "log" + "strings" "time" "github.com/anvie/port-scanner" "github.com/bwmarrin/discordgo" - "github.com/mgerb/serverstatus/bot" - "github.com/mgerb/serverstatus/config" + "github.com/mgerb/ServerStatus/bot" + "github.com/mgerb/ServerStatus/config" ) +const ( + red = 0xf4425c + green = 0x42f477 + blue = 0x42adf4 +) + +// Start - start port scanner and bot listeners func Start() { //set each server status as online to start - for i, _ := range config.Config.Servers { + for i := range config.Config.Servers { config.Config.Servers[i].Online = true } err := bot.Session.UpdateStatus(0, config.Config.GameStatus) + sendMessageToRooms(blue, "Server Status", "Bot started! Type !ServerStatus to see the status of your servers :smiley:", false) + if err != nil { log.Println(err) } @@ -43,9 +53,9 @@ func scanServers() { serverUp := serverScanner.IsOpen(server.Port) //check if the port is open if serverUp && serverUp != prevServerUp { - sendMessage(config.Config.RoleToNotify + " " + server.Name + " is now online!") + sendMessageToRooms(green, server.Name, "Is now online :smiley:", true) } else if !serverUp && serverUp != prevServerUp { - sendMessage(config.Config.RoleToNotify + " " + server.Name + " went offline!") + sendMessageToRooms(red, server.Name, "Has gone offline :frowning2:", true) } config.Config.Servers[index].Online = serverUp @@ -55,13 +65,28 @@ func scanServers() { } } -func sendMessage(message string) { +func sendMessageToRooms(color int, title, description string, mentionRoles bool) { for _, roomID := range config.Config.RoomIDList { - bot.Session.ChannelMessageSend(roomID, message) + if mentionRoles { + content := strings.Join(config.Config.RolesToNotify, " ") + bot.Session.ChannelMessageSend(roomID, content) + } + sendEmbededMessage(roomID, color, title, description) } } -// This function will be called every time a new +func sendEmbededMessage(roomID string, color int, title, description string) { + + embed := &discordgo.MessageEmbed{ + Color: color, + Title: title, + Description: description, + } + + bot.Session.ChannelMessageSendEmbed(roomID, embed) +} + +// MessageHandler will be called every time a new // message is created on any channel that the autenticated bot has access to. func MessageHandler(s *discordgo.Session, m *discordgo.MessageCreate) { @@ -73,9 +98,9 @@ func MessageHandler(s *discordgo.Session, m *discordgo.MessageCreate) { if m.Content == "!ServerStatus" { for _, server := range config.Config.Servers { if server.Online { - s.ChannelMessageSend(m.ChannelID, server.Name+" is online!") + sendEmbededMessage(m.ChannelID, green, server.Name, "Online!") } else { - s.ChannelMessageSend(m.ChannelID, server.Name+" is down!") + sendEmbededMessage(m.ChannelID, red, server.Name, "Offline!") } } }