package com.twitstreet.task; import java.util.ArrayList; import java.util.List; import com.google.inject.Inject; import com.twitstreet.db.data.Portfolio; import com.twitstreet.db.data.Stock; import com.twitstreet.db.data.StockInPortfolio; import com.twitstreet.db.data.User; import com.twitstreet.main.TwitstreetException; import com.twitstreet.market.PortfolioMgr; import com.twitstreet.market.StockMgr; import com.twitstreet.session.UserMgr; public class AutoPlayerTask implements Runnable{ @Inject UserMgr userMgr; @Inject StockMgr stockMgr; @Inject PortfolioMgr portfolioMgr; List<User> autoplayerList = new ArrayList<User>(); List<Stock> suggestedStocks = new ArrayList<Stock>(); private static final long MIN_SLEEP = 5000; //5 sec private static final long MAX_SLEEP = 60000; //1 min private static final int SUGGESTED_STOCK_LIMIT = 200; private long lastSuggestedStockLoadTime = 0; private long lastAutoPlayerLoadTime = 0; private static final long MAX_SUGGESTED_STOCK_LOAD_DURATION = 20 * 60 * 1000; //20 min private static final long MAX_AUTOPLAYER_LOAD_DURATION = 4 * 60 * 60 * 1000; //4 hours private User getRandomAutoPlayer(){ if(autoplayerList.size() > 0){ int rnd = (int)(autoplayerList.size() * Math.random()); return autoplayerList.get(rnd); } return null; } @Override public void run() { while(true){ reloadAutoPlayers(); reloadSuggestedStocks(); User user = getRandomAutoPlayer(); try { if(user.getPortfolio() > user.getCash()){ Portfolio portfolio = portfolioMgr.getUserPortfolio(user); List<StockInPortfolio> stockInPortfolioList = portfolio.getStockInPortfolioList(); if(stockInPortfolioList != null && stockInPortfolioList.size() > 0){ int size = stockInPortfolioList.size(); int rnd = (int)(Math.random() * size); StockInPortfolio stockInPortfolio = stockInPortfolioList.get(rnd); Stock stock = stockMgr.getStockById(stockInPortfolio.getStockId()); portfolioMgr.sell(user, stock, (int)stockInPortfolio.getAmount()); } } else{ Stock stock = getRandomSuggestedStock(); try { if(stock != null){ portfolioMgr.buy(user, stock, stock.getAvailable()); } } catch (TwitstreetException e) { e.printStackTrace(); } } Thread.sleep(randomSleep()); } catch (InterruptedException e) { e.printStackTrace(); } } } private long randomSleep(){ return ((long)(Math.random() * (MAX_SLEEP - MIN_SLEEP))) + MIN_SLEEP; } private Stock getRandomSuggestedStock(){ reloadSuggestedStocks(); int size = suggestedStocks.size(); if(size > 0){ int rnd = (int)(Math.random() * size); return suggestedStocks.get(rnd); } return null; } private void reloadAutoPlayers(){ long elapsed = System.currentTimeMillis() - lastAutoPlayerLoadTime; if(elapsed > MAX_AUTOPLAYER_LOAD_DURATION){ userMgr.detectAutoPlayers(); autoplayerList = userMgr.getAllAutoPlayers(); lastAutoPlayerLoadTime = System.currentTimeMillis(); } } private void reloadSuggestedStocks(){ long elapsed = System.currentTimeMillis() - lastSuggestedStockLoadTime; if(elapsed > MAX_SUGGESTED_STOCK_LOAD_DURATION){ suggestedStocks = stockMgr.getSuggestedStocks(0, SUGGESTED_STOCK_LIMIT); lastSuggestedStockLoadTime = System.currentTimeMillis(); } } }