Compare commits

..

No commits in common. "a4a015a4cc2a30ef84850dbeead5788621a09bbc" and "54c27ff977c7bc7f60315bade3f7205fd4465593" have entirely different histories.

3 changed files with 19 additions and 113 deletions

View File

@ -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"`
} }

View File

@ -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
}

View File

@ -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)
} }