function getreward($action, $update = 1, $uid = 0, $needle = '', $setcookie = 1) { global $_SGLOBAL, $_SCOOKIE; $credit = 0; $reward = array('credit' => 0, 'experience' => 0); $creditlog = array(); @(include_once S_ROOT . './data/data_creditrule.php'); $rule = $_SGLOBAL['creditrule'][$action]; if ($rule['credit'] || $rule['experience']) { $uid = $uid ? intval($uid) : $_SGLOBAL['supe_uid']; if ($rule['rewardtype']) { //增加积分 $query = $_SGLOBAL['db']->query("SELECT * FROM " . tname('creditlog') . " WHERE uid='{$uid}' AND rid='{$rule['rid']}'"); $creditlog = $_SGLOBAL['db']->fetch_array($query); if (empty($creditlog)) { $reward['credit'] = $rule['credit']; $reward['experience'] = $rule['experience']; $setarr = array('uid' => $uid, 'rid' => $rule['rid'], 'total' => 1, 'cyclenum' => 1, 'credit' => $rule['credit'], 'experience' => $rule['experience'], 'dateline' => $_SGLOBAL['timestamp']); //判断是否需要去重 if ($rule['norepeat']) { if ($rule['norepeat'] == 1) { $setarr['info'] = $needle; } elseif ($rule['norepeat'] == 2) { $setarr['user'] = $needle; } elseif ($rule['norepeat'] == 3) { $setarr['app'] = $needle; } } if (in_array($rule['cycletype'], array(2, 3))) { $setarr['starttime'] = $_SGLOBAL['timestamp']; } $clid = inserttable('creditlog', $setarr, 1); } else { $newcycle = false; $setarr = array(); $clid = $creditlog['clid']; switch ($rule['cycletype']) { case 0: //一次性奖励 break; case 1: //每天限次数 //每天限次数 case 4: //不限周期 $sql = 'cyclenum+1'; if ($rule['cycletype'] == 1) { $today = sstrtotime(sgmdate('Y-m-d')); //判断是否为昨天 if ($creditlog['dateline'] < $today && $rule['rewardnum']) { $creditlog['cyclenum'] = 0; $sql = 1; $newcycle = true; } } if (empty($rule['rewardnum']) || $creditlog['cyclenum'] < $rule['rewardnum']) { //验证是否为需要去重操作 if ($rule['norepeat']) { $repeat = checkcheating($creditlog, $needle, $rule['norepeat']); if ($repeat && !$newcycle) { return $reward; } } $reward['credit'] = $rule['credit']; $reward['experience'] = $rule['experience']; //更新次数 $setarr = array('cyclenum' => "cyclenum={$sql}", 'total' => 'total=total+1', 'dateline' => "dateline='{$_SGLOBAL['timestamp']}'", 'credit' => "credit='{$reward['credit']}'", 'experience' => "experience='{$reward['experience']}'"); } break; case 2: //整点 //整点 case 3: //间隔分钟 $nextcycle = 0; if ($creditlog['starttime']) { if ($rule['cycletype'] == 2) { //上一次执行时间 $start = sstrtotime(sgmdate('Y-m-d H:00:00', $creditlog['starttime'])); $nextcycle = $start + $rule['cycletime'] * 3600; } else { $nextcycle = $creditlog['starttime'] + $rule['cycletime'] * 60; } } if ($_SGLOBAL['timestamp'] <= $nextcycle && $creditlog['cyclenum'] < $rule['rewardnum']) { //验证是否为需要去重操作 if ($rule['norepeat']) { $repeat = checkcheating($creditlog, $needle, $rule['norepeat']); if ($repeat && !$newcycle) { return $reward; } } $reward['experience'] = $rule['experience']; $reward['credit'] = $rule['credit']; $setarr = array('cyclenum' => "cyclenum=cyclenum+1", 'total' => 'total=total+1', 'dateline' => "dateline='{$_SGLOBAL['timestamp']}'", 'credit' => "credit='{$reward['credit']}'", 'experience' => "experience='{$reward['experience']}'"); } elseif ($_SGLOBAL['timestamp'] >= $nextcycle) { $newcycle = true; $reward['experience'] = $rule['experience']; $reward['credit'] = $rule['credit']; $setarr = array('cyclenum' => "cyclenum=1", 'total' => 'total=total+1', 'dateline' => "dateline='{$_SGLOBAL['timestamp']}'", 'credit' => "credit='{$reward['credit']}'", 'starttime' => "starttime='{$_SGLOBAL['timestamp']}'", 'experience' => "experience='{$reward['experience']}'"); } break; } //记录操作历史 if ($rule['norepeat'] && $needle) { switch ($rule['norepeat']) { case 0: break; case 1: //信息去重 $info = empty($creditlog['info']) || $newcycle ? $needle : $creditlog['info'] . ',' . $needle; $setarr['info'] = "`info`='{$info}'"; break; case 2: //用户去重 $user = empty($creditlog['user']) || $newcycle ? $needle : $creditlog['user'] . ',' . $needle; $setarr['user'] = "******"; break; case 3: //应用去重 $app = empty($creditlog['app']) || $newcycle ? $needle : $creditlog['app'] . ',' . $needle; $setarr['app'] = "`app`='{$app}'"; break; } } if ($setarr) { $_SGLOBAL['db']->query("UPDATE " . tname('creditlog') . " SET " . implode(',', $setarr) . " WHERE clid='{$creditlog['clid']}'"); } } if ($setcookie && ($uid = $_SGLOBAL['supe_uid'])) { //其中有新值时才重写cookie值 if ($reward['credit'] || $reward['experience']) { $logstr = $action . ',' . $clid; ssetcookie('reward_log', $logstr); $_SCOOKIE['reward_log'] = $logstr; } } } else { //扣除积分 $reward['credit'] = "-{$rule['credit']}"; $reward['experience'] = "-{$rule['experience']}"; } if ($update && ($reward['credit'] || $reward['experience'])) { $setarr = array(); if ($reward['credit']) { $setarr['credit'] = "credit=credit+{$reward['credit']}"; } if ($reward['experience']) { $setarr['experience'] = "experience=experience+{$reward['experience']}"; } $_SGLOBAL['db']->query("UPDATE " . tname('space') . " SET " . implode(',', $setarr) . " WHERE uid='{$uid}'"); } } return array('credit' => abs($reward['credit']), 'experience' => abs($reward['experience'])); }
function getreward($action, $update = 1, $uid = 0, $needle = '', $setcookie = 1) { global $_SGLOBAL, $_SCOOKIE; $reward = array('credit' => 0, 'experience' => 0); $creditlog = array(); @(include_once S_ROOT . './data/system/creditrule.cache.php'); $rule = $_SGLOBAL['creditrule'][$action]; if ($rule['credit'] || $rule['experience']) { $uid = $uid ? intval($uid) : $_SGLOBAL['supe_uid']; $query = $_SGLOBAL['db']->query("SELECT * FROM " . tname('members') . " WHERE uid='{$uid}'"); if ($member = $_SGLOBAL['db']->fetch_array($query)) { if ($rule['rewardtype'] == 1) { //Ôö¼Ó»ý·Ö $query = $_SGLOBAL['db']->query("SELECT * FROM " . tname('creditlog') . " WHERE uid='{$uid}' AND rid='{$rule['rid']}'"); $creditlog = $_SGLOBAL['db']->fetch_array($query); if (empty($creditlog)) { $reward['credit'] = $rule['credit']; $reward['experience'] = $rule['experience']; $setarr = array('uid' => $uid, 'rid' => $rule['rid'], 'total' => 1, 'cyclenum' => 1, 'credit' => $rule['credit'], 'experience' => $rule['experience'], 'dateline' => $_SGLOBAL['timestamp']); //ÅжÏÊÇ·ñÐèҪȥÖØ if ($rule['norepeat']) { if ($rule['norepeat'] == 1) { $setarr['info'] = $needle; } elseif ($rule['norepeat'] == 2) { $setarr['user'] = $needle; } } if (in_array($rule['cycletype'], array(2, 3))) { $setarr['starttime'] = $_SGLOBAL['timestamp']; } $clid = inserttable('creditlog', $setarr, 1); } else { $newcycle = false; $setarr = array(); $clid = $creditlog['clid']; switch ($rule['cycletype']) { case 0: //Ò»´ÎÐÔ½±Àø break; case 1: //ÿÌìÏÞ´ÎÊý //ÿÌìÏÞ´ÎÊý case 4: //²»ÏÞÖÜÆÚ $sql = 'cyclenum+1'; if ($rule['cycletype'] == 1) { $today = sstrtotime(sgmdate($_SGLOBAL['timetemp'], 'Y-m-d')); //ÅжÏÊÇ·ñΪ×òÌì if ($creditlog['dateline'] < $today && $rule['rewardnum']) { $creditlog['cyclenum'] = 0; $sql = 1; $newcycle = true; } } if (empty($rule['rewardnum']) || $creditlog['cyclenum'] < $rule['rewardnum']) { //ÑéÖ¤ÊÇ·ñΪÐèҪȥÖزÙ×÷ if ($rule['norepeat']) { $repeat = checkcheating($creditlog, $needle, $rule['norepeat']); if ($repeat && !$newcycle) { return $reward; } } $reward['credit'] = $rule['credit']; $reward['experience'] = $rule['experience']; //¸üдÎÊý $setarr = array('cyclenum' => "cyclenum={$sql}", 'total' => 'total=total+1', 'dateline' => "dateline='{$_SGLOBAL['timestamp']}'", 'credit' => "credit='{$reward['credit']}'", 'experience' => "experience='{$reward['experience']}'"); } break; case 2: //Õûµã //Õûµã case 3: //¼ä¸ô·ÖÖÓ $nextcycle = 0; if ($creditlog['starttime']) { if ($rule['cycletype'] == 2) { //ÉÏÒ»´ÎÖ´ÐÐʱ¼ä $start = sstrtotime(sgmdate($creditlog['starttime'], 'Y-m-d H:00:00')); $nextcycle = $start + $rule['cycletime'] * 3600; } else { $nextcycle = $creditlog['starttime'] + $rule['cycletime'] * 60; } } if ($_SGLOBAL['timestamp'] <= $nextcycle && $creditlog['cyclenum'] < $rule['rewardnum']) { //ÑéÖ¤ÊÇ·ñΪÐèҪȥÖزÙ×÷ if ($rule['norepeat']) { $repeat = checkcheating($creditlog, $needle, $rule['norepeat']); if ($repeat && !$newcycle) { return $reward; } } $reward['experience'] = $rule['experience']; $reward['credit'] = $rule['credit']; $setarr = array('cyclenum' => "cyclenum=cyclenum+1", 'total' => 'total=total+1', 'dateline' => "dateline='{$_SGLOBAL['timestamp']}'", 'credit' => "credit='{$reward['credit']}'", 'experience' => "experience='{$reward['experience']}'"); } elseif ($_SGLOBAL['timestamp'] >= $nextcycle) { $newcycle = true; $reward['experience'] = $rule['experience']; $reward['credit'] = $rule['credit']; $setarr = array('cyclenum' => "cyclenum=1", 'total' => 'total=total+1', 'dateline' => "dateline='{$_SGLOBAL['timestamp']}'", 'credit' => "credit='{$reward['credit']}'", 'starttime' => "starttime='{$_SGLOBAL['timestamp']}'", 'experience' => "experience='{$reward['experience']}'"); } break; } //¼Ç¼²Ù×÷ÀúÊ· if ($rule['norepeat'] && $needle) { switch ($rule['norepeat']) { case 0: break; case 1: //ÐÅϢȥÖØ $info = empty($creditlog['info']) || $newcycle ? $needle : $creditlog['info'] . ',' . $needle; $setarr['info'] = "`info`='{$info}'"; break; case 2: //Óû§È¥ÖØ $user = empty($creditlog['user']) || $newcycle ? $needle : $creditlog['user'] . ',' . $needle; $setarr['user'] = "******"; break; } } if ($setarr) { $_SGLOBAL['db']->query("UPDATE " . tname('creditlog') . " SET " . implode(',', $setarr) . " WHERE clid='{$creditlog['clid']}'"); } } } elseif ($rule['rewardtype'] == 0) { //¿Û»ý·Ö£¬¼Ó¾Ñé if ($member['credit'] < $rule['credit']) { return false; } $reward['credit'] = "-{$rule['credit']}"; $reward['experience'] = "{$rule['experience']}"; } else { //¿Û»ý·Ö£¬¿Û¾Ñé $reward['credit'] = "-{$rule['credit']}"; $reward['experience'] = "-{$rule['experience']}"; } if ($update && ($reward['credit'] || $reward['experience'])) { $setarr = array(); if ($reward['credit']) { $setarr['credit'] = $reward['credit'] >= 0 ? "credit=credit+{$reward['credit']}" : "credit=credit{$reward['credit']}"; } if ($reward['experience']) { $setarr['experience'] = "experience=experience+{$reward['experience']}"; } $_SGLOBAL['db']->query("UPDATE " . tname('members') . " SET " . implode(',', $setarr) . " WHERE uid='{$uid}'"); } } } return array('credit' => abs($reward['credit']), 'experience' => abs($reward['experience'])); }