questlab/models/CharactersModel.inc

703 lines
36 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/**
* Questlab
*
* @author Oliver Hanraths <oliver.hanraths@uni-duesseldorf.de>
* @copyright 2014 2016 Heinrich-Heine-Universität Düsseldorf
* @license http://www.gnu.org/licenses/gpl.html
* @link https://github.com/coderkun/questlab
*/
namespace hhu\z\models;
/**
* Model to interact with Characters-table.
*
* @author Oliver Hanraths <oliver.hanraths@uni-duesseldorf.de>
*/
class CharactersModel extends \hhu\z\Model
{
/**
* Construct a new CharactersModel.
*/
public function __construct()
{
parent::__construct();
}
/**
* Get all characters for an user.
*
* @param int $userId ID of the user
* @return array Characters
*/
public function getCharactersForUser($userId)
{
return $this->db->query(
'SELECT '.
'characters.id, characters.created, characters.user_id, characters.name, characters.url, characters.gender, characters.charactertitle_id, cache_characters.xps, cache_characters.quest_xps, cache_characters.avatar_id, '.
'charactertypes.id AS charactertype_id, charactertypes.name AS charactertype_name, charactertypes.url AS charactertype_url, '.
'xplevels.id AS xplevel_id, xplevels.level AS xplevel, '.
'seminaries.id AS seminary_id, seminaries.url AS seminary_url, seminaries.title AS seminary_title, seminaries.url AS seminary_url '.
'FROM characters '.
'LEFT JOIN cache_characters ON cache_characters.character_id = characters.id '.
'LEFT JOIN charactertypes ON charactertypes.id = characters.charactertype_id '.
'LEFT JOIN xplevels ON xplevels.id = cache_characters.xplevel_id '.
'LEFT JOIN seminaries ON seminaries.id = charactertypes.seminary_id '.
'WHERE characters.user_id = ?',
'i',
$userId
);
}
/**
* Get count of Characters for a Seminary.
*
* @param int $seminaryId ID of the Seminary
* @param string $charactername Only get Characters with the given name (optional)
* @return int Count of Characters
*/
public function getCharactersForSeminaryCount($seminaryId, $charactername=null)
{
$data = $this->db->query(
'SELECT count(DISTINCT characters.id) AS c '.
'FROM characters '.
'LEFT JOIN charactertypes ON charactertypes.id = characters.charactertype_id '.
'LEFT JOIN seminaries ON seminaries.id = charactertypes.seminary_id '.
'WHERE seminaries.id = ? '.
(!is_null($charactername) ? sprintf('AND characters.name LIKE \'%%%s%%\'', $charactername) : null),
'i',
$seminaryId
);
if(!empty($data)) {
return $data[0]['c'];
}
return 0;
}
/**
* Get Characters for a Seminary.
*
* @param int $seminaryId ID of the Seminary
* @param bool $onlyWithRole Only Characters that have at least one role assigned (optional)
* @return array Characters
*/
public function getCharactersForSeminary($seminaryId, $onlyWithRole=false)
{
return $this->db->query(
'SELECT '.
'characters.id, characters.created, characters.user_id, characters.name, characters.url, characters.gender, characters.charactertitle_id, cache_characters.xps, cache_characters.quest_xps, cache_characters.avatar_id, '.
'charactertypes.id AS charactertype_id, charactertypes.name AS charactertype_name, charactertypes.url AS charactertype_url, '.
'xplevels.id AS xplevel_id, xplevels.level AS xplevel, '.
'seminaries.id AS seminary_id, seminaries.url AS seminary_url, seminaries.title AS seminary_title, seminaries.url AS seminary_url '.
'FROM characters '.
'LEFT JOIN cache_characters ON cache_characters.character_id = characters.id '.
'LEFT JOIN charactertypes ON charactertypes.id = characters.charactertype_id '.
'LEFT JOIN xplevels ON xplevels.id = cache_characters.xplevel_id '.
'LEFT JOIN seminaries ON seminaries.id = charactertypes.seminary_id '.
'WHERE seminaries.id = ?'.
($onlyWithRole ? ' AND EXISTS (SELECT character_id FROM characters_characterroles WHERE character_id = characters.id)' : null),
'i',
$seminaryId
);
}
/**
* Get Characters for a Seminary sorted and optionally limited.
*
* @param int $seminaryId ID of the Seminary
* @param string $sort Field to sort by
* @param string $charactername Only get Characters with the given name (optional)
* @param int $limit Limit amount of Characters (optional)
* @param int $offset Offset (optional)
* @return array Characters
*/
public function getCharactersForSeminarySorted($seminaryId, $sort, $charactername='', $limit=null, $offset=0)
{
switch($sort)
{
case 'name':
case 'created':
case 'xps':
$orders = array(
'name' => 'ASC',
'created' => 'DESC',
'xps' => 'DESC'
);
return $this->db->query(
'SELECT '.
'characters.id, characters.created, characters.user_id, characters.name, characters.url, characters.gender, characters.charactertitle_id, cache_characters.xps, cache_characters.quest_xps, cache_characters.avatar_id, '.
'charactertypes.id AS charactertype_id, charactertypes.name AS charactertype_name, charactertypes.url AS charactertype_url, '.
'xplevels.id AS xplevel_id, xplevels.level AS xplevel, '.
'seminaries.id AS seminary_id, seminaries.url AS seminary_url, seminaries.title AS seminary_title, seminaries.url AS seminary_url '.
'FROM characters '.
'LEFT JOIN cache_characters ON cache_characters.character_id = characters.id '.
'LEFT JOIN charactertypes ON charactertypes.id = characters.charactertype_id '.
'LEFT JOIN xplevels ON xplevels.id = cache_characters.xplevel_id '.
'LEFT JOIN seminaries ON seminaries.id = charactertypes.seminary_id '.
'WHERE seminaries.id = ? '.
(!is_null($charactername) ? sprintf(' AND characters.name LIKE \'%%%s%%\' ', $charactername) : null).
sprintf(
'ORDER BY %s.%s %s ',
($sort == 'xps' ? 'cache_characters' : 'characters'),
$sort,
$orders[$sort]
).
(!empty($limit) ? sprintf('LIMIT %d, %d', $offset, $limit) : null),
'i',
$seminaryId
);
break;
case 'role':
return $this->db->query(
'SELECT DISTINCT '.
'characters.id, characters.created, characters.user_id, characters.name, characters.url, characters.gender, characters.charactertitle_id, cache_characters.xps, cache_characters.quest_xps, cache_characters.avatar_id, '.
'charactertypes.id AS charactertype_id, charactertypes.name AS charactertype_name, charactertypes.url AS charactertype_url, '.
'xplevels.id AS xplevel_id, xplevels.level AS xplevel, '.
'seminaries.id AS seminary_id, seminaries.url AS seminary_url, seminaries.title AS seminary_title, seminaries.url AS seminary_url '.
'FROM characters '.
'LEFT JOIN cache_characters ON cache_characters.character_id = characters.id '.
'LEFT JOIN charactertypes ON charactertypes.id = characters.charactertype_id '.
'LEFT JOIN xplevels ON xplevels.id = cache_characters.xplevel_id '.
'LEFT JOIN seminaries ON seminaries.id = charactertypes.seminary_id '.
'LEFT JOIN characters_characterroles ON characters_characterroles.character_id = characters.id '.
'LEFT JOIN characterroles ON characterroles.id = characters_characterroles.characterrole_id '.
'WHERE seminaries.id = ? '.
(!is_null($charactername) ? sprintf(' AND characters.name LIKE \'%%%s%%\' ', $charactername) : null).
'ORDER BY characterroles.id IS NULL, characterroles.id ASC '.
(!empty($limit) ? sprintf('LIMIT %d, %d', $offset, $limit) : null),
'i',
$seminaryId
);
break;
default:
return $this->db->query(
'SELECT DISTINCT '.
'characters.id, characters.created, characters.user_id, characters.name, characters.url, characters.gender, characters.charactertitle_id, cache_characters.xps, cache_characters.quest_xps, cache_characters.avatar_id, '.
'charactertypes.id AS charactertype_id, charactertypes.name AS charactertype_name, charactertypes.url AS charactertype_url, '.
'xplevels.id AS xplevel_id, xplevels.level AS xplevel, '.
'seminaries.id AS seminary_id, seminaries.url AS seminary_url, seminaries.title AS seminary_title, seminaries.url AS seminary_url '.
'FROM characters '.
'LEFT JOIN cache_characters ON cache_characters.character_id = characters.id '.
'LEFT JOIN charactertypes ON charactertypes.id = characters.charactertype_id '.
'LEFT JOIN xplevels ON xplevels.id = cache_characters.xplevel_id '.
'LEFT JOIN seminaries ON seminaries.id = charactertypes.seminary_id '.
'LEFT JOIN characters_seminarycharacterfields ON characters_seminarycharacterfields.character_id = characters.id '.
'LEFT JOIN seminarycharacterfields ON seminarycharacterfields.id = characters_seminarycharacterfields.seminarycharacterfield_id AND seminarycharacterfields.url = ? '.
'WHERE seminaries.id = ? '.
(!is_null($charactername) ? sprintf(' AND characters.name LIKE \'%%%s%%\' ', $charactername) : null).
'ORDER BY characters_seminarycharacterfields.value ASC '.
(!empty($limit) ? sprintf('LIMIT %d, %d', $offset, $limit) : null),
'si',
$sort,
$seminaryId
);
break;
}
}
/**
* Get Characters for a Character group.
*
* @param int $groupId ID of the Character group
* @return array Characters
*/
public function getCharactersForGroup($groupId)
{
return $this->db->query(
'SELECT '.
'characters.id, characters.created, characters.user_id, characters.name, characters.url, characters.gender, characters.charactertitle_id, cache_characters.xps, cache_characters.quest_xps, cache_characters.avatar_id, '.
'charactertypes.id AS charactertype_id, charactertypes.name AS charactertype_name, charactertypes.url AS charactertype_url, '.
'xplevels.id AS xplevel_id, xplevels.level AS xplevel '.
'FROM characters '.
'LEFT JOIN characters_charactergroups ON characters_charactergroups.character_id = characters.id '.
'LEFT JOIN cache_characters ON cache_characters.character_id = characters.id '.
'LEFT JOIN charactertypes ON charactertypes.id = characters.charactertype_id '.
'LEFT JOIN xplevels ON xplevels.id = cache_characters.xplevel_id '.
'WHERE characters_charactergroups.charactergroup_id = ? '.
'ORDER BY cache_characters.xps DESC',
'i',
$groupId
);
}
/**
* Get the character of a user for a Seminary.
*
* @throws \nre\exceptions\IdNotFoundException
* @param int $userId ID of the user
* @param int $seminaryId ID of the Seminary
* @return array Character data
*/
public function getCharacterForUserAndSeminary($userId, $seminaryId)
{
$data = $this->db->query(
'SELECT '.
'characters.id, characters.created, characters.user_id, characters.name, characters.url, characters.gender, characters.charactertitle_id, cache_characters.xps, cache_characters.quest_xps, cache_characters.avatar_id, '.
'charactertypes.id AS charactertype_id, charactertypes.name AS charactertype_name, charactertypes.url AS charactertype_url, '.
'xplevels.id AS xplevel_id, xplevels.level AS xplevel '.
'FROM characters '.
'LEFT JOIN cache_characters ON cache_characters.character_id = characters.id '.
'LEFT JOIN charactertypes ON charactertypes.id = characters.charactertype_id '.
'LEFT JOIN xplevels ON xplevels.id = cache_characters.xplevel_id '.
'WHERE characters.user_id = ? AND charactertypes.seminary_id = ?',
'ii',
$userId, $seminaryId
);
if(empty($data)) {
throw new \nre\exceptions\IdNotFoundException($userId);
}
return $data[0];
}
/**
* Get a Character by its Url.
*
* @throws \nre\exceptions\IdNotFoundException
* @param int $seminaryId ID of the Seminary
* @param string $characterUrl URL-name of the Character
* @return array Character data
*/
public function getCharacterByUrl($seminaryId, $characterUrl)
{
$data = $this->db->query(
'SELECT '.
'characters.id, characters.created, characters.user_id, characters.name, characters.url, characters.gender, characters.charactertitle_id, cache_characters.xps, cache_characters.quest_xps, cache_characters.avatar_id, '.
'charactertypes.id AS charactertype_id, charactertypes.name AS charactertype_name, charactertypes.url AS charactertype_url, '.
'xplevels.id AS xplevel_id, xplevels.level AS xplevel '.
'FROM characters '.
'LEFT JOIN cache_characters ON cache_characters.character_id = characters.id '.
'LEFT JOIN charactertypes ON charactertypes.id = characters.charactertype_id '.
'LEFT JOIN xplevels ON xplevels.id = cache_characters.xplevel_id '.
'WHERE charactertypes.seminary_id = ? AND characters.url = ?',
'is',
$seminaryId, $characterUrl
);
if(empty($data)) {
throw new \nre\exceptions\IdNotFoundException($characterUrl);
}
return $data[0];
}
/**
* Get a Character by its Id.
*
* @throws \nre\exceptions\IdNotFoundException
* @param string $characterId ID of the Character
* @return array Character data
*/
public function getCharacterById($characterId)
{
$data = $this->db->query(
'SELECT '.
'characters.id, characters.created, characters.user_id, characters.name, characters.url, characters.gender, characters.charactertitle_id, cache_characters.xps,cache_characters.quest_xps, cache_characters.avatar_id, '.
'charactertypes.id AS charactertype_id, charactertypes.name AS charactertype_name, charactertypes.url AS charactertype_url, '.
'xplevels.id AS xplevel_id, xplevels.level AS xplevel '.
'FROM characters '.
'LEFT JOIN cache_characters ON cache_characters.character_id = characters.id '.
'LEFT JOIN charactertypes ON charactertypes.id = characters.charactertype_id '.
'LEFT JOIN xplevels ON xplevels.id = cache_characters.xplevel_id '.
'WHERE characters.id = ?',
'i',
$characterId
);
if(empty($data)) {
throw new \nre\exceptions\IdNotFoundException($characterId);
}
return $data[0];
}
/**
* Get Characters with the given Character role.
*
* @param string $characterrole Character role
* @return array List of Characters
*/
public function getCharactersWithRole($characterrole)
{
return $this->db->query(
'SELECT characters.id, characters.created, characters.user_id, characters.name, characters.url, characters.gender, characters.charactertitle_id '.
'FROM characters '.
'LEFT JOIN characters_characterroles ON characters_characterroles.character_id = characters.id '.
'LEFT JOIN characterroles ON characterroles.id = characters_characterroles.characterrole_id '.
'WHERE characterroles.name = ? '.
'ORDER BY name ASC',
's',
$characterrole
);
}
/**
* Get Characters with the most amount of Achievements.
*
* @param int $seminaryId ID of Seminary
* @param int $count Amount of Characters to retrieve
* @param bool $alsoWithDeadline Include Achievements with deadline (optional)
* @return array List of Characters
*/
public function getCharactersWithMostAchievements($seminaryId, $count, $alsoWithDeadline=true)
{
return $this->db->query(
'SELECT '.
'characters.id, characters.created, characters.user_id, characters.name, characters.url, characters.gender, characters.charactertitle_id, cache_characters.xps, cache_characters.quest_xps, cache_characters.avatar_id, '.
'charactertypes.id AS charactertype_id, charactertypes.name AS charactertype_name, charactertypes.url AS charactertype_url, '.
'xplevels.id AS xplevel_id, xplevels.level AS xplevel, '.
'count(DISTINCT achievement_id) AS c '.
'FROM achievements_characters '.
'INNER JOIN achievements ON achievements.id = achievements_characters.achievement_id '.
'INNER JOIN characters ON characters.id = achievements_characters.character_id '.
'INNER JOIN cache_characters ON cache_characters.character_id = characters.id '.
'INNER JOIN charactertypes ON charactertypes.id = characters.charactertype_id '.
'INNER JOIN xplevels ON xplevels.id = cache_characters.xplevel_id '.
'INNER JOIN characters_characterroles ON characters_characterroles.character_id = characters.id '.
'INNER JOIN characterroles ON characterroles.id = characters_characterroles.characterrole_id AND characterroles.name = ? '.
'WHERE achievements.seminary_id = ? AND deadline IS NULL '.
(!$alsoWithDeadline ? 'AND achievements.deadline IS NULL ' : null).
'GROUP BY achievements_characters.character_id '.
'ORDER BY count(DISTINCT achievements_characters.achievement_id) DESC '.
'LIMIT ?',
'sii',
'user',
$seminaryId,
$count
);
}
/**
* Get the rank of a XP-value of a Character.
*
* @param int $seminaryId ID of Seminary
* @param int $xps XP-value to get rank for
* @return int Rank of XP-value
*/
public function getXPRank($seminaryId, $xps)
{
$data = $this->db->query(
'SELECT count(characters.id) AS c '.
'FROM charactertypes '.
'INNER JOIN characters ON characters.charactertype_id = charactertypes.id '.
'INNER JOIN cache_characters ON cache_characters.character_id = characters.id '.
'INNER JOIN characters_characterroles ON characters_characterroles.character_id = characters.id '.
'INNER JOIN characterroles ON characterroles.id = characters_characterroles.characterrole_id AND characterroles.name = ? '.
'WHERE seminary_id = ? AND cache_characters.xps > ?',
'sid',
'user',
$seminaryId, $xps
);
if(!empty($data)) {
return $data[0]['c'] + 1;
}
return 1;
}
/**
* Get the superior $count Characters in the ranking.
*
* @param int $seminaryId ID of Seminary
* @param int $xps XP-value of Character
* @param int $count Count of Characters to determine
* @return array List of superior Characters
*/
public function getSuperiorCharacters($seminaryId, $xps, $count)
{
$data = $this->db->query(
'SELECT '.
'characters.id, characters.created, characters.user_id, characters.name, characters.url, characters.gender, characters.charactertitle_id, cache_characters.xps,cache_characters.quest_xps, cache_characters.avatar_id, '.
'charactertypes.id AS charactertype_id, charactertypes.name AS charactertype_name, charactertypes.url AS charactertype_url, '.
'xplevels.id AS xplevel_id, xplevels.level AS xplevel '.
'FROM characters '.
'INNER JOIN characters_characterroles ON characters_characterroles.character_id = characters.id '.
'INNER JOIN characterroles ON characterroles.id = characters_characterroles.characterrole_id AND characterroles.name = ? '.
'INNER JOIN cache_characters ON cache_characters.character_id = characters.id '.
'INNER JOIN charactertypes ON charactertypes.id = characters.charactertype_id '.
'INNER JOIN xplevels ON xplevels.id = cache_characters.xplevel_id '.
'WHERE charactertypes.seminary_id = ? AND cache_characters.xps > ? '.
'ORDER BY cache_characters.xps ASC, RAND() '.
'LIMIT ?',
'sidd',
'user',
$seminaryId, $xps, $count
);
$data = array_reverse($data);
return $data;
}
/**
* Get the inferior $count Characters in the ranking.
*
* @param int $seminaryId ID of Seminary
* @param int characterId ID of Character
* @param int $xps XP-value of Character
* @param int $count Count of Characters to determine
* @return array List of inferior Characters
*/
public function getInferiorCharacters($seminaryId, $characterId, $xps, $count)
{
return $this->db->query(
'SELECT '.
'characters.id, characters.created, characters.user_id, characters.name, characters.url, characters.gender, characters.charactertitle_id, cache_characters.xps,cache_characters.quest_xps, cache_characters.avatar_id, '.
'charactertypes.id AS charactertype_id, charactertypes.name AS charactertype_name, charactertypes.url AS charactertype_url, '.
'xplevels.id AS xplevel_id, xplevels.level AS xplevel '.
'FROM characters '.
'INNER JOIN characters_characterroles ON characters_characterroles.character_id = characters.id '.
'INNER JOIN characterroles ON characterroles.id = characters_characterroles.characterrole_id AND characterroles.name = ? '.
'INNER JOIN cache_characters ON cache_characters.character_id = characters.id '.
'INNER JOIN charactertypes ON charactertypes.id = characters.charactertype_id '.
'INNER JOIN xplevels ON xplevels.id = cache_characters.xplevel_id '.
'WHERE charactertypes.seminary_id = ? AND cache_characters.xps <= ? AND characters.id <> ? '.
'ORDER BY cache_characters.xps DESC, RAND() '.
'LIMIT ?',
'sidid',
'user',
$seminaryId, $xps, $characterId, $count
);
}
/**
* Get Characters that solved a Quest.
*
* @param int $questId ID of Quest to get Characters for
* @return array Characters data
*/
public function getCharactersSolvedQuest($questId)
{
return $data = $this->db->query(
'SELECT '.
'characters.id, characters.created, characters.user_id, characters.name, characters.url, characters.gender, characters.charactertitle_id, cache_characters.xps,cache_characters.quest_xps, cache_characters.avatar_id, '.
'charactertypes.id AS charactertype_id, charactertypes.name AS charactertype_name, charactertypes.url AS charactertype_url, '.
'xplevels.id AS xplevel_id, xplevels.level AS xplevel, '.
'quests_characters.created AS submission_created '.
'FROM quests_characters '.
'INNER JOIN characters ON characters.id = quests_characters.character_id '.
'INNER JOIN cache_characters ON cache_characters.character_id = characters.id '.
'INNER JOIN charactertypes ON charactertypes.id = characters.charactertype_id '.
'INNER JOIN xplevels ON xplevels.id = cache_characters.xplevel_id '.
'WHERE quests_characters.quest_id = ? AND quests_characters.status = ? AND NOT EXISTS ('.
'SELECT id '.
'FROM quests_characters AS qc '.
'WHERE qc.quest_id = quests_characters.quest_id AND qc.character_id = quests_characters.character_id AND qc.created > quests_characters.created'.
') '.
'ORDER BY quests_characters.created ASC',
'ii',
$questId, QuestsModel::QUEST_STATUS_SOLVED
);
}
/**
* Get Characters that did not solv a Quest.
*
* @param int $questId ID of Quest to get Characters for
* @return array Characters data
*/
public function getCharactersUnsolvedQuest($questId)
{
return $data = $this->db->query(
'SELECT '.
'characters.id, characters.created, characters.user_id, characters.name, characters.url, characters.gender, characters.charactertitle_id, cache_characters.xps,cache_characters.quest_xps, cache_characters.avatar_id, '.
'charactertypes.id AS charactertype_id, charactertypes.name AS charactertype_name, charactertypes.url AS charactertype_url, '.
'xplevels.id AS xplevel_id, xplevels.level AS xplevel, '.
'quests_characters.created AS submission_created '.
'FROM quests_characters '.
'INNER JOIN characters ON characters.id = quests_characters.character_id '.
'INNER JOIN cache_characters ON cache_characters.character_id = characters.id '.
'INNER JOIN charactertypes ON charactertypes.id = characters.charactertype_id '.
'INNER JOIN xplevels ON xplevels.id = cache_characters.xplevel_id '.
'WHERE quests_characters.quest_id = ? AND quests_characters.status = ? AND NOT EXISTS ('.
'SELECT id '.
'FROM quests_characters AS qc '.
'WHERE qc.quest_id = quests_characters.quest_id AND qc.character_id = quests_characters.character_id AND qc.created > quests_characters.created'.
') '.
'ORDER BY quests_characters.created ASC',
'ii',
$questId, QuestsModel::QUEST_STATUS_UNSOLVED
);
}
/**
* Get Characters that sent a submission for a Quest.
*
* @param int $questId ID of Quest to get Characters for
* @return array Characters data
*/
public function getCharactersSubmittedQuest($questId)
{
return $data = $this->db->query(
'SELECT '.
'characters.id, characters.created, characters.user_id, characters.name, characters.url, characters.gender, characters.charactertitle_id, cache_characters.xps,cache_characters.quest_xps, cache_characters.avatar_id, '.
'charactertypes.id AS charactertype_id, charactertypes.name AS charactertype_name, charactertypes.url AS charactertype_url, '.
'xplevels.id AS xplevel_id, xplevels.level AS xplevel, '.
'quests_characters.created AS submission_created '.
'FROM quests_characters '.
'INNER JOIN characters ON characters.id = quests_characters.character_id '.
'INNER JOIN cache_characters ON cache_characters.character_id = characters.id '.
'INNER JOIN charactertypes ON charactertypes.id = characters.charactertype_id '.
'INNER JOIN xplevels ON xplevels.id = cache_characters.xplevel_id '.
'WHERE quests_characters.quest_id = ? AND quests_characters.status = ? AND NOT EXISTS ('.
'SELECT id '.
'FROM quests_characters AS qc '.
'WHERE qc.quest_id = quests_characters.quest_id AND qc.character_id = quests_characters.character_id AND qc.created > quests_characters.created'.
') '.
'ORDER BY quests_characters.created ASC',
'ii',
$questId, QuestsModel::QUEST_STATUS_SUBMITTED
);
}
/**
* Get Characters with the given Character role.
*
* @param int $seminaryId ID of Seminary
* @param string $characterrole Character role
* @return array List of users
*/
public function getCharactersWithCharacterRole($seminaryId, $characterrole)
{
return $this->db->query(
'SELECT '.
'characters.id, characters.created, characters.user_id, characters.name, characters.url, characters.gender, characters.charactertitle_id, cache_characters.xps, cache_characters.quest_xps, cache_characters.avatar_id, '.
'charactertypes.id AS charactertype_id, charactertypes.name AS charactertype_name, charactertypes.url AS charactertype_url, '.
'xplevels.id AS xplevel_id, xplevels.level AS xplevel, '.
'seminaries.id AS seminary_id, seminaries.url AS seminary_url, seminaries.title AS seminary_title, seminaries.url AS seminary_url '.
'FROM characters '.
'LEFT JOIN cache_characters ON cache_characters.character_id = characters.id '.
'LEFT JOIN charactertypes ON charactertypes.id = characters.charactertype_id '.
'LEFT JOIN xplevels ON xplevels.id = cache_characters.xplevel_id '.
'LEFT JOIN seminaries ON seminaries.id = charactertypes.seminary_id '.
'LEFT JOIN characters_characterroles ON characters_characterroles.character_id = characters.id '.
'LEFT JOIN characterroles ON characterroles.id = characters_characterroles.characterrole_id '.
'WHERE seminaries.id = ? AND characterroles.name = ?',
'is',
$seminaryId, $characterrole
);
}
/**
* Check if a Character name already exists.
*
* @param string $name Character name to check
* @param int $characterId Do not check this ID (for editing)
* @return boolean Whether Character name exists or not
*/
public function characterNameExists($name, $characterId=null)
{
$data = $this->db->query(
'SELECT id '.
'FROM characters '.
'WHERE name = ? OR url = ?',
'ss',
$name,
\nre\core\Linker::createLinkParam($name)
);
return (!empty($data) && (is_null($characterId) || $characterId != $data[0]['id']));
}
/**
* Create a new Character.
*
* @param int $userId User-ID that creates the new character
* @param int $charactertypeId ID of type of new Character
* @param string $characterName Name for the new Character
* @param int $gender Gender of new Character
* @return int ID of Character
*/
public function createCharacter($userId, $charactertypeId, $characterName, $gender)
{
$this->db->query(
'INSERT INTO characters '.
'(user_id, charactertype_id, name, url, gender) '.
'VALUES '.
'(?, ?, ?, ?, ?)',
'iissi',
$userId,
$charactertypeId,
$characterName,
\nre\core\Linker::createLinkParam($characterName),
$gender
);
return $this->db->getInsertId();
}
/**
* Edit a new Character.
*
* @param int $characterId ID of the Character to edit
* @param int $charactertypeId ID of new type of Character
* @param string $characterName New name for Character
* @param int $gender New gender of Character
* @param int $charactertitleId ID of new Character title
*/
public function editCharacter($characterId, $charactertypeId, $characterName, $gender, $charactertitleId)
{
$this->db->query(
'UPDATE characters '.
'SET charactertype_id = ?, name = ?, url = ?, gender = ?, charactertitle_id = ? '.
'WHERE id = ?',
'issiii',
$charactertypeId,
$characterName,
\nre\core\Linker::createLinkParam($characterName),
$gender,
$charactertitleId,
$characterId
);
}
/**
* Delete a Character.
*
* @param int $characterId ID of the Character to delete
*/
public function deleteCharacter($characterId)
{
$this->db->query('DELETE FROM characters WHERE id = ?', 'i', $characterId);
}
}
?>