diff --git a/public/include/classes/roundstats.class.php b/public/include/classes/roundstats.class.php new file mode 100644 index 00000000..5cbbfb4e --- /dev/null +++ b/public/include/classes/roundstats.class.php @@ -0,0 +1,160 @@ +debug = $debug; + $this->mysqli = $mysqli; + $this->config = $config; + $this->debug->append("Instantiated RoundStats class", 2); + } + + // get and set methods + private function setErrorMessage($msg) { + $this->sError = $msg; + } + public function getError() { + return $this->sError; + } + + /** + * Get next block for round stats + **/ + public function getNextBlockDesc($iHeight=0) { + $stmt = $this->mysqli->prepare(" + SELECT height + FROM $this->tableBlocks + WHERE height < ? + ORDER BY height DESC + LIMIT 1"); + if ($this->checkStmt($stmt) && $stmt->bind_param('i', $iHeight) && $stmt->execute() && $result = $stmt->get_result()) + return $result->fetch_object()->height; + return false; + } + + /** + * Get prev block for round stats + **/ + public function getNextBlockAsc($iHeight=0) { + $stmt = $this->mysqli->prepare(" + SELECT height + FROM $this->tableBlocks + WHERE height > ? + ORDER BY height ASC + LIMIT 1"); + if ($this->checkStmt($stmt) && $stmt->bind_param('i', $iHeight) && $stmt->execute() && $result = $stmt->get_result()) + return $result->fetch_object()->height; + return false; + } + + /** + * Get details for block height + * @param height int Block Height + * @return data array Block information from DB + **/ + public function getDetailsForBlockHeight($iHeight=0, $isAdmin=0) { + $stmt = $this->mysqli->prepare(" + SELECT + b.id, height, amount, confirmations, difficulty, FROM_UNIXTIME(time) as time, shares, + IF(a.is_anonymous, IF( ? , a.username, 'anonymous'), a.username) AS finder + FROM $this->tableBlocks as b + LEFT JOIN $this->tableUsers AS a ON b.account_id = a.id + WHERE b.height = ? LIMIT 1"); + if ($this->checkStmt($stmt) && $stmt->bind_param('ii', $isAdmin, $iHeight) && $stmt->execute() && $result = $stmt->get_result()) + return $result->fetch_assoc(); + return false; + } + + /** + * Get shares statistics for round block height + * @param height int Block Height + * @return data array Block information from DB + **/ + public function getRoundStatsForAccounts($iHeight=0, $isAdmin=0) { + $stmt = $this->mysqli->prepare(" + SELECT + IF(a.is_anonymous, IF( ? , a.username, 'anonymous'), a.username) AS username, + s.valid, + s.invalid + FROM $this->tableStats AS s + LEFT JOIN $this->tableBlocks AS b ON s.block_id = b.id + LEFT JOIN $this->tableUsers AS a ON a.id = s.account_id + WHERE b.height = ? + GROUP BY username ASC + ORDER BY valid DESC + "); + if ($this->checkStmt($stmt) && $stmt->bind_param('ii', $isAdmin, $iHeight) && $stmt->execute() && $result = $stmt->get_result()) + return $result->fetch_all(MYSQLI_ASSOC); + return false; + } + + /** + * Get all transactions for round block height for admin + * @param height int Block Height + * @return data array Block round transactions + **/ + public function getAllRoundTransactions($iHeight=0) { + $this->debug->append("STA " . __METHOD__, 4); + $stmt = $this->mysqli->prepare(" + SELECT + t.id AS id, + a.username AS username, + t.type AS type, + t.amount AS amount + FROM $this->tableTrans AS t + LEFT JOIN $this->tableBlocks AS b ON t.block_id = b.id + LEFT JOIN $this->tableUsers AS a ON t.account_id = a.id + WHERE b.height = ? + ORDER BY id ASC"); + if ($this->checkStmt($stmt) && $stmt->bind_param('i', $iHeight) && $stmt->execute() && $result = $stmt->get_result()) + return $result->fetch_all(MYSQLI_ASSOC); + $this->debug->append('Unable to fetch transactions'); + return false; + } + + /** + * Get transactions for round block height user id + * @param height int Block Height + * @param id int user id + * @return data array Block round transactions for user id + **/ + public function getUserRoundTransactions($iHeight=0, $id=0) { + $this->debug->append("STA " . __METHOD__, 4); + $stmt = $this->mysqli->prepare(" + SELECT + t.id AS id, + a.username AS username, + t.type AS type, + t.amount AS amount + FROM $this->tableTrans AS t + LEFT JOIN $this->tableBlocks AS b ON t.block_id = b.id + LEFT JOIN $this->tableUsers AS a ON t.account_id = a.id + WHERE b.height = ? AND a.id = ? + ORDER BY id ASC"); + if ($this->checkStmt($stmt) && $stmt->bind_param('ii', $iHeight, $id) && $stmt->execute() && $result = $stmt->get_result()) + return $result->fetch_all(MYSQLI_ASSOC); + $this->debug->append('Unable to fetch transactions'); + return false; + } + + private function checkStmt($bState) { + if ($bState ===! true) { + $this->debug->append("Failed to prepare statement: " . $this->mysqli->error); + $this->setErrorMessage('Internal application Error'); + return false; + } + return true; + } + +} + +$roundstats = new RoundStats($debug, $mysqli, $config); diff --git a/public/include/pages/statistics/round.inc.php b/public/include/pages/statistics/round.inc.php index ac0adf66..06b3b8f5 100644 --- a/public/include/pages/statistics/round.inc.php +++ b/public/include/pages/statistics/round.inc.php @@ -3,17 +3,39 @@ // Make sure we are called from index.php if (!defined('SECURITY')) die('Hacking attempt'); -if ($user->isAuthenticated()) { - // Check if we want a specific round or general stats - if (!empty($_REQUEST['round'])) $round = $_REQUEST['round']; +if (!$smarty->isCached('master.tpl', $smarty_cache_key)) { + $debug->append('No cached version available, fetching from backend', 3); - // Cache detection and content generation - if (!$smarty->isCached('master.tpl', $smarty_cache_key)) { - $debug->append('No cached version available, fetching from backend', 3); +if (@$_REQUEST['next'] && !empty($_REQUEST['tx_key'])) { + $_REQUEST['tx_key'] = $roundstats->getNextBlockDesc($_REQUEST['tx_key']); +} else if (@$_REQUEST['prev'] && !empty($_REQUEST['tx_key'])) { + $_REQUEST['tx_key'] = $roundstats->getNextBlockAsc($_REQUEST['tx_key']); +} - } else { - $debug->append('Using cached page', 3); - } - $smarty->assign("CONTENT", "default.tpl"); +if (empty($_REQUEST['tx_key'])) { + $iBlock = $block->getLast(); + $iKey = $iBlock['height']; + $_REQUEST['tx_key'] = $iKey; +} else { + $iKey = $_REQUEST['tx_key']; } + + $aDetailsForBlockHeight = $roundstats->getDetailsForBlockHeight($iKey, $user->isAdmin($_SESSION['USERDATA']['id'])); + $aRoundShareStats = $roundstats->getRoundStatsForAccounts($iKey, $user->isAdmin($_SESSION['USERDATA']['id'])); + +if ($user->isAdmin($_SESSION['USERDATA']['id'])) { + $aUserRoundTransactions = $roundstats->getAllRoundTransactions($iKey); +} else { + $aUserRoundTransactions = $roundstats->getUserRoundTransactions($iKey, $_SESSION['USERDATA']['id']); +} + + // Propagate content our template + $smarty->assign('BLOCKDETAILS', $aDetailsForBlockHeight); + $smarty->assign('ROUNDSHARES', $aRoundShareStats); + $smarty->assign("ROUNDTRANSACTIONS", $aUserRoundTransactions); +} else { + $debug->append('Using cached page', 3); +} + +$smarty->assign("CONTENT", "default.tpl"); ?> diff --git a/public/templates/mmcFE/global/navigation.tpl b/public/templates/mmcFE/global/navigation.tpl index 407f24b0..75db64ce 100644 --- a/public/templates/mmcFE/global/navigation.tpl +++ b/public/templates/mmcFE/global/navigation.tpl @@ -30,6 +30,7 @@
  • Pool Stats
  • Block Stats
  • Hashrate Graphs
  • +
  • Round Stats
  • {else} diff --git a/public/templates/mmcFE/statistics/round/block_stats.tpl b/public/templates/mmcFE/statistics/round/block_stats.tpl new file mode 100644 index 00000000..40081671 --- /dev/null +++ b/public/templates/mmcFE/statistics/round/block_stats.tpl @@ -0,0 +1,61 @@ +{include file="global/block_header.tpl" ALIGN="left" BLOCK_STYLE="width: 100%" BLOCK_HEADER="Block Stats" STYLE="padding-left:5px;padding-right:5px;"} + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameValue
    Block Id{$BLOCKDETAILS.id|default:"0"}
    Heigth{$BLOCKDETAILS.height|default:"0"}
    Amount{$BLOCKDETAILS.amount|default:"0"}
    Confirmations{$BLOCKDETAILS.confirmations|default:"0"}
    Difficulty{$BLOCKDETAILS.difficulty|default:"0"}
    Time{$BLOCKDETAILS.time|default:"0"}
    Shares{$BLOCKDETAILS.shares|default:"0"}
    Finder{$BLOCKDETAILS.finder|default:"0"}
    +
    + + + + +
    + + + +
    +{include file="global/block_footer.tpl"} diff --git a/public/templates/mmcFE/statistics/round/default.tpl b/public/templates/mmcFE/statistics/round/default.tpl index 271b7a25..7098eb06 100644 --- a/public/templates/mmcFE/statistics/round/default.tpl +++ b/public/templates/mmcFE/statistics/round/default.tpl @@ -1 +1,9 @@ -Need content for me +{include file="global/block_header.tpl" BLOCK_HEADER="Round Statistics" BLOCK_STYLE="clear:none;"} + +{include file="statistics/round/block_stats.tpl"} + +{include file="statistics/round/round_transactions.tpl"} + +{include file="statistics/round/round_shares.tpl"} + +{include file="global/block_footer.tpl"} diff --git a/public/templates/mmcFE/statistics/round/round_shares.tpl b/public/templates/mmcFE/statistics/round/round_shares.tpl new file mode 100644 index 00000000..db1083d2 --- /dev/null +++ b/public/templates/mmcFE/statistics/round/round_shares.tpl @@ -0,0 +1,26 @@ +{include file="global/block_header.tpl" ALIGN="left" BLOCK_HEADER="Round Shares" } +
    + + + + + + + + + + +{assign var=rank value=1} +{assign var=listed value=0} +{section contrib $ROUNDSHARES} + + + + + + +{/section} + +
    RankUser NameValidInvalid
    {$rank++}{if $ROUNDSHARES[contrib].is_anonymous|default:"0" == 1}anonymous{else}{$ROUNDSHARES[contrib].username|escape}{/if}{$ROUNDSHARES[contrib].valid|number_format}{$ROUNDSHARES[contrib].invalid|number_format}
    +
    +{include file="global/block_footer.tpl"} diff --git a/public/templates/mmcFE/statistics/round/round_transactions.tpl b/public/templates/mmcFE/statistics/round/round_transactions.tpl new file mode 100644 index 00000000..ecb4ea75 --- /dev/null +++ b/public/templates/mmcFE/statistics/round/round_transactions.tpl @@ -0,0 +1,24 @@ +{include file="global/block_header.tpl" ALIGN="right" BLOCK_HEADER="Round Transactions"} +
    + + + + + + + + + + +{section txs $ROUNDTRANSACTIONS} + + + + + + +{/section} + +
    Tx IdUser NameTypeAmount
    {$ROUNDTRANSACTIONS[txs].id|default:"0"}{$ROUNDTRANSACTIONS[txs].username|escape}{$ROUNDTRANSACTIONS[txs].type|default:""}{$ROUNDTRANSACTIONS[txs].amount|default:"0"|number_format:"8"}
    +
    +{include file="global/block_footer.tpl"}