53 lines
1.5 KiB
Go
53 lines
1.5 KiB
Go
package message
|
|
|
|
import (
|
|
"database/sql"
|
|
|
|
"git.asio.asia/nixevol/NixMsg/internal/protocol"
|
|
)
|
|
|
|
// dispatchMinimalTx 是 M1 最小分发:单聊插一条 pending;群按当前成员去掉发送者各插 pending;
|
|
// 消息改为 dispatched。完整 7.4 规则见 DEVIATIONS「消息 M」。
|
|
func dispatchMinimalTx(tx *sql.Tx, seq int64, senderID, destKind, destID string, sendAt int64, keep int, nowMs int64) (string, error) {
|
|
recipients := make([]string, 0, 8)
|
|
switch destKind {
|
|
case protocol.TargetEndpoint:
|
|
recipients = append(recipients, destID)
|
|
case protocol.TargetGroup:
|
|
rows, err := tx.Query(`
|
|
SELECT endpoint_id FROM group_members WHERE group_id = ? AND endpoint_id != ?`, destID, senderID)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
defer func() { _ = rows.Close() }()
|
|
for rows.Next() {
|
|
var id string
|
|
if err := rows.Scan(&id); err != nil {
|
|
return "", err
|
|
}
|
|
recipients = append(recipients, id)
|
|
}
|
|
if err := rows.Err(); err != nil {
|
|
return "", err
|
|
}
|
|
default:
|
|
return "", errCode(protocol.CodeBadRequest, "invalid dest_kind")
|
|
}
|
|
|
|
for _, ep := range recipients {
|
|
if _, err := tx.Exec(`
|
|
INSERT INTO deliveries(seq, endpoint_id, send_at, keep, state, reason, expire_at, pushed_conn, pushed_at, attempts, updated_at)
|
|
VALUES(?,?,?,?,?,?,NULL,NULL,NULL,0,?)`,
|
|
seq, ep, sendAt, keep, DeliveryPending, "", nowMs,
|
|
); err != nil {
|
|
return "", err
|
|
}
|
|
}
|
|
|
|
state := StateDispatched
|
|
if _, err := tx.Exec(`UPDATE messages SET state = ? WHERE seq = ?`, state, seq); err != nil {
|
|
return "", err
|
|
}
|
|
return state, nil
|
|
}
|