diff --git a/src/internal/database/pics.go b/src/internal/database/pics.go index 355e0a6..466b43e 100644 --- a/src/internal/database/pics.go +++ b/src/internal/database/pics.go @@ -1,7 +1,7 @@ package database // GetLastUsedPic -func (db *Database) GetLastUsedPic(increment bool) (int64, string, error) { +func (db *Database) GetLastUsedPic() (int64, string, error) { min := db.getPicMinViewCount() var id int64 var fileName string @@ -15,10 +15,7 @@ func (db *Database) GetLastUsedPic(increment bool) (int64, string, error) { row.Scan(&id, &fileName) } - if increment { - // Increment the view count - db.incrementPicViewCount(id) - } + db.incrementPicViewCount(id) return id, fileName, nil } @@ -29,19 +26,14 @@ func (db *Database) DeleteAllPics() { } // StorePic -func (db *Database) StorePic(filename string) (int64, error) { +func (db *Database) StorePic(filename string) error { min := db.getPicMinViewCount() - exec, err := db.db.Exec( + _, err := db.db.Exec( "INSERT INTO `pics` (`filename`, `viewed`) VALUES (?,?)", filename, min, ) - - if err != nil { - return 0, err - } - - return exec.LastInsertId() + return err } // DeletePic @@ -56,9 +48,9 @@ func (db *Database) ResetPics() { } // GetAllPics -func (db *Database) GetAllPics() (map[int64]string, error) { - pics := make(map[int64]string) - row, err := db.db.Query("SELECT id, filename FROM pics") +func (db *Database) GetAllPics() ([]string, error) { + var pics []string + row, err := db.db.Query("SELECT filename FROM pics") if err != nil { return pics, err } @@ -66,9 +58,8 @@ func (db *Database) GetAllPics() (map[int64]string, error) { defer row.Close() for row.Next() { var pic string - var id int64 - row.Scan(&id, &pic) - pics[id] = pic + row.Scan(&pic) + pics = append(pics, pic) } return pics, nil diff --git a/src/internal/gomatrixbot/birds.go b/src/internal/gomatrixbot/birds.go index 14fec59..86d7783 100644 --- a/src/internal/gomatrixbot/birds.go +++ b/src/internal/gomatrixbot/birds.go @@ -19,7 +19,7 @@ const fontSize = 42 const BIRB_PATH = "/root/data/reaction_pics" func (mtrx *MtrxClient) postBirb(ctx context.Context, evt *event.Event) { - idd, birb, err := mtrx.db.GetLastUsedPic(true) + idd, birb, err := mtrx.db.GetLastUsedPic() if err != nil { mtrx.c.Log.Err(err).Msg("Failed to get birb") return @@ -58,41 +58,51 @@ func (mtrx *MtrxClient) postBirb(ctx context.Context, evt *event.Event) { }) } -func (mtrx *MtrxClient) postBirbWithText(ctx context.Context, evt *event.Event, text string, filename string) { - increment := true - if filename != "" { - increment = false - } - - // Do a lookup - dbId, birb, err := mtrx.db.GetLastUsedPic(increment) +func (mtrx *MtrxClient) postBirbWithText(ctx context.Context, evt *event.Event, text string, attempt int, filename string) { + idd, birb, err := mtrx.db.GetLastUsedPic() if err != nil { - mtrx.sendMessage(ctx, evt.RoomID, "Failed to get an image "+err.Error()+". "+birb) + mtrx.c.Log.Err(err).Msg("Failed to get birb") return } + + if filename != "" { + birb = filename + } + reader, err := os.Open(BIRB_PATH + "/" + birb) if err != nil { mtrx.sendMessage(ctx, evt.RoomID, "Failed to load image "+err.Error()+". "+birb) - if filename != "" { - for k, v := range mtrx.pics { - if v == birb { - dbId = k - break - } - } + mtrx.db.DeletePic(idd) + if attempt > 3 { + mtrx.db.DeletePic(idd) + return } - mtrx.db.DeletePic(dbId) - delete(mtrx.pics, dbId) + + // Retry + mtrx.postBirbWithText(ctx, evt, text, attempt+1, "") return } // do the swaps img, _, err := image.Decode(reader) if err != nil { - mtrx.sendMessage(ctx, evt.RoomID, "I can't read this image. I give up. "+err.Error()+". "+birb) + mtrx.db.DeletePic(idd) + if attempt > 3 { + mtrx.db.DeletePic(idd) + mtrx.sendMessage(ctx, evt.RoomID, "I can't read this image. I give up. "+err.Error()+". "+birb) + return + } + + // Retry + mtrx.postBirbWithText(ctx, evt, text, attempt+1, "") return + } + // r := img.Bounds() + // w := r.Dx() // w + // h := r.Dy() // h + imgNew := resize.Resize(1024, 1024, img, resize.Lanczos2) m := gg.NewContextForImage(imgNew) @@ -182,31 +192,20 @@ func (mtrx *MtrxClient) UpdatePics() error { } for _, file := range files { - found := false - if file.IsDir() || strings.HasPrefix(file.Name(), ".") { continue } - // check if in our map - for _, v := range mtrx.pics { - if v == file.Name() { - found = true - break - } - } - - if found { + if contains(mtrx.pics, file.Name()) { continue } - idd, err := mtrx.db.StorePic(file.Name()) + err = mtrx.db.StorePic(file.Name()) if err != nil { - return err + mtrx.c.Log.Err(err).Msg("Failed to store pic") } - mtrx.sendMessage(context.Background(), mtrx.adminRoom, "New pic added: "+file.Name()) - mtrx.pics[idd] = file.Name() + mtrx.pics = append(mtrx.pics, file.Name()) } return nil diff --git a/src/internal/gomatrixbot/commands.go b/src/internal/gomatrixbot/commands.go index 7b4dcca..081cc09 100644 --- a/src/internal/gomatrixbot/commands.go +++ b/src/internal/gomatrixbot/commands.go @@ -125,7 +125,6 @@ func (mtrx *MtrxClient) handleCommand(ctx context.Context, evt *event.Event) { return case ".reloadallpics": mtrx.db.DeleteAllPics() - mtrx.pics = make(map[int64]string, 0) mtrx.UpdatePics() mtrx.sendMessage(ctx, evt.RoomID, "Reset all pictures") return @@ -163,9 +162,9 @@ func (mtrx *MtrxClient) handleCommand(ctx context.Context, evt *event.Event) { return case ".rb": if len(args) < 2 { - mtrx.postBirbWithText(ctx, evt, mtrx.getAnyRandomQuote(true), "") + mtrx.postBirbWithText(ctx, evt, mtrx.getAnyRandomQuote(true), 0, "") } else { - mtrx.postBirbWithText(ctx, evt, mtrx.getAnyRandomQuoteSearch(true, strings.Join(args[1:], " ")), "") + mtrx.postBirbWithText(ctx, evt, mtrx.getAnyRandomQuoteSearch(true, strings.Join(args[1:], " ")), 0, "") } return case ".delquote": @@ -263,19 +262,17 @@ func (mtrx *MtrxClient) handleCommand(ctx context.Context, evt *event.Event) { filesearch := strings.ReplaceAll(args[0], ".", "") // lookup filename from quote, shuffle each time - matches := make(map[int64]string) - keys := make([]int64, 0) - for k, v := range mtrx.pics { - if strings.Contains(strings.ToLower(strings.Split(v, ".")[0]), strings.ToLower(filesearch)) { - matches[k] = v - keys = append(keys, k) - } + tmpPics := make([]string, len(mtrx.pics)) + perm := rand.Perm(len(mtrx.pics)) + for i, v := range perm { + tmpPics[v] = mtrx.pics[i] } - // Shuffle key - if len(matches) > 0 { - filename := matches[keys[rand.Intn(len(keys))]] - mtrx.postBirbWithText(ctx, evt, mtrx.getAnyRandomQuoteSearch(true, strings.Join(args[1:], " ")), filename) + for _, v := range tmpPics { + if strings.Contains(strings.ToLower(strings.Split(v, ".")[0]), strings.ToLower(filesearch)) { + mtrx.postBirbWithText(ctx, evt, mtrx.getAnyRandomQuoteSearch(true, strings.Join(args[1:], " ")), 0, v) + return + } } } } diff --git a/src/internal/gomatrixbot/matrix.go b/src/internal/gomatrixbot/matrix.go index 0dc21a9..f34f406 100644 --- a/src/internal/gomatrixbot/matrix.go +++ b/src/internal/gomatrixbot/matrix.go @@ -44,7 +44,7 @@ type MtrxClient struct { savedFiles map[id.EventID]string events map[id.EventID]string recentMessages map[id.RoomID]map[int64]string - pics map[int64]string + pics []string // This is gonna be a mem leak... To fix I guess quoteCache map[id.EventID]*Quote @@ -64,7 +64,7 @@ func Run(db *database.Database) { pics, err := mtrx.db.GetAllPics() if err != nil { fmt.Println(err) - mtrx.pics = make(map[int64]string, 0) + mtrx.pics = make([]string, 0) } else { mtrx.pics = pics }