From d29ae2d10783f448b264dc30d3482568c4872292 Mon Sep 17 00:00:00 2001 From: Alexandre Morignot <erdnaxeli@cervoi.se> Date: Wed, 19 Oct 2016 23:08:50 +0200 Subject: [PATCH] Add all events to the dispatcher --- dispatcher.go | 12 ----- dispatcher/dispatcher.go | 40 +++++++++++++++++ dispatcher/events.go | 94 ++++++++++++++++++++++++++-------------- irc/events.go | 2 +- irc/transport.go | 2 +- 5 files changed, 103 insertions(+), 47 deletions(-) diff --git a/dispatcher.go b/dispatcher.go index fbf977e..efed8b7 100644 --- a/dispatcher.go +++ b/dispatcher.go @@ -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 -} diff --git a/dispatcher/dispatcher.go b/dispatcher/dispatcher.go index 56ecdb6..37c883c 100644 --- a/dispatcher/dispatcher.go +++ b/dispatcher/dispatcher.go @@ -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 { diff --git a/dispatcher/events.go b/dispatcher/events.go index 7c2908b..6da078f 100644 --- a/dispatcher/events.go +++ b/dispatcher/events.go @@ -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 - } - - d.transports[endpoint.transport].Join(&jc.JoinEvent{ - Nick: ev.Nick + "_jc", - Channel: endpoint.channel, - }) - } + endpoints := d.findTransports(transport, ev.Nick, ev.Channel) + for _, endpoint := range endpoints { + d.transports[endpoint.transport].Join(&jc.JoinEvent{ + 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 - } - - for _, endpoint := range link.endpoints { - if endpoint.transport == transport && endpoint.channel == ev.Channel { - continue - } - - d.transports[endpoint.transport].Message(&jc.MessageEvent{ - Nick: ev.Nick + "_jc", - Channel: endpoint.channel, - Text: ev.Text, - }) - } + 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, + }) + } +} + +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, + }) + } +} + +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, + }) } } diff --git a/irc/events.go b/irc/events.go index b1f916b..5d31aa9 100644 --- a/irc/events.go +++ b/irc/events.go @@ -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 } diff --git a/irc/transport.go b/irc/transport.go index e44a834..8efde31 100644 --- a/irc/transport.go +++ b/irc/transport.go @@ -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 } -- GitLab