Example #1
0
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']));
}
Example #2
0
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']));
}