@ -1,9 +1,15 @@ |
|||||
package main |
package main |
||||
|
|
||||
import "log" |
|
||||
|
import ( |
||||
|
"log" |
||||
|
"runtime" |
||||
|
) |
||||
|
|
||||
func check(err error) { |
func check(err error) { |
||||
if err != nil { |
if err != nil { |
||||
|
_, fn, line, _ := runtime.Caller(1) |
||||
|
log.Println(line) |
||||
|
log.Println(fn) |
||||
log.Println(err) |
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("") |
||||
|
} |