You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
126 lines
2.7 KiB
126 lines
2.7 KiB
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, |
|
} |
|
cmds := keybase.AdvertiseCommandsOptions{ |
|
Alias: "Realm Status", |
|
Advertisements: []chat1.AdvertiseCommandAPIParam{ |
|
{ |
|
Typ: "public", |
|
Commands: []chat1.UserBotCommandInput{ |
|
{ |
|
Name: "realm", |
|
Description: "Request a Realm's status", |
|
Usage: "Kirin Tor", |
|
}, |
|
}, |
|
}, |
|
}, |
|
} |
|
k.AdvertiseCommands(cmds) |
|
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++ |
|
} |
|
|
|
}
|
|
|