56 lines
1.0 KiB
Go
56 lines
1.0 KiB
Go
package discordrpc_client
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/goccy/go-json"
|
|
"seanime/internal/discordrpc/ipc"
|
|
)
|
|
|
|
// Client wrapper for the Discord RPC client
|
|
type Client struct {
|
|
ClientID string
|
|
Socket *discordrpc_ipc.Socket
|
|
}
|
|
|
|
func (c *Client) Close() {
|
|
if c == nil {
|
|
return
|
|
}
|
|
c.Socket.Close()
|
|
}
|
|
|
|
// New sends a handshake in the socket and returns an error or nil and an instance of Client
|
|
func New(clientId string) (*Client, error) {
|
|
if clientId == "" {
|
|
return nil, fmt.Errorf("no clientId set")
|
|
}
|
|
|
|
payload, err := json.Marshal(handshake{"1", clientId})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
sock, err := discordrpc_ipc.NewConnection()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
c := &Client{Socket: sock, ClientID: clientId}
|
|
|
|
r, err := c.Socket.Send(0, string(payload))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var responseBody Data
|
|
if err := json.Unmarshal([]byte(r), &responseBody); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if responseBody.Code > 1000 {
|
|
return nil, fmt.Errorf(responseBody.Message)
|
|
}
|
|
|
|
return c, nil
|
|
}
|