Compare commits

..

No commits in common. "112abcdf364be392a1dd334e26b2ff3df566b6da" and "be94d805cf40b625ad200f2e8195069e18453a7c" have entirely different histories.

4 changed files with 57 additions and 70 deletions

View file

@ -1,7 +1,7 @@
package database package database
// GetLastUsedPic // GetLastUsedPic
func (db *Database) GetLastUsedPic(increment bool) (int64, string, error) { func (db *Database) GetLastUsedPic() (int64, string, error) {
min := db.getPicMinViewCount() min := db.getPicMinViewCount()
var id int64 var id int64
var fileName string var fileName string
@ -15,10 +15,7 @@ func (db *Database) GetLastUsedPic(increment bool) (int64, string, error) {
row.Scan(&id, &fileName) row.Scan(&id, &fileName)
} }
if increment { db.incrementPicViewCount(id)
// Increment the view count
db.incrementPicViewCount(id)
}
return id, fileName, nil return id, fileName, nil
} }
@ -29,19 +26,14 @@ func (db *Database) DeleteAllPics() {
} }
// StorePic // StorePic
func (db *Database) StorePic(filename string) (int64, error) { func (db *Database) StorePic(filename string) error {
min := db.getPicMinViewCount() min := db.getPicMinViewCount()
exec, err := db.db.Exec( _, err := db.db.Exec(
"INSERT INTO `pics` (`filename`, `viewed`) VALUES (?,?)", "INSERT INTO `pics` (`filename`, `viewed`) VALUES (?,?)",
filename, filename,
min, min,
) )
return err
if err != nil {
return 0, err
}
return exec.LastInsertId()
} }
// DeletePic // DeletePic
@ -56,9 +48,9 @@ func (db *Database) ResetPics() {
} }
// GetAllPics // GetAllPics
func (db *Database) GetAllPics() (map[int64]string, error) { func (db *Database) GetAllPics() ([]string, error) {
pics := make(map[int64]string) var pics []string
row, err := db.db.Query("SELECT id, filename FROM pics") row, err := db.db.Query("SELECT filename FROM pics")
if err != nil { if err != nil {
return pics, err return pics, err
} }
@ -66,9 +58,8 @@ func (db *Database) GetAllPics() (map[int64]string, error) {
defer row.Close() defer row.Close()
for row.Next() { for row.Next() {
var pic string var pic string
var id int64 row.Scan(&pic)
row.Scan(&id, &pic) pics = append(pics, pic)
pics[id] = pic
} }
return pics, nil return pics, nil

View file

@ -19,7 +19,7 @@ const fontSize = 42
const BIRB_PATH = "/root/data/reaction_pics" const BIRB_PATH = "/root/data/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()
if err != nil { if err != nil {
mtrx.c.Log.Err(err).Msg("Failed to get birb") mtrx.c.Log.Err(err).Msg("Failed to get birb")
return 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) { func (mtrx *MtrxClient) postBirbWithText(ctx context.Context, evt *event.Event, text string, attempt int, filename string) {
increment := true idd, birb, err := mtrx.db.GetLastUsedPic()
if filename != "" {
increment = false
}
// Do a lookup
dbId, birb, err := mtrx.db.GetLastUsedPic(increment)
if err != nil { 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 return
} }
if filename != "" {
birb = filename
}
reader, err := os.Open(BIRB_PATH + "/" + birb) reader, err := os.Open(BIRB_PATH + "/" + birb)
if err != nil { if err != nil {
mtrx.sendMessage(ctx, evt.RoomID, "Failed to load image "+err.Error()+". "+birb) mtrx.sendMessage(ctx, evt.RoomID, "Failed to load image "+err.Error()+". "+birb)
if filename != "" { mtrx.db.DeletePic(idd)
for k, v := range mtrx.pics { if attempt > 3 {
if v == birb { mtrx.db.DeletePic(idd)
dbId = k return
break
}
}
} }
mtrx.db.DeletePic(dbId)
delete(mtrx.pics, dbId) // Retry
mtrx.postBirbWithText(ctx, evt, text, attempt+1, "")
return return
} }
// do the swaps // do the swaps
img, _, err := image.Decode(reader) img, _, err := image.Decode(reader)
if err != nil { 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 return
} }
// r := img.Bounds()
// w := r.Dx() // w
// h := r.Dy() // h
imgNew := resize.Resize(1024, 1024, img, resize.Lanczos2) imgNew := resize.Resize(1024, 1024, img, resize.Lanczos2)
m := gg.NewContextForImage(imgNew) m := gg.NewContextForImage(imgNew)
@ -182,31 +192,20 @@ func (mtrx *MtrxClient) UpdatePics() error {
} }
for _, file := range files { for _, file := range files {
found := false
if file.IsDir() || strings.HasPrefix(file.Name(), ".") { if file.IsDir() || strings.HasPrefix(file.Name(), ".") {
continue continue
} }
// check if in our map if contains(mtrx.pics, file.Name()) {
for _, v := range mtrx.pics {
if v == file.Name() {
found = true
break
}
}
if found {
continue continue
} }
idd, err := mtrx.db.StorePic(file.Name()) err = mtrx.db.StorePic(file.Name())
if err != nil { 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.sendMessage(context.Background(), mtrx.adminRoom, "New pic added: "+file.Name())
mtrx.pics[idd] = file.Name() mtrx.pics = append(mtrx.pics, file.Name())
} }
return nil return nil

View file

@ -125,7 +125,6 @@ func (mtrx *MtrxClient) handleCommand(ctx context.Context, evt *event.Event) {
return return
case ".reloadallpics": case ".reloadallpics":
mtrx.db.DeleteAllPics() mtrx.db.DeleteAllPics()
mtrx.pics = make(map[int64]string, 0)
mtrx.UpdatePics() mtrx.UpdatePics()
mtrx.sendMessage(ctx, evt.RoomID, "Reset all pictures") mtrx.sendMessage(ctx, evt.RoomID, "Reset all pictures")
return return
@ -163,9 +162,9 @@ func (mtrx *MtrxClient) handleCommand(ctx context.Context, evt *event.Event) {
return return
case ".rb": case ".rb":
if len(args) < 2 { if len(args) < 2 {
mtrx.postBirbWithText(ctx, evt, mtrx.getAnyRandomQuote(true), "") mtrx.postBirbWithText(ctx, evt, mtrx.getAnyRandomQuote(true), 0, "")
} else { } 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 return
case ".delquote": case ".delquote":
@ -263,19 +262,17 @@ func (mtrx *MtrxClient) handleCommand(ctx context.Context, evt *event.Event) {
filesearch := strings.ReplaceAll(args[0], ".", "") filesearch := strings.ReplaceAll(args[0], ".", "")
// lookup filename from quote, shuffle each time // lookup filename from quote, shuffle each time
matches := make(map[int64]string) tmpPics := make([]string, len(mtrx.pics))
keys := make([]int64, 0) perm := rand.Perm(len(mtrx.pics))
for k, v := range mtrx.pics { for i, v := range perm {
if strings.Contains(strings.ToLower(strings.Split(v, ".")[0]), strings.ToLower(filesearch)) { tmpPics[v] = mtrx.pics[i]
matches[k] = v
keys = append(keys, k)
}
} }
// Shuffle key for _, v := range tmpPics {
if len(matches) > 0 { if strings.Contains(strings.ToLower(strings.Split(v, ".")[0]), strings.ToLower(filesearch)) {
filename := matches[keys[rand.Intn(len(keys))]] mtrx.postBirbWithText(ctx, evt, mtrx.getAnyRandomQuoteSearch(true, strings.Join(args[1:], " ")), 0, v)
mtrx.postBirbWithText(ctx, evt, mtrx.getAnyRandomQuoteSearch(true, strings.Join(args[1:], " ")), filename) return
}
} }
} }
} }

View file

@ -44,7 +44,7 @@ type MtrxClient struct {
savedFiles map[id.EventID]string savedFiles map[id.EventID]string
events map[id.EventID]string events map[id.EventID]string
recentMessages map[id.RoomID]map[int64]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 // This is gonna be a mem leak... To fix I guess
quoteCache map[id.EventID]*Quote quoteCache map[id.EventID]*Quote
@ -64,7 +64,7 @@ func Run(db *database.Database) {
pics, err := mtrx.db.GetAllPics() pics, err := mtrx.db.GetAllPics()
if err != nil { if err != nil {
fmt.Println(err) fmt.Println(err)
mtrx.pics = make(map[int64]string, 0) mtrx.pics = make([]string, 0)
} else { } else {
mtrx.pics = pics mtrx.pics = pics
} }