Files
bunny-bot/internal/elog/globals.go
eleksir 0c34b6e781 Global code ovehaul - remove CAS and other, add 15 minute greet check
- Remove CAS, as it no longer works for us
- Remove other checks
- Implement 15 minute greet timeout check
- Fix chat logos
- Ditch thirdparty logger, use stdlib log facility wrapper for logging
2026-10-20 12:20:16 +03:00

60 lines
2.0 KiB
Go

package elog
import (
"errors"
"sync"
"time"
)
const (
// chatLockIdleTimeout is how long a chat's lock entry may sit unused before it
// is evicted. Without it the registry grows by one entry per chat ever seen.
chatLockIdleTimeout = time.Hour
// stampLayout is the per-line timestamp. GMT+0 with millisecond precision.
stampLayout = "15:04:05.000"
// logFilePerm is the mode for a newly created chat log file.
logFilePerm = 0o644
// logDirPerm is the mode for the chat, year and month directories.
//
// It is deliberately not logFilePerm. A directory needs the execute bit to
// be traversable, and 0o644 has none, so creating the tree with the file mode
// makes every subsequent open inside it fail with EACCES rather than ENOENT
// — a failure reportFailure would swallow, leaving chat logging to silently
// produce no files at all.
//
// The two live in one block on purpose: they are a pair that must never be
// confused with each other, and keeping them adjacent is what makes confusing
// them hard. They are here, in globals.go, because that is where every
// package-level const belongs — the pair argument was weighed against rule 2
// and rule 2 won, once, on the record.
logDirPerm = 0o755
)
var (
// errNotDirectory marks a chat_logs path that exists but is a regular file.
errNotDirectory = errors.New("chat_logs path is not a directory")
// root is the configured chat-logs directory. Empty means chat logging is
// disabled and every Log* call is a no-op.
root string
// failing records that a write error has been reported and not yet cleared,
// so a persistent failure (a full disk) logs once instead of once per event.
failing bool
// stateMu guards root and failing.
stateMu sync.RWMutex
// registryMu guards locks. It is never held while a chat lock is acquired,
// or the whole logger would serialise.
registryMu sync.Mutex
// locks is the per-chat lock registry.
locks = map[int64]*chatLock{}
)
/* vim: set ft=go noet ai ts=4 sw=4 sts=4: */