好像这个系列没多少人支持一样?呵呵,不过还是会继续下去的,毕竟我在Discuz当版主这么多年来也没有见过这种类型的帖子。
申明下版权:
1.这里面的每个中文字都是我打的,code部分是引用的,当然我也加了一点注释在里面了。
2.如果要转载的话请注明- 转自[url]www.discuz.net[/url] 作者:郭鑫
复制代码
3.由于我个人的能力有限,写这篇文章没有参考一点资料,甚至连本地环境也没有搭建(遇到了白屏问题),所以难免会有错误的地方,大家发现了的话请跟帖或者联系我吧,我会尽快更正。
- //同样,防止非法引用用的。
- if(!defined('IN_DISCUZ')) {
- exit('Access Denied');
- }
复制代码- /**
- * 这个函数看着很长,其实要实现的功能很少,就是通过ip地址返回一个对应的地理位置
- * @para string $ip //给定的ip,要符合点分十进制
- *
- * @return string
- */
- function convertip($ip) {
- if(!preg_match("/^d{1,3}.d{1,3}.d{1,3}.d{1,3}$/", $ip)) {
- return '';
- }
- if($fd = @fopen(DISCUZ_ROOT.'./ipdata/wry.dat', 'rb')) {
- $ip = explode('.', $ip);
- $ipNum = $ip[0] * 16777216 + $ip[1] * 65536 + $ip[2] * 256 + $ip[3];
- $DataBegin = fread($fd, 4);
- $DataEnd = fread($fd, 4);
- $ipbegin = implode('', unpack('L', $DataBegin));
- if($ipbegin < 0) $ipbegin += pow(2, 32);
- $ipend = implode('', unpack('L', $DataEnd));
- if($ipend < 0) $ipend += pow(2, 32);
- $ipAllNum = ($ipend - $ipbegin) / 7 + 1;
- $BeginNum = 0;
- $EndNum = $ipAllNum;
- while($ip1num > $ipNum || $ip2num < $ipNum) {
- $Middle= intval(($EndNum + $BeginNum) / 2);
- fseek($fd, $ipbegin + 7 * $Middle);
- $ipData1 = fread($fd, 4);
- if(strlen($ipData1) < 4) {
- fclose($fd);
- return '- System Error';
- }
- $ip1num = implode('', unpack('L', $ipData1));
- if($ip1num < 0) $ip1num += pow(2, 32);
- if($ip1num > $ipNum) {
- $EndNum = $Middle;
- continue;
- }
- $DataSeek = fread($fd, 3);
- if(strlen($DataSeek) < 3) {
- fclose($fd);
- return '- System Error';
- }
- $DataSeek = implode('', unpack('L', $DataSeek.chr(0)));
- fseek($fd, $DataSeek);
- $ipData2 = fread($fd, 4);
- if(strlen($ipData2) < 4) {
- fclose($fd);
- return '- System Error';
- }
- $ip2num = implode('', unpack('L', $ipData2));
- if($ip2num < 0) $ip2num += pow(2, 32);
- if($ip2num < $ipNum) {
- if($Middle == $BeginNum) {
- fclose($fd);
- return '- Unknown';
- }
- $BeginNum = $Middle;
- }
- }
- $ipFlag = fread($fd, 1);
- if($ipFlag == chr(1)) {
- $ipSeek = fread($fd, 3);
- if(strlen($ipSeek) < 3) {
- fclose($fd);
- return '- System Error';
- }
- $ipSeek = implode('', unpack('L', $ipSeek.chr(0)));
- fseek($fd, $ipSeek);
- $ipFlag = fread($fd, 1);
- }
- if($ipFlag == chr(2)) {
- $AddrSeek = fread($fd, 3);
- if(strlen($AddrSeek) < 3) {
- fclose($fd);
- return '- System Error';
- }
- $ipFlag = fread($fd, 1);
- if($ipFlag == chr(2)) {
- $AddrSeek2 = fread($fd, 3);
- if(strlen($AddrSeek2) < 3) {
- fclose($fd);
- return '- System Error';
- }
- $AddrSeek2 = implode('', unpack('L', $AddrSeek2.chr(0)));
- fseek($fd, $AddrSeek2);
- } else {
- fseek($fd, -1, SEEK_CUR);
- }
- while(($char = fread($fd, 1)) != chr(0))
- $ipAddr2 .= $char;
- $AddrSeek = implode('', unpack('L', $AddrSeek.chr(0)));
- fseek($fd, $AddrSeek);
- while(($char = fread($fd, 1)) != chr(0))
- $ipAddr1 .= $char;
- } else {
- fseek($fd, -1, SEEK_CUR);
- while(($char = fread($fd, 1)) != chr(0))
- $ipAddr1 .= $char;
- $ipFlag = fread($fd, 1);
- if($ipFlag == chr(2)) {
- $AddrSeek2 = fread($fd, 3);
- if(strlen($AddrSeek2) < 3) {
- fclose($fd);
- return '- System Error';
- }
- $AddrSeek2 = implode('', unpack('L', $AddrSeek2.chr(0)));
- fseek($fd, $AddrSeek2);
- } else {
- fseek($fd, -1, SEEK_CUR);
- }
- while(($char = fread($fd, 1)) != chr(0))
- $ipAddr2 .= $char;
- }
- fclose($fd);
- if(preg_match('/http/i', $ipAddr2)) {
- $ipAddr2 = '';
- }
- $ipaddr = "$ipAddr1 $ipAddr2";
- $ipaddr = preg_replace('/CZ88.NET/is', '', $ipaddr);
- $ipaddr = preg_replace('/^s*/is', '', $ipaddr);
- $ipaddr = preg_replace('/s*$/is', '', $ipaddr);
- if(preg_match('/http/i', $ipaddr) || $ipaddr == '') {
- $ipaddr = '- Unknown';
- }
- return '- '.$ipaddr;
- } else {
- $datadir = DISCUZ_ROOT.'./ipdata/';
- $ip_detail = explode('.', $ip);
- if(file_exists($datadir.$ip_detail[0].'.txt')) {
- $ip_fdata = @fopen($datadir.$ip_detail[0].'.txt', 'r');
- } else {
- if(!($ip_fdata = @fopen($datadir.'0.txt', 'r'))) {
- return '- Invalid IP data file';
- }
- }
- for($i = 0; $i = $ip_data_detail[0] && $ip $thread['views']) {
- $thread['views'] = $thread['replies'];
- }
- $postsnum = $thread['replies'] + 1;
- $pagelinks = '';
- if($postsnum > $ppp) {
- $posts = $postsnum;
- $topicpages = ceil($posts / $ppp);
- for($i = 1; $i 6) {
- $pagelinks .= ' .. '.$topicpages.' ';
- }
- $thread['multipage'] = ' ( '.$pagelinks.')';
- } else {
- $thread['multipage'] = '';
- }
- if($thread['highlight']) {
- $string = sprintf('%02d', $thread['highlight']);
- $stylestr = sprintf('%03b', $string[0]);
- $thread['highlight'] = 'style="';
- $thread['highlight'] .= $stylestr[0] ? 'font-weight: bold;' : '';
- $thread['highlight'] .= $stylestr[1] ? 'font-style: italic;' : '';
- $thread['highlight'] .= $stylestr[2] ? 'text-decoration: underline;' : '';
- $thread['highlight'] .= $string[1] ? 'color: '.$colorarray[$string[1]] : '';
- $thread['highlight'] .= '"';
- } else {
- $thread['highlight'] = '';
- }
- if($thread['attachment']) {
- require_once DISCUZ_ROOT.'./include/attachment.func.php';
- $thread['attachment'] = attachtype($thread['attachment']).' ';
- } else {
- $thread['attachment'] = '';
- }
- return $thread;
- }
复制代码- /**
- * 用来更新点击数的
- * @para string $table //用来更新的数据表
- * @para string $idcol //用来更新的数据的id
- * @para string $viewscol //用来更新的列
- * @para string $logfile //日志文件,点击是写入日志的
- */
- function updateviews($table, $idcol, $viewscol, $logfile) {
- global $db, $tablepre;
- $viewlog = $viewarray = array();
- if(@$viewlog = file($logfile = DISCUZ_ROOT.$logfile)) {
- @unlink($logfile);
- $viewlog = array_count_values($viewlog);
- foreach($viewlog as $id => $views) {
- $viewarray[$views] .= ($id > 0) ? ','.intval($id) : '';
- }
- foreach($viewarray as $views => $ids) {
- $db->query("UPDATE $tablepre$table SET $viewscol=$viewscol+$views WHERE $idcol IN (0$ids)", 'UNBUFFERED');
- }
- }
- }
复制代码- /**
- * 给版主的工作写入日志的
- * @para array $thread //对哪个帖子的操作
- * @para string $action //进行的什么操作
- *
- */
- function modlog($thread, $action) {
- global $discuz_user, $adminid, $onlineip, $timestamp, $forum, $reason;
- writelog('modslog', dhtmlspecialchars("$timestampt$discuz_usert$adminidt$onlineipt$forum[fid]t$forum[name]t$thread[tid]t$thread[subject]t$actiont$reason"));
- }
复制代码- /**
- * 检查是不是写了理由
- *
- */
- function checkreasonpm() {
- global $reason;
- $reason = trim(strip_tags($reason));
- if(($GLOBALS['reasonpm'] == 1 || $GLOBALS['reasonpm'] == 3) && !$reason) {
- showmessage('admin_reason_invalid');
- }
- }
复制代码
- /**
- * 发送操作理由报告给帖子作者
- * @para array $var
- * @para string $item
- */
- function sendreasonpm($var, $item) {
- global $$var;
- ${$var}['subject'] = strtr(${$var}['subject'], array_flip(get_html_translation_table(HTML_ENTITIES)));
- ${$var}['dateline'] = gmdate($GLOBALS['_DCACHE']['settings']['dateformat'].' '.$GLOBALS['_DCACHE']['settings']['timeformat'], ${$var}['dateline'] + ($GLOBALS['timeoffset'] * 3600));
- sendpm(${$var}['authorid'], $item.'_subject', $item.'_message');
- }
复制代码- /**
- * 得到一个下拉列表,这个列表是版主操作理由选择
- *
- * @return string $select
- */
- function modreasonselect() {
- global $_DCACHE;
- if(!isset($_DCACHE['modreasons']) || !is_array($_DCACHE['modreasons'])) {
- @include DISCUZ_ROOT.'./forumdata/cache/cache_topicadmin.php';
- }
- $select = '';
- foreach($_DCACHE['modreasons'] as $reason) {
- $select .= $reason ? ''.$reason.'' : '--------';
- }
- return $select;
- }
复制代码- /**
- * 登陆检查,看看是不是在十五分钟已经登陆五次了
- *
- * @return int
- */
- function logincheck() {
- global $db, $tablepre, $onlineip, $timestamp;
- $query = $db->query("SELECT count, lastupdate FROM {$tablepre}failedlogins WHERE ip='$onlineip'");
- if($login = $db->fetch_array($query)) {
- if($timestamp - $login['lastupdate'] > 900) {
- return 3;
- } elseif($login['count'] < 5) {
- return 2;
- } else {
- return 0;
- }
- } else {
- return 1;
- }
- }
复制代码 [code]<div id="code_Aym">
/**
* 和上面的那个函数(logincheck)是配对的,看是哪种方式登陆的
* @para int $permission
*
*/
function loginfailed($permission) {
global $db, $tablepre, $onlineip, $timestamp;
switch($permission) {
case 1: $db->query("REPLACE INTO {$tablepre}failedlogins (ip, count, lastupdate) VALUES ('$onlineip', '1', '$timestamp')");
break;
case 2: $db->query("UPDATE {$tablepre}failedlogins SET count=count+1, lastupdate='$timestamp' WHERE ip='$onlineip'");
break;
case 3: $db->query("UPDATE {$tablepre}failedlogins SET count='1', lastupdate='$timestamp' WHERE ip='$onlineip'");
$db->query("DELETE FROM {$tablepre}failedlogins WHERE lastupdate |