From 56d6a4b67a3fabdcbe5f2ed6c14a50dda209a451 Mon Sep 17 00:00:00 2001 From: OldHawk Date: Sat, 23 Dec 2017 02:05:28 +0800 Subject: [PATCH] opt(announce): optimization announce data --- .../announces.server.controller.js | 2 + .../controllers/peers.server.controller.js | 4 +- .../controllers/torrents.server.controller.js | 8 +-- .../server/models/torrent.server.model.js | 52 ++++++++++++++++++- .../controllers/admin.server.controller.js | 4 +- .../users/server/models/user.server.model.js | 46 ++++++++++++++++ 6 files changed, 107 insertions(+), 9 deletions(-) diff --git a/modules/announce/server/controllers/announces.server.controller.js b/modules/announce/server/controllers/announces.server.controller.js index 29104b73..e659839c 100644 --- a/modules/announce/server/controllers/announces.server.controller.js +++ b/modules/announce/server/controllers/announces.server.controller.js @@ -269,6 +269,7 @@ exports.announce = function (req, res) { done(174); } else { req.torrent = t; + t.updateSeedLeechNumbers(); done(null); } }); @@ -988,6 +989,7 @@ exports.userByPasskey = function (req, res, next, pk) { req.passkeyuser.status = 'idle'; } + u.updateSeedLeechNumbers(); } else { req.passkeyuser = undefined; } diff --git a/modules/torrents/server/controllers/peers.server.controller.js b/modules/torrents/server/controllers/peers.server.controller.js index 86e37758..67bc8317 100644 --- a/modules/torrents/server/controllers/peers.server.controller.js +++ b/modules/torrents/server/controllers/peers.server.controller.js @@ -29,7 +29,7 @@ exports.getMySeeding = function (req, res) { Peer.find({ user: req.user._id, peer_status: PEERSTATE_SEEDER, - last_announce_at: {$gt: Date.now() - announceConfig.announceInterval * 2} + last_announce_at: {$gt: Date.now() - announceConfig.announceInterval - 60 * 1000} }).sort('-peer_uploaded') .populate({ path: 'torrent', @@ -58,7 +58,7 @@ exports.getMyDownloading = function (req, res) { Peer.find({ user: req.user._id, peer_status: PEERSTATE_LEECHER, - last_announce_at: {$gt: Date.now() - announceConfig.announceInterval * 2} + last_announce_at: {$gt: Date.now() - announceConfig.announceInterval - 60 * 1000} }).sort('-peer_downloaded') .populate({ path: 'torrent', diff --git a/modules/torrents/server/controllers/torrents.server.controller.js b/modules/torrents/server/controllers/torrents.server.controller.js index 3e58f5a2..57b1e19c 100644 --- a/modules/torrents/server/controllers/torrents.server.controller.js +++ b/modules/torrents/server/controllers/torrents.server.controller.js @@ -1785,7 +1785,7 @@ exports.getSeederUsers = function (req, res) { Peer.count({ torrent: req.torrent._id, peer_status: PEERSTATE_SEEDER, - last_announce_at: {$gt: Date.now() - announceConfig.announceInterval * 2} + last_announce_at: {$gt: Date.now() - announceConfig.announceInterval - 60 * 1000} }, function (err, count) { if (err) { callback(err, null); @@ -1800,7 +1800,7 @@ exports.getSeederUsers = function (req, res) { Peer.find({ torrent: req.torrent._id, peer_status: PEERSTATE_SEEDER, - last_announce_at: {$gt: Date.now() - announceConfig.announceInterval * 2} + last_announce_at: {$gt: Date.now() - announceConfig.announceInterval - 60 * 1000} }) .sort('-peer_uploaded') .populate('user', 'username displayName profileImageURL isVip') @@ -1846,7 +1846,7 @@ exports.getLeecherUsers = function (req, res) { Peer.count({ torrent: req.torrent._id, peer_status: PEERSTATE_LEECHER, - last_announce_at: {$gt: Date.now() - announceConfig.announceInterval * 2} + last_announce_at: {$gt: Date.now() - announceConfig.announceInterval - 60 * 1000} }, function (err, count) { if (err) { callback(err, null); @@ -1861,7 +1861,7 @@ exports.getLeecherUsers = function (req, res) { Peer.find({ torrent: req.torrent._id, peer_status: PEERSTATE_LEECHER, - last_announce_at: {$gt: Date.now() - announceConfig.announceInterval * 2} + last_announce_at: {$gt: Date.now() - announceConfig.announceInterval - 60 * 1000} }) .sort('-peer_uploaded') .populate('user', 'username displayName profileImageURL isVip') diff --git a/modules/torrents/server/models/torrent.server.model.js b/modules/torrents/server/models/torrent.server.model.js index 82fd340e..c90b9004 100644 --- a/modules/torrents/server/models/torrent.server.model.js +++ b/modules/torrents/server/models/torrent.server.model.js @@ -4,8 +4,16 @@ * Module dependencies */ var mongoose = require('mongoose'), + path = require('path'), + config = require(path.resolve('./config/config')), + Peer = mongoose.model('Peer'), Schema = mongoose.Schema; +var announceConfig = config.meanTorrentConfig.announce; + +const PEERSTATE_SEEDER = 'seeder'; +const PEERSTATE_LEECHER = 'leecher'; + /** * Sub Comment Schema */ @@ -232,6 +240,47 @@ function writeIsSaling(torrent) { } } +/** + * updateSeedLeechNumbers + */ +TorrentSchema.methods.updateSeedLeechNumbers = function () { + var torrent = this; + + Peer.aggregate({ + $match: { + torrent: torrent._id, + last_announce_at: {$gt: new Date(Date.now() - announceConfig.announceInterval - 60 * 1000)} + } + }, { + $group: { + _id: '$peer_status', + count: {$sum: 1} + } + }).exec(function (err, counts) { + if (!err) { + var sc = 0; + var lc = 0; + counts.forEach(function (c) { + switch (c._id) { + case PEERSTATE_SEEDER: + sc = c.count; + break; + case PEERSTATE_LEECHER: + lc = c.count; + break; + } + }); + + torrent.update({ + $set: { + torrent_seeds: sc, + torrent_leechers: lc + } + }).exec(); + } + }); +}; + /** * globalUpdateMethod */ @@ -261,7 +310,8 @@ TorrentSchema.index({ torrent_recommended: 1, orderedat: -1, createdat: -1, - '_peers.id': 1}); + '_peers.id': 1 +}); TorrentSchema.index({ user: 1, diff --git a/modules/users/server/controllers/admin.server.controller.js b/modules/users/server/controllers/admin.server.controller.js index 3db56aad..2486936b 100644 --- a/modules/users/server/controllers/admin.server.controller.js +++ b/modules/users/server/controllers/admin.server.controller.js @@ -515,7 +515,7 @@ exports.getUserSeeding = function (req, res) { Peer.find({ user: req.model._id, peer_status: PEERSTATE_SEEDER, - last_announce_at: {$gt: Date.now() - announceConfig.announceInterval * 2} + last_announce_at: {$gt: Date.now() - announceConfig.announceInterval - 60 * 1000} }).sort('-peer_uploaded') .populate({ path: 'torrent', @@ -544,7 +544,7 @@ exports.getUserLeeching = function (req, res) { Peer.find({ user: req.model._id, peer_status: PEERSTATE_LEECHER, - last_announce_at: {$gt: Date.now() - announceConfig.announceInterval * 2} + last_announce_at: {$gt: Date.now() - announceConfig.announceInterval - 60 * 1000} }).sort('-peer_downloaded') .populate({ path: 'torrent', diff --git a/modules/users/server/models/user.server.model.js b/modules/users/server/models/user.server.model.js index c301cd16..32298d44 100644 --- a/modules/users/server/models/user.server.model.js +++ b/modules/users/server/models/user.server.model.js @@ -12,10 +12,15 @@ var mongoose = require('mongoose'), generatePassword = require('generate-password'), owasp = require('owasp-password-strength-test'), moment = require('moment'), + Peer = mongoose.model('Peer'), chalk = require('chalk'); owasp.config(config.shared.owasp); +var announceConfig = config.meanTorrentConfig.announce; + +const PEERSTATE_SEEDER = 'seeder'; +const PEERSTATE_LEECHER = 'leecher'; /** * A Validation function for local strategy properties @@ -383,6 +388,47 @@ UserSchema.methods.globalUpdateMethod = function () { this.save(); }; +/** + * updateSeedLeechNumbers + */ +UserSchema.methods.updateSeedLeechNumbers = function () { + var user = this; + + Peer.aggregate({ + $match: { + user: user._id, + last_announce_at: {$gt: new Date(Date.now() - announceConfig.announceInterval - 60 * 1000)} + } + }, { + $group: { + _id: '$peer_status', + count: {$sum: 1} + } + }).exec(function (err, counts) { + if (!err) { + var sc = 0; + var lc = 0; + counts.forEach(function (c) { + switch (c._id) { + case PEERSTATE_SEEDER: + sc = c.count; + break; + case PEERSTATE_LEECHER: + lc = c.count; + break; + } + }); + + user.update({ + $set: { + seeded: sc, + leeched: lc + } + }).exec(); + } + }); +}; + /** * update user last client_agent * @param ip