ant 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. #!/usr/bin/env bash
  2. #
  3. # DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
  4. # Version 2, December 2004
  5. #
  6. # Copyright (C) 2015 grugly https://notabug.org/grugly/ant
  7. #
  8. # Everyone is permitted to copy and distribute verbatim or modified
  9. # copies of this license document, and changing it is allowed as long
  10. # as the name is changed.
  11. #
  12. # DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
  13. # TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
  14. #
  15. # 0. You just DO WHAT THE FUCK YOU WANT TO.
  16. #
  17. #
  18. scr_name='Ant - Bash IRC tool'
  19. scr_ver='0.3'
  20. scr_auth='grugly'
  21. printf '%s v%s by %s\n' "$scr_name" "$scr_ver" "$scr_auth"
  22. usage() {
  23. printf 'Usage: %s [-n nick] [-u user] [-r "Real Name"] [-h irc.host.ext] [-p port]\n' "$0"
  24. }
  25. init() {
  26. while [ "$#" -ne '0' ]
  27. do
  28. ARG="$1"
  29. shift
  30. case "$ARG" in
  31. -n) irc_nick="$1"; shift ;;
  32. -u) irc_user="$1"; shift ;;
  33. -r) irc_real="$1"; shift ;;
  34. -h) irc_host="$1"; shift ;;
  35. -p) irc_port="$1"; shift ;;
  36. *) usage; exit ;;
  37. esac
  38. done
  39. [ -z "$irc_nick" ] && irc_nick='ant'
  40. [ -z "$irc_user" ] && irc_user='ant'
  41. [ -z "$irc_real" ] && irc_real='Ant IRC script'
  42. [ -z "$irc_host" ] && irc_host='irc.aard.xyz'
  43. [ -z "$irc_port" ] && irc_port='6667'
  44. irc_home="$HOME/irc"
  45. irc_log="$irc_home/$irc_host/log"
  46. irc_ext="$irc_home/$irc_host/inp"
  47. rpid_file="$irc_home/$irc_host/rpid"
  48. [ -d "$irc_home" ] || mkdir "$irc_home"
  49. [ -d "$irc_home/$irc_host" ] || mkdir "$irc_home/$irc_host"
  50. connect && external
  51. }
  52. log() {
  53. local raw="$1" time="$( printf '%(%s)T' )"
  54. local cmd="${raw:0:4}"
  55. [ "$cmd" = 'PING' ] && return
  56. [ "$cmd" = 'PONG' ] && return
  57. printf '%s %s\n' "$time" "$raw" >> $irc_log
  58. [ "$cmd" = 'QUIT' ] && die
  59. }
  60. connect() {
  61. [ -e "$rpid_file" ] && rdie
  62. [ -e "$irc_ext" ] || mkfifo "$irc_ext"
  63. printf 'Connecting to: %s:%s\n' "$irc_host" "$irc_port"
  64. exec {host}<>/dev/tcp/$irc_host/$irc_port || exit
  65. send "USER $irc_user $irc_host $irc_host $irc_real"
  66. send "NICK $irc_nick"
  67. receive &
  68. printf "$!" > "$rpid_file"
  69. }
  70. send() {
  71. local raw="$*"
  72. printf '%s\n' "$raw" >& $host
  73. log "$raw"
  74. }
  75. receive() {
  76. while true; do
  77. local raw='' ping='' info='' data=''
  78. read -r raw <& $host
  79. [ "$raw" = '' ] && connect
  80. raw="${raw%$'\r'}"
  81. IFS=':' read -r ping info data <<< "$raw"
  82. [ "$ping" = 'PING ' ] && send "PONG $info" || log "$raw"
  83. #$irc_home/src/in.sh "$info" "$data"
  84. done
  85. }
  86. external() {
  87. exec {ext}<$irc_ext || exit 1
  88. while true; do
  89. local raw=''
  90. read -r raw <&$ext
  91. [ "$raw" ] && send "$raw" || sleep 1
  92. done
  93. }
  94. rdie() {
  95. local rpid="$( cat "$rpid_file" )"
  96. kill "$rpid"
  97. wait "$rpid" 2>/dev/null
  98. rm "$rpid_file"
  99. }
  100. die() {
  101. rdie
  102. exit
  103. }
  104. init "$@"