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;"}
+
+
+
+
+ | Name |
+ Value |
+
+
+
+
+ | 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" }
+
+
+
+
+ | Rank |
+ User Name |
+ Valid |
+ Invalid |
+
+
+
+{assign var=rank value=1}
+{assign var=listed value=0}
+{section contrib $ROUNDSHARES}
+
+ | {$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} |
+
+{/section}
+
+
+
+{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"}
+
+
+
+
+ | Tx Id |
+ User Name |
+ Type |
+ Amount |
+
+
+
+{section txs $ROUNDTRANSACTIONS}
+
+ | {$ROUNDTRANSACTIONS[txs].id|default:"0"} |
+ {$ROUNDTRANSACTIONS[txs].username|escape} |
+ {$ROUNDTRANSACTIONS[txs].type|default:""} |
+ {$ROUNDTRANSACTIONS[txs].amount|default:"0"|number_format:"8"} |
+
+{/section}
+
+
+
+{include file="global/block_footer.tpl"}