#!/bin/bash
# -*- coding: utf-8 -*-
###########################################################################
# #
# envbot - an IRC bot in bash #
# Copyright (C) 2007-2008 Arvid Norlander #
# #
# This program is free software: you can redistribute it and/or modify #
# it under the terms of the GNU General Public License as published by #
# the Free Software Foundation, either version 3 of the License, or #
# (at your option) any later version. #
# #
# This program is distributed in the hope that it will be useful, #
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
# GNU General Public License for more details. #
# #
# You should have received a copy of the GNU General Public License #
# along with this program. If not, see . #
# #
###########################################################################
#---------------------------------------------------------------------
## Simple FAQ module
#---------------------------------------------------------------------
module_faq_INIT() {
modinit_API='2'
modinit_HOOKS='after_load'
commands_register "$1" 'faq' || return 1
helpentry_module_faq_description="FAQ from a file."
helpentry_faq_faq_syntax='[number|string]'
helpentry_faq_faq_description='Show the th faq item or search for a in all the faq items.'
}
module_faq_UNLOAD() {
unset module_faq_array module_faq_last_query_item
unset module_faq_load module_faq_last_query_time
}
module_faq_REHASH() {
module_faq_load
}
#---------------------------------------------------------------------
## Load or reload FAQ items
## @Type Private
#---------------------------------------------------------------------
module_faq_load() {
local i=0
unset module_faq_array
if [[ -z "$config_module_faq_file" ]]; then
log_error "faq module: You need to set config_module_faq_file in your config!"
return 1
elif [[ -r "$config_module_faq_file" ]]; then
while read -d $'\n' line ;do
# Skip empty lines
if [[ "$line" ]]; then
(( i++ ))
module_faq_array[$i]="$line"
fi
done < "${config_module_faq_file}"
log_info 'Loaded FAQ items'
return 0
else
log_error "faq module: Cannot load '${config_module_faq_file}'. File doesn't exist or can't be read."
return 1
fi
}
# Called after module has loaded.
module_faq_after_load() {
module_faq_last_query_item='null'
module_faq_last_query_time='null'
module_faq_load
}
# Called on a PRIVMSG
#
# $1 = from who (n!u@h)
# $2 = to who (channel or botnick)
# $3 = the message
module_faq_handler_faq() {
local sender="$1"
local channel="$2"
# If it isn't in a channel send message back to person who send it,
# otherwise send in channel
if ! [[ $2 =~ ^# ]]; then
parse_hostmask_nick "$sender" 'channel'
fi
local query="$3"
if [[ "$query" ]]; then
if [[ "$query" == "reload" ]]; then
if access_check_capab "faq_admin" "$sender" "GLOBAL"; then
send_msg "$channel" "Reloading FAQ items..."
module_faq_load
send_msg "$channel" "Done."
else
access_fail "$sender" "reload faq items" "faq_admin"
fi
return 0
fi
# Is it a flood? Then 1.
local ok=0
if [[ "$module_faq_last_query_item" == "$line" ]]; then
time_check_interval "$module_faq_last_query_time" 60 || ok=1
fi
if [[ $ok -eq 0 ]] ; then # Must be at least 1 min old or different query...
time_get_current 'module_faq_last_query_time'
# Update anti-flood variables
module_faq_last_query_item="$line"
module_faq_last_query="$query_time"
if [[ "$query" =~ ^\ *([0-9]+)\ *$ ]]; then
local index="${BASH_REMATCH[1]}"
if [[ "${module_faq_array[$index]}" ]]; then
send_msg "$channel" "${module_faq_array[$index]}"
else
send_msg "$channel" "That FAQ item doesn't exist"
fi
# Check length of search to be at least 3 chars
elif [[ "${#query}" -ge 3 ]] ; then
local i=0
while [[ $i -lt "${#module_faq_array[*]}" ]] ; do
(( i++ ))
# FIXME: This code is hard to read.
# This module needs rewriting...
if grep -qiFm 1 "$query" <<< "${module_faq_array[$i]}" ; then
send_msg "$channel" "${module_faq_array[$i]}"
break 1
fi
done
fi
else
log_error "FLOOD DETECTED in FAQ module"
fi
fi
}