static function calculateScore($conn) { // calculate score $query = ' SELECT ifnull(SUM(quest.score),0) as sum_score FROM users_quests INNER JOIN quest ON quest.idquest = users_quests.questid AND quest.gameid = ? WHERE (users_quests.userid = ?) '; $score = 0; $stmt = $conn->prepare($query); $stmt->execute(array(APIGame::id(), APISecurity::userid())); if ($row = $stmt->fetch()) { $score = $row['sum_score']; } return $score; }
$stmt_users_quests = $conn->prepare("INSERT INTO users_quests(userid, questid, dt_passed) VALUES(?,?,NOW())"); $stmt_users_quests->execute(array(APISecurity::userid(), $questid)); $new_user_score = APIHelpers::calculateScore($conn); $response['new_user_score'] = intval($new_user_score); if (APISecurity::score() != $response['new_user_score']) { APISecurity::setUserScore($response['new_user_score']); $query2 = 'UPDATE users_games SET date_change = NOW(), score = ? WHERE userid = ? AND gameid = ?;'; $stmt2 = $conn->prepare($query2); $stmt2->execute(array(intval($new_user_score), APISecurity::userid(), APIGame::id())); } APIQuest::updateCountUserSolved($conn, $questid); APIAnswerList::addTryAnswer($conn, $questid, $answer, $real_answer, $levenshtein, 'Yes'); APIAnswerList::movedToBackup($conn, $questid); // add to public events if (!APISecurity::isAdmin()) { APIEvents::addPublicEvents($conn, "users", 'User #' . APISecurity::userid() . ' {' . APISecurity::nick() . '} passed quest #' . $questid . ' {' . $questname . '} from game #' . APIGame::id() . ' {' . APIGame::title() . '} (new user score: ' . $new_user_score . ')'); } } else { // check already try pass $stmt_check_tryanswer = $conn->prepare('select count(*) as cnt from tryanswer where answer_try = ? and iduser = ? and idquest = ?'); $stmt_check_tryanswer->execute(array($answer, $userid, intval($questid))); if ($row_check_tryanswer = $stmt_check_tryanswer->fetch()) { $count = intval($row_check_tryanswer['cnt']); $response['checkanswer'] = array($answer, $userid, intval($questid)); if ($count > 0) { APIHelpers::showerror(1318, 'Your already try this answer. Levenshtein distance: ' . $levenshtein); } } APIAnswerList::addTryAnswer($conn, $questid, $answer, $real_answer, $levenshtein, 'No'); APIHelpers::showerror(1216, 'Answer incorrect. Levenshtein distance: ' . $levenshtein); }
$stmt = $conn->prepare('SELECT * FROM quest WHERE idquest = ?'); $stmt->execute(array(intval($questid))); if ($row = $stmt->fetch()) { $name = $row['name']; $subject = $row['subject']; } else { APIHelpers::showerror(1190, 'Quest #' . $gameid . ' does not exists.'); } } catch (PDOException $e) { APIHelpers::showerror(1152, $e->getMessage()); } // todo recalculate score for users try { $stmt_quest = $conn->prepare('DELETE FROM quest WHERE idquest = ?'); $stmt_quest->execute(array(intval($questid))); // remove from tryanswer $stmt_tryanswer = $conn->prepare('DELETE FROM tryanswer WHERE idquest = ?'); $stmt_tryanswer->execute(array(intval($questid))); // remove from tryanswer_backup $stmt_tryanswer_backup = $conn->prepare('DELETE FROM tryanswer_backup WHERE idquest = ?'); $stmt_tryanswer_backup->execute(array(intval($questid))); // remove from users_quests $stmt_users_quests = $conn->prepare('DELETE FROM users_quests WHERE questid = ?'); $stmt_users_quests->execute(array(intval($questid))); $response['result'] = 'ok'; APIEvents::addPublicEvents($conn, "quests", "Removed quest #" . $questid . ' ' . htmlspecialchars($name) . ' (subject: ' . htmlspecialchars($subject) . ') '); } catch (PDOException $e) { APIHelpers::showerror(1063, $e->getMessage()); } APIQuest::updateMaxGameScore($conn, APIGame::id()); APIHelpers::endpage($response);
$response['result'] = 'ok'; $conn = APIHelpers::createConnection($config); $response['userid'] = APISecurity::userid(); $params = array(); $params[] = APISecurity::userid(); $params[] = intval($questid); $filter_by_state = ''; $filter_by_score = ''; $filter_by_game = ''; if (!APISecurity::isAdmin()) { $filter_by_state = ' AND quest.state = ?'; $params[] = 'open'; $filter_by_score = ' AND quest.min_score <= ?'; $params[] = APISecurity::score(); $filter_by_game = ' AND quest.gameid = ? '; $params[] = APIGame::id(); } $query = ' SELECT quest.idquest, quest.name, quest.score, quest.min_score, quest.text, quest.state, quest.subject, quest.author, quest.gameid, users_quests.dt_passed FROM quest
WHERE gameid = ? ' . $filter_by_state . ' ' . $filter_by_score . ' GROUP BY quest.subject '); $stmt->execute(array(APIGame::id())); while ($row = $stmt->fetch()) { $response['subjects'][$row['subject']] = $row['cnt']; } } catch (PDOException $e) { APIHelpers::showerror(1100, $e->getMessage()); } /*$userid = APIHelpers::getParam('userid', 0);*/ $params = array(APISecurity::userid(), APIGame::id()); // filter by status $arrWhere_status = array(); if ($response['filter']['open']) { $arrWhere_status[] = '(isnull(users_quests.dt_passed))'; } if ($response['filter']['completed']) { $arrWhere_status[] = '(not isnull(users_quests.dt_passed))'; } $where_status = ''; if (count($arrWhere_status) > 0) { $where_status = ' AND (' . implode(' OR ', $arrWhere_status) . ')'; } // filter by subjects $filter_subjects = getParam('filter_subjects', ''); $filter_subjects = explode(',', $filter_subjects);