66 lines
1.8 KiB
Go
66 lines
1.8 KiB
Go
package nixmsg
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"encoding/json"
|
|
"fmt"
|
|
"io"
|
|
"net/http"
|
|
)
|
|
|
|
// Register 静态方法:HTTP 自助注册。url 可为连接地址或注册地址。
|
|
func Register(ctx context.Context, connectOrRegisterURL, registrationCode string, opt RegisterOptions) (RegisterResult, error) {
|
|
regURL := connectOrRegisterURL
|
|
if u, err := RegisterURLFromConnect(connectOrRegisterURL); err == nil {
|
|
regURL = u
|
|
}
|
|
body := map[string]any{
|
|
"registration_code": registrationCode,
|
|
"id": opt.ID,
|
|
"login_password": opt.LoginPassword,
|
|
"name": opt.Name,
|
|
"talk_password": opt.TalkPassword,
|
|
}
|
|
payload, err := marshalJSON(body)
|
|
if err != nil {
|
|
return RegisterResult{}, err
|
|
}
|
|
req, err := http.NewRequestWithContext(ctx, http.MethodPost, regURL, bytes.NewReader(payload))
|
|
if err != nil {
|
|
return RegisterResult{}, err
|
|
}
|
|
req.Header.Set("Content-Type", "application/json")
|
|
resp, err := http.DefaultClient.Do(req)
|
|
if err != nil {
|
|
return RegisterResult{}, err
|
|
}
|
|
defer resp.Body.Close()
|
|
raw, err := io.ReadAll(io.LimitReader(resp.Body, 64<<10))
|
|
if err != nil {
|
|
return RegisterResult{}, err
|
|
}
|
|
var wrap struct {
|
|
OK bool `json:"ok"`
|
|
Data struct {
|
|
ID string `json:"id"`
|
|
LoginPassword string `json:"login_password"`
|
|
} `json:"data"`
|
|
Error *struct {
|
|
Code string `json:"code"`
|
|
Message string `json:"message"`
|
|
} `json:"error"`
|
|
}
|
|
if err := json.Unmarshal(raw, &wrap); err != nil {
|
|
return RegisterResult{}, fmt.Errorf("注册响应无效: %w", err)
|
|
}
|
|
if !wrap.OK {
|
|
code, msg := CodeBadRequest, "注册失败"
|
|
if wrap.Error != nil {
|
|
code, msg = wrap.Error.Code, wrap.Error.Message
|
|
}
|
|
return RegisterResult{}, apiErr(code, msg)
|
|
}
|
|
return RegisterResult{ID: wrap.Data.ID, LoginPassword: wrap.Data.LoginPassword}, nil
|
|
}
|