1
0
mirror of https://github.com/mgerb/ServerStatus synced 2026-01-09 02:52:47 +00:00

added embedded messages resolves #9

This commit is contained in:
2018-03-15 20:48:25 -05:00
parent 217c6c8baa
commit 8d26fba95d
9 changed files with 155 additions and 46 deletions

1
.gitignore vendored
View File

@@ -1,2 +1,3 @@
config.json config.json
dist dist
vendor

41
Gopkg.lock generated Normal file
View File

@@ -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

38
Gopkg.toml Normal file
View File

@@ -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

View File

@@ -1,7 +1,7 @@
{ {
"Token": "your bot token", "Token": "your bot token",
"RoomIDList":["room id list goes here"], "RoomIDList":["room id list goes here"],
"RoleToNotify": "@everyone", "RolesToNotify": ["<@&roleid>", "<@userid>"],
"GameStatus": "current playing game", "GameStatus": "current playing game",
"Servers": [ "Servers": [
{ {

View File

@@ -2,6 +2,7 @@ package config
import ( import (
"encoding/json" "encoding/json"
"fmt"
"io/ioutil" "io/ioutil"
"log" "log"
"os" "os"
@@ -11,11 +12,11 @@ import (
var Config configStruct var Config configStruct
type configStruct struct { type configStruct struct {
Token string `json:"Token"` Token string `json:"Token"`
RoomIDList []string `json:"RoomIDList"` RoomIDList []string `json:"RoomIDList"`
RoleToNotify string `json:"RoleToNotify"` RolesToNotify []string `json:"RolesToNotify"`
Servers []server `json:"Servers"` Servers []server `json:"Servers"`
GameStatus string `json:"GameStatus"` GameStatus string `json:"GameStatus"`
} }
type server struct { type server struct {
@@ -27,7 +28,7 @@ type server struct {
func Configure() { func Configure() {
log.Println("Reading config file...") fmt.Println("Reading config file...")
file, e := ioutil.ReadFile("./config.json") file, e := ioutil.ReadFile("./config.json")
@@ -36,8 +37,6 @@ func Configure() {
os.Exit(1) os.Exit(1)
} }
log.Printf("%s\n", string(file))
err := json.Unmarshal(file, &Config) err := json.Unmarshal(file, &Config)
if err != nil { if err != nil {

14
main.go
View File

@@ -1,9 +1,11 @@
package main package main
import ( import (
"github.com/mgerb/serverstatus/bot" "fmt"
"github.com/mgerb/serverstatus/config"
"github.com/mgerb/serverstatus/serverstatus" "github.com/mgerb/ServerStatus/bot"
"github.com/mgerb/ServerStatus/config"
"github.com/mgerb/ServerStatus/serverstatus"
) )
// Variables used for command line parameters // Variables used for command line parameters
@@ -11,6 +13,12 @@ var (
BotID string BotID string
) )
var version = "undefined"
func init() {
fmt.Println("Starting Server Status " + version)
}
func main() { func main() {
//read config file //read config file
config.Configure() config.Configure()

View File

@@ -1,14 +1,16 @@
VERSION := $(shell git describe --tags)
run: run:
go run ./src/main.go go run ./src/main.go
linux: linux:
go build -o ./dist/ServerStatus-linux ./main.go go build -o ./dist/ServerStatus-linux -ldflags="-X main.version=${VERSION}" ./main.go
mac: 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: 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: clean:
rm -rf ./dist rm -rf ./dist
@@ -16,4 +18,7 @@ clean:
copyfiles: copyfiles:
cp config.template.json ./dist/config.json cp config.template.json ./dist/config.json
zip:
zip -r dist.zip dist
all: linux mac windows copyfiles all: linux mac windows copyfiles

View File

@@ -1,24 +1,28 @@
## Server Status # Server Status
Scans a list of TCP servers checking checking which are currently online.
Scans a list of servers checking whether the ports are open or not.
This bot will send a chat notification when the status of a server changes (goes on or offline). 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. 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'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: This bot currently does not work for UDP servers.
### Note - updated for Felmyst server!
The config template contains IP/Ports for the new Felmyst game and logon servers
## Configuration ## Configuration
- Download the latest release [here](https://github.com/mgerb/ServerStatus/releases) - Download the latest release [here](https://github.com/mgerb/ServerStatus/releases)
- Add your bot token as well as other configurations to config.json - Add your bot token as well as other configurations to config.json
- Execute the OS specific binary! - 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 sure Go and Make are installed
- make all - 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 https://github.com/reactiflux/discord-irc/wiki/Creating-a-discord-bot-&-getting-a-token
### How to get your room ID ### 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. 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.
<img src="https://camo.githubusercontent.com/9f759ec8b45a6e9dd2242bc64c82897c74f84a25/687474703a2f2f692e696d6775722e636f6d2f47684b70424d512e676966"/> <img src="https://camo.githubusercontent.com/9f759ec8b45a6e9dd2242bc64c82897c74f84a25/687474703a2f2f692e696d6775722e636f6d2f47684b70424d512e676966"/>
## 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!
```

View File

@@ -2,22 +2,32 @@ package serverstatus
import ( import (
"log" "log"
"strings"
"time" "time"
"github.com/anvie/port-scanner" "github.com/anvie/port-scanner"
"github.com/bwmarrin/discordgo" "github.com/bwmarrin/discordgo"
"github.com/mgerb/serverstatus/bot" "github.com/mgerb/ServerStatus/bot"
"github.com/mgerb/serverstatus/config" "github.com/mgerb/ServerStatus/config"
) )
const (
red = 0xf4425c
green = 0x42f477
blue = 0x42adf4
)
// Start - start port scanner and bot listeners
func Start() { func Start() {
//set each server status as online to 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 config.Config.Servers[i].Online = true
} }
err := bot.Session.UpdateStatus(0, config.Config.GameStatus) 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 { if err != nil {
log.Println(err) log.Println(err)
} }
@@ -43,9 +53,9 @@ func scanServers() {
serverUp := serverScanner.IsOpen(server.Port) //check if the port is open serverUp := serverScanner.IsOpen(server.Port) //check if the port is open
if serverUp && serverUp != prevServerUp { 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 { } 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 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 { 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. // message is created on any channel that the autenticated bot has access to.
func MessageHandler(s *discordgo.Session, m *discordgo.MessageCreate) { func MessageHandler(s *discordgo.Session, m *discordgo.MessageCreate) {
@@ -73,9 +98,9 @@ func MessageHandler(s *discordgo.Session, m *discordgo.MessageCreate) {
if m.Content == "!ServerStatus" { if m.Content == "!ServerStatus" {
for _, server := range config.Config.Servers { for _, server := range config.Config.Servers {
if server.Online { if server.Online {
s.ChannelMessageSend(m.ChannelID, server.Name+" is online!") sendEmbededMessage(m.ChannelID, green, server.Name, "Online!")
} else { } else {
s.ChannelMessageSend(m.ChannelID, server.Name+" is down!") sendEmbededMessage(m.ChannelID, red, server.Name, "Offline!")
} }
} }
} }