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

This commit is contained in:
Ayyan 2025-07-03 22:19:00 -04:00 • committed by GitHub
parent d701e7d15b
commit 80d4a3124a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
9 changed files with 97 additions and 70 deletions

View file

@ -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,
}

2
go.mod
View file

@ -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

4
go.sum
View file

@ -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=

View file

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

View file

@ -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,
}
}

View file

@ -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"
)

View file

@ -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"
)

View file

@ -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"
)

View file

@ -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 {