#!/bin/bash owner="CUT" hostname=${1:-irc.freenet.de} port=${2:-6667} nick=${3:-0} ident=${4:-bot} chan=${5:-#specjal} pass=${6:-} # pass=${6:-password} cmdchar="." realname="CUT" fifo=/tmp/bot.$$ # make the fifos mkfifo ${fifo}.in mkfifo ${fifo}.out printf " [*] CUT \n" >&2 (nc -q0 $hostname $port < $fifo.in > $fifo.out; rm -f $fifo.in $fifo.out) & exec 3>${fifo}.in 4<${fifo}.out read irc_info <&4 printf "%s. \n" "${irc_info}" >&2 printf "NICK %s \n" "${nick}" >&3 printf " [*] Nick: %s sent \n" "${nick}" >&2 printf "USER %s %s %s :%s \n" "${ident}" "${ident}" "${ident}" "${realname}" >&3 read irc_reply <&4 printf " [*] debug: %s \n" "${irc_reply}" >&2 printf "JOIN %s %s \n" "${chan} ${pass}" >&3 while `test -n "${irc_reply}"`; do # :CUT PRIVMSG !AIP17[[[CUT]]] :jest maj lof read irc_reply <&4 time=`date | cut -f 4 -d " "` printf " [*] [%s] debug: %s \n" "${time}" "${irc_reply}" >&2 response=(`echo $irc_reply`) if [ "${response[0]}" = "PING" ]; then printf "PONG %s \n" "${response[1]}" >&3 printf " [*] [%s] debug->OUT: PONG %s \n" "${time}" "${response[1]}" >&2 fi if [ `echo ${response[0]} | grep ${owner}` ]&&[ "${response[1]}" == "PRIVMSG" ]; then # Full text recived from bot owner owner_response=`echo ${irc_reply} | cut -f 3 -d ":"` # Command - part of text specified after a special character # Default is message after . (dot) owner_cmd=`echo ${owner_response} | awk -F "${cmdchar}" '{ print $2 }'` # Test it here is a command if [ -n "${owner_cmd}" ]; then # If yes - react # split command into pieces owner_cmd_id=`echo ${owner_cmd} | awk -F " " '{ print $1 }' | tr '[:upper:]' '[:lower:]'` owner_cmd_body=`echo ${owner_cmd} | sed -e 's/^'${owner_cmd_id}' //'` case "${owner_cmd_id}" in "quit") #Part IRC printf "QUIT :%s \n" "${owner_cmd_body}" >&3 ;; "join") # Join channels chan_table=(`echo ${owner_cmd_body}`) printf "JOIN %s %s \n" "${chan_table[0]}" "${chan_table[1]}" >&3 ;; "part") # Part channels chan_name=`echo ${owner_cmd_body} | awk -F " " '{ print $1 }'` part_reason=`echo ${owner_cmd_body} | sed -e 's/^'${chan_name}' //'| tr '/n' ' '` if [ "${chan}" == "${chan_name}" ]; then printf "PRIVMSG %s :Cannot part controlling channel \n" "${chan}" >&3 else printf "PART %s :%s \n" "${chan_name}" "${part_reason}" >&3 fi ;; "say") #say smoething printf "PRIVMSG %s :%s \n" "${chan}" "${owner_cmd_body}" >&3 ;; "raw") #send a raw IRC command printf "%s \n" "${owner_cmd_body}" >&3 ;; "nick") #Change bot's nick printf "NICK %s \n" "${owner_cmd_body}" >&3 ;; *) #default action printf "NOTICE %s :command undefined or too few parameters - %s \n" "${chan}" "${owner_cmd_id}" >&3 ;; esac # Command done - back to the loop start fi #printf "NOTICE %s :owner says - %s \n" "${chan}" "${owner_response}" >&3 fi done exec 3>&- 4<&-