📄 startstoprulesdefaultplugin.java
字号:
DefaultRankCalculator dlData = null;
if (downloadDataMap.containsKey(download)) {
dlData = (DefaultRankCalculator)downloadDataMap.get(download);
} else {
dlData = new DefaultRankCalculator(StartStopRulesDefaultPlugin.this, download);
downloadDataMap.put( download, dlData );
download.addListener( download_listener );
download.addTrackerListener( download_tracker_listener );
}
if (dlData != null) {
dlData.recalcSeedingRank();
somethingChanged = true;
if (bDebugLog)
log.log(download.getTorrent(), LoggerChannel.LT_INFORMATION,
"somethingChanged: downloadAdded");
}
}
public void downloadRemoved( Download download )
{
download.removeListener( download_listener );
download.removeTrackerListener( download_tracker_listener );
if (downloadDataMap.containsKey(download)) {
downloadDataMap.remove(download);
}
somethingChanged = true;
if (bDebugLog)
log.log(download.getTorrent(), LoggerChannel.LT_INFORMATION,
"somethingChanged: downloadRemoved");
}
}
private class ChangeCheckerTimerTask extends TimerTask {
public void run() {
// make sure process isn't running and stop it from running while we do stuff
try{
this_mon.enter();
DefaultRankCalculator[] dlDataArray =
(DefaultRankCalculator[])downloadDataMap.values().toArray(new DefaultRankCalculator[0]);
int iNumDLing = 0;
int iNumCDing = 0;
for (int i = 0; i < dlDataArray.length; i++) {
if (dlDataArray[i].changeChecker()) {
somethingChanged = true;
return;
}
// Check DLs for change in activeness (speed threshold)
// (The call sets somethingChanged it was changed)
if (dlDataArray[i].getActivelyDownloading())
iNumDLing++;
// Check Seeders for change in activeness (speed threshold)
// (The call sets somethingChanged it was changed)
if (dlDataArray[i].getActivelySeeding()) {
iNumCDing++;
}
}
int iMaxSeeders = calcMaxSeeders(iNumDLing);
if (iNumCDing > iMaxSeeders) {
somethingChanged = true;
if (bDebugLog)
log.log(LoggerChannel.LT_INFORMATION,
"somethingChanged: More Seeding than limit");
}
}finally{
this_mon.exit();
}
}
}
// ConfigurationListener
public void configurationSaved() {
reloadConfigParams();
}
private void reloadConfigParams() {
try{
this_mon.enter();
int iNewRankType = plugin_config.getIntParameter("StartStopManager_iRankType");
minSpeedForActiveSeeding = plugin_config.getIntParameter("StartStopManager_iMinSpeedForActiveSeeding");
_maxActive = plugin_config.getIntParameter("max active torrents");
_maxActiveWhenSeedingEnabled = plugin_config.getBooleanParameter("StartStopManager_bMaxActiveTorrentsWhenSeedingEnabled");
_maxActiveWhenSeeding = plugin_config.getIntParameter("StartStopManager_iMaxActiveTorrentsWhenSeeding");
maxDownloads = plugin_config.getIntParameter("max downloads");
numPeersAsFullCopy = plugin_config.getIntParameter("StartStopManager_iNumPeersAsFullCopy");
iFakeFullCopySeedStart = plugin_config.getIntParameter("StartStopManager_iFakeFullCopySeedStart");
bAutoReposition = plugin_config.getBooleanParameter("StartStopManager_bAutoReposition");
minTimeAlive = plugin_config.getIntParameter("StartStopManager_iMinSeedingTime") * 1000;
bDebugLog = plugin_config.getBooleanParameter("StartStopManager_bDebugLog");
bAutoStart0Peers = plugin_config.getBooleanParameter("StartStopManager_bAutoStart0Peers");
iMaxUploadSpeed = plugin_config.getIntParameter("Max Upload Speed KBs",0);
boolean move_top = plugin_config.getBooleanParameter( "StartStopManager_bNewSeedsMoveTop" );
plugin_config.setBooleanParameter( PluginConfig.CORE_PARAM_BOOLEAN_NEW_SEEDS_START_AT_TOP, move_top );
if (iNewRankType != iRankType) {
iRankType = iNewRankType;
// shorted recalc for timed rank type, since the calculation is fast and we want to stop on the second
if (iRankType == RANK_TIMED) {
if (recalcSeedingRanksTask == null) {
recalcSeedingRanksTask = new RecalcSeedingRanksTask();
changeCheckerTimer.schedule(recalcSeedingRanksTask, 1000, 1000);
}
} else if (recalcSeedingRanksTask != null) {
recalcSeedingRanksTask.cancel();
recalcSeedingRanksTask = null;
}
}
/*
// limit _maxActive and maxDownloads based on TheColonel's specs
// maxActive = max_upload_speed / (slots_per_torrent * min_speed_per_peer)
if (_maxActive > 0) {
int iSlotsPerTorrent = plugin_config.getIntParameter("Max Uploads");
// TODO: Track upload speed, storing the max upload speed over a minute
// and use that for "unlimited" setting, or huge settings (like 200)
if (iSlotsPerTorrent > 0) {
int iMinSpeedPerPeer = 3; // for now. TODO: config value
int _maxActiveLimit = iMaxUploadSpeed / (iSlotsPerTorrent * iMinSpeedPerPeer);
if (_maxActive > _maxActiveLimit) {
_maxActive = _maxActiveLimit;
plugin_config.setIntParameter(PluginConfig.CORE_PARAM_INT_MAX_ACTIVE, _maxActive);
}
}
if (maxDownloads > _maxActive) {
maxDownloads = _maxActive;
plugin_config.setIntParameter(PluginConfig.CORE_PARAM_INT_MAX_DOWNLOADS, maxDownloads);
}
}
*/
recalcAllSeedingRanks(true);
somethingChanged = true;
if (bDebugLog) {
log.log(LoggerChannel.LT_INFORMATION,
"somethingChanged: config reload");
try {
if (debugMenuItem == null) {
final String DEBUG_MENU_ID = "StartStopRules.menu.viewDebug";
MenuItemListener menuListener = new MenuItemListener() {
public void selected(MenuItem menu, Object target) {
if (!(target instanceof TableRow))
return;
TableRow tr = (TableRow) target;
Object ds = tr.getDataSource();
if (!(ds instanceof Download))
return;
DefaultRankCalculator dlData = (DefaultRankCalculator) downloadDataMap
.get(ds);
if (dlData != null) {
if (bSWTUI)
StartStopRulesDefaultPluginSWTUI.openDebugWindow(dlData);
else
plugin_interface.getUIManager().showTextMessage(
null,
null,
"FP:\n" + dlData.sExplainFP + "\n" + "SR:"
+ dlData.sExplainSR + "\n" + "TRACE:\n"
+ dlData.sTrace);
}
}
};
TableManager tm = plugin_interface.getUIManager().getTableManager();
TableContextMenuItem menu;
menu = tm.addContextMenuItem(
TableManager.TABLE_MYTORRENTS_COMPLETE, DEBUG_MENU_ID);
menu.addListener(menuListener);
menu = tm.addContextMenuItem(
TableManager.TABLE_MYTORRENTS_INCOMPLETE, DEBUG_MENU_ID);
menu.addListener(menuListener);
}
} catch (Throwable t) {
Debug.printStackTrace(t);
}
}
} finally {
this_mon.exit();
}
}
private int calcMaxSeeders(int iDLs) {
// XXX put in subtraction logic here
int maxActive = getMaxActive();
return (maxActive == 0) ? 99999 : maxActive - iDLs;
}
protected int getMaxActive() {
if (!_maxActiveWhenSeedingEnabled)
return (_maxActive);
if (download_manager.isSeedingOnly()) {
if (_maxActiveWhenSeeding <= _maxActive)
return (_maxActiveWhenSeeding);
// danger here if we are in a position where allowing more to start when seeding
// allows a non-seeding download to start (looping occurs)
Download[] downloads = download_manager.getDownloads();
boolean danger = false;
for (int i = 0; i < downloads.length && !danger; i++) {
Download download = downloads[i];
int state = download.getState();
if (state == Download.ST_DOWNLOADING || state == Download.ST_SEEDING
|| state == Download.ST_STOPPED || state == Download.ST_STOPPING
|| state == Download.ST_ERROR) {
// not interesting, they can't potentially cause trouble
} else {
// look for incomplete files
DiskManagerFileInfo[] files = download.getDiskManagerFileInfo();
for (int j = 0; j < files.length; j++) {
DiskManagerFileInfo file = files[j];
if ((!file.isSkipped()) && file.getDownloaded() != file.getLength()) {
danger = true;
break;
}
}
}
}
if (!danger)
return (_maxActiveWhenSeeding);
}
return (_maxActive);
}
private class TotalsStats {
// total Forced Seeding doesn't include stalled torrents
int forcedSeeding = 0;
int forcedSeedingNonFP = 0;
int waitingToSeed = 0;
int waitingToDL = 0;
int downloading = 0;
int activelyDLing = 0;
int activelyCDing = 0;
int complete = 0;
int incompleteQueued = 0;
int firstPriority = 0;
int stalledSeeders = 0;
int stalledFPSeeders = 0;
/**
* Indicate whether it's ok to start seeding.
* <p>
* Seeding can start right away when there's no auto-ranking or we are on
* timed ranking. Otherwise, we wait until one of the following happens:
* <ul>
* <li>Any non-stopped/errored torrent gets a scrape result AND it's after
* {@link #MIN_SEEDING_STARTUP_WAIT}
* <li>All scrape results come in for completed, non-stopped/errored torrent
* <li>Any completed non-stopped/errored torrent is FP
* <li>Any torrent has 0 seeds (which, in most cases means it's the highest
* rank)
* </ul>
* <p>
* If none of the above happen, then after {@link #MIN_FIRST_SCRAPE_WAIT},
* the flag will turned on.
*/
// not a total :)
boolean bOkToStartSeeding;
int maxSeeders;
int maxActive;
int maxTorrents;
/**
* Default Constructor
*
* @param dlDataArray list of download data (rank calculators) objects
* to base calculations on.
*/
public TotalsStats(DefaultRankCalculator[] dlDataArray) {
bOkToStartSeeding = (iRankType == RANK_NONE) || (iRankType == RANK_TIMED)
|| (SystemTime.getCurrentTime() - startedOn > MIN_FIRST_SCRAPE_WAIT);
// count the # of ok scrapes when !bOkToStartSeeding, and flip to true
// if all scrapes for non-stopped/errored completes are okay.
int totalOKScrapes = 0;
// - Build a SeedingRank list for sorting
// - Build Count Totals
// - Do anything that doesn't need to be done in Queued order
for (int i = 0; i < dlDataArray.length; i++) {
DefaultRankCalculator dlData = dlDataArray[i];
Download download = dlData.getDownloadObject();
DownloadStats stats = download.getStats();
int completionLevel = stats.getDownloadCompleted(false);
boolean bIsFirstP = false;
// Count forced seedings as using a slot
// Don't count forced downloading as using a slot
if (completionLevel < 1000 && download.isForceStart())
continue;
int state = download.getState();
if (completionLevel == 1000) {
// Only used when !bOkToStartSeeding.. set only to make compiler happy
boolean bScrapeOk = true;
if (!bOkToStartSeeding) {
bScrapeOk = scrapeResultOk(download);
if (calcSeedsNoUs(download) == 0 && bScrapeOk)
bOkToStartSeeding = true;
else if ((download.getSeedingRank() > 0)
&& (state == Download.ST_QUEUED || state == Download.ST_READY)
&& (SystemTime.getCurrentTime() - startedOn > MIN_SEEDING_STARTUP_WAIT))
bOkToStartSeeding = true;
}
if (state != Download.ST_ERROR && state != Download.ST_STOPPED) {
complete++;
if (!bOkToStartSeeding && bScrapeOk)
totalOKScrapes++;
if (dlData.isFirstPriority()) {
if (!bOkToStartSeeding)
bOkToStartSeeding = true;
firstPriority++;
bIsFirstP = true;
}
if (dlData.getActivelySeeding()) {
activelyCDing++;
if (download.isForceStart()) {
forcedSeeding++;
if (!bIsFirstP)
forcedSeedingNonFP++;
}
} else if (state == Download.ST_SEEDING) {
if (bIsFirstP) {
stalledFPSeeders++;
}
stalledSeeders++;
}
if (state == Download.ST_READY || state == Download.ST_WAITING
|| state == Download.ST_PREPARING) {
waitingToSeed++;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -