Fix the synchronisation issues…
parent
fa40fe1ef4
commit
7a8c07445e
|
@ -2,7 +2,6 @@ package bot
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"log"
|
"log"
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/arachnist/gorepost/irc"
|
"github.com/arachnist/gorepost/irc"
|
||||||
)
|
)
|
||||||
|
@ -17,14 +16,16 @@ func RemoveCallback(command string) {
|
||||||
delete(Callbacks, command)
|
delete(Callbacks, command)
|
||||||
}
|
}
|
||||||
|
|
||||||
func Dispatcher(output *chan irc.Message, input *chan irc.Message) {
|
func Dispatcher(quit chan struct{}, output chan irc.Message, input chan irc.Message) {
|
||||||
// FIXME
|
|
||||||
time.Sleep(time.Second * 2)
|
|
||||||
log.Println("spawned Dispatcher")
|
log.Println("spawned Dispatcher")
|
||||||
for {
|
for {
|
||||||
msg := <-*input
|
select {
|
||||||
if Callbacks[msg.Command] != nil {
|
case msg := <-input:
|
||||||
go Callbacks[msg.Command](*output, msg)
|
if Callbacks[msg.Command] != nil {
|
||||||
|
go Callbacks[msg.Command](output, msg)
|
||||||
|
}
|
||||||
|
case <-quit:
|
||||||
|
log.Println("closing Dispatcher")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,8 +11,9 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
config, err := config.ReadConfig(os.Args[1])
|
|
||||||
var exit chan struct{}
|
var exit chan struct{}
|
||||||
|
|
||||||
|
config, err := config.ReadConfig(os.Args[1])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println("Error reading configuration from", os.Args[1], "error:", err.Error())
|
fmt.Println("Error reading configuration from", os.Args[1], "error:", err.Error())
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
|
@ -28,10 +29,7 @@ func main() {
|
||||||
connections := make([]irc.Connection, len(config.Networks))
|
connections := make([]irc.Connection, len(config.Networks))
|
||||||
for i, _ := range connections {
|
for i, _ := range connections {
|
||||||
network := config.Networks[i]
|
network := config.Networks[i]
|
||||||
connections[i].L.Lock()
|
connections[i].Setup(bot.Dispatcher, network, config.Servers[network], config.Nick, config.User, config.RealName)
|
||||||
connections[i].Setup(network, config.Servers[network], config.Nick, config.User, config.RealName)
|
|
||||||
connections[i].L.Unlock()
|
|
||||||
go bot.Dispatcher(&connections[i].Input, &connections[i].Output)
|
|
||||||
}
|
}
|
||||||
<-exit
|
<-exit
|
||||||
}
|
}
|
||||||
|
|
34
irc/irc.go
34
irc/irc.go
|
@ -13,20 +13,22 @@ const delim byte = '\n'
|
||||||
const endline string = "\r\n"
|
const endline string = "\r\n"
|
||||||
|
|
||||||
type Connection struct {
|
type Connection struct {
|
||||||
Network string
|
Network string
|
||||||
Nick string
|
Nick string
|
||||||
User string
|
User string
|
||||||
RealName string
|
RealName string
|
||||||
Input chan Message
|
Input chan Message
|
||||||
Output chan Message
|
Output chan Message
|
||||||
reader *bufio.Reader
|
reader *bufio.Reader
|
||||||
writer *bufio.Writer
|
writer *bufio.Writer
|
||||||
conn net.Conn
|
dispatcher func(chan struct{}, chan Message, chan Message)
|
||||||
reconnect chan struct{}
|
conn net.Conn
|
||||||
Quit chan struct{}
|
reconnect chan struct{}
|
||||||
quitsend chan struct{}
|
Quit chan struct{}
|
||||||
quitrecv chan struct{}
|
quitsend chan struct{}
|
||||||
l sync.Mutex
|
quitrecv chan struct{}
|
||||||
|
quitdispatcher chan struct{}
|
||||||
|
l sync.Mutex
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Connection) Sender() {
|
func (c *Connection) Sender() {
|
||||||
|
@ -112,6 +114,7 @@ func (c *Connection) Keeper(servers []string) {
|
||||||
|
|
||||||
go c.Sender()
|
go c.Sender()
|
||||||
go c.Receiver()
|
go c.Receiver()
|
||||||
|
go c.dispatcher(c.quitdispatcher, c.Input, c.Output)
|
||||||
|
|
||||||
log.Println(c.Network, "Initializing IRC connection")
|
log.Println(c.Network, "Initializing IRC connection")
|
||||||
c.Input <- Message{
|
c.Input <- Message{
|
||||||
|
@ -127,7 +130,7 @@ func (c *Connection) Keeper(servers []string) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Connection) Setup(network string, servers []string, nick string, user string, realname string) {
|
func (c *Connection) Setup(dispatcher func(chan struct{}, chan Message, chan Message), network string, servers []string, nick string, user string, realname string) {
|
||||||
rand.Seed(time.Now().UnixNano())
|
rand.Seed(time.Now().UnixNano())
|
||||||
|
|
||||||
c.reconnect = make(chan struct{}, 1)
|
c.reconnect = make(chan struct{}, 1)
|
||||||
|
@ -136,6 +139,7 @@ func (c *Connection) Setup(network string, servers []string, nick string, user s
|
||||||
c.User = user
|
c.User = user
|
||||||
c.RealName = realname
|
c.RealName = realname
|
||||||
c.Network = network
|
c.Network = network
|
||||||
|
c.dispatcher = dispatcher
|
||||||
|
|
||||||
c.reconnect <- struct{}{}
|
c.reconnect <- struct{}{}
|
||||||
go c.Keeper(servers)
|
go c.Keeper(servers)
|
||||||
|
|
Loading…
Reference in New Issue