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;
 }
示例#4
0
 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;
 }
示例#5
0
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;
}
示例#6
0
 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'));
    }
}
示例#10
0
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;
}
示例#11
0
?>
</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();
 }
示例#14
0
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'));
    }
}
示例#15
0
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;
}
示例#16
0
?>
<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;
示例#17
0
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'));
    }
}
示例#19
0
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;
}
示例#20
0
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;
}
示例#21
0
 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;
 }
示例#22
0
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;
}
示例#23
0
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'));
    }
}
示例#26
0
 protected function __construct()
 {
     $this->connector = Connector::getInstance();
 }
示例#27
0
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'));
    }
}
示例#28
0
 public static function dropExpired()
 {
     $Connector = Connector::getInstance();
     $DropSessions = $Connector->prepare('DELETE FROM `' . RP_TABLE_PREFIX . 'Session` WHERE Expires <= CURRENT_TIMESTAMP');
     $DropSessions->execute();
 }
示例#29
0
function setVersion($a_Version)
{
    $Connector = Connector::getInstance();
    $Connector->exec("UPDATE `" . RP_TABLE_PREFIX . "Setting` SET IntValue=" . intval($a_Version) . " WHERE Name='Version' LIMIT 1;");
}
示例#30
-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'));
    }
}