/** * This method returns an array of user criteria and channels, * that is used to match users in the query. */ private static function generateSearchCriteria($sQueryString) { $pInstance = Core::getCurrentInstance(); $aChannels = array(); $aCriteria = array("Nickname" => "%", "Username" => "%", "Hostname" => "%"); # Determinate channel selector and query separator. if (preg_match('/^[\\s]{0,}(.*?)[\\s]{0,}\\:[\\s]{0,}(.*?)[\\s]{0,}$/', preg_quote($sQueryString), $aParts)) { $sQueryString = stripslashes($aParts[1]); $sCSelectorList = stripslashes($aParts[2]); $sPrefixes = $pInstance->getServerConfiguration("PREFIX"); $sPrefix = substr($sPrefixes, strpos($sPrefixes, ")") + 1); $sChanTypes = preg_quote($pInstance->getServerConfiguration("CHANTYPES")); $sChannelPattern = "/^([\\^]{0,1})([{$sPrefix}]{0,})([{$sChanTypes}])(.*)\$/"; foreach (explode(',', $sCSelectorList) as $sSelector) { $sSelector = trim($sSelector); $aSelector = explode(' ', $sSelector); $iSelectorCount = count($aSelector); $aChannelElements = array(); foreach ($aSelector as $sChannel) { if (preg_match($sChannelPattern, $sChannel, $aMatches)) { $aChannelElements[] = (object) array("Channel" => $pInstance->getChannel("{$aMatches[3]}{$aMatches[4]}"), "Modes" => preg_split('//', CoreUtilities::modeCharToLetter($aMatches[2]), -1, PREG_SPLIT_NO_EMPTY), "Negation" => $aMatches[1] == "^"); } } $aChannels[] = $aChannelElements; } } # Username selector. if (preg_match('/^!(.*?)$/', $sQueryString, $aParts)) { $aCriteria = array("Nickname" => "%", "Username" => trim($aParts[1]), "Hostname" => "%"); } elseif (preg_match('/^@(.*?)$/', $sQueryString, $aParts)) { $aCriteria = array("Nickname" => "%", "Username" => "%", "Hostname" => trim($aParts[1])); } elseif (preg_match('/^(.*?)!(.*?)@(.*?)$/', $sQueryString, $aParts)) { $aCriteria = array("Nickname" => trim($aParts[1]), "Username" => trim($aParts[2]), "Hostname" => trim($aParts[3])); } elseif (preg_match('/^(.*?)@(.*?)$/', $sQueryString, $aParts)) { $aCriteria = array("Nickname" => "%", "Username" => trim($aParts[1]), "Hostname" => trim($aParts[2])); } elseif (preg_match('/^(.*?)$/', $sQueryString, $aParts)) { $aCriteria = array("Nickname" => trim($aParts[1]), "Username" => "%", "Hostname" => "%"); } return array($aChannels, $aCriteria); }
/** * Called when we recieve a NAMES response. * Numeric: 353 - NAMES response. */ public static function N353(CoreMaster $pInstance, MessageObject $pMessage) { $aUserList = explode(' ', trim($pMessage->Payload)); $pChannel = $pInstance->getChannel($pMessage->Parts[4]); foreach ($aUserList as $sNickname) { preg_match("/[+%@&~]/", trim($sNickname), $aChannelModes); $sChannelMode = CoreUtilities::modeCharToLetter(implode("", $aChannelModes)); $sNickname = preg_replace("/[+%@&~]/", "", $sNickname); $pChannel->addUserToChannel($sNickname, $sChannelMode); $pInstance->getUser($sNickname); } }