diff --git a/ergonomadic.go b/ergonomadic.go index e4633b6e..e04f9e8a 100644 --- a/ergonomadic.go +++ b/ergonomadic.go @@ -33,10 +33,10 @@ func initDB(config *irc.Config) { _, err = db.Exec(` CREATE TABLE channel ( name TEXT NOT NULL UNIQUE, - flags TEXT, - key TEXT, - topic TEXT, - user_limit INTEGER)`) + flags TEXT NOT NULL, + key TEXT NOT NULL, + topic TEXT NOT NULL, + user_limit INTEGER DEFAULT 0)`) if err != nil { log.Fatal(err) } diff --git a/irc/channel.go b/irc/channel.go index 69e39077..26f8909e 100644 --- a/irc/channel.go +++ b/irc/channel.go @@ -35,7 +35,6 @@ func NewChannel(s *Server, name string) *Channel { } s.channels[name] = channel - s.db.Exec(`INSERT INTO channel (name) VALUES (?)`, channel.name) return channel } @@ -203,15 +202,13 @@ func (channel *Channel) SetTopic(client *Client, topic string) { } channel.topic = topic - channel.server.db.Exec(` - UPDATE channel - SET topic = ? - WHERE name = ?`, channel.topic, channel.name) reply := RplTopicMsg(client, channel) for member := range channel.members { member.Reply(reply) } + + channel.Persist() } func (channel *Channel) CanSpeak(client *Client) bool { @@ -371,10 +368,19 @@ func (channel *Channel) Mode(client *Client, changes ChannelModeChanges) { member.Reply(reply) } + channel.Persist() + } +} + +func (channel *Channel) Persist() { + if channel.flags[Persistent] { channel.server.db.Exec(` - UPDATE channel - SET flags = ? - WHERE name = ?`, channel.flags.String(), channel.name) + INSERT OR REPLACE INTO channel + (name, flags, key, topic) + VALUES (?, ?, ?, ?)`, + channel.name, channel.flags.String(), channel.key, channel.topic) + } else { + channel.server.db.Exec(`DELETE FROM channel WHERE name = ?`, channel.name) } } diff --git a/irc/server.go b/irc/server.go index 00a8ff94..7ac9367d 100644 --- a/irc/server.go +++ b/irc/server.go @@ -59,7 +59,17 @@ func NewServer(config *Config) *Server { signal.Notify(server.signals, os.Interrupt, os.Kill) - rows, err := db.Query(` + server.loadChannels() + + for _, listenerConf := range config.Listeners { + go server.listen(listenerConf) + } + + return server +} + +func (server *Server) loadChannels() { + rows, err := server.db.Query(` SELECT name, flags, key, topic, user_limit FROM channel`) if err != nil { @@ -75,19 +85,13 @@ func NewServer(config *Config) *Server { } channel := NewChannel(server, name) - for flag := range flags { + for _, flag := range flags { channel.flags[ChannelMode(flag)] = true } channel.key = key channel.topic = topic channel.userLimit = userLimit } - - for _, listenerConf := range config.Listeners { - go server.listen(listenerConf) - } - - return server } func (server *Server) processCommand(cmd Command) { diff --git a/irc/types.go b/irc/types.go index 8e25f2f6..d8d9f9f8 100644 --- a/irc/types.go +++ b/irc/types.go @@ -107,6 +107,9 @@ func (clients ClientNameMap) Remove(client *Client) error { type ChannelModeSet map[ChannelMode]bool func (set ChannelModeSet) String() string { + if len(set) == 0 { + return "" + } strs := make([]string, len(set)) index := 0 for mode := range set {