Intereting Posts

Помощь, связанная с IRC

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

Вот мой сценарий (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*([AZ]+)\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 FY 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. Результатом будет «wfile file info port» <- Это будет текст, отправленный на канал IRC.

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

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

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

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

    Вот как это делается на * nix (но не на окнах) в 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 ) 

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

    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*([AZ]+)\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 FY 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; } } } } ?> 

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

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

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

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

    Лучший способ сделать это – использовать сокеты (особенно на * nix, поскольку сокеты являются фантастическими для IPC [inter process communication]). Это немного сложно, так как вы в основном создаете клиент / сервер для обмена информацией, тогда вам нужно придумать какой-то протокол для вашего 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 хорошо … простой)

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

    Ссылки: Как использовать простой 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 или некоторую другую базу данных для обработки потока данных между сценариями.

    Плюсы: – Простота внедрения

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