Как стать автором
Поиск
Написать публикацию
Обновить

Простой IRC бот для сохранения логов каналов

Понадобился мне пару лет назад скрипт для сохранения локально логов некоторых интересных мне IRC каналов. Скрипт планировалось запускать на роутере, поэтому хотелось иметь самый простой скрипт без дополнительных зависимостей и написанный на баше. Вооружившись netcat'ом был написан простенький скрипт из нескольких срочек, который работал до первого PING'а от сервера. Слегка подпавив скрипт, получилась работающая версия:


root@Alix:~# cat ./irclogbot.sh
#!/bin/sh 

nick="blb$$"
channel=testchannel
server=irc.freenode.net
config=/tmp/irclog
 
[ -n "$1" ] && channel=$1
config="${config}_${channel}"
 
echo "NICK $nick" > $config
echo "USER $nick +i * :$0" >> $config
echo "JOIN #$channel" >> $config
 
trap "rm -f $config;exit 0" INT TERM EXIT
 
tail -f $config | nc $server 6667 | while read MESSAGE 
do
  case "$MESSAGE" in
    PING*) echo "PONG${MESSAGE#PING}" >> $config;;
    *QUIT*) ;;
    *PART*) ;;
    *JOIN*) ;;
    *NICK*) ;;
    *PRIVMSG*) echo "${MESSAGE}" | \
        sed -n -r "s/^:([^!]+).*PRIVMSG[^:]+:(.*)/[$(date '+%R')] \1> \2/p";;
    *) echo "${MESSAGE}";;
  esac
done


Обратная связь внутри цикла позволяет использовать скрипт и как простейший IRC клиент. IRC комманды перенаправленные в $config файл будут исполнены на сервере. Например для отсылки сообщения в канал нужно записать в файл следующее:
echo "PRIVMSG #testchannel :Testing bash bot. Ignore it" >> /tmp/irclog_testchannel


Вместо комманды nc можно использовать и telnet без ущерба функциональности. В этом случае в скрипте будут использоваться только комманды доступные в busybox, что позволит использовать скрипт без установки дополнительных пакетов.
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.