"encoding/hex"
"errors"
"fmt"
+ "log/slog"
"slices"
"strings"
"time"
// during the send gives an answer that the result is unknown, and not a second
// send. A disconnected WhatsApp sends nothing and makes no record. link gives
// the device, the client, and the own IDs, groups the names of the groups, and
-// state the send records. The clock gives the times of the records and the time
-// zone of the answer. Image names are checked before the record is written, and
-// uploads start only after the record is durable. Text-only records keep their
-// text digest.
-func whatsappSend(ctx context.Context, link WhatsAppLink, groups *WhatsAppGroups, state *WhatsAppState, images *ImageStore, clock func() time.Time, id, chat, text, image string) (string, error) {
+// state the send records, and logger gets one line for each send. The clock
+// gives the times of the records and the time zone of the answer. Image names
+// are checked before the record is written, and uploads start only after the
+// record is durable. Text-only records keep their text digest.
+func whatsappSend(ctx context.Context, link WhatsAppLink, groups *WhatsAppGroups, state *WhatsAppState, images *ImageStore, logger *slog.Logger, clock func() time.Time, id, chat, text, image string) (string, error) {
if !link.linked {
return whatsappNotLinked, nil
}
if err != nil {
record.State = whatsappFailed
record.Answer = "The send failed: " + whatsappRedact(link.own, err.Error()) + "."
+ logger.Warn("message send failed", "chat", whatsappChatHash(jid), "image", image != "", "err", whatsappRedact(append(slices.Clone(link.own), jid.User), err.Error()))
} else {
+ logger.Info("message sent", "chat", whatsappChatHash(jid), "image", image != "")
+
name := groups.name(ctx, link, jid.String())
if jid.Server != types.GroupServer {
name = whatsappContactName(ctx, link.device, jid, "")