74 lines
1.3 KiB
Go
74 lines
1.3 KiB
Go
package discordrpc_ipc
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/binary"
|
|
"fmt"
|
|
"net"
|
|
"os"
|
|
)
|
|
|
|
// GetIpcPath chooses the correct directory to the ipc socket and returns it
|
|
func GetIpcPath() string {
|
|
vn := []string{"XDG_RUNTIME_DIR", "TMPDIR", "TMP", "TEMP"}
|
|
|
|
for _, name := range vn {
|
|
path, exists := os.LookupEnv(name)
|
|
|
|
if exists {
|
|
return path
|
|
}
|
|
}
|
|
|
|
return "/tmp"
|
|
}
|
|
|
|
// Socket extends net.Conn methods
|
|
type Socket struct {
|
|
net.Conn
|
|
}
|
|
|
|
// Read the socket response
|
|
func (socket *Socket) Read() (string, error) {
|
|
buf := make([]byte, 512)
|
|
payloadLength, err := socket.Conn.Read(buf)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
buffer := new(bytes.Buffer)
|
|
for i := 8; i < payloadLength; i++ {
|
|
buffer.WriteByte(buf[i])
|
|
}
|
|
|
|
r := buffer.String()
|
|
if r == "" {
|
|
return "", fmt.Errorf("empty response")
|
|
}
|
|
|
|
return r, nil
|
|
}
|
|
|
|
// Send opcode and payload to the unix socket
|
|
func (socket *Socket) Send(opcode int, payload string) (string, error) {
|
|
buf := new(bytes.Buffer)
|
|
|
|
err := binary.Write(buf, binary.LittleEndian, int32(opcode))
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
err = binary.Write(buf, binary.LittleEndian, int32(len(payload)))
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
buf.Write([]byte(payload))
|
|
_, err = socket.Write(buf.Bytes())
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
return socket.Read()
|
|
}
|