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++ } }