You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
143 lines
3.2 KiB
143 lines
3.2 KiB
package channel
|
|
|
|
import (
|
|
"errors"
|
|
"strings"
|
|
|
|
"git.aiterp.net/rpdata/api/internal/store"
|
|
"github.com/globalsign/mgo"
|
|
"github.com/globalsign/mgo/bson"
|
|
)
|
|
|
|
var collection *mgo.Collection
|
|
|
|
// ErrInvalidName is an error for an invalid channel name
|
|
var ErrInvalidName = errors.New("Invalid channel name")
|
|
|
|
// A Channel represents information abount an IRC RP channel, and whether it should be logged
|
|
type Channel struct {
|
|
Name string `bson:"_id"`
|
|
Logged bool `bson:"logged"`
|
|
Hub bool `bson:"hub"`
|
|
Event string `bson:"event,omitempty"`
|
|
Location string `bson:"location,omitempty"`
|
|
}
|
|
|
|
// Edit edits the channel
|
|
func (channel *Channel) Edit(logged, hub *bool, event, location *string) error {
|
|
changes := bson.M{}
|
|
changed := *channel
|
|
|
|
if logged != nil && channel.Logged != *logged {
|
|
changes["logged"] = *logged
|
|
changed.Logged = *logged
|
|
}
|
|
if hub != nil && channel.Hub != *hub {
|
|
changes["hub"] = *hub
|
|
changed.Hub = *hub
|
|
}
|
|
if event != nil && channel.Event != *event {
|
|
changes["event"] = *event
|
|
changed.Event = *event
|
|
}
|
|
if location != nil && channel.Event != *location {
|
|
changes["location"] = *location
|
|
changed.Location = *location
|
|
}
|
|
|
|
if len(changes) == 0 {
|
|
return nil
|
|
}
|
|
|
|
err := collection.UpdateId(channel.Name, bson.M{"$set": changes})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
*channel = changed
|
|
|
|
return nil
|
|
}
|
|
|
|
// Remove removes the channel information from the database.
|
|
func (channel *Channel) Remove() error {
|
|
return collection.RemoveId(channel.Name)
|
|
}
|
|
|
|
// Ensure ensures a channel's existence. It does not change `logged` if there is
|
|
// an existing channel.
|
|
func Ensure(name string, logged bool) (Channel, error) {
|
|
channel, err := FindName(name)
|
|
if err == mgo.ErrNotFound {
|
|
return New(name, logged, false, "", "")
|
|
} else if err != nil {
|
|
return Channel{}, err
|
|
}
|
|
|
|
return channel, nil
|
|
}
|
|
|
|
// New creates a new channel
|
|
func New(name string, logged, hub bool, event, location string) (Channel, error) {
|
|
if len(name) < 3 && !strings.HasPrefix(name, "#") {
|
|
return Channel{}, ErrInvalidName
|
|
}
|
|
|
|
channel := Channel{
|
|
Name: name,
|
|
Logged: logged,
|
|
Hub: hub,
|
|
Event: event,
|
|
Location: location,
|
|
}
|
|
|
|
err := collection.Insert(channel)
|
|
if err != nil {
|
|
return Channel{}, err
|
|
}
|
|
|
|
return channel, nil
|
|
}
|
|
|
|
// FindName finds a channel by its id (its name).
|
|
func FindName(name string) (Channel, error) {
|
|
channel := Channel{}
|
|
err := collection.FindId(name).One(&channel)
|
|
|
|
return channel, err
|
|
}
|
|
|
|
// List finds channels, if logged is true it will be limited to logged
|
|
// channels
|
|
func List(logged bool) ([]Channel, error) {
|
|
query := bson.M{}
|
|
if logged {
|
|
query["logged"] = true
|
|
}
|
|
|
|
channels := make([]Channel, 0, 32)
|
|
err := collection.Find(query).All(&channels)
|
|
|
|
return channels, err
|
|
}
|
|
|
|
// ListNames finds channels by the names provided
|
|
func ListNames(names ...string) ([]Channel, error) {
|
|
query := bson.M{"_id": bson.M{"$in": names}}
|
|
|
|
channels := make([]Channel, 0, 32)
|
|
err := collection.Find(query).All(&channels)
|
|
|
|
return channels, err
|
|
}
|
|
|
|
func init() {
|
|
store.HandleInit(func(db *mgo.Database) {
|
|
collection = db.C("common.channels")
|
|
|
|
collection.EnsureIndexKey("logged")
|
|
collection.EnsureIndexKey("hub")
|
|
collection.EnsureIndexKey("event")
|
|
collection.EnsureIndexKey("location")
|
|
})
|
|
}
|