botreply (4199B)
1 #!/bin/bash 2 3 source botenv 4 5 form_reply(){ 6 # Arguments: 7 # $1 - full message 8 # $2 - raw reply 9 name=${1%%!*} 10 name=${name#:} 11 echo "$1" | awk -v "name=$name" -v "ret=$2" '{print "PRIVMSG "$3" :"name": "ret}' 12 } 13 14 rot(){ 15 # Arguments: 16 # $1 - rot number 17 # $2 - rotated expression 18 vals=( $(echo -n $2 | od -An -tuC) ) 19 if (($1<0)) 20 then 21 rnum=$(($1+(1-$1/26)*26)) 22 else 23 rnum=$1 24 fi 25 for i in "${!vals[@]}"; do 26 if ((${vals[i]}>64 && ${vals[i]}<91)) 27 then 28 printf "\x$(printf %x $(( (vals[i]-65+$rnum)%26 +65 )))" 29 elif ((${vals[i]}>96 && ${vals[i]}<123)) 30 then 31 printf "\x$(printf %x $(( (vals[i]-97+$rnum)%26 +97 )))" 32 else 33 printf "\x$(printf %x ${vals[i]})" 34 fi 35 done 36 } 37 38 arot(){ 39 # Arguments: 40 # $1 - arot number 41 # $2 - rotated expression 42 vals=( $(echo -n $2 | od -An -tuC) ) 43 if (($1<0)) 44 then 45 rnum=$(($1+(1-$1/94)*94)) 46 else 47 rnum=$1 48 fi 49 for i in "${!vals[@]}"; do 50 if ((${vals[i]}>32 && ${vals[i]}<127)) 51 then 52 printf "\x$(printf %x $(( (vals[i]-33+$rnum)%94 +33 )))" 53 else 54 printf "\x$(printf %x ${vals[i]})" 55 fi 56 done 57 } 58 59 _morse(){ 60 # Arguments 61 # $1 - (un)morsed message 62 orig="$1" 63 morseonly=$(echo "$orig" | tr -dc './ \t\n-') 64 [ "$orig" = "$morseonly" ] && { 65 echo "$1" | tr '/' '\t' | morse -sd | tr '\t' ' ' 66 } || { 67 echo "$1" | morse -s | tr '\n' ' ' 68 } 69 } 70 71 # rewrite ^ to previous message 72 rewrite="$(echo "$1" | \ 73 awk -v "previous=$(echo "$previous" | sed 's/:.*://')" \ 74 '{sub(/\^$/, previous, $0); print}')" 75 76 [[ "$rewrite" =~ "." ]] && set -- "$rewrite" 77 78 case "$1" in 79 # Reply to ping 80 *"PING "*) 81 sed 's/.*\(:.*\)/PONG \1/' <<< $1 82 ;; 83 84 # Configure connection 85 *"End of /MOTD command."*) 86 # wait for notices to come 87 sleep 10 88 # uncomment for vhost 89 #echo "VHOST $nick $pass" 90 echo "JOIN $channel" 91 echo "MODE $nick +B" 92 ;; 93 94 # Display help message 95 *"PRIVMSG "*":$nick: help"|*"PRIVMSG "*":$nick, help") 96 channel=$(echo "$1" | awk '{print $3}') 97 echo "PRIVMSG $channel :usage: $nick: [ <input-lang>:<output-lang> | <input-lang>:phoneme | <input-lang>:ipa | :morse | :rot<n> | :arot<n> | :1337 ] <text>" 98 ;; 99 100 # Display ipa 101 *"PRIVMSG "*":$nick: "*":ipa"*|*"PRIVMSG "*":$nick, "*":ipa"*) 102 lang=$(echo "$1" | sed -E 's/.* ([^ ]*):ipa.*/\1/') 103 ret=$(espeak -q --ipa -v ${lang:-en} "$(echo "$1" | sed 's/.*:ipa //')") 104 form_reply "$1" "$ret" 105 ;; 106 107 # Display phoneme 108 *"PRIVMSG "*":$nick: "*":phoneme"*|*"PRIVMSG "*":$nick, "*":phoneme"*) 109 lang=$(echo "$1" | sed -E 's/.* ([^ ]*):phoneme.*/\1/') 110 ret=$(espeak -qxv ${lang:-en} "$(echo "$1" | sed 's/.*:phoneme //')") 111 form_reply "$1" "$ret" 112 ;; 113 114 # Encode/decode morse 115 *"PRIVMSG "*":$nick: :morse"*|*"PRIVMSG "*":$nick, :morse"*) 116 ret=$(_morse "$(echo "$1" | sed 's/.*:morse //')" | tr -s ' ' | sed 's/\.\.\.-\.-[[:space:]]*//') 117 form_reply "$1" "$ret" 118 ;; 119 120 # Encode rot 121 *"PRIVMSG "*":$nick: :rot"*|*"PRIVMSG "*":$nick, :rot"*) 122 num=$(echo "$1" | sed "s/.*:$nick[,:] :rot\([-+]\{0,1\}[0-9]\{0,\}\).*/\1/") 123 re='^[0-9]+$' 124 if ! [[ $num =~ $re ]] ; 125 then 126 num="13" 127 fi 128 exp=$(echo "$1" | sed "s/.*:$nick[,:] :rot[-+]\{0,1\}[0-9]\{0,\}//") 129 ret=$(rot "$num" "$exp") 130 form_reply "$1" "$ret" 131 ;; 132 133 # Encode arot 134 *"PRIVMSG "*":$nick: :arot"*|*"PRIVMSG "*":$nick, :arot"*) 135 num=$(echo "$1" | sed "s/.*:$nick[,:] :arot\([-+]\{0,1\}[0-9]\{0,\}\).*/\1/") 136 re='^[0-9]+$' 137 if ! [[ $num =~ $re ]] ; 138 then 139 num=47 140 fi 141 exp=$(echo "$1" | sed "s/.*:$nick[,:] :arot[-+]\{0,1\}[0-9]\{0,\}//") 142 ret=$(arot "$num" "$exp") 143 form_reply "$1" "$ret" 144 ;; 145 146 # Encode 1337 147 *"PRIVMSG "*":$nick: :1337"*|*"PRIVMSG "*":$nick, :1337"*) 148 ret=$(echo "$1" | sed "s/.*:$nick[,:] :1337*//" | tr 'aeilot' '431107' | sed 's~w~\\/\\/~g;s~n~|\\|~g;s~m~|\\/|~g;s~h~|-|~g;s~f~ph~g;s~b~8~g;s~x~><~g;s~c~(~g;s~k~|<~g') 149 form_reply "$1" "$ret" 150 ;; 151 152 # Main (fallback) translating case 153 *"PRIVMSG "*":$nick:"*|*"PRIVMSG "*":$nick,"*) 154 direction=$(echo "$1" | sed "/.*:$nick[,:] \([a-z]*\)-*[:>]\([a-z]*\) .*/!d;s//\1:\2/") 155 if [ -n "$direction" ]; 156 then 157 string=$(echo "$1" | sed "s/.*:$nick[,:] [a-z]*-*[:>][a-z]* //") 158 else 159 string=$(echo "$1" | sed "s/.*:$nick[,:]//") 160 fi 161 ret=$(translate-shell/translate -b $direction "$string" | tr '\n' ':' | sed s'/.$//') 162 form_reply "$1" "$ret" 163 ;; 164 esac