Как читать сообщения с канала IRC, используя бот IRC, написанный на Bash? - PullRequest
0 голосов
/ 18 мая 2011

Я не смог найти много документации по IRC-ботам, написанной на Bash, так что вот мой вопрос. У меня есть простой бот, который может присоединиться к каналу и писать сообщения в канал.

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

В конечном счете, я бы хотел, чтобы мой бот распознал ключевое слово, которое активирует бот в действии, и что-то вернет. В качестве основы моего бота я использовал скрипт из http://www.blog.tdobson.net/node/174. Также было бы полезно указать мне некоторую полезную документацию о том, как писать IRC-боты в Bash.

Ответы [ 3 ]

2 голосов
/ 12 августа 2012

Оставьте проблему протокола IRC conectivity для решения с помощью ii .

Это клиент IRC, который генерирует все выходные данные в текстовых файлах (в виде журналов), но если вы пишете (добавляетестрок) к этим файлам, вы фактически отправляете команды в IRC.Так что это очень просто.

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

1 голос
/ 20 мая 2011

Основной поток, на который вы указали, это tail -f file | telnet foo | while true; do blah; done

Этот метод получает данные, записанные в файл, в команду telnet, но ничто не берет данные из команды telnet и передает их в сценарий.

Изменение цикла для поддержки tail -f file | telnet foo | while read f; do echo "I got message $f"; done предоставляет вам данные, отправляемые вам из сеанса telnet, которые затем можно проанализировать.Проблема этой стратегии заключается в том, что вы не можете ничего делать спонтанно, только в ответ на трафик из сеанса telnet.

Вы можете решить эту проблему, запросив время ожидания:

tail -f pingbot.input | telnet irc.freenode.net 6667 | while read -t 2 f || true; do
  echo I got message $f;
done

Вы получите пустой $ f по таймауту, полный $ f, если вы получили сообщение.Разбор вывода PRIVMSG из протокола irc оставлен читателю в качестве упражнения.

Цикл tail | telnet | while read f; do ; done не является традиционным способом выполнения этой задачи.Традиционно вместо этого вы устанавливаете telnet как сопроцесс (coproc).Но в любом случае, вероятно, будет работать.

0 голосов
/ 14 июля 2019

Вот пример использования ncat (ncat от nmap) с SSL:

rm irc_file &> /dev/null
rm BOT_file &> /dev/null
touch irc_file
touch BOT_file

#open a background TCP connection to the IRC server with SSL, start inputting to ncat by reading from a source and piping to it, then redirect output to a place where we can use it

tail -n +1 -f ./irc_file | ncat --ssl irc.fu.bar 6697 >> ./BOT_file &
echo $! > bgproc.pid
sleep .5 

#IRC Protocol stuff

echo PASS 1234 >> ./irc_file            #send pass first per rfc
sleep .5 
echo NICK BOT >> ./irc_file             #send our IRC NICK
echo USER BOT 0 * :BOT >> ./irc_file    # send our IRC USER
sleep 1
echo "JOIN #123" >> ./irc_file          #Join channel "#123"
echo "PRIVMSG #123" Hello! BOT is online! >> ./irc_file #Send message to channel "#123"

tail -f ./BOT_file | while read line #read file BOT_file continuously and pipe into while read loop
    do

       echo $line

        if [[ "$line" = *!testcmd* ]];then  #Look for our first bot cmd
            echo "PRIVMSG #123" Hello! I am a BOT i see your testcmd. >> ./irc_file #Respond if found
        fi

        if [[ "$line" = *PING*irc.fu.bar* ]];then   #if we do nothing the server will ping us   
        echo "PONG" irc.fu.bar >> ./irc_file    #send em a pong back
        echo "PING Received... Sending PONG..."
        fi  

done

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

...