Compare commits
No commits in common. "a4a015a4cc2a30ef84850dbeead5788621a09bbc" and "54c27ff977c7bc7f60315bade3f7205fd4465593" have entirely different histories.
a4a015a4cc
...
54c27ff977
@ -1,7 +1,6 @@
|
|||||||
package types
|
package types
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
)
|
)
|
||||||
@ -29,5 +28,5 @@ func (le LemmyError) Error() string {
|
|||||||
|
|
||||||
type LemmyWebSocketMsg struct {
|
type LemmyWebSocketMsg struct {
|
||||||
Op UserOperation `json:"op"`
|
Op UserOperation `json:"op"`
|
||||||
Data json.RawMessage `json:"data"`
|
Data any `json:"data"`
|
||||||
}
|
}
|
||||||
|
@ -1,37 +0,0 @@
|
|||||||
package types
|
|
||||||
|
|
||||||
type UserJoin struct {
|
|
||||||
Auth string `json:"auth"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type UserJoinResponse struct {
|
|
||||||
Joined bool `json:"joined"`
|
|
||||||
LemmyResponse
|
|
||||||
}
|
|
||||||
|
|
||||||
type CommunityJoin struct {
|
|
||||||
CommunityID int `json:"community_id"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type CommunityJoinResponse struct {
|
|
||||||
Joined bool `json:"joined"`
|
|
||||||
LemmyResponse
|
|
||||||
}
|
|
||||||
|
|
||||||
type ModJoin struct {
|
|
||||||
CommunityID int `json:"community_id"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type ModJoinResponse struct {
|
|
||||||
Joined bool `json:"joined"`
|
|
||||||
LemmyResponse
|
|
||||||
}
|
|
||||||
|
|
||||||
type PostJoin struct {
|
|
||||||
PostID int `json:"post_id"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type PostJoinResponse struct {
|
|
||||||
Joined bool `json:"joined"`
|
|
||||||
LemmyResponse
|
|
||||||
}
|
|
78
websocket.go
78
websocket.go
@ -1,27 +1,18 @@
|
|||||||
package lemmy
|
package lemmy
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
|
||||||
"encoding/json"
|
|
||||||
"net/http"
|
|
||||||
"net/url"
|
"net/url"
|
||||||
"reflect"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/mitchellh/mapstructure"
|
||||||
"github.com/recws-org/recws"
|
"github.com/recws-org/recws"
|
||||||
"go.arsenm.dev/go-lemmy/types"
|
"go.arsenm.dev/go-lemmy/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
type authData struct {
|
|
||||||
Auth string `json:"auth"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type WSClient struct {
|
type WSClient struct {
|
||||||
conn *recws.RecConn
|
conn *recws.RecConn
|
||||||
baseURL *url.URL
|
|
||||||
respCh chan types.LemmyWebSocketMsg
|
respCh chan types.LemmyWebSocketMsg
|
||||||
errCh chan error
|
errCh chan error
|
||||||
token string
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewWebSocket(baseURL string) (*WSClient, error) {
|
func NewWebSocket(baseURL string) (*WSClient, error) {
|
||||||
@ -35,11 +26,10 @@ func NewWebSocket(baseURL string) (*WSClient, error) {
|
|||||||
}
|
}
|
||||||
u = u.JoinPath("/api/v3")
|
u = u.JoinPath("/api/v3")
|
||||||
|
|
||||||
ws.Dial(u.JoinPath("ws").String(), nil)
|
ws.Dial(u.String(), nil)
|
||||||
|
|
||||||
out := &WSClient{
|
out := &WSClient{
|
||||||
conn: ws,
|
conn: ws,
|
||||||
baseURL: u,
|
|
||||||
respCh: make(chan types.LemmyWebSocketMsg, 10),
|
respCh: make(chan types.LemmyWebSocketMsg, 10),
|
||||||
errCh: make(chan error, 10),
|
errCh: make(chan error, 10),
|
||||||
}
|
}
|
||||||
@ -59,40 +49,10 @@ func NewWebSocket(baseURL string) (*WSClient, error) {
|
|||||||
return out, nil
|
return out, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *WSClient) Login(ctx context.Context, l types.Login) error {
|
|
||||||
u := &url.URL{}
|
|
||||||
*u = *c.baseURL
|
|
||||||
|
|
||||||
if u.Scheme == "ws" {
|
|
||||||
u.Scheme = "http"
|
|
||||||
} else if u.Scheme == "wss" {
|
|
||||||
u.Scheme = "https"
|
|
||||||
}
|
|
||||||
|
|
||||||
hc := &Client{baseURL: u, client: http.DefaultClient}
|
|
||||||
err := hc.Login(ctx, l)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
c.token = hc.token
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *WSClient) Request(op types.UserOperation, data any) error {
|
func (c *WSClient) Request(op types.UserOperation, data any) error {
|
||||||
if data == nil {
|
|
||||||
data = authData{}
|
|
||||||
}
|
|
||||||
|
|
||||||
data = c.setAuth(data)
|
|
||||||
|
|
||||||
d, err := json.Marshal(data)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return c.conn.WriteJSON(types.LemmyWebSocketMsg{
|
return c.conn.WriteJSON(types.LemmyWebSocketMsg{
|
||||||
Op: op,
|
Op: op,
|
||||||
Data: d,
|
Data: data,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -104,29 +64,13 @@ func (c *WSClient) Errors() <-chan error {
|
|||||||
return c.errCh
|
return c.errCh
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *WSClient) setAuth(data any) any {
|
func DecodeResponse(data, out any) error {
|
||||||
val := reflect.New(reflect.TypeOf(data))
|
dec, err := mapstructure.NewDecoder(&mapstructure.DecoderConfig{
|
||||||
val.Elem().Set(reflect.ValueOf(data))
|
TagName: "json",
|
||||||
|
Result: out,
|
||||||
authField := val.Elem().FieldByName("Auth")
|
})
|
||||||
if !authField.IsValid() {
|
if err != nil {
|
||||||
return data
|
return err
|
||||||
}
|
}
|
||||||
|
return dec.Decode(data)
|
||||||
switch authField.Type().String() {
|
|
||||||
case "string":
|
|
||||||
authField.SetString(c.token)
|
|
||||||
case "types.Optional[string]":
|
|
||||||
setMtd := authField.MethodByName("Set")
|
|
||||||
out := setMtd.Call([]reflect.Value{reflect.ValueOf(c.token)})
|
|
||||||
authField.Set(out[0])
|
|
||||||
default:
|
|
||||||
return data
|
|
||||||
}
|
|
||||||
|
|
||||||
return val.Elem().Interface()
|
|
||||||
}
|
|
||||||
|
|
||||||
func DecodeResponse(data json.RawMessage, out any) error {
|
|
||||||
return json.Unmarshal(data, out)
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user