All pastes #19743 Raw Edit

bashy

public shellscript v1 · immutable
#19743 ·published 2005-08-10 19:26 UTC
rendered paste body
#!/bin/bash# bashy# IRC bot written using bash, bash sockets and CLI tools# Jan Schampera <jan.schampera@web.de>### CONFIGBSHY_IRCSRV="irc.freenode.net"BSHY_IRCPORT="6667"BSHY_IRCCHAN="#bash"BSHY_IRCUSER="bashy"BSHY_IRCNAME="Bashy"BSHY_IRCNICK="bashy"BSHY_IRCMASTER="TheBonsai"BSHY_PLUGINSDIR="/home/bonsai/devel/irc-bots/Bashy/plugins"BSHY_PLUGINSENABLE="y"BSHY_TRIGGERCHAR=";"### /CONFIG### NO CHANGES SHOULD BE NECCESARY BEYOND THIS POINT ###### IF YOU NEED TO CHANGE SOMETHING YOU THINK IT MUST BE CONFIGURABLE, EMAIL ME ###### INTERNALSexport BSHY_VERSION="0.1"### /INTERNALS### FUNCTIONSbshy_helpscreen() {cat <<MARKBASHY V${BSHY_VERSION}Usage:--configfile|-f FILE            use configfile FILE--version|-v                    display version--help|-h                       display help (this)MARK}bshy_debugmsg() {local LEVEL="${1}"local TAG="${2}"local MESSAGE="${3}"echo "${TAG}(${LEVEL}) - ${MESSAGE}" >&2# levels:# 0 - always# 1 - general debug info# 2 - detailed debug info}bshy_consoleinput() {while :; do    read -r CONSOLEINPUT;    case "${CONSOLEINPUT}" in        /*)            echo "${CONSOLEINPUT:1}" >&6            CONSOLEINPUT=""            ;;        *)            echo "PRIVMSG ${BSHY_IRCCHAN} :${CONSOLEINPUT}" >&6            CONSOLEINPUT=""            ;;    esacdone}export -f bshy_helpscreen bshy_debugmsg bshy_consoleinput### /FUNCTIONS### MAIN# begin PARSE_CMDLINE# interpret my commandline argumentswhile [ ! -z "${1}" ]; do    case "${1}" in        "--configfile"|"-f")                        BSHY_CONFIG="${2}"                        shift 2                        ;;        "--help"|"-h")                        bshy_helpscreen                        exit 0                        ;;        "--version"|"-v")			echo "${BSHY_VERSION}"			exit 0                        ;;        *)                        echo "Eh?" >&2                        bshy_helpscreen >&2                        exit 1                        ;;    esacdone# end PARSE_CMDLINE# begin READ_PLUGINSif [ "${BSHY_PLUGINSDIR}" = "y" ]; then    bshy_debugmsg 1 READ_PLUGINS "processing plugins in ${BSHY_PLUGINSDIR}"    [ -d "${BSHY_PLUGINSENABLE}" ] || { bshy_debugmsg 0 READ_PLUGINS "${BSHY_PLUGINSDIR} not found"; exit 1; }    for APLUGIN in ${BSHY_PLUGINSDIR}; do        bshy_debugmsg 2 READ_PLUGINS "processing plugin ${APLUGIN}"        source "${APLUGIN}"    donefi# end READ_PLUGINS# begin CREATE_SOCKET# create the socket (FD 5 in and 6 out)export BSHY_SOCKET="/dev/tcp/${BSHY_IRCSRV}/${BSHY_IRCPORT}"bshy_debugmsg 1 CREATE_SOCKET "creating socket"bshy_debugmsg 2 CREATE_SOCKET "attempting to create socket in ${BSHY_SOCKET}"exec 6>${BSHY_SOCKET}exec 5<&6# end CREATE_SOCKET# begin LOGINecho -en "NICK ${BSHY_IRCNICK}\r\n" >&6echo -en "USER ${BSHY_IRCUSER} 0 * : ${BSHY_IRCNAME}\r\n" >&6# end LOGIN# start console input background processbshy_consoleinput <&0 &CONSINPTPID="$!"# begin MAIN_LOOP#set -xwhile read SERVERINPUT <&5; do    # remove the off \r's specified in RFC    SERVERINPUT="${SERVERINPUT//$'\r'/}"    # is it a normal server message ':ORIGIN MESSAGETYPE MESSAGE'?    [ "${SERVERINPUT:0:1}" = ":" ] && IS_A_MESSAGE=1 || IS_A_MESSAGE=0    # if it's a normal message, remove the leading ':'    [ "${IS_A_MESSAGE}" = "1" ] && SERVERINPUT="${SERVERINPUT:1}"    case "${IS_A_MESSAGE}" in        "1")            # parse the message line, ':' was removed before            SRVMSG_ORIGIN="${SERVERINPUT%% *}"            SRVMSG_COMMAND="${SERVERINPUT%% :*}"; SRVMSG_COMMAND="${SRVMSG_COMMAND#* }"            SRVMSG_TYPE="${SRVMSG_COMMAND%% *}"            SRVMSG_TARGET="${SRVMSG_COMMAND#* }"            # SRVMSG_TYPE="${SERVERINPUT#* }"; SRVMSG_TYPE="${SERVERINPUT%% *}"            SRVMSG_MESSAGE="${SERVERINPUT#* :}"            case "${SRVMSG_TYPE}" in                37[256])                        # RPL_MOTD, RPL_MOTDSTART, RPL_MOTDEND                        echo "<MOTD> ${SRVMSG_MESSAGE}"                        ;;                001)                        # RPL_WELCOME                        echo "<WELCOME> ${SRVMSG_ORIGIN} wecomes us, joining ${BSHY_IRCCHAN}"                        echo -en "JOIN ${BSHY_IRCCHAN}\r\n" >&6                        ;;                00[2345])                        : # ignored: RPL_YOURHOST, RPL_CREATED, RPL_MYINFO, RPL_BOUNCE                        ;;                25?)                        : # ignored: server informational messages                        ;;                "353"|"366")                        : # ignored: RPL_NAMREPLY, RPL_ENDOFNAMES                        ;;                33[123])                        : # ignored: RPL_NOTOPIC, RPL_TOPIC, and 333 as in "set by X at <date>"                        ;;                [Jj][Oo][Ii][Nn])                        echo "<JOIN> ${SRVMSG_ORIGIN%%!*} has joined ${SRVMSG_MESSAGE}"                        ;;                [Pp][Aa][Rr][Tt])                        echo "<PART> ${SRVMSG_ORIGIN%%!*} has left ${SRVMSG_TARGET} (${SRVMSG_MESSAGE})"                        ;;                [Qq][Uu][Ii][Tt])                        echo "<QUIT> ${SRVMSG_ORIGIN%%!*} has quit (${SRVMSG_MESSAGE})"                        ;;                [Pp][Rr][Ii][Vv][Mm][Ss][Gg])                        echo "<MSG ${SRVMSG_ORIGIN%%!*}->${SRVMSG_TARGET}> ${SRVMSG_MESSAGE}"                        if [ "${SRVMSG_MESSAGE:0:1}" = "${BSHY_TRIGGERCHAR:0:1}" ]; then                            echo "<TRIGGER> triggered by ${SRVMSG_ORIGIN%%!*} in ${SRVMSG_TARGET}"                        fi                        ;;                [Mm][Oo][Dd][Ee])                        echo "<MODE> ${SRVMSG_ORIGIN%%!*} sets mode ${SRVMSG_MESSAGE} for ${SRVMSG_TARGET}"                        ;;                *)                        echo "<UNKNOWN> COMPLETE LINE WAS: ${SERVERINPUT}"                        ;;                            esac            ;;        "0")            SRVMSG_TYPE="${SERVERINPUT%% *}"            SRVMSG_TARGET="${SERVERINPUT#* }"; SRVMSG_TARGET="${SRVMSG_TARGET%% :*}"            SRVMSG_MESSAGE="${SERVERINPUT##*:}"            case "${SRVMSG_TYPE}" in                [Nn][Oo][Tt][Ii][Cc][Ee])                            echo "<NOTICE> ${SRVMSG_MESSAGE}"                            ;;                [Pp][Ii][Nn][Gg])                            echo "<PING> PONG!"                            echo -en "PONG :${SRVMSG_MESSAGE}\r\n" >&6                            ;;                [Ee][Rr][Rr][Oo][Rr])                            echo "<ERROR> ${SRVMSG_MESSAGE}"                            ;;            esac            ;;    esac    done# end MAIN_LOOP### /MAIN