""" **************************************** * Peer * **************************************** * reputation: float * * upload: float * * download: float * * name: string * * normalised_up:float * * properties:string * * coordinates:tuple * * latency:float * * MBshared:float * * client:string * * ID: string * **************************************** * Peer(float rep,float up,float down, * * string name, string client, * * float MBshared, float lat) * * setRep(float rep) * * setUp(float up) * * setDown(float down) * * setNormUP(float norm_up) * * setLatency(float lat) * * setMBshared(float MBshared) * * setClient(string client) * * setName(string name) * * setProperties() * * setID(int ID) * * setCoordinates(tuple p) * * getRep(): float reputation * * getUp(): float Upload * * getDown():float Download * * getNormUP(): float normalised_up * * getMBshared(): float MBshared * * getLatency(): float latency * * getClient():string client * * getName(): string name * * getID(): int ID * * getCoordinates():tuple coordinates * * getProperties(): string properties * * visPeer() * **************************************** *************************************************** * Swarm * *************************************************** * group: array * *************************************************** * Swarm() * * add(Peer peer) * * setPeerRep(int number, float rep) * * setPeerDown(int number, float down) * * setPeerUp(int number, float up) * * setPeerNormUP(int number, float norm_up) * * setPeerLatency(int number, float latency) * * setPeerMBshared(int number,float MBshared) * * setPeerClient(int number,string client) * * setPeerName(int number,string name) * * setProperties() * * setPeerID(int number, int ID) * * setPeerCoordinates(number,tuple p) * * getRep(int number): float reputation * * getPeerUp(int number): float Upload * * getPeerDown(int number):float Download * * getPeerNormUP(int number): float normalised_up * * getPeerLatency(int number):float latency * * getPeerMBshared(int number): float MBshared * * getPeerClient(int number): string client * * getPeerName(int number): string name * * getPeerID(int number): int ID * * getPeerCoordinates(int number):tuple coordinates* * getPeerProperties(int number):string properties * * visSwarm() * *************************************************** """ import wx import math import time import threading import thread import sys import string import operator from random import * # initialise a peer defined by its reputation and bandwidth in upload and download class Peer: def __init__(self, rep, up, down,lat,MBshared,client,name): self.reputation = rep self.upload = up self.download = down self.latency = lat self.MBshared = MBshared self.client = client self.name = name self.normalised_up = 0 self.properties = '' self.coordinates = (0,0) self.ID = 0 #sets the reputation and bandwidth of the peer def setRep(self, rep): self.reputation = rep def setUp(self, up): self.upload = up def setDown(self,down ): self.download = down def setNormUP(self,norm_up): self.normalised_up = norm_up def setLatency(self,lat): self.latency = lat def setMBshared(self,MBshared): self.MBshared = MBshared def setClient(self,client): self.client=client def setName(self,name): self.name=name def setProperties(self): self.properties=self.getName() + '\nReputation: ' + repr(self.getRep())+ '\nBandwidth in Upload: ' + repr(self.getUp()) + '\nBandwidth in Download: '+ repr(self.getDown()) + '\nLatency: '+ repr(self.getLatency()) + '\nMB shared: '+ repr(self.getMBshared()) + '\nClient: ' + self.getClient() def setCoordinates(self,p): self.coordinates=p def setID(self,ID): self.ID = ID #sets the reputation and bandwidth of the peer def getRep(self): return self.reputation def getUp(self): return self.upload def getDown(self): return self.download def getNormUP(self): return self.normalised_up def getLatency(self): return self.latency def getMBshared(self): return self.MBshared def getClient(self): return self.client def getName(self): return self.name def getCoordinates(self): return self.coordinates def getID(self): return self.ID def getProperties(self): return self.properties #print the reputations and bandwidth of the peer def visPeer(self): print self.properties #initialise a swarm composed by a given number of peers class Swarm: def __init__(self): self.group = [] def add(self, peer): self.group.append(peer) def setPeerRep(self, number,rep): self.group[number].setRep(rep) def setPeerUp(self, number,up): self.group[number].setUp(up) def setPeerDown(self, number,down): self.group[number].setDown(down) def setPeerNormUP(self, number,norm_up): self.group[number].setNormUP(norm_up) def setPeerLatency(self,number,lat): self.group[number].setLatency(lat) def setPeerMBshared(self,number,MBshared): self.group[number].setMBshared(MBshared) def setPeerClient(self, number,client): self.group[number].setClient(client) def setPeerName(self, number,name): self.group[number].setName(name) def setPeerCoordinates(self, number,p): self.group[number].setCoordinates(p) def setPeerID(self, number,ID): self.group[number].setID(ID) def setProperties(self): for i in range (len(self.group)): self.group[i].setProperties() def getPeerRep(self, number): return self.group[number].getRep() def getPeerUp(self, number): return self.group[number].getUp() def getPeerDown(self, number): return self.group[number].getDown() def getPeerNormUP(self, number): return self.group[number].getNormUP() def getPeerLatency(self, number): return self.group[number].getLatency() def getPeerMBshared(self,number): return self.group[number].getMBshared() def getPeerClient(self, number): return self.group[number].getClient() def getPeerName(self, number): return self.group[number].getName() def getPeerCoordinates(self, number): return self.group[number].getCoordinates() def getPeerID(self, number): return self.group[number].getID() def getPeerProperties(self, number): return self.group[number].getProperties() def visSwarm(self): for i in range (len(self.group)): self.group[i].visPeer() #generates a swarm composed by a given number of peers and sets random reputation, bandwidth, MB shared client and latency for each peer def generateSwarm(number): peers = Swarm() chars = string.letters + string.digits name_length=8 for i in range (number): x = Peer(uniform(1,3),randint(1,200),randint(1,600),uniform(5,250),uniform(5,1000),choice(['BitTorrent','Tribler']),''.join([choice(chars) for i in range(name_length)])) peers.add(x) return peers def SortSwarm(swarm): swarmBT = Swarm() swarmT = Swarm() swarmBandwidthBT = Swarm() swarmBandwidthT = Swarm() swarmLatencyBT = Swarm() swarmLatencyT = Swarm() swarmMBBT = Swarm() swarmMBT = Swarm() #sort the swarm according to its bandwidth in upload swarm.group.sort(key=operator.attrgetter('upload')) #sort the swarm according to the client used for i in range(len(swarm.group)): if swarm.getPeerClient(i)=='BitTorrent': swarmBT.add(swarm.group[i]) else: swarmT.add(swarm.group[i]) #copy the two groups of swarm in two new lists sorted by bandwidth, one for Tribler Peers and one for BitTorrent Peers for i in range(len(swarmBT.group)): swarmBandwidthBT.add(swarmBT.group[i]) for i in range(len(swarmT.group)): swarmBandwidthT.add(swarmT.group[i]) #sort the swarm according to the latency swarmBT.group.sort(key=operator.attrgetter('latency')) swarmT.group.sort(key=operator.attrgetter('latency')) #copy the two groups of swarm in two new lists sorted by latency, one for Tribler Peers and one for BitTorrent Peers for i in range(len(swarmBT.group)): swarmLatencyBT.add(swarmBT.group[i]) for i in range(len(swarmT.group)): swarmLatencyT.add(swarmT.group[i]) #sort the swarm according to MB shared swarmBT.group.sort(key=operator.attrgetter('MBshared')) swarmT.group.sort(key=operator.attrgetter('MBshared')) #copy the two groups of swarm in two new lists sorted by MB shared, one for Tribler Peers and one for BitTorrent Peers for i in range(len(swarmBT.group)): swarmMBBT.add(swarmBT.group[i]) for i in range(len(swarmT.group)): swarmMBT.add(swarmT.group[i]) return swarm,swarmBandwidthBT, swarmBandwidthT, swarmLatencyBT, swarmLatencyT, swarmMBBT, swarmMBT def normaliseLatency(swarm): resolution_1=wx.DisplaySize() x_1=resolution_1[0]/2 y_2=resolution_1[1]/2 maximum = y_2 for i in range(len(swarm.group)): if (250+swarm.getPeerLatency(i)=1 and UP<=10: size = 3 elif UP>10 and UP<=30: size = 4 elif UP>30 and UP<=50: size = 5 else: size = 7 return size swarm = Swarm() class TransientPopup(wx.PopupTransientWindow): def __init__(self, parent, style,prop): wx.PopupTransientWindow.__init__(self, parent, style) self.SetBackgroundColour("#c0c0c0") st = wx.StaticText(self, -1,prop,pos=(10,10)) sz = st.GetBestSize() self.SetSize((sz.width+20, sz.height+20)) class DrawPanel(wx.Panel): def __init__(self, parent): wx.Panel.__init__(self, parent, -1) wx.EVT_PAINT(self, self.onPaint) # Bind mouse events self.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown) self.Bind(wx.EVT_RIGHT_DOWN, self.OnRightDown) # Bind checkboxes self.cb1 = wx.CheckBox(self, wx.ID_ANY, 'Highest Bandwidth G2G', pos=(10, 10)) self.cb2 = wx.CheckBox(self, wx.ID_ANY, 'Highest Bandwidth T4T', pos=(150, 10)) self.cb3 = wx.CheckBox(self, wx.ID_ANY, 'Lowest latency G2G',pos=(10, 30)) self.cb4 = wx.CheckBox(self, wx.ID_ANY, 'Lowest latency T4T', pos=(150, 30)) self.cb5 = wx.CheckBox(self, wx.ID_ANY, 'Most uploaded MB G2G', pos=(10, 50)) self.cb6 = wx.CheckBox(self, wx.ID_ANY, 'Most uploaded MB T4T',pos=(150, 50)) self.cb7 = wx.CheckBox(self, wx.ID_ANY, 'Random Peers G2G', pos=(10, 70)) self.cb8 = wx.CheckBox(self, wx.ID_ANY, 'Random Peers T4T',pos=(150, 70)) self.cb1.SetValue(True) self.cb2.SetValue(True) self.cb3.SetValue(True) self.cb4.SetValue(True) self.cb5.SetValue(True) self.cb6.SetValue(True) self.cb7.SetValue(True) self.cb8.SetValue(True) self.cb1.Bind(wx.EVT_CHECKBOX, self.onAction) self.cb2.Bind(wx.EVT_CHECKBOX, self.onAction) self.cb3.Bind(wx.EVT_CHECKBOX, self.onAction) self.cb4.Bind(wx.EVT_CHECKBOX, self.onAction) self.cb5.Bind(wx.EVT_CHECKBOX, self.onAction) self.cb6.Bind(wx.EVT_CHECKBOX, self.onAction) self.cb7.Bind(wx.EVT_CHECKBOX, self.onAction) self.cb8.Bind(wx.EVT_CHECKBOX, self.onAction) #Bind choose mode menu modes = ['LATENCY VS UPLOAD BANDWIDTH', 'LATENCY VS REPUTATION', 'UPLOAD BANDWIDTH VS REPUTATION'] self.ch = wx.Choice(self, -1, (10, 90), choices = modes) self.Bind(wx.EVT_CHOICE, self.EvtChoice, self.ch) #Set default mode (latency VS upload badwidth) self.mode = 1 #Set default number of peers visualized self.peers_visualized=80 #Bind choose number of peers menu choose = ['Default (80 Peers)', '160 peers', '320 peers'] self.ch1 = wx.Choice(self, -1, (10, 120), choices = choose) self.Bind(wx.EVT_CHOICE, self.EvtChoice1, self.ch1) #Box ticked action def onAction(self, event): cb = event.GetEventObject() #IF DEPLOYED PUT SOMETHING TO WRITE TO LOG HERE i.e. which box has been tickd #Function bound to the choose mode menu def EvtChoice(self, event): if event.GetString() == 'LATENCY VS UPLOAD BANDWIDTH': self.mode = 1 elif event.GetString() == 'LATENCY VS REPUTATION': self.mode = 2 else: self.mode = 3 #Function bound to the choose number of peers menu def EvtChoice1(self, event): if event.GetString() == 'Default (80 Peers)': self.peers_visualized=80 elif event.GetString() == '160 peers': self.peers_visualized=160 else: self.peers_visualized=320 #Function bound to right click down def OnRightDown(self, event): global swarm point = event.GetPosition() x=point[0] y=point[1] if self.mode == 1: for i in range(len(swarm.group)): if (pow(point[0]-swarm.getPeerCoordinates(i)[0],2)+pow(point[1]-swarm.getPeerCoordinates(i)[1],2)Block def Block(self, event): print "USER BLOCKED" #PUT SOMETHING TO WRITE TO LOG #Function enabled on right down --> Prioritise def Prioritise(self, event): print "USER HAS BEEN GIVEN PRIORITY" #PUT SOMETHING TO WRITE TO LOG #Function bound to left click down def OnLeftDown(self, event): global swarm point = event.GetPosition() x=point[0] y=point[1] if self.mode == 1: for i in range(len(swarm.group)): if (pow(point[0]-swarm.getPeerCoordinates(i)[0],2)+pow(point[1]-swarm.getPeerCoordinates(i)[1],2)