/** * 执行图度规则过滤 * * 遍历所有接收人所有可用规则,并执行过滤 * @param $params */ public function filterTudu($params) { if (empty($params['tuduid']) || empty($params['tsid'])) { return; } $tuduId = $params['tuduid']; $manager = Tudu_Tudu_Manager::getInstance(Tudu_Dao_Manager::getDb(Tudu_Dao_Manager::DB_TS)); /** @var $daoRule Dao_Td_Rule_Rule */ $daoRule = Tudu_Dao_Manager::getDao('Dao_Td_Rule_Rule', Tudu_Dao_Manager::DB_TS); $users = $manager->getTuduUsers($tuduId); if (!$users) { $this->getLogger()->warn("Tudu id:{$tuduId} Users are not exists"); return; } $tudu = $manager->getTuduById($tuduId, $users[0]['uniqueid']); if (null === $tudu) { $this->getLogger()->warn("Tudu id: {$tuduId} is not exists"); return; } $tudu = $tudu->toArray(); $expire = 3600 * 24; //定义Memcache过期时间: 一天 // 获取接收用户规则过滤 foreach ($users as $user) { $unId = $user['uniqueid']; $rules = $this->_memcache->loadCache(array($daoRule, 'getRulesByUniqueId'), array($unId, array('isvalid' => true)), $expire); if ($rules->count() <= 0) { continue; } foreach ($rules as $rule) { $filters = $rule->getFilters(); $filterCount = $filters->count(); $matchCount = 0; if ($filterCount <= 0) { continue; } foreach ($filters as $filter) { $contain = false; switch ($filter->what) { // 发起人 case 'from': if (is_array($filter->value)) { foreach ($filter->value as $item) { $item = str_replace(array('oray.com', 'tudu.com'), array('oray', ''), $item); if ($item == $tudu['from'][3]) { $contain = true; break; } } } break; // 接收人,抄送人 // 接收人,抄送人 case 'to': case 'cc': if (is_array($filter->value)) { $count = 0; $match = 0; foreach ($filter->value as $item) { $count++; $item = str_replace(array('oray.com', 'tudu.com'), array('oray', ''), $item); if (isset($tudu[$filter->what][$item])) { $match++; } } if ($count == $match) { $contain = true; } } break; case 'subject': $contain = false !== strpos($tudu['subject'], $filter->value); break; } if ($filter->type == 'contain' && $contain || $filter->type == 'exclusive' && !$contain) { $matchCount++; } } // 匹配过滤条件,执行规则操作 if ($matchCount == $filterCount) { // 标签 if ($rule->operation == 'label') { $manager->addLabel($tuduId, $unId, $rule->value); // 忽略 } elseif ($rule->operation == 'ignore') { $manager->deleteLabel($tuduId, $unId, '^i'); $manager->addLabel($tuduId, $unId, '^g'); // 星标 } elseif ($rule->operation == 'starred') { $manager->addLabel($tuduId, $unId, '^t'); } // 是否需要邮件提醒 if (!empty($rule->mailRemind)) { $mailRemind = $rule->mailRemind; // 邮件提醒可用且图度在指定的板块的 if ($mailRemind['isvalid'] && !empty($mailRemind['boards']) && !empty($mailRemind['mailbox']) && is_array($mailRemind['boards']) && in_array($tudu['boardid'], $mailRemind['boards'])) { $emails = array(); foreach ($mailRemind['mailbox'] as $email) { // 必须是邮箱 if (Oray_Function::isEmail($email)) { $emails[] = $email; } } if (!empty($emails)) { $remind = array('tuduid' => $tudu['tuduid'], 'tsid' => $params['tsid'], 'emails' => $emails, 'subject' => $tudu['subject'], 'sender' => $tudu['from'][0], 'lastupdate' => date('Y-m-d H:i:s', $tudu['lastposttime']), 'content' => mb_substr(strip_tags($tudu['content']), 0, 20, 'utf-8'), 'type' => $this->_typeNames[$tudu['type']], 'url' => 'http://' . $tudu['orgid'] . '.tudu.com/tudu/view?tid=' . $tudu['tuduid']); $this->getLogger()->warn("Send Email notify to:" . implode(',', $emails)); // 发送邮件提醒请求 $data = implode(' ', array('send', 'email', '', http_build_query($remind))); $this->_httpsqs->put($data, $this->_options['httpsqs']['names']['send']); } } } } } } $this->getLogger()->debug("Tudu id:{$tuduId} done"); }