diff --git a/libmxclient/mxclientlib.go b/libmxclient/mxclientlib.go index e17f168..c0c65f0 100644 --- a/libmxclient/mxclientlib.go +++ b/libmxclient/mxclientlib.go @@ -192,6 +192,18 @@ func cliv0_mxpassitem(mxpassfile_path *C.char, url *C.char, localpart *C.char, d return C.CString(s) } +//export cliv0_genericrequest +func cliv0_genericrequest(hs *C.char, tk *C.char, reqData *C.char) *C.char { + _hs := C.GoString(hs) + _tk := C.GoString(tk) + _reqData := C.GoString(reqData) + resp, err := mxutils.GenericRequest(_hs, _tk, _reqData) + if err != nil { + return C.CString(fmt.Sprintf("ERR: %v\n%s", err, resp)) + } + return C.CString(resp) +} + /* high level api, supports multiple clients the same handler can be attached to multiple clients diff --git a/libmxclient/mxutils/generic.go b/libmxclient/mxutils/generic.go new file mode 100644 index 0000000..30136ec --- /dev/null +++ b/libmxclient/mxutils/generic.go @@ -0,0 +1,32 @@ +// Copyright (C) 2026 saces@c-base.org +// SPDX-License-Identifier: AGPL-3.0-only +package mxutils + +import ( + "context" + "encoding/json" + + "maunium.net/go/mautrix" +) + +type req_data struct { + Method string `json:"method"` + Path mautrix.BaseURLPath `json:"path"` + Payload any `json:"payload"` +} + +func GenericRequest(hs string, accessToken string, reqData string) (string, error) { + var rd req_data + err := json.Unmarshal([]byte(reqData), &rd) + if err != nil { + return "", err + } + mauclient, err := mautrix.NewClient(hs, "", accessToken) + if err != nil { + return "", err + } + + urlPath := mauclient.BuildURLWithFullQuery(mautrix.BaseURLPath(rd.Path), nil) + resp, err := mauclient.MakeRequest(context.Background(), rd.Method, urlPath, rd.Payload, nil) + return string(resp), err +} diff --git a/pygomx/build_ffi.py b/pygomx/build_ffi.py index be96195..418c614 100644 --- a/pygomx/build_ffi.py +++ b/pygomx/build_ffi.py @@ -42,6 +42,7 @@ ffibuilder.cdef( extern char* cliv0_clearaccount(char* hs, char* accessToken); extern char* cliv0_serverinfo(char* url); extern char* cliv0_mxpassitem(char* mxpassfile, char* hs, char* localpart, char* domain); + extern char* cliv0_genericrequest(char* hs, char* accessToken, char* req); extern int apiv0_initialize(); extern int apiv0_deinitialize(); extern char* apiv0_discover(char* mxid);