Browse Source

Initial commit

master
Gregory Rudolph 3 years ago
commit
12eef70fa4
Signed by: rudi
GPG Key ID: EF64F3CBD1A1EBDD
  1. 1
      .gitignore
  2. 7
      go.mod
  3. 2
      go.sum
  4. 110
      main.go
  5. 128
      types.go

1
.gitignore vendored

@ -0,0 +1 @@ @@ -0,0 +1 @@
RealmBot

7
go.mod

@ -0,0 +1,7 @@ @@ -0,0 +1,7 @@
module git.nightmare.haus/rudi/RealmBot
go 1.15
require (
samhofi.us/x/keybase/v2 v2.0.6
)

2
go.sum

@ -0,0 +1,2 @@ @@ -0,0 +1,2 @@
samhofi.us/x/keybase/v2 v2.0.6 h1:gLluTcyjbwckQxSarF1ig2klL4Li7O/THdxsgo1dUvw=
samhofi.us/x/keybase/v2 v2.0.6/go.mod h1:lJivwhzMSV+WUg+XUbatszStjjFVcuLGl+xcQpqQ5GQ=

110
main.go

@ -0,0 +1,110 @@ @@ -0,0 +1,110 @@
package main
import (
"encoding/json"
"flag"
"fmt"
"io/ioutil"
"log"
"net/http"
"strconv"
"strings"
"samhofi.us/x/keybase/v2"
"samhofi.us/x/keybase/v2/types/chat1"
)
var (
k = keybase.NewKeybase()
namespace = "dynamic-us"
locale = "en_US"
accessToken string
realms = make(map[int]Realm)
)
func init() {
flag.StringVar(&accessToken, "t", "", "Token to access Blizzard API")
flag.Parse()
}
func main() {
if accessToken == "" {
return
}
chat := handleChat
handlers := keybase.Handlers{
ChatHandler: &chat,
}
k.Run(handlers, &keybase.RunOptions{})
}
func handleChat(m chat1.MsgSummary) {
if !strings.HasPrefix(m.Content.Text.Body, "!realm") {
return
}
updateRealmStatus()
search := strings.Trim(strings.Replace(m.Content.Text.Body, "!realm", "", -1), " ")
r := getRealm(search)
if r.ID == 0 {
k.ReplyByConvID(m.ConvID, m.Id, fmt.Sprintf(":interrobang: %+v was not found!", search))
return
}
if r.Up {
k.ReplyByConvID(m.ConvID, m.Id, fmt.Sprintf(":white_check_mark: %+v is up.", r.Name))
} else {
k.ReplyByConvID(m.ConvID, m.Id, fmt.Sprintf(":x: %+v is down.", r.Name))
}
}
func updateRealmStatus() {
getRealmStatus(true)
getRealmStatus(false)
}
func getRealm(search string) Realm {
id, err := strconv.Atoi(search)
if err == nil {
if val, ok := realms[id]; ok {
return val
}
}
for _, v := range realms {
if strings.Contains(strings.ToLower(v.Name), strings.ToLower(search)) {
return v
}
}
return Realm{ID: 0, Name: "Not Found", Up: false}
}
func getRealmStatus(up bool) {
var pageData RealmSearch
statusType := "UP"
if !up {
statusType = "DOWN"
}
page := 1
for {
// Make HTTP GET request
response, err := http.Get(
fmt.Sprintf("https://us.api.blizzard.com/data/wow/search/connected-realm?namespace=%+v&status.type=%+v&orderby=id&_page=%+v&access_token=%+v",
namespace, statusType, page, accessToken))
if err != nil {
log.Fatal(err)
}
defer response.Body.Close()
body, readErr := ioutil.ReadAll(response.Body)
if readErr != nil {
log.Fatal(readErr)
}
err = json.Unmarshal([]byte(body), &pageData)
for _, d := range pageData.Results {
for _, r := range d.Data.Realms {
realms[r.ID] = Realm{ID: r.ID, Name: r.Name.EnUS, Up: up}
}
}
if page == pageData.PageCount || pageData.PageCount == 0 {
return
}
page++
}
}

128
types.go

@ -0,0 +1,128 @@ @@ -0,0 +1,128 @@
package main
// RealmSearch struct is generated from https://us.api.blizzard.com/data/wow/connected-realm/index
type RealmSearch struct {
Page int `json:"page"`
PageSize int `json:"pageSize"`
MaxPageSize int `json:"maxPageSize"`
PageCount int `json:"pageCount"`
Results []struct {
Key struct {
Href string `json:"href"`
} `json:"key"`
Data struct {
Realms []struct {
IsTournament bool `json:"is_tournament"`
Timezone string `json:"timezone"`
Name struct {
ItIT string `json:"it_IT"`
RuRU string `json:"ru_RU"`
EnGB string `json:"en_GB"`
ZhTW string `json:"zh_TW"`
KoKR string `json:"ko_KR"`
EnUS string `json:"en_US"`
EsMX string `json:"es_MX"`
PtBR string `json:"pt_BR"`
EsES string `json:"es_ES"`
ZhCN string `json:"zh_CN"`
FrFR string `json:"fr_FR"`
DeDE string `json:"de_DE"`
} `json:"name"`
ID int `json:"id"`
Region struct {
Name struct {
ItIT string `json:"it_IT"`
RuRU string `json:"ru_RU"`
EnGB string `json:"en_GB"`
ZhTW string `json:"zh_TW"`
KoKR string `json:"ko_KR"`
EnUS string `json:"en_US"`
EsMX string `json:"es_MX"`
PtBR string `json:"pt_BR"`
EsES string `json:"es_ES"`
ZhCN string `json:"zh_CN"`
FrFR string `json:"fr_FR"`
DeDE string `json:"de_DE"`
} `json:"name"`
ID int `json:"id"`
} `json:"region"`
Category struct {
ItIT string `json:"it_IT"`
RuRU string `json:"ru_RU"`
EnGB string `json:"en_GB"`
ZhTW string `json:"zh_TW"`
KoKR string `json:"ko_KR"`
EnUS string `json:"en_US"`
EsMX string `json:"es_MX"`
PtBR string `json:"pt_BR"`
EsES string `json:"es_ES"`
ZhCN string `json:"zh_CN"`
FrFR string `json:"fr_FR"`
DeDE string `json:"de_DE"`
} `json:"category"`
Locale string `json:"locale"`
Type struct {
Name struct {
ItIT string `json:"it_IT"`
RuRU string `json:"ru_RU"`
EnGB string `json:"en_GB"`
ZhTW string `json:"zh_TW"`
KoKR string `json:"ko_KR"`
EnUS string `json:"en_US"`
EsMX string `json:"es_MX"`
PtBR string `json:"pt_BR"`
EsES string `json:"es_ES"`
ZhCN string `json:"zh_CN"`
FrFR string `json:"fr_FR"`
DeDE string `json:"de_DE"`
} `json:"name"`
Type string `json:"type"`
} `json:"type"`
Slug string `json:"slug"`
} `json:"realms"`
ID int `json:"id"`
HasQueue bool `json:"has_queue"`
Status struct {
Name struct {
ItIT string `json:"it_IT"`
RuRU string `json:"ru_RU"`
EnGB string `json:"en_GB"`
ZhTW string `json:"zh_TW"`
KoKR string `json:"ko_KR"`
EnUS string `json:"en_US"`
EsMX string `json:"es_MX"`
PtBR string `json:"pt_BR"`
EsES string `json:"es_ES"`
ZhCN string `json:"zh_CN"`
FrFR string `json:"fr_FR"`
DeDE string `json:"de_DE"`
} `json:"name"`
Type string `json:"type"`
} `json:"status"`
Population struct {
Name struct {
ItIT string `json:"it_IT"`
RuRU string `json:"ru_RU"`
EnGB string `json:"en_GB"`
ZhTW string `json:"zh_TW"`
KoKR string `json:"ko_KR"`
EnUS string `json:"en_US"`
EsMX string `json:"es_MX"`
PtBR string `json:"pt_BR"`
EsES string `json:"es_ES"`
ZhCN string `json:"zh_CN"`
FrFR string `json:"fr_FR"`
DeDE string `json:"de_DE"`
} `json:"name"`
Type string `json:"type"`
} `json:"population"`
} `json:"data"`
} `json:"results"`
}
// Realm is a parsed realm from the API
type Realm struct {
ID int
Name string
Up bool
}
Loading…
Cancel
Save