trans

Unnamed repository; edit this file 'description' to name the repository.
git clone git://fqcor.com/trans.git
Log | Files | Refs | README | LICENSE

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