diff --git a/cmd/state.go b/cmd/state.go index dbeab2d..0b4cf7f 100644 --- a/cmd/state.go +++ b/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, } diff --git a/go.mod b/go.mod index 99d324f..7bf5430 100644 --- a/go.mod +++ b/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 diff --git a/go.sum b/go.sum index 201844d..8e29481 100644 --- a/go.sum +++ b/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= diff --git a/internal/config/config.go b/internal/config/config.go index f9f655b..0996db6 100644 --- a/internal/config/config.go +++ b/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 } diff --git a/internal/consts/consts.go b/internal/consts/consts.go index 57b4e61..bd1d868 100644 --- a/internal/consts/consts.go +++ b/internal/consts/consts.go @@ -1,5 +1,80 @@ package consts -const ( - Name = "discordo" +import ( + "encoding/json" + "net/http" + + "github.com/diamondburned/arikawa/v3/discord" + "github.com/diamondburned/arikawa/v3/gateway" ) + +const Name = "discordo" + +const ( + 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, + } +} diff --git a/internal/consts/consts_darwin.go b/internal/consts/consts_darwin.go deleted file mode 100644 index 54c9546..0000000 --- a/internal/consts/consts_darwin.go +++ /dev/null @@ -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" -) diff --git a/internal/consts/consts_linux.go b/internal/consts/consts_linux.go deleted file mode 100644 index dadcc53..0000000 --- a/internal/consts/consts_linux.go +++ /dev/null @@ -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" -) diff --git a/internal/consts/consts_windows.go b/internal/consts/consts_windows.go deleted file mode 100644 index 23362d9..0000000 --- a/internal/consts/consts_windows.go +++ /dev/null @@ -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" -) diff --git a/internal/login/form.go b/internal/login/form.go index 3e90e19..6a64421 100644 --- a/internal/login/form.go +++ b/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 {