spark-server/internal/module/group/logic/notice.go
2026-09-18 14:50:41 +08:00

66 lines
2.0 KiB
Go

package logic
import (
"context"
"encoding/json"
"fmt"
"time"
deliverentity "spark-server/internal/module/deliver/entity"
"spark-server/internal/module/group/entity"
msgentity "spark-server/internal/module/message/entity"
"spark-server/internal/pkg/reply"
)
func (s *Service) notice(ctx context.Context, g *entity.Group, actorID int64, kind string, targets []int64) error {
if s.msgs == nil || s.ids == nil || g == nil || g.ConversationID <= 0 {
return nil
}
msgID, err := s.ids.NextID()
if err != nil {
return err
}
now := time.Now()
content := msgentity.NewSystem(&msgentity.System{Kind: kind})
raw, err := content.Marshal()
if err != nil {
return err
}
msg := &msgentity.Message{
ID: msgID, ConversationID: g.ConversationID, SenderID: 0, GroupID: g.ID,
ClientMsgID: fmt.Sprintf("sys:group:%d", msgID),
Type: msgentity.TypeSystem, Kind: msgentity.KindGroup, Content: raw,
Status: msgentity.StatusNormal, CreatedAtMS: now.UnixMilli(),
}
if err := s.msgs.Create(ctx, msg); err != nil {
return err
}
if err := s.repo.UpdateLastMsg(ctx, g.ConversationID, msgID, now.UnixMilli()); err != nil {
return err
}
if s.queue == nil {
return nil
}
to, err := s.repo.ListMemberIDs(ctx, g.ID)
if err != nil || len(to) == 0 {
to = append([]int64{actorID}, targets...)
}
return s.queue.Push(ctx, &deliverentity.Job{
MsgID: msgID, Cmd: cmdMessage, ConversationID: g.ConversationID,
FromUserID: actorID, ToUserIDs: to,
Payload: reply.MustMarshal(reply.OK(groupPushBody{
MsgID: msgID, ConversationID: g.ConversationID, SenderID: 0,
MessageType: msgentity.TypeSystem, Content: raw, CreatedAt: now.UnixMilli(),
})),
})
}
type groupPushBody struct {
MsgID int64 `json:"msg_id"`
ConversationID int64 `json:"conversation_id"`
SenderID int64 `json:"sender_id"`
MessageType msgentity.Type `json:"message_type"`
Content json.RawMessage `json:"content"`
CreatedAt int64 `json:"created_at"`
}