natsim

NATS ↔ Instant Messaging Bridge
git clone https://git.instinctive.eu/natsim.git
Log | Files | Refs | README | LICENSE

commit c53eb509bbef333627ffd64bd7da717ee953ba5d
parent e949a12df2d45237d9374bcf1c3c905c2437022c
Author: Natasha Kerensikova <natgh@instinctive.eu>
Date:   Sat,  5 Jul 2025 18:58:49 +0000

Stats are included in the status command output
Diffstat:
Mgo.mod | 2+-
Mmain.go | 21++++++++++++++++++++-
2 files changed, 21 insertions(+), 2 deletions(-)

diff --git a/go.mod b/go.mod @@ -5,6 +5,7 @@ go 1.23.0 toolchain go1.23.9 require ( + github.com/dustin/go-humanize v1.0.1 github.com/glebarez/go-sqlite v1.22.0 github.com/nats-io/nats.go v1.42.0 github.com/pelletier/go-toml/v2 v2.2.4 @@ -12,7 +13,6 @@ require ( ) require ( - github.com/dustin/go-humanize v1.0.1 // indirect github.com/google/uuid v1.5.0 // indirect github.com/klauspost/compress v1.18.0 // indirect github.com/mattn/go-isatty v0.0.20 // indirect diff --git a/main.go b/main.go @@ -30,6 +30,7 @@ import ( "sync/atomic" "time" + "github.com/dustin/go-humanize" _ "github.com/glebarez/go-sqlite" "github.com/nats-io/nats.go" "github.com/pelletier/go-toml/v2" @@ -328,7 +329,7 @@ func (natsim *NatsIM) doCommands() { buf.WriteString(rtt.String()) } - buf.WriteString(fmt.Sprintf(", %d subscriptions", natsim.nc.NumSubscriptions())) + buf.WriteString(fmt.Sprintf(", %d subscriptions\n%s", natsim.nc.NumSubscriptions(), natsim.natsStats())) natsim.ircSend(buf.String()) case "subscribe": @@ -623,6 +624,16 @@ func (natsim *NatsIM) natsReconnectErr(c *nats.Conn, err error) { natsim.ircSendError("Reconnect", err) } +func (natsim *NatsIM) natsStats() string { + stats := natsim.nc.Stats() + return fmt.Sprintf("%d reconnections, %s / %s msg in, %s / %s msg out", + stats.Reconnects, + humanize.IBytes(stats.InBytes), + humanizeNum(stats.InMsgs), + humanize.IBytes(stats.OutBytes), + humanizeNum(stats.OutMsgs)) +} + /**************** Log to Database ****************/ //go:embed init.sql @@ -868,6 +879,14 @@ func (af *antiflood) UnmarshalText(text []byte) error { return nil } +func humanizeNum(n uint64) string { + num, unit, found := strings.Cut(humanize.Bytes(n), " ") + if !found || unit == "" || unit[len(unit)-1:] != "B" { + panic("Unexpected huamized result") + } + return num + unit[:len(unit)-1] +} + func packMark(mark LineMark, name, arg string) string { return mark.Start + name + mark.Mid + arg + mark.End }