package org.torrent.internal.transfer; import java.util.HashMap; import java.util.Map; import org.torrent.internal.peer.connection.BTConnection; import org.torrent.internal.protocol.message.BittorrentMessage; import org.torrent.internal.protocol.message.Piece; public class SimpleScoreKeeper extends BTSessionListenerAdapter { private Map<BTConnection, Long> scores = new HashMap<BTConnection, Long>(); @Override public synchronized void addedConnection(BTConnection con) { scores.put(con, 0L); } @Override public void receivedBTMessage(BTConnection from, BittorrentMessage message) { if (message instanceof Piece) { Piece piece = (Piece) message; changeScore(from, piece.getLength()); } } @Override public void receivedUnrequestedPiece(BTConnection from, Piece piece) { // Wasting our bandwidth will decrease a peers score (We could have // received valid data instead) // This is problematic if we canceled a request which was underway. (Aka // endgame mode) changeScore(from, -piece.getLength()); } @Override public synchronized void removedConnection(BTConnection con) { scores.remove(con); } @Override public void sentBTMessage(BTConnection from, BittorrentMessage message) { if (message instanceof Piece) { Piece piece = (Piece) message; changeScore(from, -piece.getLength()); } } private synchronized void changeScore(BTConnection from, int add) { scores.put(from, scores.get(from) - add); } public synchronized void checkFailedPenalty(BTConnection con, int amountReceived) { // Idea: Subtract 2 times the received amount, once to remove the // awarded points when receiving the pieces and twice for making us // download the hole thing again changeScore(con, -2 * amountReceived); } public synchronized Long getScoreOf(BTConnection con) { return scores.get(con); } }