Add IRC boiler plate for higher level features
This commit is contained in:
parent
ea7146d57d
commit
1b3970d103
1 changed files with 126 additions and 18 deletions
144
rowbot
144
rowbot
|
@ -4,7 +4,7 @@
|
||||||
# feature switch toggling
|
# feature switch toggling
|
||||||
###
|
###
|
||||||
|
|
||||||
shopt -s dotglob extglob lastpipe nullglob
|
shopt -s dotglob extglob nullglob
|
||||||
|
|
||||||
###
|
###
|
||||||
# utility and helper functions
|
# utility and helper functions
|
||||||
|
@ -31,7 +31,7 @@ die() {
|
||||||
}
|
}
|
||||||
|
|
||||||
get_option() {
|
get_option() {
|
||||||
if (( $# != 2 )); then
|
if (( ! $# )); then
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@ -44,7 +44,7 @@ get_option() {
|
||||||
config[$1]=${opts[$1]}
|
config[$1]=${opts[$1]}
|
||||||
elif [[ -v $var_name ]]; then
|
elif [[ -v $var_name ]]; then
|
||||||
config[$1]=${!var_name}
|
config[$1]=${!var_name}
|
||||||
else
|
elif (( $# > 1 )); then
|
||||||
config[$1]=$2
|
config[$1]=$2
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
@ -65,6 +65,10 @@ is_reloaded() {
|
||||||
[[ $RELOADED = yes ]] || (( LORE_LIVES > 1 ))
|
[[ $RELOADED = yes ]] || (( LORE_LIVES > 1 ))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
is_running () {
|
||||||
|
kill -0 "$1" 2>/dev/null
|
||||||
|
}
|
||||||
|
|
||||||
random() {
|
random() {
|
||||||
local min=$1 max=$2
|
local min=$1 max=$2
|
||||||
(( (RANDOM % max) + min ))
|
(( (RANDOM % max) + min ))
|
||||||
|
@ -141,15 +145,6 @@ unset key file
|
||||||
|
|
||||||
declare -A config
|
declare -A config
|
||||||
|
|
||||||
# irc registration settings
|
|
||||||
|
|
||||||
get_option nick rowbot-dev
|
|
||||||
get_option ident rowbot
|
|
||||||
get_option realname rowbot
|
|
||||||
get_option chan ""
|
|
||||||
|
|
||||||
# bot control settings
|
|
||||||
|
|
||||||
get_option owner "${USER:-uplime}"
|
get_option owner "${USER:-uplime}"
|
||||||
get_option trigger \`
|
get_option trigger \`
|
||||||
get_option dev yes
|
get_option dev yes
|
||||||
|
@ -160,12 +155,15 @@ get_option dev yes
|
||||||
|
|
||||||
on_sys_first_001_bootup() {
|
on_sys_first_001_bootup() {
|
||||||
log_info "rowbot's pid is %d" "$$"
|
log_info "rowbot's pid is %d" "$$"
|
||||||
|
get_option nick rowbot-dev
|
||||||
|
get_option ident rowbot
|
||||||
|
get_option realname rowbot
|
||||||
}
|
}
|
||||||
|
|
||||||
on_sys_first_999_bootup() {
|
on_sys_first_999_bootup() {
|
||||||
log_debug "registering with the server"
|
log_debug "registering with the server"
|
||||||
nick "${config[nick]}"
|
irc_nick "${config[nick]}"
|
||||||
user "${config[ident]}" "${config[realname]}"
|
irc_user "${config[ident]}" "${config[realname]}"
|
||||||
}
|
}
|
||||||
|
|
||||||
on_sys_before_999_bootup() {
|
on_sys_before_999_bootup() {
|
||||||
|
@ -351,7 +349,7 @@ on_sys_after_002_net() {
|
||||||
unset IRC_SOCK
|
unset IRC_SOCK
|
||||||
else
|
else
|
||||||
sock_dir=$SOCK_DIR tls_pid=$TLS_PID out_sock=$OUT_SOCK in_sock=$IN_SOCK
|
sock_dir=$SOCK_DIR tls_pid=$TLS_PID out_sock=$OUT_SOCK in_sock=$IN_SOCK
|
||||||
unset sock_dir tls_pid out_sock in_sock
|
unset SOCK_DIR TLS_PID OUT_SOCK IN_SOCK
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -370,15 +368,100 @@ on_sys_exit_998_net() {
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
###
|
||||||
|
# irc magic
|
||||||
|
###
|
||||||
|
|
||||||
|
magic_annoyatron900() {
|
||||||
|
irc_ping "row your bot gently down the stream"
|
||||||
|
}
|
||||||
|
|
||||||
|
on_sys_init_999_magic() {
|
||||||
|
get_option chan ""
|
||||||
|
}
|
||||||
|
|
||||||
|
on_sys_before_999_magic() {
|
||||||
|
if [[ -v alarm_pid ]]; then
|
||||||
|
export ALARM_PID=$alarm_pid
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
on_sys_after_999_magic() {
|
||||||
|
trap magic_annoyatron900 USR1
|
||||||
|
|
||||||
|
if [[ -v ALARM_PID ]]; then
|
||||||
|
alarm_pid=$ALARM_PID
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
on_sys_register_999_magic() {
|
||||||
|
if [[ ${config[chan]} ]]; then
|
||||||
|
irc_join "$chan"
|
||||||
|
fi
|
||||||
|
|
||||||
|
while true; do
|
||||||
|
read -rt 10 </dev/zero
|
||||||
|
KILL -USR1 "$$"
|
||||||
|
done &
|
||||||
|
|
||||||
|
alarm_pid=$!
|
||||||
|
trap magic_annoyatron900 USR1
|
||||||
|
log_debug "process %d is being annoying" "$alarm_pid"
|
||||||
|
}
|
||||||
|
|
||||||
|
on_sys_exit_997_magic() {
|
||||||
|
log_debug "shutting down annoyatron900"
|
||||||
|
|
||||||
|
if [[ -v alarm_pid ]] && is_running "$alarm_pid"; then
|
||||||
|
kill -STOP "$alarm_pid"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# nick=${args[0]}
|
||||||
|
# who "$nick" %%uht,42
|
||||||
|
|
||||||
|
###
|
||||||
|
# irc receive handlers
|
||||||
|
###
|
||||||
|
|
||||||
|
irc_on_NOTICE() {
|
||||||
|
log_info "[%s/%s] %s" "${msg[from]}" "${msg_args[0]}" "${msg_args[1]}"
|
||||||
|
}
|
||||||
|
|
||||||
|
irc_on_PING() {
|
||||||
|
irc_pong "${msg_args[1]}"
|
||||||
|
log_debug "received ping: %s" "${msg_args[0]}"
|
||||||
|
}
|
||||||
|
|
||||||
|
irc_on_PONG() {
|
||||||
|
log_debug "received pong: %s" "${msg_args[1]}"
|
||||||
|
}
|
||||||
|
|
||||||
|
irc_on_001() {
|
||||||
|
log_info %s "${msg_args[1]}"
|
||||||
|
run_callbacks on_sys_register_
|
||||||
|
run_callbacks on_register_
|
||||||
|
}
|
||||||
|
|
||||||
###
|
###
|
||||||
# irc send handlers
|
# irc send handlers
|
||||||
###
|
###
|
||||||
|
|
||||||
nick() {
|
irc_join() {
|
||||||
|
local chans
|
||||||
|
printf -v chans %s, "$@"
|
||||||
|
net_send "JOIN %s" "${chans%,}"
|
||||||
|
}
|
||||||
|
|
||||||
|
irc_nick() {
|
||||||
net_send "NICK :%s" "$1"
|
net_send "NICK :%s" "$1"
|
||||||
}
|
}
|
||||||
|
|
||||||
user() {
|
irc_ping() {
|
||||||
|
net_send "PING :%s" "$1"
|
||||||
|
}
|
||||||
|
|
||||||
|
irc_user() {
|
||||||
net_send "USER %s 0 * :%s" "$1" "$2"
|
net_send "USER %s 0 * :%s" "$1" "$2"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -430,7 +513,7 @@ fi
|
||||||
###
|
###
|
||||||
|
|
||||||
while net_recv line; do
|
while net_recv line; do
|
||||||
declare -A msg=([words]=no [original]="$line")
|
declare -A msg=( [words]=no [original]="$line" [score]=0 )
|
||||||
|
|
||||||
# parse prefix in the style of nick!ident@host
|
# parse prefix in the style of nick!ident@host
|
||||||
|
|
||||||
|
@ -438,14 +521,27 @@ while net_recv line; do
|
||||||
prefix=${line%% *} prefix=${prefix#:} line=${line#:"$prefix"} line=${line# }
|
prefix=${line%% *} prefix=${prefix#:} line=${line#:"$prefix"} line=${line# }
|
||||||
log_debug "parsing message prefix %s" "$prefix"
|
log_debug "parsing message prefix %s" "$prefix"
|
||||||
msg[host]=${prefix#*@} prefix=${prefix%"${msg[host]}"} prefix=${prefix%@}
|
msg[host]=${prefix#*@} prefix=${prefix%"${msg[host]}"} prefix=${prefix%@}
|
||||||
|
msg[from]=${msg[host]}
|
||||||
|
|
||||||
if [[ $prefix ]]; then
|
if [[ $prefix ]]; then
|
||||||
msg[ident]=${prefix#*!}
|
msg[ident]=${prefix#*!}
|
||||||
|
msg[from]=${msg[ident]}
|
||||||
|
|
||||||
if [[ ${msg[ident]} != "$prefix" ]]; then
|
if [[ ${msg[ident]} != "$prefix" ]]; then
|
||||||
msg[nick]=${prefix%!*}
|
msg[nick]=${prefix%!*}
|
||||||
|
msg[from]=${msg[nick]}
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [[ /${msg[host]}/ = */bot/* ]]; then
|
||||||
|
(( msg[score] += 100 ))
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ ${msg[nick]} = *-bot ]]; then
|
||||||
|
(( msg[score] += 30 ))
|
||||||
|
elif [[ ${msg[nick]} = *bot ]]; then
|
||||||
|
(( msg[score] += 15 ))
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# parse command formatted as a 3 digit integer or as a word consisting of
|
# parse command formatted as a 3 digit integer or as a word consisting of
|
||||||
|
@ -471,6 +567,18 @@ while net_recv line; do
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
|
if [[ ${msg[cmd]^^} = @(PRIVMSG|NOTICE) ]]; then
|
||||||
|
case ${msg_args[-1]} in
|
||||||
|
"["*"]")
|
||||||
|
(( msg[score] += 20 ))
|
||||||
|
;;
|
||||||
|
$'\xe2\x80\x8b'*)
|
||||||
|
(( msg[score] += 100 ))
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
log_debug "bot score is %d" "${msg[score]}"
|
||||||
|
|
||||||
if has irc_on_"${msg[cmd]^^}"; then
|
if has irc_on_"${msg[cmd]^^}"; then
|
||||||
irc_on_"${msg[cmd]^^}"
|
irc_on_"${msg[cmd]^^}"
|
||||||
else
|
else
|
||||||
|
|
Loading…
Reference in a new issue