This commit is contained in:
+26
-26
@@ -15,54 +15,54 @@ type Change struct {
|
||||
Keys []ChangeKey `bson:"keys"`
|
||||
Date time.Time `bson:"date"`
|
||||
|
||||
Logs []Log `bson:"logs"`
|
||||
Characters []Character `bson:"characters"`
|
||||
Channels []Channel `bson:"channels"`
|
||||
Posts []Post `bson:"posts"`
|
||||
Stories []Story `bson:"stories"`
|
||||
Tags []Tag `bson:"tags"`
|
||||
Chapters []Chapter `bson:"chapters"`
|
||||
Comments []Comment `bson:"comments"`
|
||||
Logs []*Log `bson:"logs"`
|
||||
Characters []*Character `bson:"characters"`
|
||||
Channels []*Channel `bson:"channels"`
|
||||
Posts []*Post `bson:"posts"`
|
||||
Stories []*Story `bson:"stories"`
|
||||
Tags []*Tag `bson:"tags"`
|
||||
Chapters []*Chapter `bson:"chapters"`
|
||||
Comments []*Comment `bson:"comments"`
|
||||
}
|
||||
|
||||
// AddObject adds the model into the appropriate array.
|
||||
func (change *Change) AddObject(object interface{}) bool {
|
||||
if v := reflect.ValueOf(object); v.Kind() == reflect.Ptr {
|
||||
return change.AddObject(v.Elem().Interface())
|
||||
if v := reflect.ValueOf(object); v.Kind() != reflect.Ptr && v.Kind() != reflect.Slice {
|
||||
return change.AddObject(v.Addr().Interface())
|
||||
}
|
||||
|
||||
switch object := object.(type) {
|
||||
case Log:
|
||||
case *Log:
|
||||
change.Logs = append(change.Logs, object)
|
||||
case []Log:
|
||||
case []*Log:
|
||||
change.Logs = append(change.Logs, object...)
|
||||
case Character:
|
||||
case *Character:
|
||||
change.Characters = append(change.Characters, object)
|
||||
case []Character:
|
||||
case []*Character:
|
||||
change.Characters = append(change.Characters, object...)
|
||||
case Channel:
|
||||
case *Channel:
|
||||
change.Channels = append(change.Channels, object)
|
||||
case []Channel:
|
||||
case []*Channel:
|
||||
change.Channels = append(change.Channels, object...)
|
||||
case Post:
|
||||
case *Post:
|
||||
change.Posts = append(change.Posts, object)
|
||||
case []Post:
|
||||
case []*Post:
|
||||
change.Posts = append(change.Posts, object...)
|
||||
case Story:
|
||||
case *Story:
|
||||
change.Stories = append(change.Stories, object)
|
||||
case []Story:
|
||||
case []*Story:
|
||||
change.Stories = append(change.Stories, object...)
|
||||
case Tag:
|
||||
case *Tag:
|
||||
change.Tags = append(change.Tags, object)
|
||||
case []Tag:
|
||||
case []*Tag:
|
||||
change.Tags = append(change.Tags, object...)
|
||||
case Chapter:
|
||||
case *Chapter:
|
||||
change.Chapters = append(change.Chapters, object)
|
||||
case []Chapter:
|
||||
case []*Chapter:
|
||||
change.Chapters = append(change.Chapters, object...)
|
||||
case Comment:
|
||||
case *Comment:
|
||||
change.Comments = append(change.Comments, object)
|
||||
case []Comment:
|
||||
case []*Comment:
|
||||
change.Comments = append(change.Comments, object...)
|
||||
default:
|
||||
return false
|
||||
|
||||
@@ -2,7 +2,7 @@ package changekeys
|
||||
|
||||
import "git.aiterp.net/rpdata/api/models"
|
||||
|
||||
// Listed is a helper for cases like []models.ChangeKey{changekeys.All("Logs"), changekeys.One(log)}
|
||||
// Listed is a helper for cases like []models.ChangeKey{All("Log"), One(log), One(post)}
|
||||
func Listed(objects ...interface{}) []models.ChangeKey {
|
||||
keys := Many(objects)
|
||||
if len(keys) == 0 {
|
||||
|
||||
@@ -11,10 +11,16 @@ func One(object interface{}) models.ChangeKey {
|
||||
switch v := object.(type) {
|
||||
case models.Post:
|
||||
return models.ChangeKey{Model: "Post", ID: v.ID}
|
||||
case *models.Post:
|
||||
return models.ChangeKey{Model: "Post", ID: v.ID}
|
||||
case models.Character:
|
||||
return models.ChangeKey{Model: "Character", ID: v.ID}
|
||||
case *models.Character:
|
||||
return models.ChangeKey{Model: "Character", ID: v.ID}
|
||||
case models.Channel:
|
||||
return models.ChangeKey{Model: "Channel", ID: v.Name}
|
||||
case *models.Channel:
|
||||
return models.ChangeKey{Model: "Channel", ID: v.Name}
|
||||
}
|
||||
|
||||
model := ""
|
||||
|
||||
+35
-27
@@ -54,53 +54,61 @@ func Submit(model, op, author string, listed bool, keys []models.ChangeKey, obje
|
||||
for _, object := range objects {
|
||||
switch object := object.(type) {
|
||||
case models.Log:
|
||||
change.Logs = append(change.Logs, object)
|
||||
change.Logs = append(change.Logs, &object)
|
||||
case *models.Log:
|
||||
change.Logs = append(change.Logs, *object)
|
||||
change.Logs = append(change.Logs, object)
|
||||
case []models.Log:
|
||||
change.Logs = append(change.Logs, object...)
|
||||
for _, obj := range object {
|
||||
change.Logs = append(change.Logs, &obj)
|
||||
}
|
||||
case models.Character:
|
||||
change.Characters = append(change.Characters, object)
|
||||
change.Characters = append(change.Characters, &object)
|
||||
case *models.Character:
|
||||
change.Characters = append(change.Characters, *object)
|
||||
change.Characters = append(change.Characters, object)
|
||||
case []models.Character:
|
||||
change.Characters = append(change.Characters, object...)
|
||||
for _, obj := range object {
|
||||
change.Characters = append(change.Characters, &obj)
|
||||
}
|
||||
case models.Channel:
|
||||
change.Channels = append(change.Channels, object)
|
||||
change.Channels = append(change.Channels, &object)
|
||||
case *models.Channel:
|
||||
change.Channels = append(change.Channels, *object)
|
||||
change.Channels = append(change.Channels, object)
|
||||
case []models.Channel:
|
||||
change.Channels = append(change.Channels, object...)
|
||||
for _, obj := range object {
|
||||
change.Channels = append(change.Channels, &obj)
|
||||
}
|
||||
case models.Post:
|
||||
change.Posts = append(change.Posts, object)
|
||||
change.Posts = append(change.Posts, &object)
|
||||
case *models.Post:
|
||||
change.Posts = append(change.Posts, *object)
|
||||
change.Posts = append(change.Posts, object)
|
||||
case []models.Post:
|
||||
change.Posts = append(change.Posts, object...)
|
||||
for _, obj := range object {
|
||||
change.Posts = append(change.Posts, &obj)
|
||||
}
|
||||
case models.Story:
|
||||
change.Stories = append(change.Stories, object)
|
||||
change.Stories = append(change.Stories, &object)
|
||||
case *models.Story:
|
||||
change.Stories = append(change.Stories, *object)
|
||||
change.Stories = append(change.Stories, object)
|
||||
case []models.Story:
|
||||
change.Stories = append(change.Stories, object...)
|
||||
case models.Tag:
|
||||
change.Tags = append(change.Tags, object)
|
||||
case *models.Tag:
|
||||
change.Tags = append(change.Tags, *object)
|
||||
case []models.Tag:
|
||||
change.Tags = append(change.Tags, object...)
|
||||
for _, obj := range object {
|
||||
change.Stories = append(change.Stories, &obj)
|
||||
}
|
||||
case models.Chapter:
|
||||
change.Chapters = append(change.Chapters, object)
|
||||
change.Chapters = append(change.Chapters, &object)
|
||||
case *models.Chapter:
|
||||
change.Chapters = append(change.Chapters, *object)
|
||||
change.Chapters = append(change.Chapters, object)
|
||||
case []models.Chapter:
|
||||
change.Chapters = append(change.Chapters, object...)
|
||||
for _, obj := range object {
|
||||
change.Chapters = append(change.Chapters, &obj)
|
||||
}
|
||||
case models.Comment:
|
||||
change.Comments = append(change.Comments, object)
|
||||
change.Comments = append(change.Comments, &object)
|
||||
case *models.Comment:
|
||||
change.Comments = append(change.Comments, *object)
|
||||
change.Comments = append(change.Comments, object)
|
||||
case []models.Comment:
|
||||
change.Comments = append(change.Comments, object...)
|
||||
for _, obj := range object {
|
||||
change.Comments = append(change.Comments, &obj)
|
||||
}
|
||||
default:
|
||||
log.Printf("Warning: unrecognized object in change: %#+v", object)
|
||||
}
|
||||
|
||||
+18
-1
@@ -19,4 +19,21 @@ type Log struct {
|
||||
// ChangeObject in GQL.
|
||||
func (*Log) IsChangeObject() {
|
||||
panic("this method is a dummy, and so is its caller")
|
||||
}
|
||||
}
|
||||
|
||||
// A LogFilter is a filter that can be used to list logs.
|
||||
type LogFilter struct {
|
||||
Search *string
|
||||
Open *bool
|
||||
Characters []string
|
||||
Channels []string
|
||||
Events []string
|
||||
Limit int
|
||||
}
|
||||
|
||||
type LogUpdate struct {
|
||||
Title *string
|
||||
EventName *string
|
||||
Description *string
|
||||
Open *bool
|
||||
}
|
||||
|
||||
@@ -2,7 +2,6 @@ package logs
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
"time"
|
||||
|
||||
"git.aiterp.net/rpdata/api/internal/store"
|
||||
@@ -45,21 +44,5 @@ func init() {
|
||||
store.HandleInit(func(db *mgo.Database) {
|
||||
collection = db.C("logbot3.logs")
|
||||
postCollection = db.C("logbot3.posts")
|
||||
|
||||
collection.EnsureIndexKey("date")
|
||||
collection.EnsureIndexKey("channel")
|
||||
collection.EnsureIndexKey("characterIds")
|
||||
collection.EnsureIndexKey("event")
|
||||
collection.EnsureIndex(mgo.Index{
|
||||
Key: []string{"channel", "open"},
|
||||
})
|
||||
err := collection.EnsureIndex(mgo.Index{
|
||||
Key: []string{"shortId"},
|
||||
Unique: true,
|
||||
DropDups: true,
|
||||
})
|
||||
if err != nil {
|
||||
log.Fatalln("init logbot3.logs:", err)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
@@ -1,93 +0,0 @@
|
||||
package logs
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"time"
|
||||
|
||||
"git.aiterp.net/rpdata/api/internal/importers/mirclike"
|
||||
|
||||
"git.aiterp.net/rpdata/api/models/posts"
|
||||
|
||||
"git.aiterp.net/rpdata/api/models/channels"
|
||||
|
||||
"git.aiterp.net/rpdata/api/internal/importers/forumlog"
|
||||
|
||||
"git.aiterp.net/rpdata/api/models"
|
||||
)
|
||||
|
||||
// An ImportedLog contains data about an imported log.
|
||||
type ImportedLog struct {
|
||||
Log models.Log
|
||||
Posts []models.Post
|
||||
}
|
||||
|
||||
// Import makes a log and posts object from different formats.
|
||||
func Import(importer models.LogImporter, date time.Time, tz *time.Location, channelName string, data string) ([]ImportedLog, error) {
|
||||
results := make([]ImportedLog, 0, 8)
|
||||
|
||||
eventName := ""
|
||||
if channel, err := channels.FindName(channelName); err != nil {
|
||||
eventName = channel.EventName
|
||||
}
|
||||
|
||||
date = date.In(tz)
|
||||
|
||||
switch importer {
|
||||
case models.LogImporterMircLike:
|
||||
{
|
||||
if date.IsZero() {
|
||||
return nil, errors.New("Date is not optional for mirc-like logs")
|
||||
}
|
||||
|
||||
parsedLog, parsedPosts, err := mirclike.ParseLog(data, date, true)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
log, err := Add(parsedLog.Date, channelName, "", eventName, "", false)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
posts, err := posts.AddMany(log, parsedPosts)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
results = append(results, ImportedLog{
|
||||
Log: log,
|
||||
Posts: posts,
|
||||
})
|
||||
}
|
||||
case models.LogImporterForumLog:
|
||||
{
|
||||
parseResults, err := forumlog.ParseLogs(data, tz)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
for _, result := range parseResults {
|
||||
log, err := Add(result.Log.Date, channelName, "", eventName, "", false)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
posts, err := posts.AddMany(log, result.Posts)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
results = append(results, ImportedLog{
|
||||
Log: log,
|
||||
Posts: posts,
|
||||
})
|
||||
}
|
||||
}
|
||||
default:
|
||||
{
|
||||
return nil, errors.New("Invalid importer: " + importer.String())
|
||||
}
|
||||
}
|
||||
|
||||
return results, nil
|
||||
}
|
||||
+17
-1
@@ -17,4 +17,20 @@ type Post struct {
|
||||
// ChangeObject in GQL.
|
||||
func (*Post) IsChangeObject() {
|
||||
panic("this method is a dummy, and so is its caller")
|
||||
}
|
||||
}
|
||||
|
||||
// PostFilter is used to generate a query to the database.
|
||||
type PostFilter struct {
|
||||
IDs []string
|
||||
Kinds []string
|
||||
LogID *string
|
||||
Search *string
|
||||
Limit int
|
||||
}
|
||||
|
||||
type PostUpdate struct {
|
||||
Time *time.Time
|
||||
Kind *string
|
||||
Nick *string
|
||||
Text *string
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user