Quellcode durchsuchen

feat: fetch identify props from dolfies API (#571)

Ayyan vor 10 Monaten
Ursprung
Commit
80d4a3124a

+ 4 - 11
cmd/state.go

@@ -3,8 +3,8 @@ package cmd
 import (
 	"context"
 	"log/slog"
-	"runtime"
 
+	"github.com/ayn2op/discordo/internal/consts"
 	"github.com/ayn2op/discordo/internal/notifications"
 	"github.com/ayn2op/tview"
 	"github.com/diamondburned/arikawa/v3/api"
@@ -15,16 +15,9 @@ import (
 )
 
 func openState(token string) error {
-	api.UserAgent = app.cfg.Identify.UserAgent
-	gateway.DefaultIdentity = gateway.IdentifyProperties{
-		OS:     runtime.GOOS,
-		Device: "",
-
-		Browser:          app.cfg.Identify.Browser,
-		BrowserVersion:   app.cfg.Identify.BrowserVersion,
-		BrowserUserAgent: app.cfg.Identify.UserAgent,
-	}
-
+	props := consts.GetIdentifyProps()
+	api.UserAgent = props.BrowserUserAgent
+	gateway.DefaultIdentity = props
 	gateway.DefaultPresence = &gateway.UpdatePresenceCommand{
 		Status: app.cfg.Identify.Status,
 	}

+ 1 - 1
go.mod

@@ -7,7 +7,7 @@ require (
 	github.com/atotto/clipboard v0.1.4
 	github.com/ayn2op/tview v0.0.0-20250618224732-91a1a2f06994
 	github.com/deckarep/gosx-notifier v0.0.0-20180201035817-e127226297fb
-	github.com/diamondburned/arikawa/v3 v3.5.1-0.20250620082652-9d8f454bf68f
+	github.com/diamondburned/arikawa/v3 v3.5.1-0.20250702014048-91c175a8e0e4
 	github.com/diamondburned/ningen/v3 v3.0.1-0.20250607192146-d6b46a4689a5
 	github.com/gdamore/tcell/v2 v2.8.1
 	github.com/gen2brain/beeep v0.11.1

+ 2 - 2
go.sum

@@ -40,8 +40,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c
 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/deckarep/gosx-notifier v0.0.0-20180201035817-e127226297fb h1:6S+TKObz6+Io2c8IOkcbK4Sz7nj6RpEVU7TkvmsZZcw=
 github.com/deckarep/gosx-notifier v0.0.0-20180201035817-e127226297fb/go.mod h1:wf3nKtOnQqCp7kp9xB7hHnNlZ6m3NoiOxjrB9hFRq4Y=
-github.com/diamondburned/arikawa/v3 v3.5.1-0.20250620082652-9d8f454bf68f h1:4jx3d7rJpqqz8vrz50nS480QQYqGHLOwBbuTt39OVSs=
-github.com/diamondburned/arikawa/v3 v3.5.1-0.20250620082652-9d8f454bf68f/go.mod h1:thocAM2X8lRDHuEZR5vWYaT4w+tb/vOKa1qm+r0gs5A=
+github.com/diamondburned/arikawa/v3 v3.5.1-0.20250702014048-91c175a8e0e4 h1:24TheqHAPtaJG0RFkGq9XugUYKwg5xkmuEUCCrUeQgs=
+github.com/diamondburned/arikawa/v3 v3.5.1-0.20250702014048-91c175a8e0e4/go.mod h1:thocAM2X8lRDHuEZR5vWYaT4w+tb/vOKa1qm+r0gs5A=
 github.com/diamondburned/ningen/v3 v3.0.1-0.20250607192146-d6b46a4689a5 h1:JSR20qwKLYVl3KKy6mUY7f8ziD2GtGAa3P9G2CyFgwk=
 github.com/diamondburned/ningen/v3 v3.0.1-0.20250607192146-d6b46a4689a5/go.mod h1:UU1lud9g/GBl2+CZ8nPCe3Qk1U6fABEP1fk1sUzo7w0=
 github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=

+ 11 - 31
internal/config/config.go

@@ -21,10 +21,7 @@ type (
 	}
 
 	Identify struct {
-		Status         discord.Status `toml:"status"`
-		Browser        string         `toml:"browser"`
-		BrowserVersion string         `toml:"browser_version"`
-		UserAgent      string         `toml:"user_agent"`
+		Status discord.Status `toml:"status"`
 	}
 
 	Notifications struct {
@@ -91,37 +88,20 @@ func Load(path string) (*Config, error) {
 			"err",
 			err,
 		)
-		handleDefaults(cfg)
-		return cfg, nil
+	} else {
+		if err != nil {
+			return nil, fmt.Errorf("failed to open config file: %w", err)
+		}
+		defer file.Close()
+
+		if _, err := toml.NewDecoder(file).Decode(&cfg); err != nil {
+			return nil, fmt.Errorf("failed to decode config: %w", err)
+		}
 	}
 
-	if err != nil {
-		return nil, fmt.Errorf("failed to open config file: %w", err)
-	}
-	defer file.Close()
-
-	if _, err := toml.NewDecoder(file).Decode(&cfg); err != nil {
-		return nil, fmt.Errorf("failed to decode config: %w", err)
-	}
-
-	handleDefaults(cfg)
-	return cfg, nil
-}
-
-func handleDefaults(cfg *Config) {
 	if cfg.Editor == "default" {
 		cfg.Editor = os.Getenv("EDITOR")
 	}
 
-	if cfg.Identify.Browser == "default" {
-		cfg.Identify.Browser = consts.Browser
-	}
-
-	if cfg.Identify.BrowserVersion == "default" {
-		cfg.Identify.BrowserVersion = consts.BrowserVersion
-	}
-
-	if cfg.Identify.UserAgent == "default" {
-		cfg.Identify.UserAgent = consts.UserAgent
-	}
+	return cfg, nil
 }

+ 76 - 1
internal/consts/consts.go

@@ -1,5 +1,80 @@
 package consts
 
+import (
+	"encoding/json"
+	"net/http"
+
+	"github.com/diamondburned/arikawa/v3/discord"
+	"github.com/diamondburned/arikawa/v3/gateway"
+)
+
+const Name = "discordo"
+
 const (
-	Name = "discordo"
+	identifyPropertiesURL = "https://cordapi.dolfi.es/api/v2/properties/web"
+	loginURL              = "https://discord.com/login"
 )
+
+var defaultIdentifyProps = gateway.IdentifyProperties{
+	Device: "",
+
+	Browser:          "Chrome",
+	BrowserUserAgent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36",
+	BrowserVersion:   "138.0.0.0",
+
+	OS:        "Windows",
+	OSVersion: "10",
+
+	ClientBuildNumber: 415522,
+	ReleaseChannel:    "stable",
+
+	SystemLocale:  discord.EnglishUS,
+	HasClientMods: false,
+}
+
+func GetIdentifyProps() gateway.IdentifyProperties {
+	resp, err := http.Get(identifyPropertiesURL)
+	if err != nil {
+		return defaultIdentifyProps
+	}
+	defer resp.Body.Close()
+
+	var props struct {
+		Client struct {
+			Type           string `json:"type"`
+			BuildNumber    int    `json:"build_number"`
+			BuildHash      string `json:"build_hash"`
+			ReleaseChannel string `json:"release_channel"`
+		} `json:"client"`
+
+		Browser struct {
+			Type      string `json:"type"`
+			UserAgent string `json:"user_agent"`
+			Version   string `json:"version"`
+			OS        struct {
+				Type    string `json:"type"`
+				Version string `json:"version"`
+			} `json:"os"`
+		} `json:"browser"`
+	}
+	if err := json.NewDecoder(resp.Body).Decode(&props); err != nil {
+		return defaultIdentifyProps
+	}
+
+	return gateway.IdentifyProperties{
+		Device: "",
+
+		Browser:          props.Browser.Type,
+		BrowserUserAgent: props.Browser.UserAgent,
+		BrowserVersion:   props.Browser.Version,
+
+		OS:        props.Browser.OS.Type,
+		OSVersion: props.Browser.OS.Version,
+
+		ClientBuildNumber: props.Client.BuildNumber,
+		ReleaseChannel:    props.Client.ReleaseChannel,
+
+		SystemLocale:  discord.EnglishUS,
+		HasClientMods: false,
+	}
+}

+ 0 - 7
internal/consts/consts_darwin.go

@@ -1,7 +0,0 @@
-package consts
-
-const (
-	Browser        = "Chrome"
-	BrowserVersion = "132.0.0.0"
-	UserAgent      = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) " + Browser + "/" + BrowserVersion + " Safari/537.36"
-)

+ 0 - 7
internal/consts/consts_linux.go

@@ -1,7 +0,0 @@
-package consts
-
-const (
-	Browser        = "Chrome"
-	BrowserVersion = "133.0.0.0"
-	UserAgent      = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) " + Browser + "/" + BrowserVersion + " Safari/537.36"
-)

+ 0 - 7
internal/consts/consts_windows.go

@@ -1,7 +0,0 @@
-package consts
-
-const (
-	Browser        = "Chrome"
-	BrowserVersion = "133.0.0.0"
-	UserAgent      = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) " + Browser + "/" + BrowserVersion + " Safari/537.36"
-)

+ 2 - 2
internal/login/form.go

@@ -52,8 +52,8 @@ func (f *Form) login() {
 
 	// Create an API client without an authentication token.
 	client := api.NewClient("")
-	// Spoof the user agent of a web browser.
-	client.UserAgent = f.cfg.Identify.UserAgent
+	props := consts.GetIdentifyProps()
+	client.UserAgent = props.BrowserUserAgent
 
 	resp, err := client.Login(email, password)
 	if err != nil {