debug = $debug; $this->mysqli = $mysqli; $this->user = $user; $this->share = $share; $this->config = $config; $this->debug->append("Instantiated Worker class", 2); } // get and set methods private function setErrorMessage($msg) { $this->sError = $msg; } public function getError() { return $this->sError; } 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; } /** * Update worker list for a user * @param account_id int User ID * @param data array All workers and their settings * @return bool **/ public function updateWorkers($account_id, $data) { $username = $this->user->getUserName($account_id); foreach ($data as $key => $value) { // Prefix the WebUser to Worker name $value['username'] = "$username." . $value['username']; $stmt = $this->mysqli->prepare("UPDATE $this->table SET password = ?, username = ? WHERE account_id = ? AND id = ?"); if ($this->checkStmt($stmt)) { if (!$stmt->bind_param('ssii', $value['password'], $value['username'], $account_id, $key)) return false; if (!$stmt->execute()) return false; $stmt->close(); } } return true; } /** * Fetch all workers for an account * @param account_id int User ID * @return mixed array Workers and their settings or false **/ public function getWorkers($account_id) { $stmt = $this->mysqli->prepare(" SELECT id, username, password, ( SELECT SIGN(COUNT(id)) FROM " . $this->share->getTableName() . " WHERE username = $this->table.username AND time > DATE_SUB(now(), INTERVAL 10 MINUTE)) AS active, ( SELECT ROUND(COUNT(id) * POW(2, " . $this->config['difficulty'] . ")/600/1000) FROM " . $this->share->getTableName() . " WHERE username = $this->table.username AND time > DATE_SUB(now(), INTERVAL 10 MINUTE)) AS hashrate FROM $this->table WHERE account_id = ?"); if ($this->checkStmt($stmt) && $stmt->bind_param('i', $account_id) && $stmt->execute() && $result = $stmt->get_result()) return $result->fetch_all(MYSQLI_ASSOC); // Catchall $this->setErrorMessage('Failed to fetch workers for your account'); $this->debug->append('Fetching workers failed: ' . $this->mysqli->error); return false; } /** * Get all currently active workers in the past 10 minutes * @param none * @return data mixed int count if any workers are active, false otherwise **/ public function getCountAllActiveWorkers() { $stmt = $this->mysqli->prepare("SELECT COUNT(DISTINCT username) AS total FROM " . $this->share->getTableName() . " WHERE time > DATE_SUB(now(), INTERVAL 10 MINUTE)"); if ($this->checkStmt($stmt)) { if (!$stmt->execute()) { return false; } $result = $stmt->get_result(); $stmt->close(); return $result->fetch_object()->total; } return false; } /** * Add new worker to an existing web account * The webuser name is prefixed to the worker name * Passwords are plain text for pushpoold * @param account_id int User ID * @param workerName string Worker name * @param workerPassword string Worker password * @return bool **/ public function addWorker($account_id, $workerName, $workerPassword) { $username = $this->user->getUserName($account_id); $workerName = "$username.$workerName"; $stmt = $this->mysqli->prepare("INSERT INTO $this->table (account_id, username, password) VALUES(?, ?, ?)"); if ($this->checkStmt($stmt)) { $stmt->bind_param('iss', $account_id, $workerName, $workerPassword); if (!$stmt->execute()) { $this->setErrorMessage( 'Failed to add worker' ); if ($stmt->sqlstate == '23000') $this->setErrorMessage( 'Worker already exists' ); return false; } return true; } return false; } /** * Delete existing worker from account * @param account_id int User ID * @param id int Worker ID * @return bool **/ public function deleteWorker($account_id, $id) { $stmt = $this->mysqli->prepare("DELETE FROM $this->table WHERE account_id = ? AND id = ?"); if ($this->checkStmt($stmt)) { $stmt->bind_param('ii', $account_id, $id); if ($stmt->execute() && $stmt->affected_rows == 1) { $stmt->close; return true; } else { $this->setErrorMessage( 'Unable to delete worker' ); } } return false; } } $worker = new Worker($debug, $mysqli, $user, $share, $config);