unknownnicks: Added unknown nicks model and hooked it up.

This commit is contained in:
2018-12-04 20:17:48 +01:00
parent 89a1c2366c
commit 6310cbbc1e
8 changed files with 151 additions and 6 deletions
+37 -2
View File
@@ -1,6 +1,7 @@
package logs
import (
"errors"
"strings"
"time"
@@ -8,13 +9,14 @@ import (
"git.aiterp.net/rpdata/api/models"
"git.aiterp.net/rpdata/api/models/characters"
"git.aiterp.net/rpdata/api/models/posts"
"git.aiterp.net/rpdata/api/models/unknownnicks"
"github.com/globalsign/mgo/bson"
)
var updateTask = task.New(time.Second*60, RunFullUpdate)
// UpdateCharacters updates the characters for the given log.
func UpdateCharacters(log models.Log) (models.Log, error) {
func UpdateCharacters(log models.Log, addUnknowns bool) (models.Log, error) {
posts, err := posts.List(&posts.Filter{LogID: &log.ShortID, Kind: []string{"action", "text", "chars"}, Limit: 0})
if err != nil {
return models.Log{}, err
@@ -63,6 +65,10 @@ func UpdateCharacters(log models.Log) (models.Log, error) {
characterIDs := make([]string, len(characters))
for i, char := range characters {
if char.Name == "(Hidden)" {
continue
}
characterIDs[i] = char.ID
}
@@ -73,6 +79,23 @@ func UpdateCharacters(log models.Log) (models.Log, error) {
log.CharacterIDs = characterIDs
if addUnknowns {
NickLoop:
for nick := range added {
if !added[nick] {
continue
}
for _, character := range characters {
if character.HasNick(nick) {
continue NickLoop
}
}
unknownnicks.Add(nick)
}
}
return log, nil
}
@@ -84,19 +107,31 @@ func RunFullUpdate() error {
return err
}
err = unknownnicks.BeginUpdate()
if err != nil {
return err
}
log := models.Log{}
for iter.Next(&log) {
_, err = UpdateCharacters(log)
_, err = UpdateCharacters(log, true)
if err != nil {
unknownnicks.CancelUpdate()
return err
}
}
err = iter.Err()
if err != nil {
unknownnicks.CancelUpdate()
return err
}
err = unknownnicks.CommitUpdate()
if err != nil {
return errors.New("Failed to commit unknown nicks update: " + err.Error())
}
return nil
}
+7
View File
@@ -0,0 +1,7 @@
package models
// UnknownNick represents an unknown nick name.
type UnknownNick struct {
Nick string `bson:"_id"`
Weight int `bson:"weight"`
}
+37
View File
@@ -0,0 +1,37 @@
package unknownnicks
import (
"log"
"git.aiterp.net/rpdata/api/internal/store"
"git.aiterp.net/rpdata/api/models"
"github.com/globalsign/mgo"
)
var collection *mgo.Collection
func list(query interface{}, limit int) ([]models.UnknownNick, error) {
size := 64
if limit > 0 {
size = limit
}
posts := make([]models.UnknownNick, 0, size)
err := collection.Find(query).Limit(limit).Sort("weight").All(&posts)
if err != nil {
return nil, err
}
return posts, nil
}
func init() {
store.HandleInit(func(db *mgo.Database) {
collection = db.C("logbot3.unkownnicks")
err := collection.EnsureIndexKey("weight")
if err != nil {
log.Fatalln("init logbot3.unkownnicks:", err)
}
})
}
+10
View File
@@ -0,0 +1,10 @@
package unknownnicks
import (
"git.aiterp.net/rpdata/api/models"
)
// List lists the top N unknown nicks.
func List(limit int) ([]models.UnknownNick, error) {
return list(nil, limit)
}
+1
View File
@@ -0,0 +1 @@
package unknownnicks
+55
View File
@@ -0,0 +1,55 @@
package unknownnicks
import (
"sync"
"github.com/globalsign/mgo/bson"
)
var updateMutex sync.Mutex
var updateMap map[string]int
// Add adds a nick as unknown.
func Add(nick string) {
updateMap[nick] = updateMap[nick] + 1
}
// BeginUpdate starts an add operation
func BeginUpdate() error {
updateMutex.Lock()
_, err := collection.RemoveAll(bson.M{})
if err != nil {
updateMutex.Unlock()
return err
}
if updateMap == nil {
updateMap = make(map[string]int)
}
for key := range updateMap {
delete(updateMap, key)
}
return nil
}
// CancelUpdate cancels an add operation
func CancelUpdate() {
updateMutex.Unlock()
}
// CommitUpdate commits an add operation to the database.
func CommitUpdate() error {
defer updateMutex.Unlock()
for nick, weight := range updateMap {
_, err := collection.UpsertId(nick, bson.M{"$set": bson.M{"weight": weight}})
if err != nil {
return err
}
}
return nil
}