*/ /** * @class pointController * @author NAVER (developers@xpressengine.com) * @brief Controller class of point modules */ class pointController extends point { /** * @brief Cache module point config */ protected static $_module_point_config = array(); /** * @brief Initialization */ public function init() { } /** * @brief Membership point application trigger */ public function triggerInsertMember($obj) { $member_srl = $obj->member_srl; if (!$member_srl) { return new Object(); } $config = $this->getConfig(); $point = intval($config->signup_point); if (!$point) { return new Object(); } $cur_point = getModel('point')->getPoint($member_srl, true); $this->setPoint($member_srl, $cur_point + $point, 'signup'); return new Object(); } /** * @brief A trigger to add points to the member for login */ public function triggerAfterLogin($obj) { $member_srl = $obj->member_srl; if (!$member_srl) { return new Object(); } // Points are given only once a day. if (substr($obj->last_login, 0, 8) === date('Ymd')) { return new Object(); } $config = $this->getConfig(); $point = intval($config->login_point); if (!$point) { return new Object(); } $cur_point = getModel('point')->getPoint($member_srl, true); $this->setPoint($member_srl, $cur_point + $point); return new Object(); } /** * @brief Member group deletion trigger */ public function triggerDeleteGroup($obj) { $group_srl = $obj->group_srl; $config = $this->getConfig(); // Exclude deleted group from point/level/group integration if($config->point_group && isset($config->point_group[$group_srl])) { unset($config->point_group[$group_srl]); getController('module')->insertModuleConfig('point', $config); } return new Object(); } /** * @brief A trigger to add points to the member for creating a post */ public function triggerInsertDocument($obj) { $oDocumentModel = getModel('document'); if($obj->status != $oDocumentModel->getConfigStatus('temp')) { $module_srl = $obj->module_srl; $member_srl = $obj->member_srl; if(!$module_srl || !$member_srl) return new Object(); // The fix to disable giving points for saving the document temporarily if($module_srl == $member_srl) return new Object(); // Get the point module information $oModuleModel = getModel('module'); $config = $oModuleModel->getModuleConfig('point'); $module_config = $oModuleModel->getModulePartConfig('point',$module_srl); // Get the points of the member $oPointModel = getModel('point'); $cur_point = $oPointModel->getPoint($member_srl, true); $point = $module_config['insert_document']; if(strlen($point) == 0 && !is_int($point)) $point = $config->insert_document; $cur_point += $point; // Add points for attaching a file $point = $module_config['upload_file']; if(strlen($point) == 0 && !is_int($point)) $point = $config->upload_file; if($obj->uploaded_count) $cur_point += $point * $obj->uploaded_count; // Increase the point $this->setPoint($member_srl,$cur_point); } return new Object(); } /** * @brief The trigger to give points for normal saving the temporarily saved document * Temporary storage at the point in 1.2.3 changed to avoid payment */ public function triggerUpdateDocument($obj) { $oDocumentModel = getModel('document'); $document_srl = $obj->document_srl; $oDocument = $oDocumentModel->getDocument($document_srl); // if status is TEMP or PUBLIC... give not point, only status is empty if($oDocument->get('status') == $oDocumentModel->getConfigStatus('temp') && $obj->status != $oDocumentModel->getConfigStatus('temp')) { $oModuleModel = getModel('module'); // Get the point module information $config = $oModuleModel->getModuleConfig('point'); $module_config = $oModuleModel->getModulePartConfig('point',$obj->module_srl); // Get the points of the member $oPointModel = getModel('point'); $cur_point = $oPointModel->getPoint($oDocument->get('member_srl'), true); $point = $module_config['insert_document']; if(strlen($point) == 0 && !is_int($point)) $point = $config->insert_document; $cur_point += $point; // Add points for attaching a file $point = $module_config['upload_file']; if(strlen($point) == 0 && !is_int($point)) $point = $config->upload_file; if($obj->uploaded_count) $cur_point += $point * $obj->uploaded_count; // Increase the point $this->setPoint($oDocument->get('member_srl'), $cur_point); } return new Object(); } /** * @brief The trigger which deducts the points related to post comments before deleting the post itself */ public function triggerBeforeDeleteDocument($obj) { $document_srl = $obj->document_srl; $member_srl = $obj->member_srl; $oDocumentModel = getModel('document'); $oDocument = $oDocumentModel->getDocument($document_srl); if(!$oDocument->isExists()) return new Object(); // Get the point module information $oModuleModel = getModel('module'); $config = $oModuleModel->getModuleConfig('point'); $module_config = $oModuleModel->getModulePartConfig('point',$oDocument->get('module_srl')); // The process related to clearing the post comments $comment_point = $module_config['insert_comment']; if(strlen($comment_point) == 0 && !is_int($comment_point)) $comment_point = $config->insert_comment; // If there are comment points, attempt to deduct if($comment_point>0) return new Object(); // Get all the comments related to this post $cp_args = new stdClass(); $cp_args->document_srl = $document_srl; $output = executeQueryArray('point.getCommentUsers', $cp_args); // Return if there is no object if(!$output->data) return new Object(); // Organize the member number $member_srls = array(); $cnt = count($output->data); for($i=0;$i<$cnt;$i++) { if($output->data[$i]->member_srl<1) continue; $member_srls[abs($output->data[$i]->member_srl)] = $output->data[$i]->count; } // Remove the member number who has written the original post if($member_srl) unset($member_srls[abs($member_srl)]); if(!count($member_srls)) return new Object(); // Remove all the points for each member $oPointModel = getModel('point'); // Get the points $point = $module_config['download_file']; foreach($member_srls as $member_srl => $cnt) { $cur_point = $oPointModel->getPoint($member_srl, true); $cur_point -= $cnt * $comment_point; $this->setPoint($member_srl,$cur_point); } return new Object(); } /** * @brief A trigger to give points for deleting the post */ public function triggerDeleteDocument($obj) { $oDocumentModel = getModel('document'); if($obj->status != $oDocumentModel->getConfigStatus('temp')) { $module_srl = $obj->module_srl; $member_srl = $obj->member_srl; // The process related to clearing the post object if(!$module_srl || !$member_srl) return new Object(); // Run only when logged in $logged_info = Context::get('logged_info'); if(!$logged_info->member_srl) return new Object(); // Get the points of the member $oPointModel = getModel('point'); $cur_point = $oPointModel->getPoint($member_srl, true); // Get the point module information $oModuleModel = getModel('module'); $config = $oModuleModel->getModuleConfig('point'); $module_config = $oModuleModel->getModulePartConfig('point', $module_srl); $point = $module_config['insert_document']; if(strlen($point) == 0 && !is_int($point)) $point = $config->insert_document; // if the point is set to decrease when writing a document, make sure it does not increase the points when deleting an article if($point < 0) return new Object(); $cur_point -= $point; // Add points related to deleting an attachment $point = $module_config['upload_file']; if(strlen($point) == 0 && !is_int($point)) $point = $config->upload_file; if($obj->uploaded_count) $cur_point -= $point * $obj->uploaded_count; // Increase the point $this->setPoint($member_srl,$cur_point); } return new Object(); } /** * @brief A trigger which gives points for entering a comment */ public function triggerInsertComment($obj) { $module_srl = $obj->module_srl; $member_srl = $obj->member_srl; if(!$module_srl || !$member_srl) return new Object(); // Do not increase the points if the member is the author of the post $document_srl = $obj->document_srl; $oDocumentModel = getModel('document'); $oDocument = $oDocumentModel->getDocument($document_srl); // Get the point module information $oModuleModel = getModel('module'); $config = $oModuleModel->getModuleConfig('point'); if($config->no_point_date > 0) { if($oDocument->get('regdate') < date('YmdHis', strtotime('-'.$config->no_point_date.' day'))) { return new Object(); } } if(!$oDocument->isExists() || abs($oDocument->get('member_srl'))==abs($member_srl)) return new Object(); $module_config = $oModuleModel->getModulePartConfig('point', $module_srl); // Get the points of the member $oPointModel = getModel('point'); $cur_point = $oPointModel->getPoint($member_srl, true); $point = $module_config['insert_comment']; if(strlen($point) == 0 && !is_int($point)) $point = $config->insert_comment; // Increase the point $cur_point += $point; $this->setPoint($member_srl,$cur_point); return new Object(); } /** * @brief A trigger which gives points for deleting a comment */ public function triggerDeleteComment($obj) { $oModuleModel = getModel('module'); $oPointModel = getModel('point'); $oDocumentModel = getModel('document'); $module_srl = $obj->module_srl; $member_srl = abs($obj->member_srl); $document_srl = $obj->document_srl; if(!$module_srl || !$member_srl) return new Object(); // Get the original article (if the original article is missing or if the member is its author, do not apply the points) $oDocument = $oDocumentModel->getDocument($document_srl); if(!$oDocument->isExists()) return new Object(); if($oDocument->get('member_srl')==$member_srl) return new Object(); // Get the point module information $config = $oModuleModel->getModuleConfig('point'); $module_config = $oModuleModel->getModulePartConfig('point', $module_srl); // Get the points of the member $cur_point = $oPointModel->getPoint($member_srl, true); $point = $module_config['insert_comment']; if(strlen($point) == 0 && !is_int($point)) $point = $config->insert_comment; // if the point is set to decrease when writing a comment, make sure it does not increase the points when deleting a comment if($point < 0) return new Object(); // Increase the point $cur_point -= $point; $this->setPoint($member_srl,$cur_point); return new Object(); } /** * @brief Add the file registration trigger * To prevent taking points for invalid file registration this method wlil return a null object */ public function triggerInsertFile($obj) { return new Object(); } /** * @brief A trigger to give points for deleting a file * Remove points only in case an invalid file is being deleted */ public function triggerDeleteFile($obj) { if($obj->isvalid != 'Y') return new Object(); $module_srl = $obj->module_srl; $member_srl = $obj->member_srl; if(!$module_srl || !$member_srl) return new Object(); // Get the point module information $oModuleModel = getModel('module'); $config = $oModuleModel->getModuleConfig('point'); $module_config = $oModuleModel->getModulePartConfig('point', $module_srl); // Get the points of the member $oPointModel = getModel('point'); $cur_point = $oPointModel->getPoint($member_srl, true); $point = $module_config['upload_file']; if(strlen($point) == 0 && !is_int($point)) $point = $config->upload_file; // Increase the point $cur_point -= $point; $this->setPoint($member_srl,$cur_point); return new Object(); } /** * @brief The trigger called before a file is downloaded */ public function triggerBeforeDownloadFile($obj) { $logged_info = Context::get('logged_info'); $member_srl = $logged_info->member_srl; $module_srl = $obj->module_srl; if ($member_srl && abs($obj->member_srl) == $member_srl) { return new Object(); } $point = $this->_getModulePointConfig($module_srl, 'download_file'); if (!$point) { return new Object(); } // Get current points. $cur_point = $member_srl ? getModel('point')->getPoint($member_srl, true) : 0; // If the user (member or guest) does not have enough points, deny access. $config = $this->getConfig(); if ($config->disable_download == 'Y' && $cur_point + $point < 0) { return new Object(-1, 'msg_cannot_download'); } // Points will be adjusted after downloading (triggerDownloadFile). return new Object(); } /** * @brief The trigger to give or take points for downloading the file */ public function triggerDownloadFile($obj) { $logged_info = Context::get('logged_info'); $member_srl = $logged_info->member_srl; $module_srl = $obj->module_srl; if (!$member_srl || abs($obj->member_srl) == $member_srl) { return new Object(); } $point = $this->_getModulePointConfig($module_srl, 'download_file'); if (!$point) { return new Object(); } $cur_point = getModel('point')->getPoint($member_srl, true); $this->setPoint($member_srl, $cur_point + $point); return new Object(); } /** * @brief Give points for hits increase * Run it even if there are no points */ public function triggerUpdateReadedCount($obj) { $logged_info = Context::get('logged_info'); $member_srl = $logged_info->member_srl; $module_srl = $obj->get('module_srl'); $target_member_srl = abs($obj->get('member_srl')); if ($member_srl && $target_member_srl == $member_srl) { return new Object(); } $point = $this->_getModulePointConfig($module_srl, 'read_document'); if (!$point) { return new Object(); } // If the current member has already read this document, do not adjust points again. if ($member_srl) { $args = new stdClass(); $args->member_srl = $member_srl; $args->document_srl = $obj->document_srl; $output = executeQuery('document.getDocumentReadedLogInfo', $args); if ($output->data->count) { return new Object(); } } // Get current points. $cur_point = $member_srl ? getModel('point')->getPoint($member_srl, true) : 0; // If the user (member or guest) does not have enough points, deny access. $config = $this->getConfig(); if($config->disable_read_document == 'Y' && $cur_point + $point < 0) { $message = sprintf(lang('msg_disallow_by_point'), abs($point), $cur_point); $obj->add('content', $message); $_SESSION['banned_document'][$obj->document_srl] = true; return new Object(-1, $message); } else { $_SESSION['banned_document'][$obj->document_srl] = false; } // Adjust points for member. if ($member_srl) { $args = new stdClass(); $args->member_srl = $member_srl; $args->document_srl = $obj->document_srl; $output = executeQuery('document.insertDocumentReadedLog', $args); $this->setPoint($member_srl, $cur_point + $point); } return new Object(); } /** * @brief Points for voting up or down */ public function triggerUpdateVotedCount($obj) { $logged_info = Context::get('logged_info'); $logged_member_srl = $logged_info->member_srl; $module_srl = $obj->module_srl; $member_srl = abs($obj->member_srl); if ($logged_member_srl && $logged_member_srl == $member_srl) { return new Object(); } elseif (!$member_srl) { return new Object(); } // Get current points. $cur_point = getModel('point')->getPoint($member_srl, true); // Get adjustment amount. if ($obj->point > 0) { $config_key = (isset($obj->comment_srl) && $obj->comment_srl) ? 'voted_comment' : 'voted'; } else { $config_key = (isset($obj->comment_srl) && $obj->comment_srl) ? 'blamed_comment' : 'blamed'; } $point = $this->_getModulePointConfig($module_srl, $config_key); if (!$point) { return new Object(); } if (isset($obj->cancel) && $obj->cancel) { $point = -1 * $point; } $this->setPoint($member_srl, $cur_point + $point); return new Object(); } /** * @brief Copy point settings when copying module */ public function triggerCopyModule($obj) { $oModuleModel = getModel('module'); $pointConfig = $oModuleModel->getModulePartConfig('point', $obj->originModuleSrl); $oModuleController = getController('module'); if(is_array($obj->moduleSrlList)) { foreach($obj->moduleSrlList AS $key=>$moduleSrl) { $oModuleController->insertModulePartConfig('point', $moduleSrl, $pointConfig); } } } /** * @brief Set points */ public function setPoint($member_srl, $point, $mode = null) { $member_srl = abs($member_srl); $mode_arr = array('add', 'minus', 'update', 'signup'); if(!$mode || !in_array($mode,$mode_arr)) $mode = 'update'; // Get configuration information $oMemberModel = getModel('member'); $oModuleModel = getModel('module'); $oPointModel = getModel('point'); $config = $oModuleModel->getModuleConfig('point'); // Get the default configuration information $current_point = $oPointModel->getPoint($member_srl, true); $current_level = $oPointModel->getLevel($current_point, $config->level_step); // Change points $args = new stdClass(); $args->member_srl = $member_srl; $args->point = $current_point; switch($mode) { case 'add' : $args->point += $point; break; case 'minus' : $args->point -= $point; break; case 'update' : case 'signup' : $args->point = $point; break; } if($args->point < 0) $args->point = 0; $point = $args->point; // Call a trigger (before) $trigger_obj = new stdClass(); $trigger_obj->member_srl = $args->member_srl; $trigger_obj->mode = $mode; $trigger_obj->current_point = $current_point; $trigger_obj->current_level = $current_level; $trigger_obj->set_point = $point; $trigger_output = ModuleHandler::triggerCall('point.setPoint', 'before', $trigger_obj); if(!$trigger_output->toBool()) { return $trigger_output; } // begin transaction $oDB = &DB::getInstance(); $oDB->begin(); // If there are points, update, if no, insert $oPointModel = getModel('point'); if($oPointModel->isExistsPoint($member_srl)) executeQuery("point.updatePoint", $args); else executeQuery("point.insertPoint", $args); // Get a new level $level = $oPointModel->getLevel($point, $config->level_step); // If existing level and a new one are different attempt to set a point group if($level != $current_level) { // Check if the level, for which the current points are prepared, is calculate and set the correct group $point_group = $config->point_group; // If the point group exists if($point_group && is_array($point_group) && count($point_group) ) { // Get the default group $default_group = $oMemberModel->getDefaultGroup(); // Get the removed group and the newly granted group $del_group_list = array(); $new_group_list = array(); asort($point_group); // Reset group after initialization if($config->group_reset != 'N') { // If the new level is in the right group if(in_array($level, $point_group)) { // Delete all groups except the one which the current level belongs to foreach($point_group as $group_srl => $target_level) { $del_group_list[] = $group_srl; if($target_level == $level) $new_group_list[] = $group_srl; } } // Otherwise, in case the level is reduced, add the recent group else { $i = $level; while($i > 0) { if(in_array($i, $point_group)) { foreach($point_group as $group_srl => $target_level) { if($target_level == $i) { $new_group_list[] = $group_srl; } } $i = 0; } $i--; } } // Delete the group of a level which is higher than the current level foreach($point_group as $group_srl => $target_level) { if($target_level > $level) $del_group_list[] = $group_srl; } $del_group_list[] = $default_group->group_srl; } // Grant a new group else { // Check until the current level by rotating setting the configurations of the point groups foreach($point_group as $group_srl => $target_level) { $del_group_list[] = $group_srl; if($target_level <= $level) $new_group_list[] = $group_srl; } } // If there is no a new group, granted the default group if(!$new_group_list[0]) $new_group_list[0] = $default_group->group_srl; // Remove linkage group if($del_group_list && count($del_group_list)) { $del_group_args = new stdClass; $del_group_args->member_srl = $member_srl; $del_group_args->group_srl = implode(',', $del_group_list); $del_group_output = executeQuery('point.deleteMemberGroup', $del_group_args); } // Grant a new group foreach($new_group_list as $group_srl) { $new_group_args = new stdClass; $new_group_args->member_srl = $member_srl; $new_group_args->group_srl = $group_srl; executeQuery('member.addMemberToGroup', $new_group_args); } } } // Call a trigger (after) $trigger_obj->new_group_list = $new_group_list; $trigger_obj->del_group_list = $del_group_list; $trigger_obj->new_level = $level; ModuleHandler::triggerCall('point.setPoint', 'after', $trigger_obj); $oDB->commit(); // Cache Settings $cache_path = sprintf('./files/member_extra_info/point/%s/', getNumberingPath($member_srl)); FileHandler::makedir($cache_path); $cache_filename = sprintf('%s%d.cache.txt', $cache_path, $member_srl); FileHandler::writeFile($cache_filename, $point); getController('member')->_clearMemberCache($member_srl); return $output; } /** * Get point configuration for module, falling back to defaults if not set. * * @param int $module_srl * @param string $config_key * @return int */ protected function _getModulePointConfig($module_srl, $config_key) { $module_srl = intval($module_srl); $config_key = strval($config_key); if (!$config_key) { return 0; } $oModuleModel = getModel('module'); if ($module_srl) { if (!isset(self::$_module_point_config[$module_srl])) { self::$_module_point_config[$module_srl] = $oModuleModel->getModulePartConfig('point', $module_srl); } $module_config = self::$_module_point_config[$module_srl]; } else { $module_config = array(); } if (isset($module_config[$config_key]) && $module_config[$config_key] !== '') { $point = $module_config[$config_key]; } else { $default_config = $this->getConfig(); $point = $default_config->{$config_key}; } return intval($point); } } /* End of file point.controller.php */ /* Location: ./modules/point/point.controller.php */