添加更新用户流量的方法,并定时跟新到所有用户

Change-Id: I9aa5b3ace0bf327980554a89611b059caed12360
diff --git a/src/main/java/com/pt/service/CommentService.java b/src/main/java/com/pt/service/CommentService.java
index 3d8b7dd..1ac817e 100644
--- a/src/main/java/com/pt/service/CommentService.java
+++ b/src/main/java/com/pt/service/CommentService.java
@@ -17,11 +17,16 @@
         this.commentRepository = commentRepository;
     }
 
-    public void addComment(String content, String username, int postId) {
+    public void addComment(String content, String username, int postId, Integer reviewer) {
+        System.out.println("Adding comment: " + content + " by " + username + " on post ID: " + postId + " with reviewer ID: " + reviewer);
         Comment comment = new Comment();
         comment.setContent(content);
         comment.setWriter(username);
         comment.setParentPost(postId);
+        if(reviewer != null) {
+            System.out.println("Setting reviewer ID: " + reviewer);
+            comment.setReviewer(reviewer);
+        }
         commentRepository.save(comment);
     }
 
@@ -37,4 +42,8 @@
         );
         return comments;
     }
+
+    public Comment getCommentById(int commentId) {
+        return commentRepository.findById(commentId).orElse(null);
+    }
 }
diff --git a/src/main/java/com/pt/service/TorrentService.java b/src/main/java/com/pt/service/TorrentService.java
index 1fdb700..ad38622 100644
--- a/src/main/java/com/pt/service/TorrentService.java
+++ b/src/main/java/com/pt/service/TorrentService.java
@@ -18,6 +18,10 @@
     private TorrentMetaRepository torrentMetaRepository;
 
     public TorrentMeta parseAndSaveTorrent(byte[] torrentBytes) throws Exception {
+        System.out.println("111");
+        for (byte b : torrentBytes) {
+            System.out.println(b);
+        }
         Map<String, Object> torrentDict = (Map<String, Object>) BencodeCodec.decode(torrentBytes);
         if (!torrentDict.containsKey("info")) {
             throw new IllegalArgumentException("Invalid torrent file: missing 'info' dictionary");
@@ -25,12 +29,14 @@
 
         Map<String, Object> infoDict = (Map<String, Object>) torrentDict.get("info");
 
+        System.out.println(222);
         // 计算 info_hash
         byte[] infoEncoded = BencodeCodec.encode(infoDict);
         MessageDigest sha1 = MessageDigest.getInstance("SHA-1");
         byte[] infoHashBytes = sha1.digest(infoEncoded);
         String infoHash = bytesToHex(infoHashBytes);
 
+        System.out.println(333);
         // 获取文件名,大小等
         String name = (String) infoDict.get("name");
         long length = 0;
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 属性