Created
August 9, 2021 15:11
-
-
Save Tanami/9c35cb48386fdef2fb10a5478681d309 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import ( | |
"encoding/json" | |
"fmt" | |
"io" | |
"net/http" | |
"strings" | |
"sync" | |
"github.com/rumblefrog/go-a2s" | |
) | |
var ips []string | |
var servers = make(map[string]string) | |
type set struct { | |
key string | |
val []string | |
} | |
type sJServer struct { | |
Country string `json:"country"` | |
Hostname string `json:"hostname"` | |
Whitelist float64 `json:"whitelist"` | |
IP string `json:"ip"` | |
ID float64 `json:"id"` | |
} | |
func loadServers() { | |
if res, err := http.Get("https://sourcejump.net/ajax/servers"); err != nil { | |
panic(err) | |
} else { | |
defer res.Body.Close() | |
data, _ := io.ReadAll(res.Body) | |
var decoded []sJServer | |
if err := json.Unmarshal(data, &decoded); err != nil { | |
panic(err) | |
} | |
for _, server := range decoded { | |
servers[server.Hostname] = server.IP | |
} | |
// spew.Dump(servers) | |
} | |
} | |
func getPlayers(wg *sync.WaitGroup, name string, addr string, setPlayers chan<- set) { | |
defer wg.Done() | |
client, err := a2s.NewClient(addr) | |
var realPlayers []string | |
if err != nil { | |
// don't care | |
} else { | |
defer client.Close() | |
players, err := client.QueryPlayer() | |
if err != nil { | |
// don't care | |
} else { | |
for _, player := range players.Players { | |
if strings.Index(player.Name, "replay") == -1 && | |
strings.Index(player.Name, "WR") == -1 && | |
strings.Index(player.Name, "Main") == -1 && | |
strings.Index(player.Name, "Normal") == -1 && | |
strings.Index(player.Name, "Bonus") == -1 { | |
realPlayers = append(realPlayers, player.Name) | |
} | |
} | |
if len(realPlayers) > 0 { | |
setPlayers <- set{ | |
key: name, | |
val: realPlayers, | |
} | |
} | |
} | |
client.Close() | |
} | |
} | |
func main() { | |
loadServers() | |
setPlayers := make(chan set) | |
players := make(map[string][]string) | |
var wg sync.WaitGroup | |
go func() { | |
for { | |
select { | |
case recv := <-setPlayers: | |
players[recv.key] = recv.val | |
} | |
} | |
}() | |
for server, ip := range servers { | |
wg.Add(1) | |
go getPlayers(&wg, server, ip, setPlayers) | |
} | |
wg.Wait() | |
for name, playerList := range players { | |
fmt.Printf("%s: %s\n", name, strings.Join(playerList, ", ")) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment