@ -1,9 +1,15 @@ |
|||
package main |
|||
|
|||
import "log" |
|||
import ( |
|||
"log" |
|||
"runtime" |
|||
) |
|||
|
|||
func check(err error) { |
|||
if err != nil { |
|||
_, fn, line, _ := runtime.Caller(1) |
|||
log.Println(line) |
|||
log.Println(fn) |
|||
log.Println(err) |
|||
} |
|||
} |
@ -0,0 +1,62 @@ |
|||
package main |
|||
|
|||
import ( |
|||
"encoding/json" |
|||
"fmt" |
|||
"log" |
|||
"net" |
|||
"time" |
|||
|
|||
"github.com/fatih/color" |
|||
) |
|||
|
|||
type Msg struct { |
|||
Type string `json:"type"` |
|||
Date time.Time `json:"date"` |
|||
Content string `json:"content"` |
|||
PeersList PeersList `json:"peerslist"` |
|||
} |
|||
|
|||
func messageHandler(conn net.Conn, msg Msg) { |
|||
|
|||
log.Println("[New msg]") |
|||
log.Println(msg) |
|||
|
|||
switch msg.Type { |
|||
case "Hi": |
|||
color.Yellow(msg.Type) |
|||
color.Green(msg.Content) |
|||
break |
|||
case "PeersList": |
|||
color.Blue("newPeerslist") |
|||
fmt.Println(msg.PeersList) |
|||
|
|||
time.Sleep(1000 * time.Millisecond) |
|||
updatePeersList(conn, msg.PeersList) |
|||
propagatePeersList() |
|||
printPeersList() |
|||
default: |
|||
log.Println("Msg.Type not supported") |
|||
break |
|||
} |
|||
|
|||
} |
|||
func (msg Msg) construct(msgtype string, msgcontent string, peersList PeersList) Msg { |
|||
msg.Type = msgtype |
|||
msg.Content = msgcontent |
|||
msg.PeersList = peersList |
|||
msg.Date = time.Now() |
|||
return msg |
|||
} |
|||
func (msg Msg) toBytes() []byte { |
|||
msgS, err := json.Marshal(msg) |
|||
check(err) |
|||
l := string(msgS) + "\n" |
|||
r := []byte(l) |
|||
return r |
|||
} |
|||
func (msg Msg) createFromBytes(bytes []byte) Msg { |
|||
err := json.Unmarshal(bytes, &msg) |
|||
check(err) |
|||
return msg |
|||
} |
@ -0,0 +1,64 @@ |
|||
package main |
|||
|
|||
import ( |
|||
"fmt" |
|||
"net" |
|||
"time" |
|||
|
|||
"github.com/fatih/color" |
|||
) |
|||
|
|||
type PeersList struct { |
|||
PeerID string |
|||
Peers []Peer `json:"peerslist"` |
|||
Date time.Time `json:"date"` |
|||
} |
|||
|
|||
//var peersList []Peer
|
|||
var peersList PeersList |
|||
|
|||
func peerIsInPeersList(p Peer, pl []Peer) int { |
|||
r := -1 |
|||
for i, peer := range pl { |
|||
if peer.IP+":"+peer.Port == p.IP+":"+p.Port { |
|||
r = i |
|||
} |
|||
} |
|||
return r |
|||
} |
|||
func updatePeersList(conn net.Conn, newPeersList PeersList) { |
|||
for _, peer := range newPeersList.Peers { |
|||
if getIPPortFromConn(conn) == peer.IP+":"+peer.Port { |
|||
peer.ID = newPeersList.PeerID |
|||
} |
|||
i := peerIsInPeersList(peer, peersList.Peers) |
|||
if i == -1 { |
|||
peersList.Peers = append(peersList.Peers, peer) |
|||
} else { |
|||
fmt.Println(peersList.Peers[i]) |
|||
peersList.Peers[i].ID = peer.ID |
|||
} |
|||
} |
|||
} |
|||
|
|||
//send the peersList to all the peers except the peer that has send the peersList
|
|||
func propagatePeersList() { |
|||
for _, peer := range peersList.Peers { |
|||
if peer.Conn != nil { |
|||
var msg Msg |
|||
msg = msg.construct("PeersList", "here my peersList", peersList) |
|||
msgB := msg.toBytes() |
|||
_, err := peer.Conn.Write(msgB) |
|||
check(err) |
|||
} |
|||
} |
|||
} |
|||
func printPeersList() { |
|||
fmt.Println("") |
|||
color.Green("PEERSLIST:") |
|||
color.Green("thisPeerId: " + thisPeerID) |
|||
for _, peer := range peersList.Peers { |
|||
fmt.Println(peer) |
|||
} |
|||
fmt.Println("") |
|||
} |