添加更新用户流量的方法,并定时跟新到所有用户
Change-Id: I9aa5b3ace0bf327980554a89611b059caed12360
diff --git a/src/main/java/com/pt/service/TrackerService.java b/src/main/java/com/pt/service/TrackerService.java
index 191479b..8a654d0 100644
--- a/src/main/java/com/pt/service/TrackerService.java
+++ b/src/main/java/com/pt/service/TrackerService.java
@@ -2,10 +2,13 @@
import com.pt.entity.PeerInfoEntity;
import com.pt.entity.TorrentMeta;
+import com.pt.entity.User;
import com.pt.exception.ResourceNotFoundException;
import com.pt.repository.PeerInfoRepository;
import com.pt.repository.TorrentMetaRepository;
import com.pt.utils.BencodeCodec;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -18,6 +21,8 @@
@Service
public class TrackerService {
+ private static final Logger logger = LoggerFactory.getLogger(TrackerService.class);
+
@Autowired
private TorrentMetaRepository torrentMetaRepository;
@@ -26,6 +31,9 @@
@Autowired
private TorrentStatsService statsService;
+
+ @Autowired
+ private UserService userService;
@Transactional
public byte[] handleAnnounce(Map<String, String[]> params, String ipAddress) {
@@ -39,6 +47,7 @@
// 解析参数
String infoHash = decodeParam(params.get("info_hash")[0]);
String peerId = decodeParam(params.get("peer_id")[0]);
+ String username = decodeParam(params.get("username")[0]);
int port = Integer.parseInt(params.get("port")[0]);
// 获取事件类型
@@ -57,8 +66,16 @@
// 创建或更新 peer 信息
PeerInfoEntity peer = findOrCreatePeer(peerId, infoHash);
+
+ // 计算流量增量
+ long uploadedDelta = uploaded - peer.getUploaded();
+ long downloadedDelta = downloaded - peer.getDownloaded();
+
+ // 更新用户总流量
+ updateUserTraffic(username, uploadedDelta, downloadedDelta);
// 设置 peer 属性
+ peer.setUsername(username);
setPeerProperties(peer, ipAddress, port, uploaded, downloaded, left);
// 处理事件类型
@@ -81,6 +98,34 @@
}
}
+ // 添加更新用户流量的方法
+ @Transactional
+ private void updateUserTraffic(String username, long uploadedDelta, long downloadedDelta) {
+ if (uploadedDelta <= 0 && downloadedDelta <= 0) {
+ return; // 没有新的流量,不需要更新
+ }
+
+ User user = userService.findByUsername(username);
+ if (user != null) {
+ long oldUploaded = user.getUploaded();
+ long oldDownloaded = user.getDownloaded();
+
+ user.setUploaded(oldUploaded + uploadedDelta);
+ user.setDownloaded(oldDownloaded + downloadedDelta);
+ userService.save(user);
+
+ // 更新用户等级
+ userService.updateUserLevel(user.getUid());
+
+ logger.info("用户 {} 流量更新: 上传 {} -> {} (+{}), 下载 {} -> {} (+{})",
+ username,
+ oldUploaded, user.getUploaded(), uploadedDelta,
+ oldDownloaded, user.getDownloaded(), downloadedDelta);
+ } else {
+ logger.warn("尝试更新不存在的用户流量: {}", username);
+ }
+ }
+
// 辅助方法:获取事件参数
private String getEventParam(Map<String, String[]> params) {
return params.containsKey("event") ?
@@ -96,7 +141,15 @@
// 辅助方法:查找或创建 peer
private PeerInfoEntity findOrCreatePeer(String peerId, String infoHash) {
return peerInfoRepository.findByPeerIdAndInfoHash(peerId, infoHash)
- .orElseGet(PeerInfoEntity::new);
+ .orElseGet(() -> {
+ PeerInfoEntity newPeer = new PeerInfoEntity();
+ newPeer.setPeerId(peerId);
+ newPeer.setInfoHash(infoHash);
+ newPeer.setActive(true);
+ newPeer.setStatus("downloading");
+ newPeer.setLastSeen(LocalDateTime.now());
+ return newPeer;
+ });
}
// 辅助方法:设置 peer 属性