Add counters

This commit is contained in:
Daniel Mason 2025-05-30 13:58:28 +12:00
parent 112abcdf36
commit 04a260f96c
Signed by: idanoo
GPG key ID: 387387CDBC02F132
7 changed files with 125 additions and 5 deletions

View file

@ -0,0 +1,55 @@
package database
import "time"
// GetLastUsedPic
func (db *Database) GetCounterFor(key string) (time.Time, error) {
var id int64
var timestamp time.Time
row, err := db.db.Query("SELECT `id`, `timestamp` FROM `counter` WHERE `key` = ? LIMIT 1", key)
if err != nil {
return timestamp, err
}
defer row.Close()
for row.Next() {
row.Scan(&id, &timestamp)
}
return timestamp, nil
}
// UpdateCounterFor - Add counter
func (db *Database) UpdateCounterFor(key string, timestamp time.Time) (int64, error) {
exec, err := db.db.Exec(
"REPLACE INTO `counter` (`key`, `timestamp`) VALUES (?,?)",
key,
timestamp,
)
if err != nil {
return 0, err
}
return exec.LastInsertId()
}
// GetAllCounters
func (db *Database) GetAllCounters() (map[string]time.Time, error) {
counters := make(map[string]time.Time)
row, err := db.db.Query("SELECT id, timestamp FROM counter order by key ASC")
if err != nil {
return counters, err
}
defer row.Close()
for row.Next() {
var key string
var timestamp time.Time
row.Scan(&key, &timestamp)
counters[key] = timestamp
}
return counters, nil
}

View file

@ -46,6 +46,12 @@ func (db *Database) runMigrations() (*Database, error) {
return db, err return db, err
} }
_, err = db.db.Exec("CREATE TABLE IF NOT EXISTS `counter` " +
"(`id` INTEGER PRIMARY KEY AUTOINCREMENT, `key` TEXT, `timestamp` DATETIME)")
if err != nil {
return db, err
}
return db, nil return db, nil
} }

View file

@ -16,7 +16,7 @@ import (
const fontSize = 42 const fontSize = 42
const BIRB_PATH = "/root/data/reaction_pics" const BIRB_PATH = BASE_PATH + "/reaction_pics"
func (mtrx *MtrxClient) postBirb(ctx context.Context, evt *event.Event) { func (mtrx *MtrxClient) postBirb(ctx context.Context, evt *event.Event) {
idd, birb, err := mtrx.db.GetLastUsedPic(true) idd, birb, err := mtrx.db.GetLastUsedPic(true)

View file

@ -24,6 +24,9 @@ var COMMANDS = []string{
"☝️ react to set room topic", "☝️ react to set room topic",
"📷️ react to save picture for future lulz", "📷️ react to save picture for future lulz",
"", "",
".counter - List all counters",
".counter <key> - Get a counter for a key",
".counterreset <key> - Reset a counter for a key",
".r <?quote>- Returns a random quote (can search quotes)", ".r <?quote>- Returns a random quote (can search quotes)",
".rb <?quote> - Returns a random quote on a random bird pic (with optional search)", ".rb <?quote> - Returns a random quote on a random bird pic (with optional search)",
".remindme <time - 1w1h> <reminder> - Triggers a reminder", ".remindme <time - 1w1h> <reminder> - Triggers a reminder",
@ -123,6 +126,14 @@ func (mtrx *MtrxClient) handleCommand(ctx context.Context, evt *event.Event) {
mtrx.sendMessage(ctx, evt.RoomID, err.Error()) mtrx.sendMessage(ctx, evt.RoomID, err.Error())
} }
return return
case ".counter":
if len(args) < 2 {
mtrx.getAllCounters(ctx, evt.RoomID)
return
} else {
mtrx.getCounterFor(ctx, evt.RoomID, args[1])
return
}
case ".reloadallpics": case ".reloadallpics":
mtrx.db.DeleteAllPics() mtrx.db.DeleteAllPics()
mtrx.pics = make(map[int64]string, 0) mtrx.pics = make(map[int64]string, 0)

View file

@ -0,0 +1,47 @@
package gomatrixbot
import (
"context"
"time"
"maunium.net/go/mautrix/id"
)
func (mtrx *MtrxClient) getCounterFor(ctx context.Context, roomID id.RoomID, key string) {
counter, err := mtrx.db.GetCounterFor(key)
if err != nil {
mtrx.sendMessage(ctx, roomID, "Failed to get counter for "+key+": "+err.Error())
return
}
diff := time.Now().Sub(counter)
msg := "Days since " + key + ": " + diff.String()
mtrx.sendMessage(ctx, roomID, msg)
}
func (mtrx *MtrxClient) getAllCounters(ctx context.Context, roomID id.RoomID) {
counters, err := mtrx.db.GetAllCounters()
if err != nil {
mtrx.sendMessage(ctx, roomID, "Failed to get counters: "+err.Error())
return
}
msg := "Counters:\n"
for key, timestamp := range counters {
msg += key + ": " + timestamp.String() + "\n"
}
mtrx.sendMessage(ctx, roomID, msg)
}
func (mtrx *MtrxClient) updateCounterFor(ctx context.Context, roomID id.RoomID, key string) {
timestamp := time.Now()
_, err := mtrx.db.UpdateCounterFor(key, timestamp)
if err != nil {
mtrx.sendMessage(ctx, roomID, "Failed to update counter for "+key+": "+err.Error())
return
}
mtrx.sendMessage(ctx, roomID, "Updated counter for "+key)
}

View file

@ -14,9 +14,10 @@ import (
) )
const ( const (
OUTPUT_PATH = "/root/data/output" BASE_PATH = "/root/data"
THE_GREATS = "/root/data/the_greats" OUTPUT_PATH = BASE_PATH + "/output"
DATABASE_PATH = "/root/data/database.sql" THE_GREATS = BASE_PATH + "/the_greats"
DATABASE_PATH = BASE_PATH + "/database.sql"
) )
func (mtrx *MtrxClient) getFileContent(url string) ([]byte, error) { func (mtrx *MtrxClient) getFileContent(url string) ([]byte, error) {

View file

@ -30,7 +30,7 @@ var (
MatrixHost string MatrixHost string
MatrixUsername string MatrixUsername string
MatrixPassword string MatrixPassword string
MautrixDB = "/root/data/mautrix.db" MautrixDB = BASE_PATH + "/mautrix.db"
mtrx MtrxClient mtrx MtrxClient
) )