2012-08-17 20:38:15 +00:00
|
|
|
package bot
|
|
|
|
|
|
|
|
import irc "github.com/fluffle/goirc/client"
|
2012-08-17 21:37:49 +00:00
|
|
|
import "labix.org/v2/mgo"
|
2012-08-17 22:17:39 +00:00
|
|
|
import "bitbucket.org/phlyingpenguin/godeepintir/config"
|
2012-08-17 22:56:44 +00:00
|
|
|
import "strings"
|
2012-08-17 20:38:15 +00:00
|
|
|
|
|
|
|
// Bot type provides storage for bot-wide information, configs, and database connections
|
|
|
|
type Bot struct {
|
2012-08-17 22:09:29 +00:00
|
|
|
// Each plugin must be registered in our plugins handler. To come: a map so that this
|
|
|
|
// will allow plugins to respond to specific kinds of events
|
2012-08-26 16:15:26 +00:00
|
|
|
Plugins map[string]Handler
|
|
|
|
PluginOrdering []string
|
2012-08-17 22:09:29 +00:00
|
|
|
|
|
|
|
// Users holds information about all of our friends
|
|
|
|
Users []User
|
|
|
|
|
|
|
|
// Conn allows us to send messages and modify our connection state
|
|
|
|
Conn *irc.Conn
|
|
|
|
|
|
|
|
Config *config.Config
|
|
|
|
|
|
|
|
// Mongo connection and db allow botwide access to the database
|
2012-08-17 21:37:49 +00:00
|
|
|
DbSession *mgo.Session
|
|
|
|
Db *mgo.Database
|
2012-08-17 22:56:44 +00:00
|
|
|
|
2012-08-26 23:23:51 +00:00
|
|
|
varColl *mgo.Collection
|
|
|
|
|
2012-08-17 22:56:44 +00:00
|
|
|
Version string
|
2012-08-17 20:38:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// User type stores user history. This is a vehicle that will follow the user for the active
|
|
|
|
// session
|
|
|
|
type User struct {
|
|
|
|
// Current nickname known
|
2012-08-17 21:37:49 +00:00
|
|
|
Name string
|
2012-08-17 20:38:15 +00:00
|
|
|
|
|
|
|
// LastSeen DateTime
|
|
|
|
|
|
|
|
// Alternative nicknames seen
|
2012-08-17 21:37:49 +00:00
|
|
|
Alts []string
|
2012-08-17 20:38:15 +00:00
|
|
|
|
|
|
|
// Last N messages sent to the user
|
2012-08-17 21:37:49 +00:00
|
|
|
MessageLog []string
|
2012-08-26 23:23:51 +00:00
|
|
|
|
|
|
|
Admin bool
|
2012-08-17 20:38:15 +00:00
|
|
|
}
|
|
|
|
|
2012-08-17 22:09:29 +00:00
|
|
|
type Message struct {
|
|
|
|
User *User
|
|
|
|
Channel, Body string
|
2012-08-25 04:49:48 +00:00
|
|
|
Raw string
|
2012-08-18 01:39:26 +00:00
|
|
|
Command bool
|
2012-08-25 04:49:48 +00:00
|
|
|
Action bool
|
2012-08-17 22:09:29 +00:00
|
|
|
}
|
|
|
|
|
2012-08-26 23:23:51 +00:00
|
|
|
type Variable struct {
|
|
|
|
Variable, Value string
|
|
|
|
}
|
|
|
|
|
2012-08-17 22:56:44 +00:00
|
|
|
// NewBot creates a Bot for a given connection and set of handlers.
|
|
|
|
func NewBot(config *config.Config, c *irc.Conn) *Bot {
|
2012-08-17 21:37:49 +00:00
|
|
|
session, err := mgo.Dial(config.DbServer)
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
db := session.DB(config.DbName)
|
|
|
|
|
2012-08-17 20:38:15 +00:00
|
|
|
return &Bot{
|
2012-08-26 16:15:26 +00:00
|
|
|
Config: config,
|
|
|
|
Plugins: make(map[string]Handler),
|
|
|
|
PluginOrdering: make([]string, 0),
|
|
|
|
Users: make([]User, 0),
|
|
|
|
Conn: c,
|
|
|
|
DbSession: session,
|
|
|
|
Db: db,
|
2012-08-26 23:23:51 +00:00
|
|
|
varColl: db.C("variables"),
|
2012-08-26 16:15:26 +00:00
|
|
|
Version: config.Version,
|
2012-08-17 20:38:15 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Adds a constructed handler to the bots handlers list
|
2012-08-17 22:56:44 +00:00
|
|
|
func (b *Bot) AddHandler(name string, h Handler) {
|
|
|
|
b.Plugins[strings.ToLower(name)] = h
|
2012-08-26 16:15:26 +00:00
|
|
|
b.PluginOrdering = append(b.PluginOrdering, name)
|
2012-08-17 21:37:49 +00:00
|
|
|
}
|
2012-08-26 20:15:50 +00:00
|
|
|
|
|
|
|
// Sends message to channel
|
|
|
|
func (b *Bot) SendMessage(channel, message string) {
|
|
|
|
b.Conn.Privmsg(channel, message)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Sends action to channel
|
|
|
|
func (b *Bot) SendAction(channel, message string) {
|
|
|
|
b.Conn.Action(channel, message)
|
|
|
|
}
|