feat: 实现 Go 与 JS/TS SDK 连接收发与其余接口
This commit is contained in:
+224
@@ -0,0 +1,224 @@
|
||||
package nixmsg
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
)
|
||||
|
||||
// Recall 撤回消息。
|
||||
func (c *Client) Recall(ctx context.Context, id string) (RecallResult, error) {
|
||||
data, err := c.request(ctx, map[string]any{"v": 1, "type": "recall", "rid": c.nextRID(), "id": id}, false)
|
||||
if err != nil {
|
||||
return RecallResult{}, err
|
||||
}
|
||||
var r RecallResult
|
||||
_ = json.Unmarshal(data, &r)
|
||||
return r, nil
|
||||
}
|
||||
|
||||
// Status 查询发送状态。
|
||||
func (c *Client) Status(ctx context.Context, id, cursor string, limit int) (json.RawMessage, error) {
|
||||
req := map[string]any{"v": 1, "type": "status", "rid": c.nextRID(), "id": id}
|
||||
if cursor != "" {
|
||||
req["cursor"] = cursor
|
||||
}
|
||||
if limit > 0 {
|
||||
req["limit"] = limit
|
||||
}
|
||||
return c.request(ctx, req, false)
|
||||
}
|
||||
|
||||
// Unlock 解锁对话密码。
|
||||
func (c *Client) Unlock(ctx context.Context, endpointID, talkPassword string) error {
|
||||
_, err := c.request(ctx, map[string]any{
|
||||
"v": 1, "type": "unlock", "rid": c.nextRID(),
|
||||
"endpoint_id": endpointID, "talk_password": talkPassword,
|
||||
}, false)
|
||||
return err
|
||||
}
|
||||
|
||||
// Presence 查询在线。
|
||||
func (c *Client) Presence(ctx context.Context, ids []string) ([]PresenceItem, error) {
|
||||
data, err := c.request(ctx, map[string]any{"v": 1, "type": "presence.get", "rid": c.nextRID(), "ids": ids}, false)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
var wrap struct {
|
||||
Items []PresenceItem `json:"items"`
|
||||
}
|
||||
if json.Unmarshal(data, &wrap) == nil && wrap.Items != nil {
|
||||
return wrap.Items, nil
|
||||
}
|
||||
var items []PresenceItem
|
||||
if err := json.Unmarshal(data, &items); err == nil {
|
||||
return items, nil
|
||||
}
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
// Directory 列目录。
|
||||
func (c *Client) Directory(ctx context.Context, cursor, query string, limit int) (json.RawMessage, error) {
|
||||
req := map[string]any{"v": 1, "type": "directory.list", "rid": c.nextRID()}
|
||||
if cursor != "" {
|
||||
req["cursor"] = cursor
|
||||
}
|
||||
if query != "" {
|
||||
req["query"] = query
|
||||
}
|
||||
if limit > 0 {
|
||||
req["limit"] = limit
|
||||
}
|
||||
return c.request(ctx, req, false)
|
||||
}
|
||||
|
||||
// WatchPresence 订阅上下线;ids 为空且 all 为 true 表示全部。
|
||||
func (c *Client) WatchPresence(ctx context.Context, ids []string, all bool) error {
|
||||
req := map[string]any{"v": 1, "type": "presence.watch", "rid": c.nextRID(), "all": all}
|
||||
if len(ids) > 0 {
|
||||
req["ids"] = ids
|
||||
}
|
||||
_, err := c.request(ctx, req, false)
|
||||
return err
|
||||
}
|
||||
|
||||
// GetSelf 读取自己的资料。
|
||||
func (c *Client) GetSelf(ctx context.Context) (SelfInfo, error) {
|
||||
data, err := c.request(ctx, map[string]any{"v": 1, "type": "self.get", "rid": c.nextRID()}, false)
|
||||
if err != nil {
|
||||
return SelfInfo{}, err
|
||||
}
|
||||
var s SelfInfo
|
||||
_ = json.Unmarshal(data, &s)
|
||||
return s, nil
|
||||
}
|
||||
|
||||
// UpdateSelf 更新资料。
|
||||
func (c *Client) UpdateSelf(ctx context.Context, name string, defaultDelayMs *int64) error {
|
||||
req := map[string]any{"v": 1, "type": "self.update", "rid": c.nextRID()}
|
||||
if name != "" {
|
||||
req["name"] = name
|
||||
}
|
||||
if defaultDelayMs != nil {
|
||||
req["default_delay_ms"] = *defaultDelayMs
|
||||
}
|
||||
_, err := c.request(ctx, req, false)
|
||||
return err
|
||||
}
|
||||
|
||||
// SetTalkPassword 设置对话密码;空字符串清除。
|
||||
func (c *Client) SetTalkPassword(ctx context.Context, talkPassword string) error {
|
||||
_, err := c.request(ctx, map[string]any{
|
||||
"v": 1, "type": "self.talk_password", "rid": c.nextRID(), "talk_password": talkPassword,
|
||||
}, false)
|
||||
return err
|
||||
}
|
||||
|
||||
// ChangeLoginPassword 修改登录密码;成功后若返回新令牌会经 onSession 交出。
|
||||
func (c *Client) ChangeLoginPassword(ctx context.Context, oldPassword, newPassword string) error {
|
||||
data, err := c.request(ctx, map[string]any{
|
||||
"v": 1, "type": "self.login_password", "rid": c.nextRID(),
|
||||
"old_password": oldPassword, "new_password": newPassword,
|
||||
}, false)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
var d struct {
|
||||
SessionToken string `json:"session_token"`
|
||||
}
|
||||
if json.Unmarshal(data, &d) == nil && d.SessionToken != "" {
|
||||
c.mu.Lock()
|
||||
c.session = d.SessionToken
|
||||
if c.transport != nil {
|
||||
c.transport.SetCredential(d.SessionToken)
|
||||
}
|
||||
c.mu.Unlock()
|
||||
if c.onSession != nil {
|
||||
c.cbMu.Lock()
|
||||
c.onSession(d.SessionToken)
|
||||
c.cbMu.Unlock()
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// CreateGroup 建群。
|
||||
func (c *Client) CreateGroup(ctx context.Context, id, name string, members []GroupMemberIn) (json.RawMessage, error) {
|
||||
ms := make([]map[string]any, 0, len(members))
|
||||
for _, m := range members {
|
||||
ms = append(ms, map[string]any{"id": m.ID, "talk_password": m.TalkPassword})
|
||||
}
|
||||
return c.request(ctx, map[string]any{
|
||||
"v": 1, "type": "group.create", "rid": c.nextRID(), "id": id, "name": name, "members": ms,
|
||||
}, false)
|
||||
}
|
||||
|
||||
// AddGroupMembers 加成员。
|
||||
func (c *Client) AddGroupMembers(ctx context.Context, groupID string, members []GroupMemberIn) (json.RawMessage, error) {
|
||||
ms := make([]map[string]any, 0, len(members))
|
||||
for _, m := range members {
|
||||
ms = append(ms, map[string]any{"id": m.ID, "talk_password": m.TalkPassword})
|
||||
}
|
||||
return c.request(ctx, map[string]any{
|
||||
"v": 1, "type": "group.add", "rid": c.nextRID(), "group_id": groupID, "members": ms,
|
||||
}, false)
|
||||
}
|
||||
|
||||
// RemoveGroupMember 移除成员。
|
||||
func (c *Client) RemoveGroupMember(ctx context.Context, groupID, endpointID string) error {
|
||||
_, err := c.request(ctx, map[string]any{
|
||||
"v": 1, "type": "group.remove", "rid": c.nextRID(), "group_id": groupID, "endpoint_id": endpointID,
|
||||
}, false)
|
||||
return err
|
||||
}
|
||||
|
||||
// LeaveGroup 退群。
|
||||
func (c *Client) LeaveGroup(ctx context.Context, groupID string) error {
|
||||
_, err := c.request(ctx, map[string]any{"v": 1, "type": "group.leave", "rid": c.nextRID(), "group_id": groupID}, false)
|
||||
return err
|
||||
}
|
||||
|
||||
// TransferGroup 转让群主。
|
||||
func (c *Client) TransferGroup(ctx context.Context, groupID, endpointID string) error {
|
||||
_, err := c.request(ctx, map[string]any{
|
||||
"v": 1, "type": "group.transfer", "rid": c.nextRID(), "group_id": groupID, "endpoint_id": endpointID,
|
||||
}, false)
|
||||
return err
|
||||
}
|
||||
|
||||
// RenameGroup 改群名。
|
||||
func (c *Client) RenameGroup(ctx context.Context, groupID, name string) error {
|
||||
_, err := c.request(ctx, map[string]any{
|
||||
"v": 1, "type": "group.rename", "rid": c.nextRID(), "group_id": groupID, "name": name,
|
||||
}, false)
|
||||
return err
|
||||
}
|
||||
|
||||
// DissolveGroup 解散群。
|
||||
func (c *Client) DissolveGroup(ctx context.Context, groupID string) error {
|
||||
_, err := c.request(ctx, map[string]any{"v": 1, "type": "group.dissolve", "rid": c.nextRID(), "group_id": groupID}, false)
|
||||
return err
|
||||
}
|
||||
|
||||
// ListGroups 列出我的群。
|
||||
func (c *Client) ListGroups(ctx context.Context, cursor string, limit int) (json.RawMessage, error) {
|
||||
req := map[string]any{"v": 1, "type": "group.list", "rid": c.nextRID()}
|
||||
if cursor != "" {
|
||||
req["cursor"] = cursor
|
||||
}
|
||||
if limit > 0 {
|
||||
req["limit"] = limit
|
||||
}
|
||||
return c.request(ctx, req, false)
|
||||
}
|
||||
|
||||
// GetGroup 获取群详情。
|
||||
func (c *Client) GetGroup(ctx context.Context, groupID, cursor string, limit int) (json.RawMessage, error) {
|
||||
req := map[string]any{"v": 1, "type": "group.get", "rid": c.nextRID(), "group_id": groupID}
|
||||
if cursor != "" {
|
||||
req["cursor"] = cursor
|
||||
}
|
||||
if limit > 0 {
|
||||
req["limit"] = limit
|
||||
}
|
||||
return c.request(ctx, req, false)
|
||||
}
|
||||
Reference in New Issue
Block a user