}
     break;
 case 'undelete':
     $roomData = $generalCache->getRooms($messageData['roomId']);
     if (fim_hasPermission($roomData, $user, 'moderate', true)) {
         $database->update("{$sqlPrefix}messages", array('deleted' => 0), array("messageId" => (int) $request['messageId']));
         $database->createEvent('undeletedMessage', $user['userId'], $roomData['roomId'], $messageData['messageId'], false, false, false);
         // name, user, room, message, p1, p2, p3
         $xmlData['editMessage']['response']['success'] = true;
     } else {
         $errStr = 'noPerm';
         $errDesc = 'You are not allowed to moderate this room.';
     }
     break;
 case 'edit':
     if (fim_hasPermission($roomData, $user, 'moderate', true)) {
         list($messageDataNew, $messageDataEncrypted) = fim_sendMessage($request['newMssage'], $user, $room, $request['flag']);
         // TODO      fim3parse_keyWords($messageData['text'], $messageId, $roomData['roomId']); // Add message to archive search store.
         $database->insert("{$sqlPrefix}messageEditHistory", array('oldText' => $messageData['text'], 'newText' => $messageDataEncrypted['text'], 'iv1' => $messageData['iv'], 'iv2' => $messageDataEncrypted['iv'], 'salt1' => $messageData['salt'], 'salt2' => $messageDataEncrypted['salt'], 'time' => $database->now()));
         $database->update("{$sqlPrefix}messages", array('text' => $messageDataEncrypted['text'], 'salt' => $messageDataEncrypted['saltNum'], 'iv' => $messageDataEncrypted['iv'], 'ip' => $_SERVER['REMOTE_ADDR'], 'userId' => $user['userId']), array("messageId" => (int) $request['messageId']));
         $database->modLog('editMessage', $messageData['messageId']);
         $database->createEvent('editedMessage', $user['userId'], $roomData['roomId'], $messageData['messageId'], $messageDataNew['text'], false);
         // name, user, room, message, p1, p2, p3
         $xmlData['editMessage']['response']['success'] = true;
     } else {
         $errStr = 'noPerm';
         $errDesc = 'You are not allowed to moderate this room.';
     }
     break;
 default:
     $errStr = 'badAction';
 * @copyright Joseph T. Parsons 2014
 *
 * @param string rooms - A comma-seperated list of room IDs to get.
 * @param string users - A comma-seperated list of user IDs to get.
*/
$apiRequest = true;
require '../global.php';
/* Get Request Data */
$request = fim_sanitizeGPC('g', array('rooms' => array('default' => '', 'cast' => 'jsonList', 'filter' => 'int', 'evaltrue' => true), 'users' => array('default' => '', 'cast' => 'jsonList', 'filter' => 'int', 'evaltrue' => true)));
/* Data Predefine */
$xmlData = array('getKicks' => array('activeUser' => array('userId' => (int) $user['userId'], 'userName' => fim_encodeXml($user['userName'])), 'errStr' => fim_encodeXml($errStr), 'errDesc' => fim_encodeXml($errDesc), 'kicks' => array()));
/* Get Kicks from Database */
$kicks = $database->getKicks(array('userIds' => $request['users'], 'roomIds' => $request['rooms']))->getAsArray(true);
/* Start Processing */
foreach ($kicks as $kick) {
    $kick['parentalAge'] = 100;
    // Over-ride parentalAge/parentalFlags; TODO: needed?
    $kick['parentalFlags'] = '';
    if (fim_hasPermission($kick, $user, 'moderate') || $kick['userId'] == $user['userId']) {
        // The user is allowed to know of all kicks they are subject to, and of all kicks in any rooms they moderate.
        $xmlData['getKicks']['kicks']['kick ' . $kick['kickId']] = array('roomData' => array('roomId' => (int) $kick['roomId'], 'roomName' => (string) $kick['roomName']), 'userData' => array('userId' => (int) $kick['userId'], 'userName' => (string) $kick['userName'], 'userNameFormat' => (string) $kick['userNameFormat']), 'kickerData' => array('userId' => (int) $kick['kickerId'], 'userName' => (string) $kick['kickerName'], 'userNameFormat' => (string) $kick['userNameFormat']), 'length' => (int) $kick['klength'], 'set' => (int) $kick['ktime'], 'expires' => (int) ($kick['ktime'] + $kick['klength']));
    }
}
/* Update Data for Errors */
$xmlData['getKicks']['errStr'] = (string) $errStr;
$xmlData['getKicks']['errDesc'] = (string) $errDesc;
if ($config['dev']) {
    $xmlData['request'] = $request;
}
/* Output Data */
echo fim_outputApi($xmlData);
/**
 * Sets a User's Activity Status
 *
 * @package fim3
 * @version 3.0
 * @author Jospeph T. Parsons <*****@*****.**>
 * @copyright Joseph T. Parsons 2014
 *
 * @param int roomId - A comma-seperated list of room IDs to get.
 * @param string statusType - The type of status.
 * @param string statusValue - The value of the status type.
*/
$apiRequest = true;
require '../global.php';
/* Get Request Data */
$request = fim_sanitizeGPC('p', array('roomIds' => array('cast' => 'jsonList', 'filter' => 'int'), 'status' => array('valid' => array('away', 'busy', 'available', 'invisible', 'offline')), 'type' => array('cast' => 'bool')));
/* Get Room Data */
$rooms = $slaveDatabase->getRooms(array('roomIds' => $request['roomIds']))->getAsArray('roomId');
if (!count($rooms)) {
    throw new Exception('invalidRooms');
} else {
    foreach ($rooms as $room) {
        if (!fim_hasPermission($room, $user, 'view', true)) {
            continue;
        }
        $database->setUserStatus($room['roomId']);
    }
}
$xmlData = array('setUserStatus' => array('activeUser' => array('userId' => (int) $user['userId'], 'userName' => $user['userName'])));
/* Output Data */
echo fim_outputApi($xmlData);
 * @package fim3
 * @version 3.0
 * @author Jospeph T. Parsons <*****@*****.**>
 * @copyright Joseph T. Parsons 2014
 *
 * @param string users - A comma-seperated list of user IDs to get.
*/
$apiRequest = true;
require '../global.php';
/* Get Request Data */
$request = fim_sanitizeGPC('g', array('users' => array('default' => array($user['userId']), 'cast' => 'csv', 'filter' => 'int', 'evaltrue' => true)));
/* Data Pre-Define */
$xmlData['getFiles'] = array('activeUser' => array('userId' => (int) $user['userId'], 'userName' => $user['userName']), 'errStr' => $errStr, 'errDesc' => $errDesc, 'files' => array());
/* Get Uploads from Database */
$files = $database->getFiles(array('userIds' => $request['users']))->getAsArray('fileId');
/* Start Processing */
foreach ($files as $file) {
    // Only show if the user has permission.
    if ($file['roomIdLink'] && $file['userId'] != $user['userId']) {
        /* TODO: Test */
        if (!fim_hasPermission($database->getRoom($file['roomIdLink']), $user, 'view', true)) {
            continue;
        }
    }
    $xmlData['getFiles']['files']['file ' . $file['fileId']] = array('fileSize' => (int) $file['size'], 'fileSizeFormatted' => fim_formatSize($file['size']), 'fileName' => $file['fileName'], 'mime' => $file['mime'], 'parentalAge' => $file['fileParentalAge'], 'parentalFlags' => explode(',', $file['fileParentalFlags']), 'md5hash' => $file['md5hash'], 'sha256hash' => $file['sha256hash']);
}
if ($config['dev']) {
    $xmlData['request'] = $request;
}
/* Output Data */
echo fim_outputApi($xmlData);
 * @author Jospeph T. Parsons <*****@*****.**>
 * @copyright Joseph T. Parsons 2014
 *
 * @param string rooms - A comma-seperated list of room IDs to get.
 * @param int [number = 10] - The number of top posters to obtain.
*/
$apiRequest = true;
require '../global.php';
/* Get Request */
$request = fim_sanitizeGPC('g', array('rooms' => array('default' => '', 'cast' => 'jsonList', 'filter' => 'int', 'evaltrue' => true), 'users' => array('default' => '', 'cast' => 'jsonList', 'filter' => 'int', 'evaltrue' => true), 'number' => array('default' => 10, 'cast' => 'int')));
/* Data Predefine */
$xmlData = array('getStats' => array('activeUser' => array('userId' => (int) $user['userId'], 'userName' => $user['userName']), 'errStr' => $errStr, 'roomStats' => array()));
/* Start Processing */
$totalPosts = $database->getPostStats(array('roomIds' => $request['rooms']))->getAsArray(array('roomId', 'userId'), false);
//var_dump($totalPosts);
foreach ($totalPosts as $room) {
    foreach ($room as $roomId => $totalPoster) {
        if (!fim_hasPermission($totalPoster, $totalPoster, 'view', true)) {
            // Users must be able to view the room to see the respective post counts.
            continue;
        }
        if (!isset($xmlData['getStats']['roomStats']['room ' . $totalPoster['roomId']])) {
            $xmlData['getStats']['roomStats']['room ' . $totalPoster['roomId']] = array('roomData' => array('roomId' => (int) $totalPoster['roomId'], 'roomName' => $totalPoster['roomName']), 'users' => array());
        }
        $xmlData['getStats']['roomStats']['room ' . $totalPoster['roomId']]['users']['user ' . $totalPoster['userId']] = array('userData' => array('userId' => (int) $totalPoster['userId'], 'userName' => $totalPoster['userName'], 'userNameFormat' => $totalPoster['userNameFormat']), 'messageCount' => (int) $totalPoster['messages']);
    }
}
/* Update Data for Errors */
$xmlData['getStats']['errStr'] = $errStr;
/* Output Data */
echo fim_outputApi($xmlData);
            } elseif ($badRegex) {
                $xmlData['editUserOptions']['response']['profile']['status'] = false;
                $xmlData['editUserOptions']['response']['profile']['errStr'] = 'bannedUrl';
                $xmlData['editUserOptions']['response']['profile']['errDesc'] = 'The URL specified is not allowed.';
            } else {
                $updateArray['profile'] = $request['profile'];
                $xmlData['editUserOptions']['response']['profile']['status'] = true;
                $xmlData['editUserOptions']['response']['profile']['newValue'] = $request['profile'];
            }
        }
    }
}
/* Default Room */
if ($request['defaultRoomId'] > 0) {
    $defaultRoomData = $slaveDatabase->getRoom($request['defaultRoomId']);
    if (fim_hasPermission($defaultRoomData, $user, 'view')) {
        $updateArray['defaultRoom'] = (int) $request['defaultRoomId'];
        $xmlData['editUserOptions']['response']['defaultRoom']['status'] = true;
        $xmlData['editUserOptions']['response']['defaultRoom']['newValue'] = (int) $request['defaultRoomId'];
    } else {
        $xmlData['editUserOptions']['response']['defaultRoom']['status'] = false;
        $xmlData['editUserOptions']['response']['defaultRoom']['errStr'] = 'noPerm';
        $xmlData['editUserOptions']['response']['defaultRoom']['errDesc'] = 'You do not have permission to view the room you are trying to default to.';
    }
}
/* Watch Rooms (used for notifications of new messages, which are placed in unreadMessages) */
if (count($request['watchRooms'])) {
    $database->editRoomList('watchRooms', $user, $request['watchRooms'], $_SERVER['REQUEST_METHOD']);
}
/* Fav List */
if (count($request['favRooms'])) {
         $errStr = 'exists';
         $errDesc = 'The room specified already exists.';
         $continue = false;
     }
     $room['roomId'] = 0;
 } elseif ($request['action'] === 'edit') {
     if (!$request['roomName']) {
         $request['roomName'] = $room['roomName'];
     }
     // If only a room ID was provided, we will fill in the room name here.
     if ($room === false) {
         $errStr = 'noRoom';
         $errDesc = 'The room specified does not exist.';
     } elseif ($room['roomType'] !== 'general') {
         $errStr = 'nongeneralRoom';
     } elseif (!fim_hasPermission($room, $user, 'admin', true)) {
         // The user must be an admin (or, inherently, the room's owner) to edit rooms.
         $errStr = 'noPerm';
         $errDesc = 'You do not have permission to edit this room.';
     } elseif ($room['settings'] & 4) {
         // Make sure the room hasn't been deleted.
         $errStr = 'deleted';
         $errDesc = 'The room has been deleted - it can not be edited.';
     } elseif (count($data) > 0 && $data['roomId'] !== $room['roomId']) {
         // Make sure no other room with that name exists (if no room is found, the result is false), and that, of course, this only applies if the user just specified the current room's existing name.
         $errStr = 'exists';
         $errDesc = 'The room name specified already exists.';
     }
 }
 if (!$errStr) {
     if (strlen($request['roomName']) == 0) {