feat: fetch identify props from dolfies API (#571)
This commit is contained in:
parent
d701e7d15b
commit
80d4a3124a
9 changed files with 97 additions and 70 deletions
15
cmd/state.go
15
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,
|
||||
}
|
||||
|
|
|
|||
2
go.mod
2
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
|
||||
|
|
|
|||
4
go.sum
4
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=
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
)
|
||||
|
|
@ -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"
|
||||
)
|
||||
|
|
@ -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"
|
||||
)
|
||||
|
|
@ -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 {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue