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