102 lines
3.0 KiB
Go
102 lines
3.0 KiB
Go
package discordrpc_client
|
|
|
|
import (
|
|
"os"
|
|
"strconv"
|
|
"time"
|
|
|
|
"github.com/google/uuid"
|
|
)
|
|
|
|
// Activity holds the data for discord rich presence
|
|
//
|
|
// See https://discord.com/developers/docs/game-sdk/activities#data-models-activity-struct
|
|
type Activity struct {
|
|
Name string `json:"name,omitempty"`
|
|
Details string `json:"details,omitempty"`
|
|
DetailsURL string `json:"details_url,omitempty"` // URL to details
|
|
State string `json:"state,omitempty"`
|
|
StateURL string `json:"state_url,omitempty"` // URL to state
|
|
|
|
Timestamps *Timestamps `json:"timestamps,omitempty"`
|
|
Assets *Assets `json:"assets,omitempty"`
|
|
Party *Party `json:"party,omitempty"`
|
|
Secrets *Secrets `json:"secrets,omitempty"`
|
|
Buttons []*Button `json:"buttons,omitempty"`
|
|
|
|
Instance bool `json:"instance"`
|
|
Type int `json:"type"`
|
|
StatusDisplayType int `json:"status_display_type,omitempty"` // 1 = name, 2 = details, 3 = state
|
|
}
|
|
|
|
// Timestamps holds unix timestamps for start and/or end of the game
|
|
//
|
|
// See https://discord.com/developers/docs/game-sdk/activities#data-models-activitytimestamps-struct
|
|
type Timestamps struct {
|
|
Start *Epoch `json:"start,omitempty"`
|
|
End *Epoch `json:"end,omitempty"`
|
|
}
|
|
|
|
// Epoch wrapper around time.Time to ensure times are sent as a unix epoch int
|
|
type Epoch struct{ time.Time }
|
|
|
|
// MarshalJSON converts time.Time to unix time int
|
|
func (t Epoch) MarshalJSON() ([]byte, error) {
|
|
return []byte(strconv.FormatInt(t.Unix(), 10)), nil
|
|
}
|
|
|
|
// Assets passes image references for inclusion in rich presence
|
|
//
|
|
// See https://discord.com/developers/docs/game-sdk/activities#data-models-activityassets-struct
|
|
type Assets struct {
|
|
LargeImage string `json:"large_image,omitempty"`
|
|
LargeText string `json:"large_text,omitempty"`
|
|
LargeURL string `json:"large_url,omitempty"` // URL to large image, if any
|
|
SmallImage string `json:"small_image,omitempty"`
|
|
SmallText string `json:"small_text,omitempty"`
|
|
SmallURL string `json:"small_url,omitempty"` // URL to small image, if any
|
|
}
|
|
|
|
// Party holds information for the current party of the player
|
|
type Party struct {
|
|
ID string `json:"id"`
|
|
Size []int `json:"size"` // seems to be element [0] is count and [1] is max
|
|
}
|
|
|
|
// Secrets holds secrets for Rich Presence joining and spectating
|
|
type Secrets struct {
|
|
Join string `json:"join,omitempty"`
|
|
Spectate string `json:"spectate,omitempty"`
|
|
Match string `json:"match,omitempty"`
|
|
}
|
|
|
|
type Button struct {
|
|
Label string `json:"label,omitempty"`
|
|
Url string `json:"url,omitempty"`
|
|
}
|
|
|
|
// SetActivity sets the Rich Presence activity for the running application
|
|
func (c *Client) SetActivity(activity Activity) error {
|
|
payload := Payload{
|
|
Cmd: SetActivityCommand,
|
|
Args: Args{
|
|
Pid: os.Getpid(),
|
|
Activity: &activity,
|
|
},
|
|
Nonce: uuid.New(),
|
|
}
|
|
return c.SendPayload(payload)
|
|
}
|
|
|
|
func (c *Client) CancelActivity() error {
|
|
payload := Payload{
|
|
Cmd: SetActivityCommand,
|
|
Args: Args{
|
|
Pid: os.Getpid(),
|
|
Activity: nil,
|
|
},
|
|
Nonce: uuid.New(),
|
|
}
|
|
return c.SendPayload(payload)
|
|
}
|