IRC связанная помощь - PullRequest
       3

IRC связанная помощь

2 голосов
/ 19 ноября 2010

Теперь у меня есть бот для отправки сообщения, когда бот присоединяется.Однако, как мне сделать форму, которая будет публиковать данные так, чтобы бот сообщал сообщение на канал?

Вот мой скрипт (Rewamped):

<?php
set_time_limit(0);

$socket = fsockopen("//", 6667) or die();

$msg = $_POST['message'];
$pr = $_POST['percentage'];
$pr /= 100;

fputs($socket,"USER BOT 0 zo :ZH bot\n");
// Set the bots nickname
fputs($socket,"NICK BOT1\n");

fputs($socket,"JOIN #bots\n");

while(1) {

   while($data = fgets($socket, 128)) {
      // echo the data received to page
      echo nl2br($data);
      // flush old data, it isn't needed any longer.
      flush();

      $ex = explode(' ', $data);

      if($ex[0] == "PING") fputs($socket, "PONG ".$ex[1]."\n");

      $search_string = "/^:([A-Za-z0-9_\-]+)[@!~a-zA-Z0-9@\.\-]+\s*([A-Z]+)\s*[:]*([\#a-zA-Z0-9\-]+)*\s*[:]*([!\#\-\.A-Za-z0-9 ]+)*/";

      $do = preg_match($search_string, $data, $matches);

      // check that there is a command received
      if(isset($matches['2'])) {
         switch($matches['2']) {
            case "PRIVMSG":
               $user = $matches['1'];
               $channel = $matches['3'];
               $chat_text = isset($matches['4']) ? $matches['4'] : "";

               // check chat for !time
               if(strtolower($chat_text) == "!time") { 
                  $output = "::::: " . date('l jS \of F Y h:i:s A') . " :::::";
                  fputs($socket, "PRIVMSG " . $channel . " :" . $output . "\n");
               } elseif(strtolower($chat_text) == "!hello") {
                  fputs($socket, "PRIVMSG " . $channel . " :Hello!\n");
               }
            break;

            case "JOIN":
               $user = $matches['1'];
               $channel = $matches['3'];
               fputs($socket, "PRIVMSG " . $channel . " :Welcome " . $user . " to " . $channel . "\n");
            break;
         }

      }
   }
}
?>

Например, Создание формычто бы отправить данные на канал IRC.Вывод будет "wget ​​file port" <- это будет текст, отправленный на IRC-канал. </p>

Вот части, связанные с:

fputs($socket, "PRIVMSG " . $channel . " :Welcome " . $user . " to " . $channel ."\n");

Надеюсь, кто-то может помочь.

Ответы [ 2 ]

3 голосов
/ 19 ноября 2010

Хорошо, вот лучший ответ.Первый раздел все еще стоит.Новый процесс PHP вызывается каждый раз, когда вы хотите инициировать новый скрипт.Таким образом, вам нужен какой-то способ сделать IPC.

Вот как это делается на * nix (но не на windows) в PHP:

Получатель:

<?php
$queueKey = 123321;

$queue = false;
if(msg_queue_exists($queueKey)) {
        echo "Queue Exists.\n";
}

// Join the queue
$queue = msg_get_queue($queueKey);

while(!($queue == false)) {
        // Note: This function could block if you feel like threading
        $msgRec = msg_receive(
                $queue,        // I: Queue to get messages from
                0,             // I: Message type (0 = first on queue)
                $msgType,      // O: Type of message received
                1024,          // I: Max message size
                $msgData,      // O: Data in the message
                true,          // I: Unserialize data
                MSG_IPC_NOWAIT // I: Don't block
        );

        if($msgRec) {
                echo "Message received:\n";
                echo "Type = $msgType\n";
                echo "Data = \n";
                print_r($msgData);
        }
}
?>

Отправитель:

<?php
$queueKey = 123321;

$queue = false;
if(msg_queue_exists($queueKey)) {
        echo "Queue Exists.\n";
} else {
        echo "WARNING: Queue does not exist. Maybe no listeners?\n";
}

$queue = msg_get_queue($queueKey);

$abc["something"] = "something value";
$abc["hello"] = "world";
$abc["fu"] = "bar";
msg_send(
        $queue, // Queue to send on
        1,      // Message type
        $abc,   // Data to send
        true,   // Serialize data?
        true    // Block
);

?>

Это должно создать (в цикле приемника) что-то похожее на это:

Message received:
Type = 1 
Data =
Array 
(
    [something] => something value
    [hello] => world
    [fu] => bar 
)

Ваш скрипт может выглядеть примерно такthis

postToMe.php:

<?php
$queueKey = 123321;

$queue = false;
if(msg_queue_exists($queueKey)) {
        echo "Queue Exists.\n";
} else {
        echo "WARNING: Queue does not exist. Maybe no listeners?\n";
}

$queue = msg_get_queue($queueKey);

msg_send(
        $queue, // Queue to send on
        1,      // Message type
        $_POST, // Data to send
        true,   // Serialize data?
        true    // Block
);

?>

bot.php:

<?php 
set_time_limit(0); 

$socket = fsockopen("//", 6667) or die(); 

$msg = $_POST['message']; 
$pr = $_POST['percentage']; 
$pr /= 100; 

fputs($socket,"USER BOT 0 zo :ZH bot\n"); 
// Set the bots nickname 
fputs($socket,"NICK BOT1\n"); 

fputs($socket,"JOIN #bots\n"); 


$queueKey = 123321;
$queue = false;

// Join the IPC queue
$queue = msg_get_queue($queueKey);
if(!$queue) echo "ERROR: Could not join IPC queue. Form data will not be received";

while(1) { 
   // Handle new post info
   // You may want to increase the message size from 1024 if post data is large
   if(msg_receive($queue, 0, $msgType, 1024, $msgData, true, MSG_IPC_NOWAIT)) {
      // Handle data here. Post data is stored in $msgData
   }

   while($data = fgets($socket, 128)) { 
      // echo the data received to page 
      echo nl2br($data); 
      // flush old data, it isn't needed any longer. 
      flush(); 

      $ex = explode(' ', $data); 

      if($ex[0] == "PING") fputs($socket, "PONG ".$ex[1]."\n"); 

      $search_string = "/^:([A-Za-z0-9_\-]+)[@!~a-zA-Z0-9@\.\-]+\s*([A-Z]+)\s*[:]*([\#a-zA-Z0-9\-]+)*\s*[:]*([!\#\-\.A-Za-z0-9 ]+)*/"; 

      $do = preg_match($search_string, $data, $matches); 

      // check that there is a command received 
      if(isset($matches['2'])) { 
         switch($matches['2']) { 
            case "PRIVMSG": 
               $user = $matches['1']; 
               $channel = $matches['3']; 
               $chat_text = isset($matches['4']) ? $matches['4'] : ""; 

               // check chat for !time 
               if(strtolower($chat_text) == "!time") {  
                  $output = "::::: " . date('l jS \of F Y h:i:s A') . " :::::"; 
                  fputs($socket, "PRIVMSG " . $channel . " :" . $output . "\n"); 
               } elseif(strtolower($chat_text) == "!hello") { 
                  fputs($socket, "PRIVMSG " . $channel . " :Hello!\n"); 
               } 
            break; 

            case "JOIN": 
               $user = $matches['1']; 
               $channel = $matches['3']; 
               fputs($socket, "PRIVMSG " . $channel . " :Welcome " . $user . " to " . $channel . "\n"); 
            break; 
         } 

      } 
   } 
} 
?> 
2 голосов
/ 19 ноября 2010

По сути, этот скрипт будет работать все время.PHP работает так, что для каждого запускаемого скрипта создается новый процесс PHP.Скрипты могут запускаться несколько раз одновременно, однако они не смогут напрямую обмениваться данными.

Вам потребуется создать другой сценарий (или, по крайней мере, совершенно новую функцию этого сценария), чтобы принимать переменные post, изатем отправьте их в работающую версию этого сценария.

(Примечание: я предоставлю 2 решения, поскольку 1 значительно сложнее. Кроме того, есть семафор, который я только что нашел, однако точно не уверен, что еслиэто соответствует нашим потребностям, потому что я почти ничего не знаю об этом http://php.net/manual/en/book.sem.php)

Лучший (но продвинутый)

лучший способ, которым я могу думатьдля этого нужно использовать сокеты (особенно в * nix, так как сокеты являются фантастическими для IPC [межпроцессное взаимодействие]). Это немного сложно, так как вы в основном создаете клиент / сервер просто для передачи деталей, тогда вам нужнопридумать какой-то протокол для вашего IPC.

Я не буду здесь ничего кодировать, но ссылки, которые имеют отношение к этому,http://www.php.net/manual/en/function.socket-create.php http://www.php.net/manual/en/function.socket-bind.php http://www.php.net/manual/en/function.socket-listen.php http://www.php.net/manual/en/function.socket-accept.php http://www.php.net/manual/en/function.socket-connect.php

Если вы используете это в * nix, я настоятельно рекомендую использовать AF_UNIX в качестве домена.Это очень эффективно, и многие приложения используют его для IPC.

Плюсы: Очень надежное решение - Высокая эффективность - Мгновенное (или максимально близкое) общение

Минусы: -Довольно сложно реализовать

Не так хорошо (но все еще хорошо)

Просто используйте файлы для передачи информации.Ваш скрипт-бот проверяет файл каждые 15 секунд на наличие изменений.Я бы предложил использовать XML для данных (так как простой xml делает обработку XML в php хорошо ... простой)

Что нужно учесть, так это: как бы он отреагировал при получении 2 сообщений одновременно?(Если вы просто используете плоский файл или не используете несколько записей, это станет проблемой).Как вы узнаете, является ли сообщение новым (я бы удалил / очистил файл сразу после прочтения. Примечание. Не после обработки, поскольку кто-то может опубликовать скрипт формы, пока вы обрабатываете / отправляете сообщение)

Ссылки: Как использовать простой xml http://php.net/manual/en/simplexml.examples-basic.php http://au2.php.net/manual/en/book.simplexml.php

Файл, связанный http://au2.php.net/manual/en/function.file-put-contents.php http://au2.php.net/manual/en/function.file-get-contents.php

При этом, вы также можете использовать MySQL / Postgres или какую-либо другую базу данныхбэкэнд для обработки потока данных между скриптами.

Плюсы: - Простота реализации

Минусы: - Медленная передача данных (проверка файлов с заданными интервалами) - Использование внешних файлов, которыемогут быть удалены / изменены мои внешние приложения / пользователи

...