找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4932|回复: 0

[内置扩展] Discuz x3.5 核心文件 class_card.php

[复制链接]
发表于 2024-5-12 22:45:54 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区

您需要 登录 才可以下载或查看,没有账号?立即注册

×
[PHP] 纯文本查看 复制代码
<?php

/**
 *      [Discuz!] (C)2001-2099 Comsenz Inc.
 *      This is NOT a freeware, use is subject to license terms
 *
 *      $Id: class_card.php 27449 2012-02-01 05:32:35Z zhangguosheng $
 */

if(!defined('IN_DISCUZ')) {
	exit('Access Denied');
}
class card{

	var $set = array();
	var $rulekey = array("str"=>"\@", "num"=>"\#", "full"=>"\*");
	var $sysrule = '';
	var $rule = '';
	var $rulemap_str = "ABCDEFGHIJKLMNPQRSTUVWXYZ";
	var $rulemap_num = "123456789";

	var $rulereturn = array();
	var $cardlist = array();

	var $succeed = 0;
	var $fail = 0;
	var $failmin = 1;
	var $failrate = '0.1';


	function __construct() {
		$this->init();
	}
	/**
	 * 初始化函数
	 * 设置系统变量和规则
	 */
	function init() {
	    global $_G;
	    $this->set = &$_G['setting']['card']; // 引用全局设置中的卡片设置
	    $this->sysrule = "^[A-Z0-9".implode('|', $this->rulekey)."]+$"; // 定义系统认可的规则字符集
	}

	/**
	 * 生成卡片规则
	 * @param string $rule 用户自定义规则,为空则使用默认规则
	 * @param int $num 生成卡片的数量
	 * @param array $cardval 卡片值的数组,包含额外的信息如生成者UID和时间戳
	 * @return int 返回生成结果,成功为true,失败为-1或其他错误代码
	 */
	function make($rule = '', $num = 1, $cardval = array()) {
	    global $_G;
	    $this->rule = empty($rule) ? $this->set['rule'] : trim($rule); // 确定使用的规则
	    if(empty($this->rule)) {
	        return -1; // 如果没有有效的规则,直接返回-1
	    }
	    $this->fail($num); // 初始化失败尝试次数
	    $cardval['makeruid'] = $_G['uid']; // 设置制作卡片的用户UID
	    $cardval['dateline'] = $_G['timestamp']; // 设置卡片创建时间戳
	    for($i = 0; $i < $num ; $i++) { // 开始生成指定数量的卡片
	        if($this->checkrule($this->rule)) { // 检查规则是否符合要求
	            $card = $this->rule; // 使用规则创建卡片
	            foreach($this->rulereturn AS $key => $val) { // 替换规则中的占位符
	                $search = array();
	                foreach($val AS $skey => $sval) {
	                    $search[] = '/'.$this->rulekey[$key].'/';
	                }
	                $card =  preg_replace($search, $val, $card, 1);
	            }
	        } else {
	            return 0; // 如果规则检查失败,则返回0
	        }
	        $cardval['id'] = $card; // 设置卡片ID
	        C::t('common_card')->insert($cardval, false, false, 'SILENT'); // 试图插入卡片信息到数据库
	        if(($sqlerror = DB::error())) { // 检查数据库操作是否出错
	            if($sqlerror == 1062) { // 处理唯一性冲突
	                $this->fail++;
	                if($this->failmin > $this->fail) {
	                    $num++;
	                } else {
	                    $num = $i - 1;
	                }
	            }
	        } else {
	            $this->succeed += intval(DB::affected_rows()); // 记录成功插入的卡片数量
	            $this->cardlist[] = $card; // 收集生成的卡片ID
	        }
	    }
	    return true; // 如果生成过程没有遇到错误,则返回true
	}

	/**
	 * 检查规则是否有效
	 * @param string $rule 待检查的规则
	 * @param string $type 检查类型,默认为'0'
	 * @return int 返回检查结果,true表示规则有效,-2表示规则格式不正确
	 */
	function checkrule($rule, $type = '0') {
	    if(!preg_match("/($this->sysrule)/i", $rule)){ // 检查规则是否符合系统定义的格式
	        return -2;
	    }
	    if($type == 0) { // 如果是类型0的规则,进一步处理
	        foreach($this->rulekey AS $key => $val) { // 遍历规则关键字
	            $match = array();
	            preg_match_all("/($val){1}/i", $rule, $match); // 匹配规则中出现的关键字
	            $number[$key] = count($match[0]); // 统计每个关键字出现的次数
	            if($number[$key] > 0) { // 如果有关键字出现,则随机替换为具体值
	                for($i = 0; $i < $number[$key]; $i++) {
	                    switch($key) {
	                    case 'str':
	                        $rand = mt_rand(0, (strlen($this->rulemap_str) - 1));
	                        $this->rulereturn[$key][$i] = $this->rulemap_str[$rand];
	                        break;
	                    case 'num':
	                        $rand = mt_rand(0, (strlen($this->rulemap_num) - 1));
	                        $this->rulereturn[$key][$i] = $this->rulemap_num[$rand];
	                        break;
	                    case 'full':
	                        $fullstr = $this->rulemap_str.$this->rulemap_num;
	                        $rand = mt_rand(0,(strlen($fullstr) - 1));
	                        $this->rulereturn[$key][$i] = $fullstr[$rand];
	                        break;
	                    }
	                }
	            }
	        }
	    }
	    return true; // 如果规则检查通过,则返回true
	}

	/**
	 * 根据生成卡片的数量,计算允许的失败次数
	 * @param int $num 企图生成的卡片数量
	 */
	function fail($num = 1) {
	    $failrate = $this->failrate ? (float)$this->failrate : '0.1'; // 获取失败率,若未设置则默认为0.1
	    $this->failmin = ceil($num * $failrate); // 计算最少的失败次数
	    $this->failmin = $this->failmin > 100 ? 100 : $this->failmin; // 限制失败次数的最大值为100
	}
};
?>

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|新秀网络验证系统API[软著登字第13061951号] ( 豫ICP备2021033257号-1 )

GMT+8, 2026-1-13 08:44 , Processed in 0.245360 second(s), 63 queries , Redis On.

Powered by Discuz! X3.5 Licensed

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表
slot777
slot qris
atlas123
KAPAK123
MENARA123
BARONG123
VIRGO123
HORAS123
KAKEK123
ION123
PATEN123
SALAM123
TUYUL123
KUNGLO123
PINTU123
JOKI123
INTI123
JADI123
MENANGBET
JADIJP
ACEH123
TINGGIBET
SUMBER4D
PULANG4D
POLAMAXWIN
INTAN123
dingin4d
paten123
slotsultan
slot sultan