2012-05-28 58 views
0

我一直在做我的vBulletin論壇很多修改,我已經特別關注不同形式的人工智能和botting在論壇上。我最近創建了一個插件,如果它被調用,這個插件就會讓這個bot在一個線程中發佈。它在某些時候有效,而不是其他時間。我無法弄清楚它爲何如此不可靠。vBulletin機器人只有一些時候被稱爲

它火的鉤位置「newpost_complete」,並具有下面的代碼:

if (stristr($postinfo['pagetext'],'.robot:')){ 
    preg_match('@^(?:.robot:)?([^:]+)@i',$postinfo['pagetext'], $matches); 
    $host = $matches[1]; 
    require_once(DIR . '/includes/functions_robot.php'); 
    run($host,$threadinfo['threadid']); 
} 

我不擅長用正則表達式,所以我不知道的preg_match是最佳的。我發現它很少運行代碼,如果你發佈.robot:hi:但是如果你用.robot:hi引用了一個帖子:hi:即使實際引用的內容更改爲其他內容,它也會運行。

這裏是在functions_robot.php文件中的相關代碼:

function run($command,$threadid) { 
    global $vbulletin; 
    global $db; 
    if ($command == 'hi') { 
     $output = 'Hello.'; 
     //Queries 
    } 
} 

上什麼導致它是如此不可靠的任何想法?如果我能夠順利運行,有很大的潛力。

+0

'.'是一個保留字符 - 它可以匹配任何東西。如果你希望它只匹配一個文字'.'字符,你應該使用'\ .'。 –

+0

謝謝我添加了反斜槓,但這還不足以解決不可靠性問題。 – Jared

+0

我剛剛意識到添加\實際上完全打破了它......編輯:劃痕,有或沒有,它只適用於報價,如果原來的帖子開始與.robot:嗨: – Jared

回答

0

我能夠與使用http://regex.larsolavtorvik.com/

弄明白我切換到postdata_presave掛鉤,而不是newpost_complete。

$pagetext =& $this->fetch_field('pagetext', 'post'); 
$threadid =& $this->fetch_field('threadid', 'post'); 
if (stristr($pagetext,'.robot:')){ 
    preg_match('/(\.robot:)(.*)(:)/iU',$pagetext, $matches); 
    $host = $matches[2]; 
    require_once(DIR . '/includes/functions_robot.php'); 
    run($host,$threadid); 
} 

新掛接位置意味着它通常發射了比我實際交的插入更快,我之前在使機器人崗位。我通過將usleep(500000);添加到我的run()函數的開始來解決此問題。

相關問題