Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package main
- import (
- "encoding/json"
- "flag"
- "fmt"
- "io"
- "net/http"
- "net/url"
- "strings"
- "github.com/gorilla/websocket"
- )
- const (
- Server = "sim.psim.us"
- WebsocketURL string = "wss://sim3.psim.us/showdown/websocket"
- ActionURL string = "https://play.pokemonshowdown.com/~~" + Server + "/action.php"
- )
- // flags
- var (
- name = flag.String("name", "", "bot name")
- password = flag.String("pass", "", "bot password")
- )
- type Login struct {
- ActionSuccess bool `json:"actionsuccess"`
- Assertion string `json:"assertion"`
- CurUser CurrentUser `json:"curuser"`
- }
- type CurrentUser struct {
- LoggedIn bool `json:"loggedin"`
- Username string `json:"username"`
- UserID string `json:"userid"`
- }
- func main() {
- flag.Parse()
- conn, _, err := websocket.DefaultDialer.Dial(WebsocketURL, nil)
- if err != nil {
- panic(err)
- }
- defer conn.Close()
- fmt.Println("Connecting to Showdown...")
- for {
- _, b, err := conn.ReadMessage()
- if err != nil {
- panic(err)
- }
- fmt.Println(string(b))
- chunks := strings.Split(string(b), "|")
- switch chunks[1] {
- case "challstr":
- id, data := chunks[2], chunks[3]
- u, _ := url.Parse(ActionURL)
- q := u.Query()
- q.Set("act", "login")
- q.Set("name", *name)
- q.Set("pass", *password)
- q.Set("challengekeyid", id)
- q.Set("challstr", data)
- u.RawQuery = q.Encode()
- fmt.Println(u.String())
- res, err := http.Post(u.String(), "application/x-www-form-urlencoded", nil)
- if err != nil {
- panic(err)
- }
- fmt.Println("Response:", res.Status)
- body, err := io.ReadAll(res.Body)
- if err != nil {
- panic(err)
- }
- var login Login
- if err = json.Unmarshal(body[1:], &login); err != nil {
- panic(err)
- }
- fmt.Println(login)
- d := []byte(fmt.Sprintf("|/trn %s,0,%s", *name, login.Assertion))
- err = conn.WriteMessage(websocket.TextMessage, d)
- if err != nil {
- panic(err)
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment