X-Git-Url: https://git.giacomolli.uk/onechat/blobdiff_plain/8d9547f6e7ffa1e95ad25d9f8f2e7cfd23d992d0..80e348724041a694002fc38f57e8868b9b9a2be9:/whatsapp_groups.go?ds=sidebyside diff --git a/whatsapp_groups.go b/whatsapp_groups.go index e8111c3..5eedd5d 100644 --- a/whatsapp_groups.go +++ b/whatsapp_groups.go @@ -2,13 +2,17 @@ package main import ( "context" - "log" + "log/slog" "maps" "sync" "time" ) const ( + // whatsappGroupLookupTimeout is the longest time of a read of group + // names. + whatsappGroupLookupTimeout = 10 * time.Second + // whatsappGroupsRefresh is the shortest time between two reads of the // groups from WhatsApp for a group with no name. whatsappGroupsRefresh = time.Minute @@ -21,22 +25,13 @@ const ( whatsappGroupsAge = time.Hour ) -// newWhatsAppGroups returns the names of the groups with no names yet. logger -// gets the failures of a read. -func newWhatsAppGroups(logger *log.Logger) *WhatsAppGroups { - return &WhatsAppGroups{ - logger: logger, - names: make(map[string]string), - } -} - // WhatsAppGroups holds the names of the groups of the account, by the ID of the // group. They come from the events of the groups and from reads of the groups // from WhatsApp, and they stay in memory only. triedAt is the time of the last // read, and readAt the time of the last read that succeeded. The mutex // protects all fields after logger. type WhatsAppGroups struct { - logger *log.Logger + logger *slog.Logger mutex sync.Mutex names map[string]string @@ -44,11 +39,21 @@ type WhatsAppGroups struct { readAt time.Time } +// newWhatsAppGroups returns the names of the groups with no names yet. logger +// gets the failures of a read. +func newWhatsAppGroups(logger *slog.Logger) *WhatsAppGroups { + return &WhatsAppGroups{ + logger: logger, + names: make(map[string]string), + } +} + // name returns the name of the group id, or whatsappUnknownGroup. A group that // is not in the names reads the groups from WhatsApp with the client of link // again, at most once in whatsappGroupsRefresh. func (g *WhatsAppGroups) name(ctx context.Context, link WhatsAppLink, id string) string { g.mutex.Lock() + name, found := g.names[id] fresh := time.Since(g.triedAt) < whatsappGroupsRefresh g.mutex.Unlock() @@ -57,6 +62,7 @@ func (g *WhatsAppGroups) name(ctx context.Context, link WhatsAppLink, id string) g.read(ctx, link) g.mutex.Lock() + name, found = g.names[id] g.mutex.Unlock() } @@ -75,12 +81,12 @@ func (g *WhatsAppGroups) read(ctx context.Context, link WhatsAppLink) bool { return false } - ctx, cancel := context.WithTimeout(ctx, whatsappLookupTime) + ctx, cancel := context.WithTimeout(ctx, whatsappGroupLookupTimeout) defer cancel() groups, err := link.client.GetJoinedGroups(ctx) if err != nil { - g.logger.Printf("group names can be missing, because the list of groups did not load: %s", whatsappRedact(link.own, err.Error())) + g.logger.Warn("group list failed", "err", whatsappRedact(link.own, err.Error())) } g.mutex.Lock()