Skip to content
Extraits de code Groupes Projets
Valider d29ae2d1 rédigé par Alexandre Morignot's avatar Alexandre Morignot
Parcourir les fichiers

Add all events to the dispatcher

parent 86b1983d
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
......@@ -3,15 +3,3 @@ package jc
type Dispatcher interface {
Run()
}
type Links []Link
type Link struct {
endpoints []Endpoint
filters []string
}
type Endpoint struct {
Channel string
Transport string
}
......@@ -79,6 +79,14 @@ func (d *Dispatcher) Run() {
d.join(name, ev)
case *jc.MessageEvent:
d.message(name, ev)
case *jc.NickEvent:
d.nick(name, ev)
case *jc.PrivMessageEvent:
d.privMessage(name, ev)
case *jc.PartEvent:
d.part(name, ev)
case *jc.QuitEvent:
d.quit(name, ev)
}
}
}
......@@ -115,6 +123,38 @@ func (d *Dispatcher) findLink(transport string, channels ...string) []Link {
return links
}
func (d *Dispatcher) findTransports(transport string, nick string, channels ...string) []Endpoint {
var endpoints []Endpoint
var links []Link
var channel string
if len(channels) == 0 {
channel = ""
links = d.findLink(transport)
} else {
channel = channels[0]
links = d.findLink(transport, channel)
}
for _, link := range links {
if isFiltered(link.filters, nick) {
continue
}
for _, endpoint := range link.endpoints {
if channel == "" && endpoint.transport == transport {
continue
} else if channel != "" && endpoint.transport == transport && endpoint.channel == channel {
continue
}
endpoints = append(endpoints, endpoint)
}
}
return endpoints
}
func isFiltered(filters []string, nick string) bool {
for _, v := range filters {
if v == nick {
......
......@@ -9,44 +9,72 @@ import (
func (d *Dispatcher) join(transport string, ev *jc.JoinEvent) {
log.Printf("Receive JoinEvent from %s: %s on %s", transport, ev.Nick, ev.Channel)
links := d.findLink(transport, ev.Channel)
for _, link := range links {
if isFiltered(link.filters, ev.Nick) {
continue
}
for _, endpoint := range link.endpoints {
if endpoint.transport == transport && endpoint.channel == ev.Channel {
continue
}
endpoints := d.findTransports(transport, ev.Nick, ev.Channel)
for _, endpoint := range endpoints {
d.transports[endpoint.transport].Join(&jc.JoinEvent{
Nick: ev.Nick + "_jc",
Nick: ev.Nick,
Channel: endpoint.channel,
})
}
}
}
func (d *Dispatcher) message(transport string, ev *jc.MessageEvent) {
log.Printf("Receive MessageEvent from %s: %s on %s", transport, ev.Nick, ev.Channel)
links := d.findLink(transport, ev.Channel)
for _, link := range links {
if isFiltered(link.filters, ev.Nick) {
continue
endpoints := d.findTransports(transport, ev.Nick, ev.Channel)
for _, endpoint := range endpoints {
d.transports[endpoint.transport].Message(&jc.MessageEvent{
Nick: ev.Nick,
Channel: endpoint.channel,
Text: ev.Text,
})
}
}
for _, endpoint := range link.endpoints {
if endpoint.transport == transport && endpoint.channel == ev.Channel {
continue
func (d *Dispatcher) nick(transport string, ev *jc.NickEvent) {
log.Printf("Receive NickEvent from %s : %s to %s", transport, ev.OldNick, ev.NewNick)
endpoints := d.findTransports(transport, ev.OldNick)
for _, endpoint := range endpoints {
d.transports[endpoint.transport].Nick(&jc.NickEvent{
OldNick: ev.OldNick,
NewNick: ev.NewNick,
})
}
}
d.transports[endpoint.transport].Message(&jc.MessageEvent{
Nick: ev.Nick + "_jc",
func (d *Dispatcher) privMessage(transport string, ev *jc.PrivMessageEvent) {
log.Printf("Receive PrivMessageEvent from %s: %s on %s", transport, ev.Nick, ev.Channel)
endpoints := d.findTransports(transport, ev.Nick, ev.Channel)
for _, endpoint := range endpoints {
d.transports[endpoint.transport].PrivMessage(&jc.PrivMessageEvent{
Nick: ev.Nick,
Channel: endpoint.channel,
Text: ev.Text,
})
}
}
func (d *Dispatcher) part(transport string, ev *jc.PartEvent) {
log.Printf("Receive PartEvent from %s: %s on %s", transport, ev.Nick, ev.Channel)
endpoints := d.findTransports(transport, ev.Nick, ev.Channel)
for _, endpoint := range endpoints {
d.transports[endpoint.transport].Part(&jc.PartEvent{
Nick: ev.Nick,
Channel: endpoint.channel,
})
}
}
func (d *Dispatcher) quit(transport string, ev *jc.QuitEvent) {
log.Printf("Receive QuitEvent from %s: %s", transport, ev.Nick)
endpoints := d.findTransports(transport, ev.Nick)
for _, endpoint := range endpoints {
d.transports[endpoint.transport].Quit(&jc.QuitEvent{
Nick: ev.Nick,
})
}
}
......@@ -42,7 +42,7 @@ func (t *Transport) connected(client *irc.Conn, line *irc.Line) {
func (t *Transport) disconnected(client *irc.Conn, line *irc.Line) {
if t.client != client {
// all should already have been cleaned
log.Print("%s got disconnected", client.Me().Nick)
log.Printf("%s got disconnected", client.Me().Nick)
return
}
......
......@@ -118,7 +118,7 @@ func (t *Transport) newNick(nick string) string {
delete(t.realNicks, nick)
}
newNick := nick + "_"
newNick := nick + "^"
t.realNicks[newNick] = realNick
return newNick
}
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Veuillez vous inscrire ou vous pour commenter