function msgQueryLocations($aRequest) { global $gSite; global $gGame; loadGameSettings(); $Out = Out::getInstance(); if (validRaidlead()) { $Connector = Connector::getInstance(); // Locations $ListLocations = $Connector->prepare('Select * FROM `' . RP_TABLE_PREFIX . 'Location` WHERE Game = :Game ORDER BY Name'); $ListLocations->bindValue(':Game', $gGame['GameId'], PDO::PARAM_STR); $Locations = array(); $ListLocations->loop(function ($Data) use(&$Locations) { $LocationData = array('id' => $Data['LocationId'], 'name' => $Data['Name'], 'image' => $Data['Image']); array_push($Locations, $LocationData); }); $Out->pushValue('location', $Locations); // Images $Images = @scandir('../themes/icons/' . $gSite['Iconset'] . '/raidsmall'); $ImageList = array(); if ($Images != null) { foreach ($Images as $Image) { if (strripos($Image, '.png') !== false) { array_push($ImageList, $Image); } } } $Out->pushValue('locationimage', $ImageList); } else { $Out->pushError(L('AccessDenied')); } }
function msgQueryNewRaidData($aRequest) { $Out = Out::getInstance(); if (validRaidlead()) { $Connector = Connector::getInstance(); // Settings $NewRaidSettings = $Connector->prepare('SELECT Name, IntValue, TextValue FROM `' . RP_TABLE_PREFIX . 'Setting`'); $IntOfInterest = array('RaidSize', 'RaidStartHour', 'RaidStartMinute', 'RaidEndHour', 'RaidEndMinute', 'StartOfWeek'); $TextOfInterest = array('RaidMode'); $Settings = array(); $NewRaidSettings->loop(function ($Data) use(&$Settings, $IntOfInterest, $TextOfInterest) { $KeyValue = array('name' => $Data['Name'], 'value' => null); if (in_array($Data['Name'], $IntOfInterest)) { $KeyValue['value'] = $Data['IntValue']; } elseif (in_array($Data['Name'], $TextOfInterest)) { $KeyValue['value'] = $Data['TextValue']; } array_push($Settings, $KeyValue); }); $Out->pushValue('setting', $Settings); // Locations msgQueryLocations($aRequest); } else { $Out->pushError(L('AccessDenied')); } }
/** * This method must be called to make class "PC" available * @param Connector|null $connector * @param Handler|null $handler * @throws \Exception * @return Connector */ public static function register(Connector $connector = null, Handler $handler = null) { if (static::$connector) { throw new \Exception('Helper already registered'); } self::$handler = $handler; self::$connector = $connector ?: Connector::getInstance(); self::$isActive = self::$connector->isActiveClient(); return self::$connector; }
function gc() { $con = Connector::getInstance(); try { $con->beginTransaction(); $st = $con->prepare('DELETE FROM sessions WHERE expires < ?'); $st->execute(array(time())); $con->commit(); } catch (Exception $e) { $st->rollback(); } return true; }
function api_query_location($aParameter) { $aGames = getParamFrom($aParameter, 'games', ''); $aUTF8 = getParamFrom($aParameter, 'utf8', false); $Parameters = array(); $Conditions = array(); // Filter games if ($aGames != '') { $Games = explode(',', $aGames); $GameOptions = array(); foreach ($Games as $Game) { array_push($GameOptions, 'Game=?'); array_push($Parameters, $Game); } array_push($Conditions, $GameOptions); } // Build where clause $WhereString = ''; if (count($Conditions) > 0) { foreach ($Conditions as &$Part) { if (is_array($Part)) { $Part = '(' . implode(' OR ', $Part) . ')'; } } $WhereString = 'WHERE ' . implode(' AND ', $Conditions) . ' '; } // Query $Connector = Connector::getInstance(); $LocationQuery = $Connector->prepare('SELECT * FROM `' . RP_TABLE_PREFIX . 'Location` ' . $WhereString . ' ORDER BY Name'); foreach ($Parameters as $Index => $Value) { if (is_numeric($Value)) { $LocationQuery->bindValue($Index + 1, $Value, PDO::PARAM_INT); } else { $LocationQuery->bindValue($Index + 1, $Value, PDO::PARAM_STR); } } // Build result $Result = array(); $LocationQuery->loop(function ($LocationRow) use(&$Result, $aUTF8) { array_push($Result, array('Id' => $LocationRow['LocationId'], 'Name' => $aUTF8 ? xmlToUTF8($LocationRow['Name']) : $LocationRow['Name'], 'GameId' => $LocationRow['Game'], 'Image' => $LocationRow['Image'])); }); return $Result; }
public function serialize() { $Connector = Connector::getInstance(); // Get existing settings $TestQuery = $Connector->prepare('SELECT * FROM `' . RP_TABLE_PREFIX . 'Setting`'); $ExistingValues = array(); $TestQuery->loop(function ($Row) use(&$ExistingValues) { $ExistingValues[$Row['Name']] = $Row; }); $ExistingSettings = array_keys($ExistingValues); // Update / insert settings foreach ($this->Property as $Name => $Property) { $Index = array_search($Name, $ExistingSettings); $IntValue = isset($Property['IntValue']) ? intval($Property['IntValue']) : 0; $TextValue = isset($Property['TextValue']) ? strval($Property['TextValue']) : ''; if ($Index === false) { $InsertQuery = $Connector->prepare('INSERT INTO `' . RP_TABLE_PREFIX . 'Setting` (Name, IntValue, TextValue) VALUES (:Name, :IntValue, :TextValue)'); $InsertQuery->bindValue(':IntValue', $IntValue, PDO::PARAM_INT); $InsertQuery->bindValue(':TextValue', $TextValue, PDO::PARAM_STR); $InsertQuery->bindValue(':Name', $Name, PDO::PARAM_STR); $InsertQuery->execute(); } else { $CurrentValue = $ExistingValues[$Name]; if (isset($Property['IntValue']) && $CurrentValue['IntValue'] != $Property['IntValue'] || isset($Property['TextValue']) && $CurrentValue['TextValue'] != $Property['TextValue']) { $UpdateQuery = $Connector->prepare('UPDATE `' . RP_TABLE_PREFIX . 'Setting` SET IntValue=:IntValue, TextValue=:TextValue WHERE Name=:Name LIMIT 1'); $UpdateQuery->bindValue(':IntValue', $IntValue, PDO::PARAM_INT); $UpdateQuery->bindValue(':TextValue', $TextValue, PDO::PARAM_STR); $UpdateQuery->bindValue(':Name', $Name, PDO::PARAM_STR); $UpdateQuery->execute(); } array_splice($ExistingSettings, $Index, 1); } } // Remove settings foreach ($ExistingSettings as $Setting) { $DropQuery = $Connector->prepare('DELETE FROM `' . RP_TABLE_PREFIX . 'Setting` WHERE Name=:Name LIMIT 1'); $DropQuery->bindValue(':Name', $Setting, PDO::PARAM_STR); $DropQuery->execute(); } }
function msgQueryCalendar($aRequest) { if (validUser()) { global $gGame; loadGameSettings(); $Out = Out::getInstance(); $Connector = Connector::getInstance(); $ListRaidQuery = $Connector->prepare('Select ' . RP_TABLE_PREFIX . 'Raid.*, ' . RP_TABLE_PREFIX . 'Location.*, ' . RP_TABLE_PREFIX . 'Attendance.CharacterId, ' . RP_TABLE_PREFIX . 'Attendance.UserId, ' . RP_TABLE_PREFIX . 'Attendance.Status, ' . RP_TABLE_PREFIX . 'Attendance.Class, ' . RP_TABLE_PREFIX . 'Attendance.Role, ' . RP_TABLE_PREFIX . 'Attendance.Comment, ' . 'UNIX_TIMESTAMP(' . RP_TABLE_PREFIX . 'Raid.Start) AS StartUTC, ' . 'UNIX_TIMESTAMP(' . RP_TABLE_PREFIX . 'Raid.End) AS EndUTC ' . 'FROM `' . RP_TABLE_PREFIX . 'Raid` ' . 'LEFT JOIN `' . RP_TABLE_PREFIX . 'Location` USING(LocationId) ' . 'LEFT JOIN `' . RP_TABLE_PREFIX . 'Attendance` USING (RaidId) ' . 'LEFT JOIN `' . RP_TABLE_PREFIX . 'Character` USING (CharacterId) ' . 'WHERE ' . RP_TABLE_PREFIX . 'Raid.Start >= FROM_UNIXTIME(:Start) AND ' . RP_TABLE_PREFIX . 'Raid.Start <= FROM_UNIXTIME(:End) ' . 'AND ' . RP_TABLE_PREFIX . 'Location.Game = :Game ' . 'ORDER BY ' . RP_TABLE_PREFIX . 'Raid.Start, ' . RP_TABLE_PREFIX . 'Raid.RaidId'); // Calculate the correct start end end times $StartDay = getCalStartDay(); $StartUTC = mktime(0, 0, 0, $aRequest['Month'], 1, $aRequest['Year']); $StartDate = getdate($StartUTC); if ($StartDate['wday'] != $StartDay) { // Calculate the first day displayed in the calendar $Offset = $StartDate['wday'] < $StartDay ? 7 - ($StartDay - $StartDate['wday']) : $StartDate['wday'] - $StartDay; $StartUTC -= 60 * 60 * 24 * $Offset; $StartDate = getdate($StartUTC); } // Calculate the last day displayed in the calendar $EndUTC = $StartUTC + 60 * 60 * 24 * 7 * 6; // + 6 weeks // Query and return $ListRaidQuery->bindValue(':Start', $StartUTC, PDO::PARAM_INT); $ListRaidQuery->bindValue(':End', intval($EndUTC), PDO::PARAM_INT); $ListRaidQuery->bindValue(':Game', $gGame['GameId'], PDO::PARAM_STR); $Session = Session::get(); $Session['Calendar'] = array('month' => intval($aRequest['Month']), 'year' => intval($aRequest['Year'])); $Out->pushValue('startDay', $StartDate['mday']); $Out->pushValue('startMonth', $StartDate['mon']); $Out->pushValue('startYear', $StartDate['year']); $Out->pushValue('startOfWeek', $StartDay); $Out->pushValue('displayMonth', $aRequest['Month']); $Out->pushValue('displayYear', $aRequest['Year']); parseRaidQuery($aRequest, $ListRaidQuery, 0); } else { $Out = Out::getInstance(); $Out->pushError(L('AccessDenied')); } }
function msgCommentupdate($aRequest) { if (validUser()) { $Connector = Connector::getInstance(); $RaidId = intval($aRequest['raidId']); $UserId = UserProxy::getInstance()->UserId; $CheckQuery = $Connector->prepare('SELECT UserId FROM `' . RP_TABLE_PREFIX . 'Attendance` WHERE UserId = :UserId AND RaidId = :RaidId LIMIT 1'); $CheckQuery->bindValue(':UserId', $UserId, PDO::PARAM_INT); $CheckQuery->bindValue(':RaidId', $RaidId, PDO::PARAM_INT); if ($CheckQuery->execute()) { $UpdateQuery = null; if ($CheckQuery->getAffectedRows() > 0) { $UpdateQuery = $Connector->prepare('UPDATE `' . RP_TABLE_PREFIX . 'Attendance` ' . 'SET comment = :Comment, LastUpdate = FROM_UNIXTIME(:Timestamp) ' . 'WHERE RaidId = :RaidId AND UserId = :UserId LIMIT 1'); $UpdateQuery->bindValue(':Timestamp', time(), PDO::PARAM_INT); } else { $UpdateQuery = $Connector->prepare('INSERT INTO `' . RP_TABLE_PREFIX . 'Attendance` ( CharacterId, UserId, RaidId, Status, Role, Comment ) ' . 'VALUES ( :CharacterId, :UserId, :RaidId, :Status, :Role, :Comment )'); $UpdateQuery->bindValue(':CharacterId', 0, PDO::PARAM_INT); $UpdateQuery->bindValue(':Role', '', PDO::PARAM_STR); $UpdateQuery->bindValue(':Status', 'undecided', PDO::PARAM_STR); } $UpdateQuery->bindValue(':RaidId', $RaidId, PDO::PARAM_INT); $UpdateQuery->bindValue(':UserId', $UserId, PDO::PARAM_INT); $UpdateQuery->bindValue(':Comment', requestToXML($aRequest['comment'], ENT_COMPAT, 'UTF-8'), PDO::PARAM_STR); $UpdateQuery->execute(); } // reload calendar $RaidQuery = $Connector->prepare('SELECT Start FROM `' . RP_TABLE_PREFIX . 'Raid` WHERE RaidId = :RaidId LIMIT 1'); $RaidQuery->bindValue(':RaidId', $RaidId, PDO::PARAM_INT); $RaidData = $RaidQuery->fetchFirst(); $Session = Session::get(); $ShowMonth = isset($Session['Calendar']) && isset($Session['Calendar']['month']) ? $Session['Calendar']['month'] : intval(substr($RaidData['Start'], 5, 2)); $ShowYear = isset($Session['Calendar']) && isset($Session['Calendar']['year']) ? $Session['Calendar']['year'] : intval(substr($RaidData['Start'], 0, 4)); msgQueryCalendar(prepareCalRequest($ShowMonth, $ShowYear)); } else { $Out = Out::getInstance(); $Out->pushError(L('AccessDenied')); } }
function msgRaidDelete($aRequest) { if (validRaidlead()) { $Connector = Connector::getInstance(); // Call plugins $RaidId = intval($aRequest['id']); PluginRegistry::ForEachPlugin(function ($PluginInstance) use($RaidId) { $PluginInstance->onRaidRemove($RaidId); }); do { // Delete raid $Connector->beginTransaction(); $DeleteRaidQuery = $Connector->prepare('DELETE FROM `' . RP_TABLE_PREFIX . 'Raid` WHERE RaidId = :RaidId LIMIT 1'); $DeleteRaidQuery->bindValue(':RaidId', $aRequest['id'], PDO::PARAM_INT); if (!$DeleteRaidQuery->execute()) { $Connector->rollBack(); return; // ### return, error ### } // Delete attendance $DeleteAttendanceQuery = $Connector->prepare('DELETE FROM `' . RP_TABLE_PREFIX . 'Attendance` WHERE RaidId = :RaidId'); $DeleteAttendanceQuery->bindValue(':RaidId', $aRequest['id'], PDO::PARAM_INT); if (!$DeleteAttendanceQuery->execute()) { $Connector->rollBack(); return; // ### return, error ### } } while (!$Connector->commit()); $Session = Session::get(); $ShowMonth = isset($Session['Calendar']) && isset($Session['Calendar']['month']) ? $Session['Calendar']['month'] : $aRequest['month']; $ShowYear = isset($Session['Calendar']) && isset($Session['Calendar']['year']) ? $Session['Calendar']['year'] : $aRequest['year']; msgQueryCalendar(prepareCalRequest($ShowMonth, $ShowYear)); } else { $Out = Out::getInstance(); $Out->pushError(L('AccessDenied')); } }
function tryGetUserLink($UserId) { $Connector = Connector::getInstance(); $UserProxy = UserProxy::getInstance(); $UserQuery = $Connector->prepare('Select * FROM `' . RP_TABLE_PREFIX . 'User` WHERE UserId=:UserId LIMIT 1'); $UserQuery->bindValue(':UserId', $UserId, PDO::PARAM_INT); $UserData = $UserQuery->fetchFirst(); if ($UserData == null) { return null; } // ### return, failed ### // Try to find a fitting binding // External binding is still set. // Finding the user is trivial if ($UserData['ExternalBinding'] != 'none') { return $UserProxy->getUserInfoById($UserData['ExternalBinding'], $UserData['ExternalId']); // ### return, success ### } // External id is still set. // Finding the user is trivial if there is only one binding if ($UserData['ExternalId'] != 0) { $Candidates = UserProxy::getAllUserInfosById($UserData['ExternalId']); if (count($Candidates) > 1) { // More than one binding, check the username and // reduce the array to username matches $Filtered = array(); foreach ($Candidates as $BindingName => $UserInfo) { if ($UserInfo->UserName == $UserData['Login']) { $Filtered[$BindingName] = $UserInfo; } } // If filtering was successfull, switch arrays if (count($Filtered) > 0) { $Candidates = $Filtered; } } // Use the first match. Having multiple matches is very unlikely as two (or more) // forums need to have a user with the same username AND id. if (count($Candidates) > 0) { reset($Candidates); list($BindingName, $UserInfo) = each($Candidates); // fetch the first entry return $UserInfo; // ### return, success ### } } // All checks failed // Search for user by name $Candidates = $UserProxy->getAllUserInfosByName($UserData['Login']); // Use the first match. // This may lead to the wrong user, but searching by name is basically wild guessing anyway. // Note that there is always at least one candidate with the binding 'none'. if (count($Candidates) > 1) { reset($Candidates); list($BindingName, $UserInfo) = each($Candidates); // first entry is 'none' list($BindingName, $UserInfo) = each($Candidates); // this is the first external binding return $UserInfo; // ### return, success ### } return null; }
?> </h2> <?php echo L("AdminPasswordSetup"); ?> <br/> <?php echo L("AdminNotMoveable"); ?> <br/> <br/> <?php $Connector = Connector::getInstance(); $NameQuery = $Connector->prepare("SELECT Login FROM `" . RP_TABLE_PREFIX . "User` WHERE UserId=1 LIMIT 1"); $UserData = $NameQuery->fetchFirst(); $AdminName = $NameQuery->getAffectedRows() == 0 ? "admin" : $UserData["Login"]; ?> <input type="text" id="name" value="<?php echo $AdminName; ?> "/> <?php echo L("AdminName"); ?> <br/> <input type="password" id="password"/> <?php echo L("AdminPassword"); ?>
function msgQuerySettings($aRequest) { if (validAdmin()) { global $gGame; loadGameSettings(); $Out = Out::getInstance(); $Connector = Connector::getInstance(); // Pass through parameter $Out->pushValue('show', $aRequest['showPanel']); $Out->pushValue('syncActive', !defined('ALLOW_GROUP_SYNC') || ALLOW_GROUP_SYNC); // Load users $UserQuery = $Connector->prepare('SELECT * FROM `' . RP_TABLE_PREFIX . 'User` ORDER BY Login, `Group`'); $Users = array(); $UserQuery->loop(function ($Data) use(&$Users) { $UserData = array('id' => $Data['UserId'], 'login' => xmlentities($Data['Login'], ENT_COMPAT, 'UTF-8'), 'bindingActive' => $Data['BindingActive'], 'binding' => $Data['ExternalBinding'], 'group' => $Data['Group']); array_push($Users, $UserData); }); $Out->pushValue('user', $Users); // Load settings $Settings = Settings::getInstance(); $SettingsJS = array(); Api::getPrivateToken(); foreach ($Settings->getProperties() as $Name => $Data) { array_push($SettingsJS, array('name' => $Name, 'intValue' => isset($Data['IntValue']) ? $Data['IntValue'] : 0, 'textValue' => isset($Data['TextValue']) ? $Data['TextValue'] : '')); } $Out->pushValue('setting', $SettingsJS); // Load games $GameFiles = scandir('../themes/games'); $Games = array(); foreach ($GameFiles as $GameFileName) { try { if (substr($GameFileName, -4) === '.xml') { $Game = @new SimpleXMLElement(file_get_contents('../themes/games/' . $GameFileName)); $SimpleGameFileName = substr($GameFileName, 0, strrpos($GameFileName, '.')); if ($Game->name != '') { $GameName = strval($Game->name); } else { $GameName = str_replace('_', ' ', $SimpleGameFileName); } $Groups = array(); foreach ($Game->groups->group as $Group) { array_push($Groups, intval($Group['count'])); } array_push($Games, array('name' => $GameName, 'family' => strval($Game->family), 'file' => $SimpleGameFileName, 'groups' => $Groups)); } } catch (Exception $e) { $Out->pushError('Error parsing gameconfig ' . $GameFileName . ': ' . $e->getMessage()); } } $Out->pushValue('game', $Games); // Load themes $ThemeFiles = scandir('../themes/themes'); $Themes = array(); foreach ($ThemeFiles as $ThemeFileName) { try { if (substr($ThemeFileName, -4) === '.xml') { $Theme = @new SimpleXMLElement(file_get_contents('../themes/themes/' . $ThemeFileName)); $SimpleThemeFileName = substr($ThemeFileName, 0, strrpos($ThemeFileName, '.')); $Family = isset($Theme->family) ? explode(',', strtolower($Theme->family)) : 'wow'; if ($Theme->name != '') { $ThemeName = strval($Theme->name); } else { $ThemeName = str_replace('_', ' ', $SimpleThemeFileName); } array_push($Themes, array('name' => $ThemeName, 'family' => $Family, 'file' => $SimpleThemeFileName)); } } catch (Exception $e) { $Out->pushError('Error parsing themefile ' . $ThemeFileName . ': ' . $e->getMessage()); } } $Out->pushValue('theme', $Themes); // Query attendance $AttendanceString = 'SELECT ' . '`' . RP_TABLE_PREFIX . 'User`.UserId, ' . '`' . RP_TABLE_PREFIX . 'Character`.Name, ' . '`' . RP_TABLE_PREFIX . 'Attendance`.`Status`, ' . 'UNIX_TIMESTAMP(`' . RP_TABLE_PREFIX . 'User`.Created) AS CreatedUTC, ' . 'COUNT(`' . RP_TABLE_PREFIX . 'Raid`.RaidId) AS Count ' . 'FROM `' . RP_TABLE_PREFIX . 'User` ' . 'LEFT JOIN `' . RP_TABLE_PREFIX . 'Attendance` USING(UserId) ' . 'LEFT JOIN `' . RP_TABLE_PREFIX . 'Raid` USING(RaidId) ' . 'LEFT JOIN `' . RP_TABLE_PREFIX . 'Location` USING(LocationId) ' . 'LEFT JOIN `' . RP_TABLE_PREFIX . 'Character` ON `' . RP_TABLE_PREFIX . 'User`.UserId = `' . RP_TABLE_PREFIX . 'Character`.UserId ' . 'WHERE `' . RP_TABLE_PREFIX . 'Character`.Mainchar = "true" ' . 'AND `' . RP_TABLE_PREFIX . 'Raid`.Start > `' . RP_TABLE_PREFIX . 'User`.Created ' . 'AND `' . RP_TABLE_PREFIX . 'Raid`.Start < FROM_UNIXTIME(:Now) ' . 'AND `' . RP_TABLE_PREFIX . 'Location`.Game = :Game ' . 'AND `' . RP_TABLE_PREFIX . 'Character`.Game = :Game ' . 'GROUP BY `' . RP_TABLE_PREFIX . 'User`.UserId, `Status`'; $Attendance = $Connector->prepare($AttendanceString); $Attendance->bindValue(':Now', time(), PDO::PARAM_INT); $Attendance->bindValue(':Game', $gGame['GameId'], PDO::PARAM_STR); $UserId = 0; $NumRaidsRemain = 0; $MainCharName = ''; $StateCounts = array('undecided' => 0, 'available' => 0, 'unavailable' => 0, 'ok' => 0); $Attendances = array(); $Attendance->loop(function ($Data) use(&$gGame, &$Connector, &$UserId, &$NumRaidsRemain, &$MainCharName, &$StateCounts, &$Attendances) { if ($UserId != $Data['UserId']) { if ($UserId > 0) { $AttendanceData = array('id' => $UserId, 'name' => $MainCharName, 'ok' => $StateCounts['ok'], 'available' => $StateCounts['available'], 'unavailable' => $StateCounts['unavailable'], 'undecided' => $StateCounts['undecided'] + $NumRaidsRemain); array_push($Attendances, $AttendanceData); } // Clear cache $StateCounts['ok'] = 0; $StateCounts['available'] = 0; $StateCounts['unavailable'] = 0; $StateCounts['undecided'] = 0; $NumRaidsRemain = 0; $UserId = $Data['UserId']; $MainCharName = $Data['Name']; // Fetch number of attendable raids $Raids = $Connector->prepare('SELECT COUNT(RaidId) AS `NumberOfRaids` ' . 'FROM `' . RP_TABLE_PREFIX . 'Raid` ' . 'LEFT JOIN `' . RP_TABLE_PREFIX . 'Location` USING(LocationId) ' . 'WHERE Start > FROM_UNIXTIME(:Created) ' . 'AND Start < FROM_UNIXTIME(:Now) ' . 'AND Game = :Game'); $Raids->bindValue(':Now', time(), PDO::PARAM_INT); $Raids->bindValue(':Created', $Data['CreatedUTC'], PDO::PARAM_INT); $Raids->bindValue(':Game', $gGame['GameId'], PDO::PARAM_STR); $RaidCountData = $Raids->fetchFirst(); $NumRaidsRemain = $RaidCountData == null ? 0 : $RaidCountData['NumberOfRaids']; } $StateCounts[$Data['Status']] += $Data['Count']; $NumRaidsRemain -= $Data['Count']; }); // Push last user if ($UserId != 0) { $AttendanceData = array('id' => $UserId, 'name' => $MainCharName, 'ok' => $StateCounts['ok'], 'available' => $StateCounts['available'], 'unavailable' => $StateCounts['unavailable'], 'undecided' => $StateCounts['undecided'] + $NumRaidsRemain); array_push($Attendances, $AttendanceData); } $Out->pushValue('attendance', $Attendances); // Locations msgQueryLocations($aRequest); } else { $Out = Out::getInstance(); $Out->pushError(L('AccessDenied')); } }
/** * @return Connector */ public function getConnector() { return Connector::getInstance(); }
function msgRaidAttend($aRequest) { if (validUser()) { global $gGame; loadGameSettings(); $Connector = Connector::getInstance(); $AttendanceId = intval($aRequest['attendanceId']); $AttendanceSubId = intval($aRequest['attendanceSubId']); $RaidId = intval($aRequest['raidId']); $UserId = intval(UserProxy::getInstance()->UserId); // check user/character match $ChangeAllowed = true; $RaidInfo = array(); $Role = ''; $Class = ''; // Check if locked $LockCheckQuery = $Connector->prepare('SELECT Stage, Mode, SlotRoles, SlotCount FROM `' . RP_TABLE_PREFIX . 'Raid` WHERE RaidId = :RaidId LIMIT 1'); $LockCheckQuery->bindValue(':RaidId', $RaidId, PDO::PARAM_INT); $RaidInfo = $LockCheckQuery->fetchFirst(); if ($RaidInfo == null) { return; } // ### return, locked ### $ChangeAllowed = $RaidInfo['Stage'] == 'open'; if ($ChangeAllowed) { // Check if character matches user if ($AttendanceId > 0) { $CheckQuery = $Connector->prepare('SELECT UserId, Class, Role1, Role2 FROM `' . RP_TABLE_PREFIX . 'Character` WHERE CharacterId = :CharacterId AND Game = :Game LIMIT 1'); $CheckQuery->bindValue(':CharacterId', $AttendanceId, PDO::PARAM_INT); $CheckQuery->bindValue(':Game', $gGame['GameId'], PDO::PARAM_INT); $CharacterInfo = $CheckQuery->fetchFirst(); if ($CharacterInfo != null) { $ChangeAllowed &= $CharacterInfo['UserId'] == $UserId; if ($gGame['ClassMode'] == 'multi') { $Classes = explode(':', $CharacterInfo['Class']); $Class = $AttendanceSubId < 0 ? $Classes[0] : $Classes[$AttendanceSubId]; $Role = $gGame['Classes'][$Class]['roles'][0]; } else { $Class = $CharacterInfo['Class']; $Role = $AttendanceSubId < 0 ? $CharacterInfo['Role1'] : ($AttendanceSubId == 0 ? $CharacterInfo['Role1'] : $CharacterInfo['Role2']); } } else { $ChangeAllowed = false; } } // update/insert new attendance data if ($ChangeAllowed) { $CheckQuery = $Connector->prepare('SELECT UserId FROM `' . RP_TABLE_PREFIX . 'Attendance` WHERE UserId = :UserId AND RaidId = :RaidId LIMIT 1'); $CheckQuery->bindValue(':UserId', $UserId, PDO::PARAM_INT); $CheckQuery->bindValue(':RaidId', $RaidId, PDO::PARAM_INT); $CheckQuery->execute(); $AttendQuery = null; $ChangeComment = isset($aRequest['comment']) && $aRequest['comment'] != ''; if ($CheckQuery->getAffectedRows() > 0) { if ($ChangeComment) { $AttendQuery = $Connector->prepare('UPDATE `' . RP_TABLE_PREFIX . 'Attendance` SET ' . 'CharacterId = :CharacterId, Status = :Status, Class = :Class, Role = :Role, Comment = :Comment, LastUpdate = FROM_UNIXTIME(:Timestamp) ' . 'WHERE RaidId = :RaidId AND UserId = :UserId LIMIT 1'); } else { $AttendQuery = $Connector->prepare('UPDATE `' . RP_TABLE_PREFIX . 'Attendance` SET ' . 'CharacterId = :CharacterId, Status = :Status, Class = :Class, Role = :Role, LastUpdate = FROM_UNIXTIME(:Timestamp) ' . 'WHERE RaidId = :RaidId AND UserId = :UserId LIMIT 1'); } } else { if ($ChangeComment) { $AttendQuery = $Connector->prepare('INSERT INTO `' . RP_TABLE_PREFIX . 'Attendance` ( CharacterId, UserId, RaidId, Status, Class, Role, Comment, LastUpdate ) ' . 'VALUES ( :CharacterId, :UserId, :RaidId, :Status, :Class, :Role, :Comment, FROM_UNIXTIME(:Timestamp) )'); } else { $AttendQuery = $Connector->prepare('INSERT INTO `' . RP_TABLE_PREFIX . 'Attendance` ( CharacterId, UserId, RaidId, Status, Class, Role, Comment, LastUpdate) ' . 'VALUES ( :CharacterId, :UserId, :RaidId, :Status, :Class, :Role, "", FROM_UNIXTIME(:Timestamp) )'); } } // Define the status and id to set if ($AttendanceId == -1) { $Status = 'unavailable'; $CharacterId = intval($aRequest['fallback']); } else { $CharacterId = $AttendanceId; switch ($RaidInfo['Mode']) { case 'all': case 'attend': $Status = 'ok'; break; default: case 'manual': case 'overbook': $Status = 'available'; break; } } // Add comment when setting absent status if ($ChangeComment) { $Comment = requestToXML($aRequest['comment'], ENT_COMPAT, 'UTF-8'); $AttendQuery->bindValue(':Comment', $Comment, PDO::PARAM_STR); } $AttendQuery->bindValue(':CharacterId', $CharacterId, PDO::PARAM_INT); $AttendQuery->bindValue(':RaidId', intval($RaidId), PDO::PARAM_INT); $AttendQuery->bindValue(':UserId', intval($UserId), PDO::PARAM_INT); $AttendQuery->bindValue(':Status', $Status, PDO::PARAM_STR); $AttendQuery->bindValue(':Role', $Role, PDO::PARAM_STR); $AttendQuery->bindValue(':Class', $Class, PDO::PARAM_STR); $AttendQuery->bindValue(':Timestamp', time(), PDO::PARAM_INT); if ($AttendQuery->execute() && $Role != '' && $RaidInfo['Mode'] == 'attend' && $Status == 'ok') { removeOverbooked($RaidId, $RaidInfo['SlotRoles'], $RaidInfo['SlotCount']); } } else { $Out = Out::getInstance(); $Out->pushError(L('AccessDenied')); } } else { $Out = Out::getInstance(); $Out->pushError(L('RaidLocked')); } // reload calendar $RaidQuery = $Connector->prepare('SELECT Start FROM `' . RP_TABLE_PREFIX . 'Raid` WHERE RaidId = :RaidId LIMIT 1'); $RaidQuery->bindValue(':RaidId', $RaidId, PDO::PARAM_INT); $RaidData = $RaidQuery->fetchFirst(); $Session = Session::get(); $ShowMonth = isset($Session['Calendar']) && isset($Session['Calendar']['month']) ? $Session['Calendar']['month'] : intval(substr($RaidData['Start'], 5, 2)); $ShowYear = isset($Session['Calendar']) && isset($Session['Calendar']['year']) ? $Session['Calendar']['year'] : intval(substr($RaidData['Start'], 0, 4)); msgQueryCalendar(prepareCalRequest($ShowMonth, $ShowYear)); } else { $Out = Out::getInstance(); $Out->pushError(L('AccessDenied')); } }
function api_query_user($aParameter) { $aUsers = getParamFrom($aParameter, 'users', ''); $aGames = getParamFrom($aParameter, 'games', ''); $aCurrent = getParamFrom($aParameter, 'current', false); $aUTF8 = getParamFrom($aParameter, 'utf8', false); // load gameconfigs $GameFiles = scandir(dirname(__FILE__) . '/../../themes/games'); $Games = array(); foreach ($GameFiles as $GameFileName) { if (substr($GameFileName, -4) === '.xml') { $Game = loadGame(substr($GameFileName, 0, -4)); $Games[$Game['GameId']] = $Game; } } // Build query $Parameters = array(); $Conditions = array(); // Filter users if (!$aCurrent && $aUsers != '') { $Users = explode(',', $aUsers); foreach ($Users as &$UserId) { $UserId = intval($UserId); } if (count($Users) == 1) { array_push($Conditions, 'UserId=?'); array_push($Parameters, $Users[0]); } else { array_push($Conditions, 'UserId IN (' . implode(',', $Users) . ')'); } } if ($aCurrent) { $Session = Session::get(); if ($Session === null) { return array(); } // no user logged in array_push($Conditions, 'UserId=?'); array_push($Parameters, $Session->getUserId()); } // Filter games if ($aGames != '') { $Games = explode(',', $aGames); $GameOptions = array(); foreach ($Games as $Game) { array_push($GameOptions, 'Game=?'); array_push($Parameters, $Game); } array_push($Conditions, $GameOptions); } // Build where clause $WhereString = ''; if (count($Conditions) > 0) { foreach ($Conditions as &$Part) { if (is_array($Part)) { $Part = '(' . implode(' OR ', $Part) . ')'; } } $WhereString = 'WHERE ' . implode(' AND ', $Conditions) . ' '; } // Run query $Connector = Connector::getInstance(); $UserQuery = $Connector->prepare('SELECT `' . RP_TABLE_PREFIX . 'User`.UserId AS _UserId, `' . RP_TABLE_PREFIX . 'Character`.* FROM `' . RP_TABLE_PREFIX . 'User` ' . 'LEFT JOIN `' . RP_TABLE_PREFIX . 'Character` USING(UserId) ' . $WhereString . 'ORDER BY UserId,Name,Game'); foreach ($Parameters as $Index => $Value) { //Out::getInstance()->pushValue('query', $Value); if (is_numeric($Value)) { $UserQuery->bindValue($Index + 1, $Value, PDO::PARAM_INT); } else { $UserQuery->bindValue($Index + 1, $Value, PDO::PARAM_STR); } } // Resolve result $Result = array(); $LastUserId = 0; $User = array(); $UserQuery->loop(function ($UserRow) use(&$LastUserId, &$Result, &$User, &$Games, $aUTF8) { if ($LastUserId != $UserRow['_UserId']) { if (count($User) > 0) { array_push($Result, $User); } $LastUserId = $UserRow['_UserId']; $User = array('Id' => $LastUserId, 'Characters' => array()); } if ($UserRow['CharacterId'] != null) { $Game = $Games[$UserRow['Game']]; $Classes = explode(':', $UserRow['Class']); $Roles = array(); if ($Game['ClassMode'] == 'single') { // Single class mode -> Roles are in database array_push($Roles, $UserRow['Role1']); if ($UserRow['Role1'] != $UserRow['Role2']) { array_push($Roles, $UserRow['Role2']); } } else { // Multi class mode -> Roles are attached to class foreach ($Classes as $ClassId) { foreach ($Game['Classes'][$ClassId]['roles'] as $RoleId) { if (!in_array($RoleId, $Roles)) { array_push($Roles, $RoleId); } } } } array_push($User['Characters'], array('Name' => $aUTF8 ? xmlToUTF8($UserRow['Name']) : $UserRow['Name'], 'Game' => $UserRow['Game'], 'IsMainChar' => $UserRow['Mainchar'] == 'true', 'Classes' => $Classes, 'Roles' => $Roles)); } }); if (count($User) > 0) { array_push($Result, $User); } return $Result; }
?> <br/> <?php echo L("OnlyDBAffected"); ?> <br/> <?php echo L("NoChangeNoAction"); ?> <br/> <br/><br/> <?php echo "<span class=\"check_field\">" . L("DatabaseConnection") . "</span>"; try { $Connector = Connector::getInstance(true); $DatabaseOk = true; } catch (PDOException $Exception) { $DatabaseOk = false; } if ($DatabaseOk) { echo "<span class=\"check_result\" style=\"color: green\">" . L("Ok") . "</span><br/>"; echo "<span class=\"check_field\">" . L("DetectedVersion") . "</span>"; $GetVersion = $Connector->prepare("SELECT IntValue FROM `" . RP_TABLE_PREFIX . "Setting` WHERE Name='Version' LIMIT 1"); if ($Data = $GetVersion->fetchFirst()) { $Version = intval($Data["IntValue"]); } else { $Version = 0; } $Patch = $Version % 10; $Minor = $Version / 10 % 10;
function msgRaidupdate($aRequest) { if (validRaidlead()) { global $gGame; loadGameSettings(); $Connector = Connector::getInstance(); // The whole update is packed into one transaction. // The transaction will be rolled back upon error so no half-updated // data is stored in the database. This requires the database to // support transactions. do { $Connector->beginTransaction(); $LocationId = $aRequest['locationId']; // Insert new location if necessary if ($LocationId == 0) { $NewLocationQuery = $Connector->prepare('INSERT INTO `' . RP_TABLE_PREFIX . 'Location`' . '(Name, Game, Image) VALUES (:Name, :Game, :Image)'); $NewLocationQuery->bindValue(':Name', requestToXML($aRequest['locationName'], ENT_COMPAT, 'UTF-8'), PDO::PARAM_STR); $NewLocationQuery->bindValue(':Game', $gGame['GameId'], PDO::PARAM_STR); $NewLocationQuery->bindValue(':Image', $aRequest['raidImage'], PDO::PARAM_STR); if (!$NewLocationQuery->execute()) { $Connector->rollBack(); return; // ### return, error ### } $LocationId = $Connector->lastInsertId(); } // Update raid $UpdateRaidQuery = $Connector->prepare('UPDATE `' . RP_TABLE_PREFIX . 'Raid` SET ' . 'LocationId = :LocationId, Size = :Size, ' . 'Stage = :Stage, ' . 'Start = FROM_UNIXTIME(:Start), End = FROM_UNIXTIME(:End), ' . 'Description = :Description, ' . 'Mode = :Mode, ' . 'SlotRoles = :SlotRoles, SlotCount = :SlotCount ' . 'WHERE RaidId = :RaidId'); $StartDateTime = mktime(intval($aRequest['startHour']), intval($aRequest['startMinute']), 0, intval($aRequest['startMonth']), intval($aRequest['startDay']), intval($aRequest['startYear'])); $EndDateTime = mktime(intval($aRequest['endHour']), intval($aRequest['endMinute']), 0, intval($aRequest['endMonth']), intval($aRequest['endDay']), intval($aRequest['endYear'])); // Convert to UTC $StartDateTime += $aRequest['startOffset'] * 60; $EndDateTime += $aRequest['endOffset'] * 60; $UpdateRaidQuery->bindValue(':RaidId', $aRequest['id'], PDO::PARAM_INT); $UpdateRaidQuery->bindValue(':LocationId', $LocationId, PDO::PARAM_INT); $UpdateRaidQuery->bindValue(':Stage', $aRequest['stage'], PDO::PARAM_STR); $UpdateRaidQuery->bindValue(':Size', $aRequest['locationSize'], PDO::PARAM_INT); $UpdateRaidQuery->bindValue(':Start', $StartDateTime, PDO::PARAM_INT); $UpdateRaidQuery->bindValue(':End', $EndDateTime, PDO::PARAM_INT); $UpdateRaidQuery->bindValue(':Mode', $aRequest['mode'], PDO::PARAM_STR); $UpdateRaidQuery->bindValue(':Description', requestToXML($aRequest['description'], ENT_COMPAT, 'UTF-8'), PDO::PARAM_STR); $UpdateRaidQuery->bindValue(':SlotRoles', implode(':', $aRequest['slotRoles']), PDO::PARAM_STR); $UpdateRaidQuery->bindValue(':SlotCount', implode(':', $aRequest['slotCount']), PDO::PARAM_STR); if (!$UpdateRaidQuery->execute()) { $Connector->rollBack(); return; // ### return, error ### } // Remove the attends marked for delete. // Only random player attends can be removed. $NumRemoved = isset($aRequest['removed']) ? count($aRequest['removed']) : 0; for ($i = 0; $i < $NumRemoved; ++$i) { $RemoveSlot = $Connector->prepare('DELETE FROM `' . RP_TABLE_PREFIX . 'Attendance` ' . 'WHERE AttendanceId = :AttendanceId AND CharacterId = 0 AND UserId = 0'); $RemoveSlot->bindValue(':AttendanceId', $aRequest['removed'][$i], PDO::PARAM_INT); if (!$RemoveSlot->execute()) { $Connector->rollBack(); return; // ### return, error ### } } // Now iterate over all role lists and update the players in it // Random player will be converted to 'real' player, i.e. they loose their // negative pseudo-id. foreach ($gGame['Roles'] as $Role) { if (isset($aRequest['role_' . $Role['id']])) { $NumAttends = 0; $AttendsForRole = $aRequest['role_' . $Role['id']]; // Attendances are passed in the form [id,status,id,status, … ] // So we iterate with a stride of 2 for ($AttendIdx = 0; $AttendIdx < count($AttendsForRole);) { $UpdateSlot = null; // $Id = UserId when not having an attendance record // $Id = AttendanceId for all others $Id = intVal($AttendsForRole[$AttendIdx++]); $Status = $AttendsForRole[$AttendIdx++]; $OldTimestamp = $AttendsForRole[$AttendIdx++]; $Flags = intVal($AttendsForRole[$AttendIdx++]); if ($Status == 'undecided') { continue; } // ### continue, skip undecided ### // Get extra parameters if (($Flags & PlayerFlagCharId) != 0) { $CharId = intval($AttendsForRole[$AttendIdx++]); $ActiveClass = $AttendsForRole[$AttendIdx++]; } if (($Flags & PlayerFlagUserId) != 0) { $UserId = intVal($AttendsForRole[$AttendIdx++]); } if (($Flags & PlayerFlagName) != 0) { $Name = $AttendsForRole[$AttendIdx++]; } if (($Flags & PlayerFlagComment) != 0) { $Comment = $AttendsForRole[$AttendIdx++]; } if (($Flags & PlayerFlagNew) != 0) { // New entries if (($Flags & PlayerFlagComment) != 0 && ($Flags & PlayerFlagUserId) != 0 && ($Flags & PlayerFlagCharId) != 0) { // Undecided set-up $UpdateSlot = $Connector->prepare('INSERT INTO `' . RP_TABLE_PREFIX . 'Attendance` ' . '( CharacterId, Class, UserId, RaidId, Status, Role, Comment ) ' . 'VALUES ( :CharId, :Class, :UserId, :RaidId, :Status, :Role, :Comment )'); $UpdateSlot->bindValue(':CharId', $CharId, PDO::PARAM_INT); $UpdateSlot->bindValue(':Class', $ActiveClass, PDO::PARAM_STR); $UpdateSlot->bindValue(':UserId', $UserId, PDO::PARAM_INT); $UpdateSlot->bindValue(':Comment', $Comment, PDO::PARAM_STR); } else { if (($Flags & PlayerFlagComment) != 0 && ($Flags & PlayerFlagCharId) != 0) { // Undecied absent $UpdateSlot = $Connector->prepare('INSERT INTO `' . RP_TABLE_PREFIX . 'Attendance` ' . '( CharacterId, Class, UserId, RaidId, Status, Role, Comment ) ' . 'VALUES ( :CharId, :Class, :UserId, :RaidId, :Status, :Role, :Comment )'); $UpdateSlot->bindValue(':CharId', $CharId, PDO::PARAM_INT); $UpdateSlot->bindValue(':Class', $ActiveClass, PDO::PARAM_STR); $UpdateSlot->bindValue(':UserId', $UserId, PDO::PARAM_INT); $UpdateSlot->bindValue(':Comment', $Comment, PDO::PARAM_STR); } else { if (($Flags & PlayerFlagName) != 0) { // Random player. Set name. $UpdateSlot = $Connector->prepare('INSERT INTO `' . RP_TABLE_PREFIX . 'Attendance` ' . '( CharacterId, UserId, RaidId, Status, Class, Role, Comment ) ' . 'VALUES ( 0, 0, :RaidId, :Status, :Class, :Role, :Name )'); $UpdateSlot->bindValue(':Name', $Name, PDO::PARAM_STR); $UpdateSlot->bindValue(':Class', '___', PDO::PARAM_STR); } else { $Out = Out::getInstance(); $Out->pushError('Invalid user flags'); } } } } else { // Update existing entries if (($Flags & PlayerFlagComment) != 0 && ($Flags & PlayerFlagCharId) != 0) { // Used when setting up an absent player $UpdateSlot = $Connector->prepare('UPDATE `' . RP_TABLE_PREFIX . 'Attendance` SET ' . 'Status = :Status, CharacterId = :CharId, Class = :Class, Comment = :Comment, Role = :Role, LastUpdate = FROM_UNIXTIME(:TimestampNow) ' . 'WHERE RaidId = :RaidId AND LastUpdate = FROM_UNIXTIME(:LastUpdate) AND AttendanceId = :AttendanceId LIMIT 1'); $UpdateSlot->bindValue(':Comment', $Comment, PDO::PARAM_STR); $UpdateSlot->bindValue(':CharId', $CharId, PDO::PARAM_INT); $UpdateSlot->bindValue(':Class', $ActiveClass, PDO::PARAM_STR); } else { if (($Flags & PlayerFlagCharId) != 0) { // Used when changing a character $UpdateSlot = $Connector->prepare('UPDATE `' . RP_TABLE_PREFIX . 'Attendance` SET ' . 'Status = :Status, CharacterId = :CharId, Class = :Class, Role = :Role, LastUpdate = FROM_UNIXTIME(:TimestampNow) ' . 'WHERE RaidId = :RaidId AND LastUpdate = FROM_UNIXTIME(:LastUpdate) AND AttendanceId = :AttendanceId LIMIT 1'); $UpdateSlot->bindValue(':CharId', $CharId, PDO::PARAM_INT); $UpdateSlot->bindValue(':Class', $ActiveClass, PDO::PARAM_STR); } else { if (($Flags & PlayerFlagComment) != 0) { // Used when setting a player to absent $UpdateSlot = $Connector->prepare('UPDATE `' . RP_TABLE_PREFIX . 'Attendance` SET ' . 'Status = :Status, Comment = :Comment, Role = :Role, LastUpdate = FROM_UNIXTIME(:TimestampNow) ' . 'WHERE RaidId = :RaidId AND LastUpdate = FROM_UNIXTIME(:LastUpdate) AND AttendanceId = :AttendanceId LIMIT 1'); $UpdateSlot->bindValue(':Comment', $Comment, PDO::PARAM_STR); } else { if (($Flags & PlayerFlagName) != 0) { // Used when changing the name of a random player $UpdateSlot = $Connector->prepare('UPDATE `' . RP_TABLE_PREFIX . 'Attendance` SET ' . 'Status = :Status, Role = :Role, Comment = :Name, LastUpdate = FROM_UNIXTIME(:TimestampNow) ' . 'WHERE RaidId = :RaidId AND LastUpdate = FROM_UNIXTIME(:LastUpdate) AND AttendanceId = :AttendanceId LIMIT 1'); $UpdateSlot->bindValue(':Name', $Name, PDO::PARAM_STR); } else { // Existing player, update $UpdateSlot = $Connector->prepare('UPDATE `' . RP_TABLE_PREFIX . 'Attendance` SET ' . 'Status = :Status, Role = :Role, LastUpdate = FROM_UNIXTIME(:TimestampNow) ' . 'WHERE RaidId = :RaidId AND LastUpdate = FROM_UNIXTIME(:LastUpdate) AND AttendanceId = :AttendanceId LIMIT 1'); } } } } $UpdateSlot->bindValue(':AttendanceId', $Id, PDO::PARAM_INT); $UpdateSlot->bindValue(':LastUpdate', $OldTimestamp, PDO::PARAM_INT); $UpdateSlot->bindValue(':TimestampNow', time(), PDO::PARAM_INT); } $UpdateSlot->bindValue(':Status', $Status, PDO::PARAM_STR); $UpdateSlot->bindValue(':RaidId', $aRequest['id'], PDO::PARAM_INT); $UpdateSlot->bindValue(':Role', $Role['id'], PDO::PARAM_STR); if (!$UpdateSlot->execute()) { $Connector->rollBack(); return; // ### return, error ### } } } } // Assure mode constraints if ($aRequest['mode'] == 'all') { // Mode 'all' means all players are either 'ok' or 'unavailable' $AttendenceQuery = $Connector->prepare('UPDATE `' . RP_TABLE_PREFIX . 'Attendance` SET Status = "ok" ' . 'WHERE RaidId = :RaidId AND Status = "available"'); $AttendenceQuery->bindValue(':RaidId', $aRequest['id'], PDO::PARAM_INT); if (!$AttendenceQuery->execute()) { $Connector->rollBack(); return; // ### return, error ### } } else { if ($aRequest['mode'] != 'overbook') { // Assure there not more 'ok' players than allowed by slot size $SlotSizes = array_combine($aRequest['slotRoles'], $aRequest['slotCount']); foreach ($aRequest['slotRoles'] as $RoleId) { if ($SlotSizes[$RoleId] > 0) { $AttendenceQuery = $Connector->prepare('SELECT AttendanceId ' . 'FROM `' . RP_TABLE_PREFIX . 'Attendance` ' . 'WHERE RaidId = :RaidId AND Status = "ok" AND Role = :RoleId ' . 'ORDER BY AttendanceId DESC LIMIT :MaxCount'); $AttendenceQuery->bindValue(':RaidId', $aRequest['id'], PDO::PARAM_INT); $AttendenceQuery->bindValue(':RoleId', $RoleId, PDO::PARAM_STR); $AttendenceQuery->bindValue(':MaxCount', $SlotSizes[$RoleId], PDO::PARAM_INT); $LastAttend = $AttendenceQuery->fetchFirst(); if ($AttendenceQuery->getAffectedRows() == $SlotSizes[$RoleId]) { // Fix the overhead $FixQuery = $Connector->prepare('UPDATE `' . RP_TABLE_PREFIX . 'Attendance` SET Status = "available" ' . 'WHERE RaidId = :RaidId AND Status = "ok" AND Role = :RoleId ' . 'AND AttendanceId > :FirstId'); $FixQuery->bindValue(':RaidId', $aRequest['id'], PDO::PARAM_INT); $FixQuery->bindValue(':RoleId', $RoleId, PDO::PARAM_STR); $FixQuery->bindValue(':FirstId', $LastAttend['AttendanceId'], PDO::PARAM_INT); if (!$FixQuery->execute()) { $Connector->rollBack(); return; // ### return, error ### } } } } } } } while (!$Connector->commit()); // Call plugins $RaidId = intval($aRequest['id']); PluginRegistry::ForEachPlugin(function ($PluginInstance) use($RaidId) { $PluginInstance->onRaidModify($RaidId); }); // reload detailed view msgRaidDetail($aRequest); } else { $Out = Out::getInstance(); $Out->pushError(L('AccessDenied')); } }
function msgSettingsupdate($aRequest) { if (validAdmin()) { $Connector = Connector::getInstance(); // Update settings $Settings = Settings::getInstance(); $Settings['PurgeRaids']['IntValue'] = $aRequest['purgeTime']; $Settings['LockRaids']['IntValue'] = $aRequest['lockTime']; $Settings['TimeFormat']['IntValue'] = $aRequest['timeFormat']; $Settings['StartOfWeek']['IntValue'] = $aRequest['startOfWeek']; $Settings['RaidStartHour']['IntValue'] = $aRequest['raidStartHour']; $Settings['RaidStartMinute']['IntValue'] = $aRequest['raidStartMinute']; $Settings['RaidEndHour']['IntValue'] = $aRequest['raidEndHour']; $Settings['RaidEndMinute']['IntValue'] = $aRequest['raidEndMinute']; $Settings['RaidSize']['IntValue'] = $aRequest['raidSize']; $Settings['RaidMode']['TextValue'] = $aRequest['raidMode']; $Settings['Site']['TextValue'] = $aRequest['site']; $Settings['Theme']['TextValue'] = $aRequest['theme']; $Settings['GameConfig']['TextValue'] = $aRequest['game']; $Settings['HelpPage']['TextValue'] = $aRequest['helpPage']; $Settings['PrimaryRole']['TextValue'] = $aRequest['primaryRole']; $Settings->serialize(); do { // Update locations $Connector->beginTransaction(); $ExistingLocations = $Connector->prepare('SELECT * FROM `' . RP_TABLE_PREFIX . 'Location`'); $CurrentValues = array(); $ExistingLocations->loop(function ($Data) use(&$CurrentValues) { $CurrentValues[$Data['LocationId']] = array('Name' => $Data['Name'], 'Image' => $Data['Image']); }); $QueryString = ''; $BindValues = array(); // Build location query if (isset($aRequest['locationIds'])) { for ($i = 0; $i < count($aRequest['locationIds']); ++$i) { $LocationId = intval($aRequest['locationIds'][$i]); $CurrentLocation = $CurrentValues[$LocationId]; $LocationName = requestToXML($aRequest['locationNames'][$i], ENT_COMPAT, 'UTF-8'); $LocationImage = isset($aRequest['locationImages']) && isset($aRequest['locationImages'][$i]) && $aRequest['locationImages'][$i] != 'undefined' ? $aRequest['locationImages'][$i] : $CurrentLocation['Image']; if ($LocationName != $CurrentLocation['Name'] || $LocationImage != $CurrentLocation['Image']) { array_push($BindValues, array(':Name' . $LocationId, $LocationName, PDO::PARAM_STR)); array_push($BindValues, array(':Image' . $LocationId, $LocationImage, PDO::PARAM_STR)); $QueryString .= 'UPDATE `' . RP_TABLE_PREFIX . 'Location` SET Name = :Name' . $LocationId . ', Image = :Image' . $LocationId . ' WHERE LocationId=' . $LocationId . '; '; } } } if (isset($aRequest['locationRemoved'])) { foreach ($aRequest['locationRemoved'] as $LocationId) { $QueryString .= 'DELETE `' . RP_TABLE_PREFIX . 'Location`, `' . RP_TABLE_PREFIX . 'Raid`, `' . RP_TABLE_PREFIX . 'Attendance` FROM `' . RP_TABLE_PREFIX . 'Location` ' . 'LEFT JOIN `' . RP_TABLE_PREFIX . 'Raid` USING(LocationId) ' . 'LEFT JOIN `' . RP_TABLE_PREFIX . 'Attendance` USING(RaidId) ' . ' WHERE LocationId=' . intval($LocationId) . '; '; } } if ($QueryString != '') { $LocationUpdate = $Connector->prepare($QueryString); foreach ($BindValues as $BindData) { $LocationUpdate->bindValue($BindData[0], $BindData[1], $BindData[2]); } if (!$LocationUpdate->execute()) { $Connector->rollBack(); return; // ### return, error ### } } // Update users and groups $BannedIds = isset($aRequest['banned']) ? $aRequest['banned'] : array(); $MemberIds = isset($aRequest['member']) ? $aRequest['member'] : array(); $RaidleadIds = isset($aRequest['raidlead']) ? $aRequest['raidlead'] : array(); $AdminIds = isset($aRequest['admin']) ? $aRequest['admin'] : array(); $RemovedIds = isset($aRequest['removed']) ? $aRequest['removed'] : array(); $UnlinkedIds = isset($aRequest['unlinked']) ? $aRequest['unlinked'] : array(); $RelinkedIds = isset($aRequest['relinked']) ? $aRequest['relinked'] : array(); if (!updateGroup($Connector, 'none', $BannedIds)) { return; } if (!updateGroup($Connector, 'member', $MemberIds)) { return; } if (!updateGroup($Connector, 'raidlead', $RaidleadIds)) { return; } if (!updateGroup($Connector, 'admin', $AdminIds)) { return; } // Update unlinked users foreach ($UnlinkedIds as $UserId) { $UnlinkUser = $Connector->prepare('UPDATE `' . RP_TABLE_PREFIX . 'User` SET `BindingActive` = "false" WHERE UserId = :UserId LIMIT 1'); $UnlinkUser->bindValue(':UserId', $UserId, PDO::PARAM_INT); if (!$UnlinkUser->execute()) { $Connector->rollBack(); return; // ### return, error ### } } // Update relinked users foreach ($RelinkedIds as $UserId) { $UserInfo = tryGetUserLink($UserId); if ($UserInfo != null) { $UpdateQuery = $Connector->prepare('UPDATE `' . RP_TABLE_PREFIX . 'User` SET ' . 'Password = :Password, Salt = :Salt, `Group` = :Group, ' . 'ExternalId = :ExternalId, ExternalBinding = :Binding, BindingActive = "true" ' . 'WHERE UserId = :UserId LIMIT 1'); $UpdateQuery->bindValue(':Password', $UserInfo->Password, PDO::PARAM_STR); $UpdateQuery->bindValue(':Group', $UserInfo->Group, PDO::PARAM_STR); $UpdateQuery->bindValue(':Salt', $UserInfo->Salt, PDO::PARAM_STR); $UpdateQuery->bindValue(':Binding', $UserInfo->BindingName, PDO::PARAM_STR); $UpdateQuery->bindValue(':ExternalId', $UserInfo->UserId, PDO::PARAM_STR); $UpdateQuery->bindValue(':UserId', intval($UserId), PDO::PARAM_INT); if (!$UpdateQuery->execute()) { $Connector->rollBack(); return; // ### return, error ### } } } // Update removed users foreach ($RemovedIds as $UserId) { // remove characters and attendances $DropCharacter = $Connector->prepare('DELETE FROM `' . RP_TABLE_PREFIX . 'Character` WHERE UserId = :UserId LIMIT 1'); $DropAttendance = $Connector->prepare('DELETE FROM `' . RP_TABLE_PREFIX . 'Attendance` WHERE UserId = :UserId'); $DropCharacter->bindValue(':UserId', $UserId, PDO::PARAM_INT); $DropAttendance->bindValue(':UserId', $UserId, PDO::PARAM_INT); if (!$DropCharacter->execute()) { $Connector->rollBack(); return; // ### return, error ### } if (!$DropAttendance->execute()) { $Connector->rollBack(); return; // ### return, error ### } // remove user $DropUser = $Connector->prepare('DELETE FROM `' . RP_TABLE_PREFIX . 'User` WHERE UserId = :UserId LIMIT 1'); $DropUser->bindValue(':UserId', $UserId, PDO::PARAM_INT); if (!$DropUser->execute()) { $Connector->rollBack(); return; // ### return, error ### } } } while (!$Connector->commit()); msgQuerySettings($aRequest); } else { $Out = Out::getInstance(); $Out->pushError(L('AccessDenied')); } }
function api_query_raid($aParameter) { // Assemble paramters $aStart = getParamFrom($aParameter, 'start', 0); $aEnd = getParamFrom($aParameter, 'end', 0x7fffffff); $aLimit = getParamFrom($aParameter, 'limit', 0); $aOffset = getParamFrom($aParameter, 'offset', 0); $aRaid = getParamFrom($aParameter, 'raid', ''); $aLocation = getParamFrom($aParameter, 'location', ''); $aGames = getParamFrom($aParameter, 'games', ''); $aFetchFull = getParamFrom($aParameter, 'full', true); $aFetchFree = getParamFrom($aParameter, 'free', true); $aFetchOpen = getParamFrom($aParameter, 'open', true); $aFetchClosed = getParamFrom($aParameter, 'closed', false); $aFetchCanceled = getParamFrom($aParameter, 'canceled', false); $aAddAttends = getParamFrom($aParameter, 'attends', false); $aDesc = getParamFrom($aParameter, 'desc', false); $aUTF8 = getParamFrom($aParameter, 'utf8', false); // Build query $Fields = array('`inner_select`.*', '`' . RP_TABLE_PREFIX . 'Attendance`.Status', '`' . RP_TABLE_PREFIX . 'Attendance`.Role'); $Conditions = array('`' . RP_TABLE_PREFIX . 'Raid`.Start > FROM_UNIXTIME(?)', '`' . RP_TABLE_PREFIX . 'Raid`.Start < FROM_UNIXTIME(?)'); $Parameters = array($aStart, $aEnd); $TableQuery = 'SELECT' . ' `' . RP_TABLE_PREFIX . 'Raid`.*,' . ' UNIX_TIMESTAMP(`' . RP_TABLE_PREFIX . 'Raid`.Start) AS StartUTC,' . ' UNIX_TIMESTAMP(`' . RP_TABLE_PREFIX . 'Raid`.End) AS EndUTC' . ' FROM `' . RP_TABLE_PREFIX . 'Raid` ' . ' LEFT JOIN `' . RP_TABLE_PREFIX . 'Location` USING (LocationId) '; // Specific raids if ($aRaid != '') { $Raids = explode(',', $aRaid); foreach ($Raids as &$RaidId) { $RaidId = intval($RaidId); } if (count($Raids) == 1) { array_push($Conditions, '`' . RP_TABLE_PREFIX . 'Raid`.RaidId=?'); array_push($Parameters, $Raids[0]); } else { if (count($Raids) > 1) { array_push($Conditions, '`' . RP_TABLE_PREFIX . 'Raid`.RaidId IN (' . implode(',', $Raids) . ')'); } } } // Merge locations if required if ($aLocation != '') { $Locations = explode(',', $aLocation); $LocationById = array(); $LocationByName = array(); $LocationConditions = array(); // Sort into ids and names foreach ($Locations as $Location) { if (is_numeric($Location)) { array_push($LocationById, intval($Location)); } else { array_push($LocationByName, $Location); } } // Build id based condition if (count($LocationById) == 1) { array_push($LocationConditions, '`' . RP_TABLE_PREFIX . 'Location`.LocationId=?'); array_push($Parameters, $LocationById[0]); } else { if (count($LocationById) > 1) { array_push($LocationConditions, '`' . RP_TABLE_PREFIX . 'Location`.LocationId IN (' . implode(',', $LocationById) . ')'); } } // Build name based condition if (count($LocationByName) == 1) { array_push($LocationConditions, '`' . RP_TABLE_PREFIX . 'Location`.Name=?'); array_push($Parameters, $LocationByName[0]); } else { if (count($LocationByName) > 1) { array_push($LocationConditions, '`' . RP_TABLE_PREFIX . 'Location`.Name IN ("' . implode('","', $LocationByName) . '")'); } } array_push($Conditions, $LocationConditions); } // Raid status if (!$aFetchOpen || !$aFetchClosed || !$aFetchCanceled) { $StatusConditions = array(); if ($aFetchOpen) { array_push($StatusConditions, '`' . RP_TABLE_PREFIX . 'Raid`.Stage = "open"'); } if ($aFetchClosed) { array_push($StatusConditions, '`' . RP_TABLE_PREFIX . 'Raid`.Stage = "locked"'); } if ($aFetchCanceled) { array_push($StatusConditions, '`' . RP_TABLE_PREFIX . 'Raid`.Stage = "canceled"'); } array_push($Conditions, $StatusConditions); } // Filter games if ($aGames != '') { $Games = explode(',', $aGames); $GameOptions = array(); foreach ($Games as $Game) { array_push($GameOptions, '`' . RP_TABLE_PREFIX . 'Location`.Game=?'); array_push($Parameters, $Game); } array_push($Conditions, $GameOptions); } // Build where part $WhereString = ''; if (count($Conditions) > 0) { foreach ($Conditions as &$Part) { if (is_array($Part)) { $Part = '(' . implode(' OR ', $Part) . ')'; } } $WhereString = ' WHERE ' . implode(' AND ', $Conditions); } // Build limit part $LimitString = ''; if ($aLimit > 0) { $LimitString = ' LIMIT ' . intval($aOffset) . ',' . intval($aLimit); } // Build order part $OrderString = ' ORDER BY' . ' `' . RP_TABLE_PREFIX . 'Raid`.Start ' . ($aDesc ? 'DESC' : 'ASC') . ',' . ' `' . RP_TABLE_PREFIX . 'Raid`.RaidId ' . ($aDesc ? 'DESC' : 'ASC'); // Merge attendance information (outer select) $AttendanceJoin = 'LEFT JOIN `' . RP_TABLE_PREFIX . 'Attendance` USING (RaidId) '; if ($aAddAttends === true) { $AttendanceJoin .= 'LEFT JOIN `' . RP_TABLE_PREFIX . 'User` USING (UserId) '; $AttendanceJoin .= 'LEFT JOIN `' . RP_TABLE_PREFIX . 'Character` USING (CharacterId) '; $Fields = array_merge($Fields, array('`' . RP_TABLE_PREFIX . 'Attendance`.Class', '`' . RP_TABLE_PREFIX . 'Attendance`.Comment', '`' . RP_TABLE_PREFIX . 'User`.UserId', '`' . RP_TABLE_PREFIX . 'User`.ExternalBinding AS BindingId', '`' . RP_TABLE_PREFIX . 'User`.ExternalId AS BoundUserId', '`' . RP_TABLE_PREFIX . 'Character`.Name AS CharacterName', '`' . RP_TABLE_PREFIX . 'Character`.Class AS CharacterClasses', '`' . RP_TABLE_PREFIX . 'Character`.Mainchar AS CharacterIsMain', '`' . RP_TABLE_PREFIX . 'Character`.Role1 AS CharacterRole1', '`' . RP_TABLE_PREFIX . 'Character`.Role2 AS CharacterRole2')); } // Execute query $QueryString = 'SELECT ' . implode(',', $Fields) . ' FROM (' . $TableQuery . $WhereString . $OrderString . $LimitString . ') AS inner_select ' . $AttendanceJoin; //Out::getInstance()->pushValue('debug', $QueryString); $Connector = Connector::getInstance(); $RaidQuery = $Connector->prepare($QueryString); foreach ($Parameters as $Index => $Value) { //Out::getInstance()->pushValue('debug', $Value); if (is_numeric($Value)) { $RaidQuery->bindValue($Index + 1, $Value, PDO::PARAM_INT); } else { $RaidQuery->bindValue($Index + 1, $Value, PDO::PARAM_STR); } } // Prepare results $LastRaidId = 0; $Result = array(); $Raid = array(); $RaidQuery->loop(function ($aRaidRow) use(&$LastRaidId, &$Raid, &$Result, $aAddAttends, $aFetchFull, $aFetchFree, $aUTF8) { if ($aRaidRow['RaidId'] != $LastRaidId) { if (api_filter_raid($Raid, $aFetchFull, $aFetchFree)) { array_push($Result, $Raid); } // Generate Raid $LastRaidId = $aRaidRow['RaidId']; $Raid = array('RaidId' => $aRaidRow['RaidId'], 'LocationId' => $aRaidRow['LocationId'], 'Status' => $aRaidRow['Stage'], 'Size' => $aRaidRow['Size'], 'Start' => $aRaidRow['StartUTC'], 'End' => $aRaidRow['EndUTC'], 'Description' => $aUTF8 ? xmlToUTF8($aRaidRow['Description']) : $aRaidRow['Description'], 'Slots' => array_combine(explode(':', $aRaidRow['SlotRoles']), explode(':', $aRaidRow['SlotCount'])), 'SetToRaid' => array(), 'Available' => array(), 'Absent' => 0); if ($aAddAttends) { $Raid['Attends'] = array(); } foreach ($Raid['Slots'] as $Role => $Max) { $Raid['SetToRaid'][$Role] = 0; $Raid['Available'][$Role] = 0; } } // Count available / absent if ($aRaidRow['Role'] !== null && $aRaidRow['Role'] !== '') { switch ($aRaidRow['Status']) { case 'ok': ++$Raid['SetToRaid'][$aRaidRow['Role']]; // ok counts as available, too // ok counts as available, too case 'available': ++$Raid['Available'][$aRaidRow['Role']]; break; case 'undecided': // TODO: Need to query all available users to return undecided break; case 'unavailable': default: ++$Raid['Absent']; break; } } // Add attends if requested if ($aAddAttends && $aRaidRow['Status'] !== null) { $Attend = array('UserId' => $aRaidRow['UserId'], 'BindingId' => $aRaidRow['BindingId'], 'BoundUserId' => $aRaidRow['BoundUserId'], 'Status' => $aRaidRow['Status'], 'Role' => $aRaidRow['Role'], 'Class' => $aRaidRow['Class'], 'Comment' => $aUTF8 ? xmlToUTF8($aRaidRow['Comment']) : $aRaidRow['Comment'], 'CharacterName' => $aUTF8 ? xmlToUTF8($aRaidRow['CharacterName']) : $aRaidRow['CharacterName'], 'CharacterIsMain' => $aRaidRow['CharacterIsMain'], 'CharacterClasses' => explode(':', $aRaidRow['CharacterClasses']), 'CharacterRoles' => array($aRaidRow['CharacterRole1'], $aRaidRow['CharacterRole2'])); array_push($Raid['Attends'], $Attend); } }); // Add remaining raid if (api_filter_raid($Raid, $aFetchFull, $aFetchFree)) { array_push($Result, $Raid); } return $Result; }
function MergeGames($aSourceFile, $aTargetFile) { if ($aSourceFile == $aTargetFile) { echo "<div class=\"update_step_warning\">" . L("SameGame") . "</div>"; return false; // ### return, same game ### } // Try to load both files $SourceGameId = ""; $TargetGameId = ""; $SourceGameMode = ""; $TargetGameMode = ""; $SourceClasses = array(); $TargetClasses = array(); $SourceRoles = array(); $TargetRoles = array(); try { $GameDir = dirname(__FILE__) . "/../../themes/games"; $SourceClasses = GenerateClassList($GameDir . "/" . $aSourceFile . ".xml", $SourceGameId, $SourceGameMode, $SourceRoles); $TargetClasses = GenerateClassList($GameDir . "/" . $aTargetFile . ".xml", $TargetGameId, $TargetGameMode, $TargetRoles); } catch (Exception $e) { echo "<div class=\"update_step_error\">Error parsing files: " . $e->getMessage() . "</div>"; return false; // ### return, invalid gameconfig ### } // Convert all characters $Connector = Connector::getInstance(); $Characters = $Connector->prepare("SELECT * FROM `" . RP_TABLE_PREFIX . "Character` WHERE Game=:SourceGame"); $Characters->setErrorsAsHTML(true); $Characters->bindValue(":SourceGame", $SourceGameId, PDO::PARAM_STR); $NumCharactersFixed = 0; $Characters->loop(function ($aRow) use($Connector, &$NumCharactersFixed, $SourceGameMode, $SourceGameId, &$SourceClasses, &$SourceRoles, $TargetGameMode, $TargetGameId, &$TargetClasses, &$TargetRoles) { $ClassIds = explode(":", $aRow["Class"]); $ClassId = $ClassIds[0]; $Role1Id = $aRow["Role1"]; $Role2Id = $aRow["Role2"]; if ($SourceGameMode == "multi") { foreach ($ClassIds as &$Id) { $ClassInfo = $SourceClasses[$Id]; $Roles = array_keys($ClassInfo["roles"]); $RoleId = $Roles[0]; FindFittingRole($TargetRoles, $RoleId, $SourceRoles[$RoleId]["name"], $SourceRoles[$RoleId]["style"]); FindFittingClass($TargetClasses, $Id, $RoleId, $RoleId, $ClassInfo["name"], $ClassInfo["style"]); } $ClassId = $TargetGameMode == "multi" ? implode(":", $ClassIds) : $ClassIds[0]; $Roles = array_keys($TargetClasses[$ClassId]["roles"]); $Role1Id = $Roles[0]; $Role2Id = $Roles[0]; } else { $ClassInfo = $SourceClasses[$ClassId]; FindFittingRole($TargetRoles, $Role1Id, $SourceRoles[$Role1Id]["name"], $SourceRoles[$Role1Id]["style"]); FindFittingRole($TargetRoles, $Role2Id, $SourceRoles[$Role2Id]["name"], $SourceRoles[$Role2Id]["style"]); FindFittingClass($TargetClasses, $ClassId, $Role1Id, $Role2Id, $ClassInfo["name"], $ClassInfo["style"]); } // Set the new values $CharUpdate = $Connector->prepare("UPDATE `" . RP_TABLE_PREFIX . "Character` SET Class=:Class, Role1=:Role1, Role2=:Role2, Game=:TargetGame WHERE CharacterId=:CharId LIMIT 1"); $CharUpdate->setErrorsAsHTML(true); $CharUpdate->bindValue(":CharId", $aRow["CharacterId"], PDO::PARAM_INT); $CharUpdate->bindValue(":Class", $ClassId, PDO::PARAM_STR); $CharUpdate->bindValue(":Role1", $Role1Id, PDO::PARAM_STR); $CharUpdate->bindValue(":Role2", $Role2Id, PDO::PARAM_STR); $CharUpdate->bindValue(":TargetGame", $TargetGameId, PDO::PARAM_STR); if ($CharUpdate->execute()) { ++$NumCharactersFixed; } }); echo "<div class=\"update_step_warning\">" . L("Merged") . " " . $NumCharactersFixed . " " . L("Characters") . "</div>"; // Convert all locations $Locations = $Connector->prepare("UPDATE `" . RP_TABLE_PREFIX . "Location` SET Game=:TargetGame WHERE Game=:SourceGame"); $Locations->setErrorsAsHTML(true); $Locations->bindValue(":SourceGame", $SourceGameId, PDO::PARAM_STR); $Locations->bindValue(":TargetGame", $TargetGameId, PDO::PARAM_STR); if ($Locations->execute()) { echo "<div class=\"update_step_warning\">" . L("Merged") . " " . $Locations->getAffectedRows() . " " . L("Locations") . "</div>"; } return true; }
public static function changePassword($aUserId, $aHashedPassword, $aSalt) { $IsCurrentUser = self::getInstance()->UserId == $aUserId; if (!$IsCurrentUser && !validAdmin()) { return false; } // ### return, security check failed ### // Change password to new values. // Only accounts with an inactive binding may be changed. $Connector = Connector::getInstance(); $UpdateQuery = $Connector->prepare('UPDATE `' . RP_TABLE_PREFIX . 'User` SET ' . 'ExternalBinding = "none", Password = :Password, Salt = :Salt ' . 'WHERE UserId = :UserId AND (BindingActive="false" OR ExternalBinding="none") LIMIT 1'); $UpdateQuery->bindValue(':UserId', $aUserId, PDO::PARAM_INT); $UpdateQuery->bindValue(':Password', $aHashedPassword, PDO::PARAM_STR); $UpdateQuery->bindValue(':Salt', $aSalt, PDO::PARAM_STR); $UpdateQuery->execute(); return true; }
function api_query_statistic($aParameter) { $aStart = getParamFrom($aParameter, 'start', 0); $aEnd = getParamFrom($aParameter, 'end', time()); $aRaids = getParamFrom($aParameter, 'raids', ''); $aUsers = getParamFrom($aParameter, 'users', ''); $aGames = getParamFrom($aParameter, 'games', ''); $aUTF8 = getParamFrom($aParameter, 'utf8', false); // Build query $Conditions = array('`' . RP_TABLE_PREFIX . 'Character`.Mainchar = true', '`' . RP_TABLE_PREFIX . 'Character`.Game = `' . RP_TABLE_PREFIX . 'Location`.Game', '`' . RP_TABLE_PREFIX . 'Raid`.Start > `' . RP_TABLE_PREFIX . 'User`.Created', '`' . RP_TABLE_PREFIX . 'Raid`.Start > FROM_UNIXTIME(:Start)', '`' . RP_TABLE_PREFIX . 'Raid`.Start < FROM_UNIXTIME(:End)'); $Parameters = array("Start" => $aStart, "End" => $aEnd); $GamesCondition = ''; $GamesParameter = array(); // Filter users if ($aUsers != '') { $Users = explode(',', $aUsers); foreach ($Users as &$UserId) { $UserId = intval($UserId); } if (count($Users) == 1) { array_push($Conditions, '`' . RP_TABLE_PREFIX . 'User`.UserId=:UserId'); $Parameters["UserId"] = $Users[0]; } else { array_push($Conditions, '`' . RP_TABLE_PREFIX . 'User`.UserId IN (' . implode(',', $Users) . ')'); } } // Filter raids if ($aRaids != '') { $Raids = explode(',', $aRaids); foreach ($Raids as &$RaidId) { $RaidId = intval($RaidId); } if (count($Raids) == 1) { array_push($Conditions, '`' . RP_TABLE_PREFIX . 'raid`.RaidId=:RaidId'); $Parameters["RaidId"] = $Raids[0]; } else { array_push($Conditions, '`' . RP_TABLE_PREFIX . 'raid`.RaidId IN (' . implode(',', $Raids) . ')'); } } // Filter games if ($aGames != '') { $Games = explode(',', $aGames); $GameByLoc = array(); $GameIdx = 0; foreach ($Games as $Game) { array_push($GameByLoc, '`' . RP_TABLE_PREFIX . 'Location`.Game=:Game' . $GameIdx); $Parameters["Game" . $GameIdx] = $Game; $GamesParameter["Game" . $GameIdx] = $Game; ++$GameIdx; } $GamesCondition = implode(' OR ', $GameByLoc); array_push($Conditions, $GameByLoc); } // Build where clause $WhereString = ''; if (count($Conditions) > 0) { foreach ($Conditions as &$Part) { if (is_array($Part)) { $Part = '(' . implode(' OR ', $Part) . ')'; } } $WhereString = ' WHERE ' . implode(' AND ', $Conditions) . ' '; } // Query attendances $QueryString = 'SELECT ' . '`' . RP_TABLE_PREFIX . 'User`.UserId, ' . '`' . RP_TABLE_PREFIX . 'Character`.Name, ' . '`' . RP_TABLE_PREFIX . 'Attendance`.`Status`, ' . '`' . RP_TABLE_PREFIX . 'Attendance`.Role, ' . 'UNIX_TIMESTAMP(`' . RP_TABLE_PREFIX . 'User`.Created) AS CreatedUTC, ' . 'COUNT(`' . RP_TABLE_PREFIX . 'Raid`.RaidId) AS Count ' . 'FROM `' . RP_TABLE_PREFIX . 'User` ' . 'LEFT JOIN `' . RP_TABLE_PREFIX . 'Attendance` USING(UserId) ' . 'LEFT JOIN `' . RP_TABLE_PREFIX . 'Raid` USING(RaidId) ' . 'LEFT JOIN `' . RP_TABLE_PREFIX . 'Location` USING(LocationId) ' . 'LEFT JOIN `' . RP_TABLE_PREFIX . 'Character` ON `' . RP_TABLE_PREFIX . 'User`.UserId = `' . RP_TABLE_PREFIX . 'Character`.UserId ' . $WhereString . 'GROUP BY `' . RP_TABLE_PREFIX . 'User`.UserId, `' . RP_TABLE_PREFIX . 'Attendance`.`Status`, `' . RP_TABLE_PREFIX . 'Attendance`.Role '; $Connector = Connector::getInstance(); $AttendanceQuery = $Connector->prepare($QueryString); foreach ($Parameters as $IndexName => $Value) { if (is_numeric($Value)) { $AttendanceQuery->bindValue(':' . $IndexName, $Value, PDO::PARAM_INT); } else { $AttendanceQuery->bindValue(':' . $IndexName, $Value, PDO::PARAM_STR); } } $UserId = 0; $NumRaidsRemain = 0; $MainCharName = ''; $StateCounts = array('undecided' => 0, 'available' => 0, 'unavailable' => 0, 'ok' => 0); $Attendances = array(); $Roles = array(); $AttendanceQuery->loop(function ($Data) use($Connector, &$UserId, &$NumRaidsRemain, &$MainCharName, &$StateCounts, &$Attendances, &$Roles, $aUTF8, &$GamesCondition, &$GamesParameter, $aStart, $aEnd) { if ($UserId != $Data['UserId']) { // User changed, store cache if ($UserId != 0) { $AttendanceData = array('Id' => $UserId, 'MainChar' => $aUTF8 ? xmlToUTF8($MainCharName) : $MainCharName, 'SetToRaid' => $StateCounts['ok'], 'Available' => $StateCounts['available'], 'Absent' => $StateCounts['unavailable'], 'Undecided' => $StateCounts['undecided'] + $NumRaidsRemain, 'Roles' => $Roles); array_push($Attendances, $AttendanceData); } // Clear cache $StateCounts['ok'] = 0; $StateCounts['available'] = 0; $StateCounts['unavailable'] = 0; $StateCounts['undecided'] = 0; $NumRaidsRemain = 0; $Roles = array(); $UserId = $Data['UserId']; $MainCharName = $Data['Name']; // Fetch number of attendable raids $RaidQueryString = 'SELECT ' . 'COUNT(RaidId) AS `NumberOfRaids` ' . 'FROM `' . RP_TABLE_PREFIX . 'Raid` ' . 'LEFT JOIN `' . RP_TABLE_PREFIX . 'Location` USING(LocationId) ' . 'WHERE `' . RP_TABLE_PREFIX . 'Raid`.Start > FROM_UNIXTIME(:Created) ' . 'AND `' . RP_TABLE_PREFIX . 'Raid`.Start > FROM_UNIXTIME(:Start) ' . 'AND `' . RP_TABLE_PREFIX . 'Raid`.Start < FROM_UNIXTIME(:End) ' . ($GamesCondition == '' ? '' : 'AND (' . $GamesCondition . ')'); $Raids = $Connector->prepare($RaidQueryString); $Raids->bindValue(':Start', $aStart, PDO::PARAM_INT); $Raids->bindValue(':End', $aEnd, PDO::PARAM_INT); $Raids->bindValue(':Created', $Data['CreatedUTC'], PDO::PARAM_INT); foreach ($GamesParameter as $IndexName => $Value) { if (is_numeric($Value)) { $Raids->bindValue(':' . $IndexName, $Value, PDO::PARAM_INT); } else { $Raids->bindValue(':' . $IndexName, $Value, PDO::PARAM_STR); } } $RaidCountData = $Raids->fetchFirst(); $NumRaidsRemain = $RaidCountData == null ? 0 : $RaidCountData['NumberOfRaids']; } // Same user / first entry, add data to cache if ($Data['Status'] == null) { return true; } // ### continue, invalid data ### $StateCounts[$Data['Status']] += $Data['Count']; $NumRaidsRemain -= $Data['Count']; if ($Data['Role'] == null || $Data['Status'] != 'ok') { return true; } // ### continue, no role set or absent ### if (!isset($Roles[$Data['Role']])) { $Roles[$Data['Role']] = $Data['Count']; } else { $Roles[$Data['Role']] += $Data['Count']; } }); // Push last user if ($UserId != 0) { $AttendanceData = array('Id' => $UserId, 'MainChar' => $aUTF8 ? xmlToUTF8($MainCharName) : $MainCharName, 'SetToRaid' => $StateCounts['ok'], 'Available' => $StateCounts['available'], 'Absent' => $StateCounts['unavailable'], 'Undecided' => $StateCounts['undecided'] + $NumRaidsRemain, 'Roles' => $Roles); array_push($Attendances, $AttendanceData); } return $Attendances; }
function setTie($game_id) { $con = Connector::getInstance(); $st = $con->prepare('UPDATE game SET winner = ?, status = ? WHERE game_id = ?'); $st->execute(array($winner, 'tie', $game_id)); }
function msgQueryProfile($aRequest) { if (validUser()) { global $gGame; loadGameSettings(); $Out = Out::getInstance(); $UserId = UserProxy::getInstance()->UserId; if (validAdmin() && isset($aRequest['userId']) && $aRequest['userId'] != 0) { $UserId = intval($aRequest['userId']); } $Connector = Connector::getInstance(); $Out->pushValue('show', $aRequest['showPanel']); // Admintool relevant data $Users = $Connector->prepare('SELECT Login, UNIX_TIMESTAMP(Created) AS CreatedUTC, ExternalBinding, BindingActive FROM `' . RP_TABLE_PREFIX . 'User` WHERE UserId = :UserId LIMIT 1'); $Users->bindValue(':UserId', $UserId, PDO::PARAM_INT); $Data = $Users->fetchFirst(); if ($Data != null) { $Out->pushValue('userid', $UserId); $Out->pushValue('name', $Data['Login']); $Out->pushValue('bindingActive', $Data['BindingActive'] == 'true'); $Out->pushValue('binding', $Data['ExternalBinding']); $CreatedUTC = $Data['CreatedUTC']; } // Load settings $SettingsQuery = $Connector->prepare('SELECT * FROM `' . RP_TABLE_PREFIX . 'UserSetting` WHERE UserId = :UserId'); $SettingsQuery->bindValue(':UserId', $UserId, PDO::PARAM_INT); $UserSettings = array(); $SettingsQuery->loop(function ($Data) use(&$UserSettings) { $UserSettings[$Data['Name']] = array('number' => $Data['IntValue'], 'text' => $Data['TextValue']); }); $Out->pushValue('settings', $UserSettings); // Load characters $Characters = array(); if ($UserId == UserProxy::getInstance()->UserId) { foreach (UserProxy::getInstance()->Characters as $Data) { if ($Data->Game == $gGame['GameId']) { $Character = array('id' => $Data->CharacterId, 'name' => $Data->Name, 'classname' => explode(':', $Data->ClassName), 'mainchar' => $Data->IsMainChar, 'role1' => $Data->Role1, 'role2' => $Data->Role2); array_push($Characters, $Character); } } } else { $CharacterQuery = $Connector->prepare('SELECT * FROM `' . RP_TABLE_PREFIX . 'Character` ' . 'WHERE UserId = :UserId AND Game = :Game ' . 'ORDER BY Mainchar, Name'); $CharacterQuery->bindValue(':UserId', $UserId, PDO::PARAM_INT); $CharacterQuery->bindValue(':Game', $gGame['GameId'], PDO::PARAM_STR); $CharacterQuery->loop(function ($Row) use(&$Characters) { $Character = array('id' => $Row['CharacterId'], 'name' => $Row['Name'], 'classname' => explode(':', $Row['Class']), 'mainchar' => $Row['Mainchar'] == 'true', 'role1' => $Row['Role1'], 'role2' => $Row['Role2']); array_push($Characters, $Character); }); } $Out->pushValue('character', $Characters); // Total raid count $NumRaids = 0; $RaidsQuery = $Connector->prepare('SELECT COUNT(RaidId) AS `NumberOfRaids` FROM `' . RP_TABLE_PREFIX . 'Raid` ' . 'LEFT JOIN `' . RP_TABLE_PREFIX . 'Location` USING(LocationId) ' . 'WHERE Start > FROM_UNIXTIME(:Created) AND Start < FROM_UNIXTIME(:Now) AND Game = :Game'); $RaidsQuery->bindValue(':Now', time(), PDO::PARAM_INT); $RaidsQuery->bindValue(':Created', $CreatedUTC, PDO::PARAM_STR); $RaidsQuery->bindValue(':Game', $gGame['GameId'], PDO::PARAM_STR); $Data = $RaidsQuery->fetchFirst(); if ($Data != null) { $NumRaids = $Data['NumberOfRaids']; } // Load attendance $AttendanceQuery = $Connector->prepare('Select `Status`, `Role`, COUNT(RaidId) AS `Count` ' . 'FROM `' . RP_TABLE_PREFIX . 'Attendance` ' . 'LEFT JOIN `' . RP_TABLE_PREFIX . 'Raid` USING(RaidId) ' . 'LEFT JOIN `' . RP_TABLE_PREFIX . 'Location` USING(LocationId) ' . 'WHERE UserId = :UserId AND Start > FROM_UNIXTIME(:Created) AND Start < FROM_UNIXTIME(:Now) AND Game = :Game ' . 'GROUP BY `Status`, `Role` ORDER BY Status'); $AttendanceQuery->bindValue(':UserId', $UserId, PDO::PARAM_INT); $AttendanceQuery->bindValue(':Created', $CreatedUTC, PDO::PARAM_INT); $AttendanceQuery->bindValue(':Now', time(), PDO::PARAM_INT); $AttendanceQuery->bindValue(':Game', $gGame['GameId'], PDO::PARAM_STR); $AttendanceData = array('raids' => $NumRaids, 'available' => 0, 'unavailable' => 0, 'ok' => 0, 'roles' => array()); // Pull data $AttendanceQuery->loop(function ($Data) use(&$AttendanceData) { if ($Data['Status'] != 'undecided') { $AttendanceData[$Data['Status']] += $Data['Count']; } if ($Data['Status'] == 'ok') { $RoleId = $Data['Role']; if (isset($AttendanceData['roles'][$RoleId])) { $AttendanceData['roles'][$RoleId] += $Data['Count']; } else { $AttendanceData['roles'][$RoleId] = $Data['Count']; } } }); $Out->pushValue('attendance', $AttendanceData); } else { $Out = Out::getInstance(); $Out->pushError(L('AccessDenied')); } }
function msgProfileupdate($aRequest) { if (validUser()) { global $gGame; loadGameSettings(); $UserId = UserProxy::getInstance()->UserId; if (validAdmin() && isset($aRequest['userId']) && $aRequest['userId'] != 0) { $UserId = intval($aRequest['userId']); } $Connector = Connector::getInstance(); do { $Connector->beginTransaction(); // Update password if (isset($aRequest['newPass']) && $aRequest['oldPass'] != '') { if (UserProxy::getInstance()->validateCredentials($aRequest['oldPass'])) { // User authenticated with valid password // change the password of the given id. ChangePassword does a check // for validity (e.g. only admin may change other user's passwords) $Salt = UserProxy::generateKey32(); $HashedPassword = NativeBinding::nativeHash($aRequest['newPass'], $Salt, 'none'); if (!UserProxy::changePassword($UserId, $HashedPassword, $Salt)) { $Out = Out::getInstance(); $Out->pushError(L('PasswordLocked')); } } else { $Out = Out::getInstance(); $Out->pushError(L('WrongPassword')); } } // Update always log in if ($aRequest['autoAttend'] == 'true') { $ExistsRequest = $Connector->prepare('SELECT UserSettingId FROM `' . RP_TABLE_PREFIX . 'UserSetting` ' . 'WHERE UserId=:UserId and Name="AutoAttend" LIMIT 1'); $ExistsRequest->bindValue(':UserId', $UserId, PDO::PARAM_INT); if ($ExistsRequest->fetchFirst() == null) { $AttendRequest = $Connector->prepare('INSERT INTO `' . RP_TABLE_PREFIX . 'UserSetting` (UserId, Name) VALUES (:UserId, "AutoAttend")'); $AttendRequest->bindValue(':UserId', $UserId, PDO::PARAM_INT); $AttendRequest->execute(); } } else { $RemoveQuery = $Connector->prepare('DELETE FROM `' . RP_TABLE_PREFIX . 'UserSetting` WHERE ' . 'UserId = :UserId AND (Name = "AutoAttend") LIMIT 1'); $RemoveQuery->bindValue(':UserId', $UserId, PDO::PARAM_INT); $RemoveQuery->execute(); } // Update vacation settings $Ranges = getVacationData($aRequest); $VacationMessage = $aRequest['vacationMessage'] == null ? '' : requestToXML($aRequest['vacationMessage'], ENT_COMPAT, 'UTF-8'); // Revoke ranges that have been removed foreach ($Ranges['revoke'] as $RevokeRange) { $RevokeQuery = $Connector->prepare('UPDATE `' . RP_TABLE_PREFIX . 'Raid` LEFT JOIN `' . RP_TABLE_PREFIX . 'Attendance` USING (RaidId) ' . 'SET `' . RP_TABLE_PREFIX . 'Attendance`.Status = "undecided", Comment = "" ' . 'WHERE Start >= FROM_UNIXTIME(:Start) AND Start <= FROM_UNIXTIME(:End) ' . 'AND `' . RP_TABLE_PREFIX . 'Attendance`.Status = "unavailable" AND `' . RP_TABLE_PREFIX . 'Attendance`.UserId = :UserId'); $RevokeQuery->bindValue(':Start', max($RevokeRange[0], time()), PDO::PARAM_INT); $RevokeQuery->bindValue(':End', max($RevokeRange[1], time()), PDO::PARAM_INT); $RevokeQuery->bindValue(':UserId', $UserId, PDO::PARAM_INT); $RevokeQuery->execute(); } // Update already affected ranges foreach ($Ranges['update'] as $UpdateRange) { $UpdateQuery = $Connector->prepare('UPDATE `' . RP_TABLE_PREFIX . 'Raid` LEFT JOIN `' . RP_TABLE_PREFIX . 'Attendance` USING(RaidId) ' . 'SET Comment = :Message ' . 'WHERE Start >= FROM_UNIXTIME(:Start) AND Start <= FROM_UNIXTIME(:End) ' . 'AND UserId = :UserId AND Status = "unavailable"'); $UpdateQuery->bindValue(':Start', $UpdateRange[0], PDO::PARAM_INT); $UpdateQuery->bindValue(':End', $UpdateRange[1], PDO::PARAM_INT); $UpdateQuery->bindValue(':UserId', $UserId, PDO::PARAM_INT); $UpdateQuery->bindValue(':Message', $VacationMessage, PDO::PARAM_STR); $UpdateQuery->execute(); } // Update/Insert new ranges foreach ($Ranges['new'] as $NewRange) { // Update all raids that already have an attendance record $UpdateQuery = $Connector->prepare('UPDATE `' . RP_TABLE_PREFIX . 'Raid` LEFT JOIN `' . RP_TABLE_PREFIX . 'Attendance` USING(RaidId) ' . 'SET Status = "unavailable", Comment = :Message ' . 'WHERE Start >= FROM_UNIXTIME(:Start) AND Start <= FROM_UNIXTIME(:End) ' . 'AND UserId = :UserId'); $UpdateQuery->bindValue(':Start', $NewRange[0], PDO::PARAM_INT); $UpdateQuery->bindValue(':End', $NewRange[1], PDO::PARAM_INT); $UpdateQuery->bindValue(':UserId', intval($UserId), PDO::PARAM_INT); $UpdateQuery->bindValue(':Message', $VacationMessage, PDO::PARAM_STR); $UpdateQuery->execute(); // Find all reaids the do not have an attendance record $AffectedQuery = $Connector->prepare('SELECT `' . RP_TABLE_PREFIX . 'Raid`.RaidId FROM `' . RP_TABLE_PREFIX . 'Raid` ' . 'LEFT JOIN `' . RP_TABLE_PREFIX . 'Attendance` ON (`' . RP_TABLE_PREFIX . 'Raid`.RaidId = `' . RP_TABLE_PREFIX . 'Attendance`.RaidId ' . 'AND (`' . RP_TABLE_PREFIX . 'Attendance`.UserId = :UserId OR `' . RP_TABLE_PREFIX . 'Attendance`.UserId IS NULL)) ' . 'WHERE Start >= FROM_UNIXTIME(:Start) AND Start <= FROM_UNIXTIME(:End) ' . 'AND UserId IS NULL ' . 'GROUP BY RaidId'); $AffectedQuery->bindValue(':Start', $NewRange[0], PDO::PARAM_INT); $AffectedQuery->bindValue(':End', $NewRange[1], PDO::PARAM_INT); $AffectedQuery->bindValue(':UserId', intval($UserId), PDO::PARAM_INT); $AffectedQuery->loop(function ($aRaid) use(&$Connector, $UserId, $VacationMessage) { // Set user to unavailable $InsertQuery = $Connector->prepare('INSERT INTO `' . RP_TABLE_PREFIX . 'Attendance` ' . '(UserId, RaidId, Status, Comment) ' . 'VALUES (:UserId, :RaidId, "unavailable", :Message)'); $InsertQuery->bindValue(':UserId', intval($UserId), PDO::PARAM_INT); $InsertQuery->bindValue(':RaidId', $aRaid['RaidId'], PDO::PARAM_INT); $InsertQuery->bindValue(':Message', $VacationMessage, PDO::PARAM_STR); $InsertQuery->execute(); }); } // Update user settings if (count($Ranges['new']) == 0 && count($Ranges['update']) == 0) { if (count($Ranges['revoke']) > 0) { $RemoveQuery = $Connector->prepare('DELETE FROM `' . RP_TABLE_PREFIX . 'UserSetting` WHERE ' . 'UserId = :UserId AND (Name = "VacationStart" OR Name = "VacationEnd" OR Name = "VacationMessage") LIMIT 3'); $RemoveQuery->bindValue(':UserId', $UserId, PDO::PARAM_INT); $RemoveQuery->execute(); } } else { if ($Ranges['SettingsFound']) { $UpdateQuery = $Connector->prepare('UPDATE `' . RP_TABLE_PREFIX . 'UserSetting` SET IntValue = :Start WHERE UserId = :UserId AND Name = "VacationStart" LIMIT 1;' . 'UPDATE `' . RP_TABLE_PREFIX . 'UserSetting` SET IntValue = :End WHERE UserId = :UserId AND Name = "VacationEnd" LIMIT 1;' . 'UPDATE `' . RP_TABLE_PREFIX . 'UserSetting` SET TextValue = :Message WHERE UserId = :UserId AND Name = "VacationMessage" LIMIT 1;'); $UpdateQuery->bindValue(':UserId', $UserId, PDO::PARAM_INT); $UpdateQuery->bindValue(':Start', $aRequest['vacationStart'], PDO::PARAM_INT); $UpdateQuery->bindValue(':End', $aRequest['vacationEnd'], PDO::PARAM_INT); $UpdateQuery->bindValue(':Message', $VacationMessage, PDO::PARAM_STR); $UpdateQuery->execute(); } else { $InsertQuery = $Connector->prepare('INSERT INTO `' . RP_TABLE_PREFIX . 'UserSetting` (IntValue, UserId, Name) VALUES (:Start, :UserId, "VacationStart");' . 'INSERT INTO `' . RP_TABLE_PREFIX . 'UserSetting` (IntValue, UserId, Name) VALUES (:End, :UserId, "VacationEnd");' . 'INSERT INTO `' . RP_TABLE_PREFIX . 'UserSetting` (TextValue, UserId, Name) VALUES (:Message, :UserId, "VacationMessage");'); $InsertQuery->bindValue(':UserId', $UserId, PDO::PARAM_INT); $InsertQuery->bindValue(':Start', $aRequest['vacationStart'], PDO::PARAM_INT); $InsertQuery->bindValue(':End', $aRequest['vacationEnd'], PDO::PARAM_INT); $InsertQuery->bindValue(':Message', $VacationMessage, PDO::PARAM_STR); $InsertQuery->execute(); } } // Update characters $CharacterQuery = $Connector->prepare('SELECT * FROM `' . RP_TABLE_PREFIX . 'Character` WHERE UserId = :UserId AND Game = :Game ORDER BY Name'); $CharacterQuery->bindValue(':UserId', $UserId, PDO::PARAM_INT); $CharacterQuery->bindValue(':Game', $gGame['GameId'], PDO::PARAM_STR); $ValidCharacterIds = array(); $UpdatedCharacteIds = array(); $CharacterQuery->loop(function ($Data) use(&$ValidCharacterIds) { array_push($ValidCharacterIds, $Data['CharacterId']); }); $NumCharacters = isset($aRequest['charId']) && is_array($aRequest['charId']) ? count($aRequest['charId']) : 0; // Sanity check mainchar $FoundMainChar = false; for ($CharIndex = 0; $CharIndex < $NumCharacters; ++$CharIndex) { if ($aRequest['mainChar'][$CharIndex] == 'true') { if ($FoundMainChar) { $aRequest['mainChar'][$CharIndex] = 'false'; } else { $FoundMainChar = true; } } } if (!$FoundMainChar && $NumCharacters > 0) { $aRequest['mainChar'][0] = 'true'; } // Update/insert chars for ($CharIndex = 0; $CharIndex < $NumCharacters; ++$CharIndex) { $CharId = $aRequest['charId'][$CharIndex]; $ClassArray = $aRequest['charClass'][$CharIndex]; $Classes = count($ClassArray) == 1 ? $ClassArray[0] : implode(':', $ClassArray); if ($CharId == 0) { // Insert new character $InsertChar = $Connector->prepare('INSERT INTO `' . RP_TABLE_PREFIX . 'Character` ' . '( UserId, Name, Game, Class, Mainchar, Role1, Role2 ) ' . 'VALUES ( :UserId, :Name, :Game, :Class, :Mainchar, :Role1, :Role2 )'); $InsertChar->bindValue(':UserId', $UserId, PDO::PARAM_INT); $InsertChar->bindValue(':Name', requestToXML($aRequest['name'][$CharIndex], ENT_COMPAT, 'UTF-8'), PDO::PARAM_STR); $InsertChar->bindValue(':Game', $gGame['GameId'], PDO::PARAM_STR); $InsertChar->bindValue(':Class', $Classes, PDO::PARAM_STR); $InsertChar->bindValue(':Mainchar', $aRequest['mainChar'][$CharIndex], PDO::PARAM_STR); $InsertChar->bindValue(':Role1', $aRequest['role1'][$CharIndex], PDO::PARAM_STR); $InsertChar->bindValue(':Role2', $aRequest['role2'][$CharIndex], PDO::PARAM_STR); if (!$InsertChar->execute()) { $Connector->rollBack(); return; } } else { if (in_array($CharId, $ValidCharacterIds)) { // Update character array_push($UpdatedCharacteIds, $CharId); $UpdateChar = $Connector->prepare('UPDATE `' . RP_TABLE_PREFIX . 'Character` ' . 'SET Class = :Class, Mainchar = :Mainchar, Role1 = :Role1, Role2 = :Role2 ' . 'WHERE CharacterId = :CharacterId AND UserId = :UserId'); $UpdateChar->bindValue(':UserId', $UserId, PDO::PARAM_INT); $UpdateChar->bindValue(':CharacterId', $CharId, PDO::PARAM_INT); $UpdateChar->bindValue(':Class', $Classes, PDO::PARAM_STR); $UpdateChar->bindValue(':Mainchar', $aRequest['mainChar'][$CharIndex], PDO::PARAM_STR); $UpdateChar->bindValue(':Role1', $aRequest['role1'][$CharIndex], PDO::PARAM_STR); $UpdateChar->bindValue(':Role2', $aRequest['role2'][$CharIndex], PDO::PARAM_STR); if (!$UpdateChar->execute()) { $Connector->rollBack(); return; } } } } $IdsToRemove = array_diff($ValidCharacterIds, $UpdatedCharacteIds); foreach ($IdsToRemove as $CharId) { // Remove character $DropChar = $Connector->prepare('DELETE FROM `' . RP_TABLE_PREFIX . 'Character` ' . 'WHERE CharacterId = :CharacterId AND UserId = :UserId'); $DropAttendance = $Connector->prepare('DELETE FROM `' . RP_TABLE_PREFIX . 'Attendance` ' . 'WHERE CharacterId = :CharacterId AND UserId = :UserId'); $DropChar->bindValue(':UserId', $UserId, PDO::PARAM_INT); $DropChar->bindValue(':CharacterId', $CharId, PDO::PARAM_INT); $DropAttendance->bindValue(':UserId', $UserId, PDO::PARAM_INT); $DropAttendance->bindValue(':CharacterId', $CharId, PDO::PARAM_INT); if (!$DropChar->execute()) { $Connector->rollBack(); return; } if (!$DropAttendance->execute()) { $Connector->rollBack(); return; } } } while (!$Connector->commit()); UserProxy::getInstance()->updateCharacters(); msgQueryProfile($aRequest); } else { $Out = Out::getInstance(); $Out->pushError(L('AccessDenied')); } }
protected function __construct() { $this->connector = Connector::getInstance(); }
function msgRaidCreate($aRequest) { if (validRaidlead()) { global $gGame; loadGameSettings(); $Connector = Connector::getInstance(); $LocationId = $aRequest['locationId']; // Create location if ($LocationId == 0) { $NewLocationQuery = $Connector->prepare('INSERT INTO `' . RP_TABLE_PREFIX . 'Location`' . '(Game, Name, Image) VALUES (:Game, :Name, :Image)'); $NewLocationQuery->bindValue(':Name', requestToXML($aRequest['locationName'], ENT_COMPAT, 'UTF-8'), PDO::PARAM_STR); $NewLocationQuery->bindValue(':Image', $aRequest['raidImage'], PDO::PARAM_STR); $NewLocationQuery->bindValue(':Game', $gGame['GameId'], PDO::PARAM_STR); if (!$NewLocationQuery->execute()) { return; } // ### return, location could not be created ### $LocationId = $Connector->lastInsertId(); } // Create raid if ($LocationId != 0) { // First raid time calculation $StartHour = intval($aRequest['startHour']); $StartMinute = intval($aRequest['startMinute']); $StartDay = intval($aRequest['startDay']); $StartMonth = intval($aRequest['startMonth']); $StartYear = intval($aRequest['startYear']); $EndHour = intval($aRequest['endHour']); $EndMinute = intval($aRequest['endMinute']); $EndDay = intval($aRequest['endDay']); $EndMonth = intval($aRequest['endMonth']); $EndYear = intval($aRequest['endYear']); // Get users on vacation $UserSettingsQuery = $Connector->prepare('SELECT UserId, Name, IntValue, TextValue FROM `' . RP_TABLE_PREFIX . 'UserSetting` ' . 'WHERE Name = "VacationStart" OR Name = "VacationEnd" OR Name = "VacationMessage" ORDER BY UserId'); $VactionUsers = array(); $UserSettingsQuery->loop(function ($Settings) use(&$VactionUsers) { if (!isset($VactionUsers[$Settings['UserId']])) { $VactionUsers[$Settings['UserId']] = array('Message' => ''); } switch ($Settings['Name']) { case 'VacationStart': $VactionUsers[$Settings['UserId']]['Start'] = $Settings['IntValue']; break; case 'VacationEnd': $VactionUsers[$Settings['UserId']]['End'] = $Settings['IntValue']; break; case 'VacationMessage': $VactionUsers[$Settings['UserId']]['Message'] = $Settings['TextValue']; break; default: break; } }); // Prepare posting raids to forum $PostTargets = array(); PluginRegistry::ForEachBinding(function ($PluginInstance) use(&$PostTargets) { if ($PluginInstance->isActive() && $PluginInstance->postRequested()) { array_push($PostTargets, $PluginInstance); } }); $LocationData = null; if (count($PostTargets) > 0) { loadSiteSettings(); $LocationQuery = $Connector->prepare('SELECT * FROM `' . RP_TABLE_PREFIX . 'Location` WHERE LocationId = :LocationId LIMIT 1'); $LocationQuery->bindValue(':LocationId', $LocationId, PDO::PARAM_INT); $LocationData = $LocationQuery->fetchFirst(); } // Get opt-out list or auto attend users $AutoAttendUsers = array(); if (strtolower($aRequest['mode'] == 'optout')) { $UserQuery = $Connector->prepare('SELECT UserId, CharacterId, Class, Role1 FROM `' . RP_TABLE_PREFIX . 'User` ' . 'LEFT JOIN `' . RP_TABLE_PREFIX . 'Character` USING(UserId) ' . 'WHERE Mainchar="true" AND Game=:Game'); $UserQuery->bindValue(':Game', $gGame['GameId'], PDO::PARAM_STR); $UserQuery->loop(function ($aUser) use(&$AutoAttendUsers) { array_push($AutoAttendUsers, $aUser); }); } else { $UserQuery = $Connector->prepare('SELECT UserId, CharacterId, Class, Role1 FROM `' . RP_TABLE_PREFIX . 'UserSetting` ' . 'LEFT JOIN `' . RP_TABLE_PREFIX . 'Character` USING(UserId) ' . 'WHERE `' . RP_TABLE_PREFIX . 'UserSetting`.Name="AutoAttend" AND Mainchar="true" AND Game=:Game'); $UserQuery->bindValue(':Game', $gGame['GameId'], PDO::PARAM_STR); $UserQuery->loop(function ($aUser) use(&$AutoAttendUsers) { array_push($AutoAttendUsers, $aUser); }); } // Create raids(s) $Repeat = max(0, intval($aRequest['repeat'])) + 1; // repeat at least once $GroupInfo = $gGame['Groups'][$aRequest['locationSize']]; $SlotRoles = implode(':', array_keys($GroupInfo)); $SlotCount = implode(':', $GroupInfo); $RaidMode = $aRequest['mode'] == 'optout' ? 'manual' : $aRequest['mode']; for ($rc = 0; $rc < $Repeat; ++$rc) { $NewRaidQuery = $Connector->prepare('INSERT INTO `' . RP_TABLE_PREFIX . 'Raid` ' . '(LocationId, Size, Start, End, Mode, Description, SlotRoles, SlotCount ) ' . 'VALUES (:LocationId, :Size, FROM_UNIXTIME(:Start), FROM_UNIXTIME(:End), :Mode, :Description, ' . ':SlotRoles, :SlotCount)'); $StartDateTime = mktime($StartHour, $StartMinute, 0, $StartMonth, $StartDay, $StartYear); $EndDateTime = mktime($EndHour, $EndMinute, 0, $EndMonth, $EndDay, $EndYear); // Convert to UTC $StartDateTime += $aRequest['startOffset'] * 60; $EndDateTime += $aRequest['endOffset'] * 60; $NewRaidQuery->bindValue(':LocationId', $LocationId, PDO::PARAM_INT); $NewRaidQuery->bindValue(':Size', $aRequest['locationSize'], PDO::PARAM_INT); $NewRaidQuery->bindValue(':Start', $StartDateTime, PDO::PARAM_INT); $NewRaidQuery->bindValue(':End', $EndDateTime, PDO::PARAM_INT); $NewRaidQuery->bindValue(':Mode', $RaidMode, PDO::PARAM_STR); $NewRaidQuery->bindValue(':Description', requestToXML($aRequest['description'], ENT_COMPAT, 'UTF-8'), PDO::PARAM_STR); $NewRaidQuery->bindValue(':SlotRoles', $SlotRoles, PDO::PARAM_STR); $NewRaidQuery->bindValue(':SlotCount', $SlotCount, PDO::PARAM_STR); $NewRaidQuery->execute(); $RaidId = $Connector->lastInsertId(); // Attend players when mode is optout if (count($AutoAttendUsers > 0)) { $Status = $RaidMode == 'all' || $RaidMode == 'attend' ? 'ok' : 'available'; foreach ($AutoAttendUsers as $User) { $UserId = intval($User['UserId']); if (isset($VactionUsers[$UserId]) && ($StartDateTime >= $VactionUsers[$UserId]['Start'] && $StartDateTime <= $VactionUsers[$UserId]['End'])) { continue; // ### continue, user is on vacation ### } $Classes = explode(':', $User['Class']); $ClassId = $Classes[0]; $RoleId = $gGame['ClassMode'] == 'multi' ? $gGame['Classes'][$ClassId]['roles'][0] : $User['Role1']; $AttendQuery = $Connector->prepare('INSERT INTO `' . RP_TABLE_PREFIX . 'Attendance` (UserId, RaidId, CharacterId, Class, Role, Status) ' . 'VALUES (:UserId, :RaidId, :CharId, :Class, :Role, :Status)'); $AttendQuery->bindValue(':UserId', $UserId, PDO::PARAM_INT); $AttendQuery->bindValue(':RaidId', $RaidId, PDO::PARAM_INT); $AttendQuery->bindValue(':CharId', $User['CharacterId'], PDO::PARAM_INT); $AttendQuery->bindValue(':Class', $ClassId, PDO::PARAM_STR); $AttendQuery->bindValue(':Role', $RoleId, PDO::PARAM_STR); $AttendQuery->bindValue(':Status', $Status, PDO::PARAM_STR); $AttendQuery->execute(); } if ($RaidMode == 'attend') { removeOverbooked($RaidId, $SlotRoles, $SlotCount); } } // Set vacation attendances foreach ($VactionUsers as $UserId => $Settings) { if ($StartDateTime >= $Settings['Start'] && $StartDateTime <= $Settings['End']) { $AbsentQuery = $Connector->prepare('INSERT INTO `' . RP_TABLE_PREFIX . 'Attendance` (UserId, RaidId, Status, Comment) ' . 'VALUES (:UserId, :RaidId, "unavailable", :Message)'); $AbsentQuery->bindValue(':UserId', $UserId, PDO::PARAM_INT); $AbsentQuery->bindValue(':RaidId', $RaidId, PDO::PARAM_INT); $AbsentQuery->bindValue(':Message', $Settings['Message'], PDO::PARAM_STR); $AbsentQuery->execute(); } } // Post raids to forum if (count($PostTargets) > 0) { $RaidQuery = $Connector->prepare('SELECT * FROM `' . RP_TABLE_PREFIX . 'Raid` WHERE RaidId=:RaidId LIMIT 1'); $RaidQuery->bindValue(':RaidId', $RaidId, PDO::PARAM_INT); $RaidData = $RaidQuery->fetchFirst(); $MessageData = Binding::generateMessage($RaidData, $LocationData); try { foreach ($PostTargets as $PluginInstance) { $PluginInstance->post($MessageData['subject'], $MessageData['message']); } } catch (PDOException $Exception) { Out::getInstance()->pushError($Exception->getMessage()); } } // Call plugins PluginRegistry::ForEachPlugin(function ($PluginInstance) use($RaidId) { $PluginInstance->onRaidCreate($RaidId); }); // Increment start/end switch ($aRequest['stride']) { case 'day': ++$StartDay; ++$EndDay; break; case 'week': $StartDay += 7; $EndDay += 7; break; case 'month': ++$StartMonth; ++$EndMonth; break; default: case 'once': $rc = $Repeat; // Force done break; } } // reload calendar $Session = Session::get(); $ShowMonth = isset($Session['Calendar']) && isset($Session['Calendar']['month']) ? $Session['Calendar']['month'] : $aRequest['month']; $ShowYear = isset($Session['Calendar']) && isset($Session['Calendar']['year']) ? $Session['Calendar']['year'] : $aRequest['year']; msgQueryCalendar(prepareCalRequest($ShowMonth, $ShowYear)); } } else { $Out = Out::getInstance(); $Out->pushError(L('AccessDenied')); } }
public static function dropExpired() { $Connector = Connector::getInstance(); $DropSessions = $Connector->prepare('DELETE FROM `' . RP_TABLE_PREFIX . 'Session` WHERE Expires <= CURRENT_TIMESTAMP'); $DropSessions->execute(); }
function setVersion($a_Version) { $Connector = Connector::getInstance(); $Connector->exec("UPDATE `" . RP_TABLE_PREFIX . "Setting` SET IntValue=" . intval($a_Version) . " WHERE Name='Version' LIMIT 1;"); }
function msgRaidList($aRequest) { if (validUser()) { global $gGame; loadGameSettings(); $Out = Out::getInstance(); $Connector = Connector::getInstance(); // Get next 6 raids $NextRaidQuery = $Connector->prepare('Select ' . RP_TABLE_PREFIX . 'Raid.*, ' . RP_TABLE_PREFIX . 'Location.*, ' . RP_TABLE_PREFIX . 'Attendance.CharacterId, ' . RP_TABLE_PREFIX . 'Attendance.UserId, ' . RP_TABLE_PREFIX . 'Attendance.Status, ' . RP_TABLE_PREFIX . 'Attendance.Class, ' . RP_TABLE_PREFIX . 'Attendance.Role, ' . RP_TABLE_PREFIX . 'Attendance.Comment, ' . 'UNIX_TIMESTAMP(' . RP_TABLE_PREFIX . 'Raid.Start) AS StartUTC, ' . 'UNIX_TIMESTAMP(' . RP_TABLE_PREFIX . 'Raid.End) AS EndUTC ' . 'FROM `' . RP_TABLE_PREFIX . 'Raid` ' . 'LEFT JOIN `' . RP_TABLE_PREFIX . 'Location` USING(LocationId) ' . 'LEFT JOIN `' . RP_TABLE_PREFIX . 'Attendance` USING(RaidId) ' . 'LEFT JOIN `' . RP_TABLE_PREFIX . 'Character` USING (CharacterId) ' . 'WHERE ' . RP_TABLE_PREFIX . 'Raid.Start >= FROM_UNIXTIME(:Start) ' . 'AND ' . RP_TABLE_PREFIX . 'Location.Game = :Game ' . 'ORDER BY ' . RP_TABLE_PREFIX . 'Raid.Start, ' . RP_TABLE_PREFIX . 'Raid.RaidId'); $NextRaidQuery->bindValue(':Start', mktime(0, 0, 0), PDO::PARAM_INT); $NextRaidQuery->bindValue(':Game', $gGame['GameId'], PDO::PARAM_STR); parseRaidQuery($aRequest, $NextRaidQuery, 6); // Load raid history $RaidHistoryQuery = $Connector->prepare('Select ' . RP_TABLE_PREFIX . 'Raid.*, ' . RP_TABLE_PREFIX . 'Location.*, ' . 'UNIX_TIMESTAMP(' . RP_TABLE_PREFIX . 'Raid.Start) AS StartUTC, ' . 'UNIX_TIMESTAMP(' . RP_TABLE_PREFIX . 'Raid.End) AS EndUTC ' . 'FROM `' . RP_TABLE_PREFIX . 'Raid` ' . 'LEFT JOIN `' . RP_TABLE_PREFIX . 'Location` USING(LocationId) ' . 'WHERE ' . RP_TABLE_PREFIX . 'Raid.Start < FROM_UNIXTIME(:Start) ' . 'AND ' . RP_TABLE_PREFIX . 'Location.Game = :Game ' . 'ORDER BY Start DESC LIMIT ' . intval($aRequest['offset']) . ', ' . intval($aRequest['count'])); $RaidHistoryQuery->bindValue(':Start', mktime(0, 0, 0), PDO::PARAM_INT); $RaidHistoryQuery->bindValue(':Game', $gGame['GameId'], PDO::PARAM_STR); $RaidList = array(); $RaidHistoryQuery->loop(function ($Data) use(&$RaidList) { $StartDate = getdate($Data['StartUTC']); $EndDate = getdate($Data['EndUTC']); $Raid = array('id' => $Data['RaidId'], 'location' => $Data['Name'], 'stage' => $Data['Stage'], 'image' => $Data['Image'], 'size' => $Data['Size'], 'startDate' => $StartDate['year'] . '-' . leadingZero10($StartDate['mon']) . '-' . leadingZero10($StartDate['mday']), 'start' => leadingZero10($StartDate['hours']) . ':' . leadingZero10($StartDate['minutes']), 'endDate' => $EndDate['year'] . '-' . leadingZero10($EndDate['mon']) . '-' . leadingZero10($EndDate['mday']), 'end' => leadingZero10($EndDate['hours']) . ':' . leadingZero10($EndDate['minutes'])); array_push($RaidList, $Raid); }); $Out->pushValue('history', $RaidList); } else { $Out = Out::getInstance(); $Out->pushError(L('AccessDenied')); } }