Advertisement
Guest User

tinyirc_setup.sh

a guest
May 31st, 2014
178
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #!/bin/sh
  2.  
  3. # The ramdisk /bin/sh uses "\c" at end of line to suppress newlines.
  4. # Oher shells use -ne and -e.  So define c or the other two.
  5. c=\\c
  6. #ne=-ne; e=-e
  7.  
  8. E=$(printf "\033")
  9. ESC=$(printf "\033")
  10. C_D=$(printf "\004")
  11. C_H=$(printf "\010")
  12. TAB=$(printf "\011")
  13. BS=$(printf "\177")
  14. NL='
  15. '
  16.  
  17. # ANSI colors (darK,Red,Green,Yellow,Blue,Magenta,Cyan,White,Normal)
  18. K="${E}[1;30m"
  19. R="${E}[1;31m"
  20. G="${E}[1;32m"
  21. Y="${E}[1;33m"
  22. B="${E}[1;34m"
  23. M="${E}[1;35m"
  24. C="${E}[1;36m"
  25. W="${E}[1;37m"
  26. N="${E}[0m"
  27. BOLD="${E}[1m"
  28. REV="${E}[7m"
  29. ITAL="${E}[3m"
  30. UNDR="${E}[4m"
  31. BLNK="${E}[5m"
  32.  
  33. WB="${E}[1;44;37m"
  34. BW="${E}[0;47;34m"
  35.  
  36. DRAW="${E}(0"
  37. TEXT="${E}(B"
  38.  
  39. #NICK="zippy"
  40. DSRV="irc.freenode.net"
  41. SERV=$DSRV
  42. PORT=6667
  43.  
  44. printat()
  45. {
  46.   printf "${ESC}[%d;%dH" ${1:-1} ${2:-1}
  47.   [ $# -gt 2 ] && {
  48.     shift 2
  49.     printf "%s" "$*"
  50.   }
  51. }
  52.  
  53. sreplace()
  54. {
  55.   S1=$(expr substr "$STR" 1 $1)
  56.   [ $# -lt 2 ] && S1=$(expr substr $STR 1 $(($1 - 1)))
  57.   S2=$(expr substr "$STR" $(($1 + 1)) ${#STR})
  58.   STR="${S1}${2}${S2}"
  59. }
  60.  
  61. cursor()
  62. {
  63.   case $1 in
  64.     0) printf "${ESC}[?25l" ;;
  65.     *) printf "${ESC}[?12l${ESC}[?25h" ;;
  66.   esac
  67. }
  68.  
  69. bold()
  70. {
  71.   case $1 in
  72.     0) printf "${ESC}[22m" ;;
  73.     *) printf "${ESC}[1m" ;;
  74.   esac
  75. }
  76.  
  77. get() ## get a single keystroke from stdin without waiting
  78. {
  79.   if [ -t 0 ]
  80.   then
  81.     if [ -z "$_STTY" ]
  82.     then
  83.       _STTY=$(stty -g)
  84.       stty -echo -icanon time ${GET_TMOUT:-0} min ${GET_MIN:-0}
  85.     elif [ -n "$GET_TMOUT$GET_MIN" ]
  86.     then
  87.       stty -echo -icanon time ${GET_TMOUT:-0} min ${GET_MIN:-0}
  88.     fi
  89.   fi
  90. #  _KEY=$(dd bs=1 count=1  2>/dev/null; printf '.')
  91.   _KEY=$(dd bs=1 count=1  2>/dev/null; echo '.')
  92.   _KEY=${_KEY%.}
  93.   [ -n "$_KEY" ]
  94. }
  95.  
  96. get_key()
  97. {
  98.   while :
  99.   do
  100.     GET_TMOUT=5 get && break ## Half second timeout on each loop
  101.   done
  102.  
  103.   case $_KEY in
  104.   "${ESC}")
  105.     stty -echo -icanon time 0 min 0
  106.     read _KEY
  107.     if [ -z "$_KEY" ]
  108.     then
  109. #      _KEY='?'
  110.       _KEY="${ESC}"
  111.     fi
  112.   ;;
  113.   esac
  114. }
  115.  
  116.  
  117. # Define GUI Widgets (StrName, FieldLength, AtLoc, EmptyStr, Type)
  118. WS1="NICK";  WL1=39;  WA1="${E}[2;13H";   WE1="${WA1}$(printf "%-39s")"
  119. WS2="ID";    WL2=39;  WA2="${E}[3;13H";   WE2="${WA2}$(printf "%-39s")"
  120. WS3="IPAS";  WL3=39;  WA3="${E}[4;13H";   WE3="${WA3}$(printf "%-39s")"
  121. WS4="SERV";  WL4=39;  WA4="${E}[6;13H";   WE4="${WA4}$(printf "%-39s")"
  122. WS5="PORT";  WL5=39;  WA5="${E}[7;13H";   WE5="${WA5}$(printf "%-39s")"
  123. WS6="NPAS";  WL6=39;  WA6="${E}[8;13H";   WE6="${WA6}$(printf "%-39s")"
  124. WS7="PASS";  WL7=39;  WA7="${E}[9;13H";   WE7="${WA7}$(printf "%-39s")"
  125. WS8="CH1";   WL8=24;  WA8="${E}[11;3H";   WE8="${WA8}$(printf "%-24s")"
  126. WS9="CH2";   WL9=24;  WA9="${E}[12;3H";   WE9="${WA9}$(printf "%-24s")"
  127. WS10="CH3";  WL10=24; WA10="${E}[13;3H";  WE10="${WA10}$(printf "%-24s")"
  128. WS11="CH4";  WL11=24; WA11="${E}[14;3H";  WE11="${WA11}$(printf "%-24s")"
  129. WS12="NK1";  WL12=3;  WA12="${E}[11;32H"; WE12="${WA12}$(printf "%-3s")"
  130. WS13="NK2";  WL13=3;  WA13="${E}[12;32H"; WE13="${WA13}$(printf "%-3s")"
  131. WS14="NK3";  WL14=3;  WA14="${E}[13;32H"; WE14="${WA14}$(printf "%-3s")"
  132. WS15="NK4";  WL15=3;  WA15="${E}[14;32H"; WE15="${WA15}$(printf "%-3s")"
  133. WS16="KEY1"; WL16=15; WA16="${E}[11;37H"; WE16="${WA16}$(printf "%-15s")"
  134. WS17="KEY2"; WL17=15; WA17="${E}[12;37H"; WE17="${WA17}$(printf "%-15s")"
  135. WS18="KEY3"; WL18=15; WA18="${E}[13;37H"; WE18="${WA18}$(printf "%-15s")"
  136. WS19="KEY4"; WL19=15; WA19="${E}[14;37H"; WE19="${WA19}$(printf "%-15s")"
  137.  
  138. ###################
  139. ShowGUI()
  140. {
  141. printf "${ESC}[2J"
  142.  
  143. # Must use UPPERCASE for words in DRAW mode.  Or add labels later.
  144. # NOTE: see how the cfaj code makes variable sized boxes.
  145. printat 1 1  "$WB$DRAW"
  146. echo "lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk"
  147. echo "x NICK                                              x"
  148. echo "x IDENTIFY                                          x"
  149. echo "x PASSWORD                                          x"
  150. echo "tqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqu"
  151. echo "x SERVER                                            x"
  152. echo "x PORT                                              x"
  153. echo "x NEEDPASS                                          x"
  154. echo "x PASSWORD                                          x"
  155. echo "t CHANNELS  qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqu"
  156. echo "x                          KEY                      x"
  157. echo "x                          KEY                      x"
  158. echo "x                          KEY                      x"
  159. echo "x                          KEY                      x"
  160. echo "mqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj"
  161. printf "$TEXT$BW"
  162. #
  163. echo "${WE1}${WA1}${NICK}"
  164. echo "${WE2}${WA2}${ID}"
  165. echo "${WE3}${WA3}${IPAS}"
  166. echo "${WE4}${WA4}${SERV}"
  167. echo "${WE5}${WA5}${PORT}"
  168. echo "${WE6}${WA6}${NPAS}"
  169. echo "${WE7}${WA7}${PASS}"
  170. echo "${WE8}${WA8}${CH1}${WE12}${WA12}${NK1}${WE16}${WA16}${KEY1}"
  171. echo "${WE9}${WA9}${CH2}${WE13}${WA13}${NK2}${WE17}${WA17}${KEY2}"
  172. echo "${WE10}${WA10}${CH3}${WE14}${WA14}${NK3}${WE18}${WA18}${KEY3}"
  173. echo "${WE11}${WA11}${CH4}${WE15}${WA15}${NK4}${WE19}${WA19}${KEY4}"
  174. #echo $N
  175. }
  176.  
  177. # Open the tinyirc wrapper script and read lines until one starts with tinyirc.
  178. IRC=/usr/local/bin/irc
  179. if [ -r $IRC ] ; then
  180. exec 3<$IRC
  181. # Find SERV NICK PORT
  182. while read line <&3
  183. do
  184.   if [ "${line%% *}" = "tinyirc" ] ; then
  185.     # Tries to remove the first word
  186.     CFG="${line#tinyirc }"
  187.     # Check if we removed anything
  188.     if [ "$CFG" != "$line" ] ; then
  189.       for ARG in $CFG
  190.       do
  191.     case $ARG in
  192.       */*|*:*|*.*) SERV="$ARG" ;;
  193.       -i) ID="yes" ;;
  194.       -*) ARGS="$ARGS $ARG" ;;
  195.       ''|*[!0-9]*) NICK="$ARG" ;;
  196.       *) PORT="$ARG" ;;
  197.     esac
  198.       done
  199.     fi
  200.   fi
  201. done
  202. exec 3</dev/null
  203. fi
  204.  
  205. # Remove irc:// from SERV
  206. case $SERV in
  207.   *://*) SERV=${SERV#*://} ;;
  208. esac
  209. # Split SERV at first /
  210. case $SERV in
  211.   */*) CHAN=${SERV#*/} ;;
  212.   *) CHAN="" ;;  
  213. esac
  214. SERV=${SERV%%/*}
  215. # Split SERV at first :
  216. case $SERV in
  217.   *:*) PORT=${SERV#*:} ; SERV=${SERV%%:*} ;;
  218. esac
  219.  
  220. # Get the channels
  221. J=1; while [ $J -lt 5 ]
  222. do
  223.   CH=${CHAN%%/*}
  224.   case $CHAN in
  225.     */*) CHAN=${CHAN#*/} ;;
  226.     *) CHAN="" ;;
  227.   esac
  228.   case $CH in
  229.     *[\?\&,]*) OPTS=${CH#*[[\?\&,]} ; CH=${CH%%[\?\&,]*} ;;
  230.     *) OPTS="" ;;
  231.   esac
  232.   echo "$J CH=<$CH> OPTS=<$OPTS>"
  233.   if [ -n "$CH" ] ; then
  234.     eval CH$J=$CH ; eval OPTS$J=$OPTS ;
  235.     case $OPTS in
  236.       *key=*) CK=${OPTS#key=} ; CK=${CK#*[[\?\&,]} ; eval KEY$J=$CK ;;
  237.       *needkey*) eval NK$J="yes" ;;
  238.     esac
  239.     J=`expr $J + 1` ;
  240.   elif [ -z "$OPTS" ] ; then
  241.     J=`expr $J + 1` ;
  242.   else # We got some server opts (no channel)
  243.     SOPT="$SOPT,$OPTS"
  244.   fi
  245.   case $OPTS in
  246.     *identify=*) IPAS=${OPTS#identify=} ; IPAS=${IPAS#*[[\?\&,]} ;;
  247.   esac
  248.   case $OPTS in
  249.     *pass=*) PASS=${OPTS#pass=} ; PASS=${PASS#*[[\?\&,]} ;;
  250.     *needpass*) NPAS="yes" ;;
  251.   esac
  252. done
  253.  
  254. # Check if various passwords are needed
  255. if [ -n "$ID" ] ; then ID="yes" ;
  256. elif [ -n "$IPAS" ] ; then ID="yes" ;
  257. else ID="no" ;
  258. fi
  259. if [ -n "$NPAS" ] ; then NPAS="yes" ;
  260. elif [ -n "$PASS" ] ; then NPAS="yes" ;
  261. else NPAS="no" ;
  262. fi
  263.  
  264. if [ -n "$NK1" ] ; then NK1="yes" ;
  265. elif [ -n "$KEY1" ] ; then NK1="yes" ;
  266. else NK1="no" ;
  267. fi
  268. if [ -n "$NK2" ] ; then NK2="yes" ;
  269. elif [ -n "$KEY2" ] ; then NK2="yes" ;
  270. else NK2="no" ;
  271. fi
  272. if [ -n "$NK3" ] ; then NK3="yes" ;
  273. elif [ -n "$KEY4" ] ; then NK3="yes" ;
  274. else NK3="no" ;
  275. fi
  276. if [ -n "$NK4" ] ; then NK4="yes" ;
  277. elif [ -n "$KEY4" ] ; then NK4="yes" ;
  278. else NK4="no" ;
  279. fi
  280.  
  281.  
  282. ################## Now draw and run the GUI.
  283. ShowGUI
  284.  
  285. #cursor 0
  286. J=1
  287. y=2
  288. x=13
  289. xo=13
  290. STR=$NICK
  291.  
  292. # Run main dialog box until ESC
  293. while :
  294. do
  295. printat $y $x
  296. get_key
  297. MV=0 # Handle widget traversal (UP,DN,TAB).
  298. case $_KEY in
  299.    ${NL})printat 1 24 "key=[NL]"
  300.         #_KEY=$J
  301.     eval SP=\$WS$J
  302.     eval $SP=$STR
  303.     x=$xo
  304. ;; "${ESC}"|${NL}) break
  305. ;; '[A')printat 1 24 "key=[UP]" ; MV=$J
  306.         [ "$J" -eq 12 ] && J=8
  307.         [ "$J" -eq 16 ] && J=8
  308.         J=$(($J - 1))
  309. ;; '[B')printat 1 24 "key=[DN]" ; MV=$J
  310.         [ "$J" -ne 11 ] && [ "$J" -ne 15 ] && J=$(($J + 1))
  311. ;; "${TAB}")printat 1 24 "key=[TB]" ; MV=$J
  312.         [ "$J" -eq 19 ] && J=0
  313.         [ "$J" -gt 7 ] && J=$(($J + 4))
  314.         [ "$J" -gt 19 ] && J=$(($J - 11))
  315.         [ "$J" -le 7 ] && J=$(($J + 1))
  316. ;; '[D')printat 1 24 "key=[<<]"
  317.         [ $x -gt $xo ] && x=$(($x - 1))
  318. ;; '[C')printat 1 24 "key=[>>]"
  319.         [ $x -lt $((${#STR} + $xo)) ] && x=$(($x + 1))
  320. ;; '[5~')printat 1 24 "key=[V+]"
  321. ;; '[6~')printat 1 24 "key=[V-]"
  322. ;; '[1~')printat 1 24 "key=[HM]"
  323. ;; '[4~')printat 1 24 "key=[EN]"
  324. ;; "${C_D}")printat 1 24 "key=[^D]"
  325. ;; "${C_H}")printat 1 24 "key=[^H]"
  326. ;; "${BS}")printat 1 24 "key=[BS]"
  327.     [ $x -gt $xo ] && {
  328.           sreplace $(($x - $xo))
  329.       x=$(($x - 1))
  330.           printat $y $xo "$STR "
  331.           printat $y $x
  332.         }
  333. ;; [[:cntrl:]]) printat 1 24 "key=[CTL]"
  334. ;; [[:graph:]]) printat 1 24 "key=[${_KEY}]"
  335.     sreplace $(($x - $xo)) "${_KEY}"
  336.         printat $y $xo $STR
  337.     x=$(($x + 1))
  338.         printat $y $x
  339. ;; *)printat 1 24 "key=[HUH]"
  340. ;;
  341. esac
  342.  
  343. # Set x and y if traversing between widgets
  344. if [ $MV -ne 0 ] ; then
  345.   eval WL=\$WL$MV
  346.   printat $y $xo; printf "%-${WL}s"
  347.   eval SP=\$WS$MV
  348.   eval STR=\$"$SP"
  349.   eval printat $y $xo $STR
  350.   # Should erase from xo+$(#STR) to widgetlength.
  351.   if [ "$J" -lt 1 ] ; then J=1
  352.   elif [ "$J" -gt 19 ] ; then J=19
  353.   fi
  354.   if   [ "$J" -lt 4 ] ; then y=$(($J + 1)) ; x=13
  355.   elif [ "$J" -lt 8 ] ; then y=$(($J + 2)) ; x=13
  356.   elif [ "$J" -lt 12 ] ; then y=$(($J + 3)) ; x=3
  357.   elif [ "$J" -lt 16 ] ; then y=$(($J - 1)) ; x=32
  358.   elif [ "$J" -lt 20 ] ; then y=$(($J - 5)) ; x=37
  359.   fi
  360.   xo=$x
  361.   eval SP=\$WS$J
  362.   eval STR=\$"$SP"
  363.   eval printat $y $xo $STR
  364. fi
  365. done
  366.  
  367. # Goto top left corner (1,1), set normal text, fix tty, turn on the cursor.
  368. printat 1 1 $N
  369. stty sane
  370. clear
  371. cursor 1
  372.  
  373. ### Construct a tinyirc command line to save.
  374. CMD="tinyirc $NICK $PORT ${SERV:-$DSRV}"
  375.  
  376. OPS=""
  377. OP=\?
  378. case "$ID" in y*|Y*) OPS="${OP}identify=$IPAS"; OP=\& ;; esac
  379. if [ -n "$PASS" ] ; then
  380.   OPS="${OPS}${OP}pass=${PASS}";
  381. else case "$NPAS" in
  382.   y*|Y*) OPS="${OPS}${OP}needpass" ;; esac
  383. fi
  384. [ -n "$OPS" ] && CMD="${CMD}/$OPS"
  385.  
  386. for J in 1 2 3 4
  387. do
  388. eval CH="\$CH$J"; eval NK="\$NK$J"; eval KEY="\$KEY$J"
  389. [ -n "$CH" ] && {
  390.   CMD="${CMD}/$CH"
  391.   if [ -n "$KEY" ] ; then
  392.     CMD="${CMD},key=${KEY}"
  393.   else case "$NK" in
  394.     y*|Y*) CMD="${CMD},needkey" ;; esac
  395.   fi
  396. }
  397. done
  398.  
  399. echo $CMD
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement