move from other repo
This commit is contained in:
parent
535d89ee09
commit
5e7fd5b6c9
139
irc/irc.sh
Normal file
139
irc/irc.sh
Normal file
@ -0,0 +1,139 @@
|
||||
#!/bin/sh
|
||||
|
||||
# irc; Deven Blake 2022; Public domain
|
||||
# I stopped understanding this at 81 lines.
|
||||
|
||||
alias cat='cat -u'
|
||||
alias sed='sed -u'
|
||||
|
||||
# defaults
|
||||
DEFAULT_HOST="example.com"
|
||||
PORT=6667
|
||||
[ -n "$IRC_QUIT_MESSAGE" ] \
|
||||
|| IRC_QUIT_MESSAGE="Bye bye!"
|
||||
|
||||
# defaults (standard-defined)
|
||||
URI_FRAGMENT_DELIMITER='#' # RFC 3986
|
||||
|
||||
argv0="$0"
|
||||
URL="$1"
|
||||
|
||||
usage(){
|
||||
printf "Usage: %s [url]\n" "$argv0"
|
||||
exit 1
|
||||
}
|
||||
|
||||
one_character_per_line(){
|
||||
sed 's/./&\n/g'
|
||||
}
|
||||
|
||||
host_ex_url(){
|
||||
# filter out scheme URI subcomponent
|
||||
# filter out userinfo URI subcomponent
|
||||
# filter out port
|
||||
# filter out heirarchy path
|
||||
# filter out query
|
||||
# filter out fragment
|
||||
printf "%s\n" "$URL" \
|
||||
| sed 's/.*:\/\///' \
|
||||
| sed 's/.*@//' \
|
||||
| sed 's/:.*$//' \
|
||||
| sed 's/\/.*$//' \
|
||||
| sed 's/\?.*$//' \
|
||||
| sed 's/#.*$//'
|
||||
}
|
||||
|
||||
port_ex_url(){
|
||||
# filter out scheme URI subcomponent
|
||||
# filter out userinfo URI subcomponent
|
||||
local_url="$(printf "%s\n" "$URL" \
|
||||
| sed 's/.*:\/\///' \
|
||||
| sed 's/.*@//')"
|
||||
|
||||
# check to ensure there Is a port in the URL
|
||||
# this will also catch if we fucked up
|
||||
if ! [ "$(printf "%s\n" "$local_url" \
|
||||
| one_character_per_line \
|
||||
| grep ':' \
|
||||
| wc -l)" \
|
||||
= 1 ]
|
||||
then
|
||||
# give up, gracefully
|
||||
printf "%s\n" "$PORT"
|
||||
return 0
|
||||
fi
|
||||
|
||||
# filter out query URI subcomponent
|
||||
# filter out heirarchy path
|
||||
# filter out everything preceding the port
|
||||
local_url="$(printf "%s\n" "$local_url" \
|
||||
| sed 's/\?.*$//' \
|
||||
| sed 's/\/.*$//' \
|
||||
| sed 's/.*://')"
|
||||
|
||||
printf "%s\n" "$local_url"
|
||||
}
|
||||
|
||||
username_ex_url(){
|
||||
# only go if there's actually userinfo in the URL
|
||||
# filter out scheme URI subcomponent
|
||||
# filter out everything after userinfo URI subcomponent
|
||||
# filter out password in userinfo, if present
|
||||
printf "%s\n" "$URL" \
|
||||
| grep '@' \
|
||||
| sed 's/.*:\/\///' \
|
||||
| sed 's/@.*$//' \
|
||||
| sed 's/:.*$//'
|
||||
}
|
||||
|
||||
[ -n "$URL" ] \
|
||||
|| usage
|
||||
|
||||
[ -n "$IRC_NICK" ] \
|
||||
|| IRC_NICK="$USER"
|
||||
|
||||
# check if URL matches /^irc:\/\//
|
||||
if ! printf "%s\n" "$URL" | grep "^irc://" >/dev/null 2>&1; then
|
||||
printf "%s: %s: URL incorrectly formatted or scheme not specified.\n" "$argv0" "$URL"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# easy; the fragment is the last part of the URI
|
||||
CHANNEL="#$(printf "%s\n" "$URL" \
|
||||
| sed 's/.*#//' )"
|
||||
|
||||
# not easy
|
||||
PORT="$(port_ex_url)"
|
||||
|
||||
# slow, so don't rerun
|
||||
a="$(username_ex_url)"
|
||||
[ -z "$a" ] \
|
||||
|| IRC_NICK="$a"
|
||||
|
||||
HOST="$(host_ex_url)"
|
||||
|
||||
[ -n "$HOST" ] \
|
||||
|| HOST="$DEFAULT_HOST"
|
||||
|
||||
if ! TEMP="$(mktemp)" || ! TEMP_FIN="$(mktemp)"; then
|
||||
printf "%s: mktemp: Could not make temporary file.\n" "$argv0"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# RFC 1459 section 4.1.2
|
||||
printf "NICK %s\n" "$IRC_NICK" >"$TEMP"
|
||||
|
||||
# RFC 1459 section 4.1.3; USER <username> <hostname> <servername> <realname>
|
||||
# not really important
|
||||
printf "USER %s 0 0 :\n" "$IRC_NICK" >>"$TEMP"
|
||||
|
||||
# RFC 1459 section 4.2.1
|
||||
printf "JOIN %s\n" "$CHANNEL" >>"$TEMP"
|
||||
|
||||
# RFC 1459 section 4.1.6
|
||||
printf "QUIT :%s\n" "$IRC_QUIT_MESSAGE" >"$TEMP_FIN"
|
||||
|
||||
# RFC 1459 section 4.4.1
|
||||
sed "s/^/PRIVMSG $CHANNEL :/g" \
|
||||
| cat "$TEMP" /dev/stdin "$TEMP_FIN" \
|
||||
| nc "$HOST" "$PORT"
|
Loading…
Reference in New Issue
Block a user