diff options
Diffstat (limited to 'modules/m_karma.sh')
-rw-r--r-- | modules/m_karma.sh | 252 |
1 files changed, 252 insertions, 0 deletions
diff --git a/modules/m_karma.sh b/modules/m_karma.sh new file mode 100644 index 0000000..8d2aed8 --- /dev/null +++ b/modules/m_karma.sh @@ -0,0 +1,252 @@ +#!/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 <http://www.gnu.org/licenses/>. # +# # +########################################################################### +#--------------------------------------------------------------------- +## Karma module +#--------------------------------------------------------------------- + +module_karma_INIT() { + modinit_API='2' + modinit_HOOKS='after_load on_PRIVMSG' + commands_register "$1" 'karma' || return 1 + helpentry_module_karma_description="Provides karma support. Use ++ and -- after a string in a channel to change karma." + helpentry_karma_karma_syntax='<string>' + helpentry_karma_karma_description='Get current karma for <string>.' +} + +module_karma_UNLOAD() { + unset module_karma_SELECT + unset module_karma_INSERT module_karma_UPDATE module_karma_set_INSERT_or_UPDATE + unset module_karma_substract module_karma_add module_karma_check + unset module_karma_is_nick + unset module_karma_check_return + return 0 +} + +module_karma_REHASH() { + return 0 +} + +module_karma_after_load() { + modules_depends_register "karma" "sqlite3" || { + # This error reporting is hackish, will fix later. + if ! list_contains "modules_loaded" "sqlite3"; then + log_error "The karma module depends upon the SQLite3 module being loaded." + fi + return 1 + } + if [[ -z $config_module_karma_table ]]; then + log_error "Karma table (config_module_karma_table) must be set in config to use the karma module." + return 1 + fi + if ! module_sqlite3_table_exists "$config_module_karma_table"; then + log_error "karma module: $config_module_karma_table does not exist in the database file." + log_error "karma module: See comment in doc/karma.sql for how to create the table." + fi +} + +#--------------------------------------------------------------------- +## Get an item from DB +## @Type Private +## @param key +## @Stdout The result of the database query. +#--------------------------------------------------------------------- +module_karma_SELECT() { + module_sqlite3_exec_sql "SELECT rating FROM $config_module_karma_table WHERE target='$(module_sqlite3_clean_string "$1")';" +} + + +#--------------------------------------------------------------------- +## Insert a new item into DB +## @Type Private +## @param key +## @param karma +#--------------------------------------------------------------------- +module_karma_INSERT() { + module_sqlite3_exec_sql \ + "INSERT INTO $config_module_karma_table (target, rating) VALUES('$(module_sqlite3_clean_string "$1")', '$(module_sqlite3_clean_string "$2")');" +} + + +#--------------------------------------------------------------------- +## Change the item in DB +## @Type Private +## @param key +## @param karma +#--------------------------------------------------------------------- +module_karma_UPDATE() { + module_sqlite3_exec_sql \ + "UPDATE $config_module_karma_table SET rating='$(module_sqlite3_clean_string "$2")' WHERE target='$(module_sqlite3_clean_string "$1")';" +} + +#--------------------------------------------------------------------- +## Wrapper, call either INSERT or UPDATE +## @Type Private +## @param key +## @param karma +#--------------------------------------------------------------------- +module_karma_set_INSERT_or_UPDATE() { + if [[ $(module_karma_SELECT "$1") ]]; then + module_karma_UPDATE "$1" "$2" + else + module_karma_INSERT "$1" "$2" + fi +} + +#--------------------------------------------------------------------- +## Remove 1 from key +## @Type Private +## @param key to remove from. +#--------------------------------------------------------------------- +module_karma_substract() { + # Clean spaces and convert to lower case + local keyarray + read -ra keyarray <<< "$1" + local key="$(tr '[:upper:]' '[:lower:]' <<< "${keyarray[*]}")" + local old="$(module_karma_SELECT "$key")" + # -1 + any old value (yes looks backwards but works) + local new=-1 + if [[ "$old" ]]; then + (( new += old )) + fi + module_karma_set_INSERT_or_UPDATE "$key" "$new" +} + +#--------------------------------------------------------------------- +## Add 1 from key +## @Type Private +## @param key to add to. +#--------------------------------------------------------------------- +module_karma_add() { + # Clean spaces and convert to lower case + local keyarray + read -ra keyarray <<< "$1" + local key="$(tr '[:upper:]' '[:lower:]' <<< "${keyarray[*]}")" + local old="$(module_karma_SELECT "$key")" + # 1 + any old value + local new=1 + if [[ "$old" ]]; then + (( new += old )) + fi + module_karma_set_INSERT_or_UPDATE "$key" "$new" +} + +#--------------------------------------------------------------------- +## Return karma value for key +## The result is returned in $module_karma_check_return +## @Type Private +## @param key to return karma for +## @Globals $module_karma_check_return +#--------------------------------------------------------------------- +module_karma_check() { + # Clean spaces and convert to lower case + local keyarray + read -ra keyarray <<< "$1" + local key="$(tr '[:upper:]' '[:lower:]' <<< "${keyarray[*]}")" + module_karma_check_return="$(module_karma_SELECT "$key")" + if [[ -z "$module_karma_check_return" ]]; then + module_karma_check_return=0 + fi +} + +#--------------------------------------------------------------------- +## Check if the key is the nick of sender. +## @Type Private +## @param key +## @param sender +## @return 0 If nick and key are same +## @return 1 Otherwise +#--------------------------------------------------------------------- +module_karma_is_nick() { + local keyarray + read -ra keyarray <<< "$1" + local key="$(tr '[:upper:]' '[:lower:]' <<< "${keyarray[*]}")" + local sendernick + parse_hostmask_nick "$2" 'sendernick' + local nickarray + read -ra nickarray <<< "$(tr '[:upper:]' '[:lower:]' <<< "$sendernick")" + local nick="${nickarray[*]}" + if [[ "$key" = "$nick" ]]; then + return 0 + fi + return 1 +} + + +# Called on a PRIVMSG +# +# $1 = from who (n!u@h) +# $2 = to who (channel or botnick) +# $3 = the message +module_karma_on_PRIVMSG() { + local sender="$1" + local query="$3" + local sendon_channel + # If it isn't in a channel send message back to person who sent it, + # otherwise send in channel + if [[ $2 =~ ^# ]]; then + sendon_channel="$2" + # An item must begin with an alphanumeric char. + if [[ "$query" =~ ^([a-zA-Z0-9].*)\+\+$ ]]; then + local key="${BASH_REMATCH[1]}" + if module_karma_is_nick "$key" "$sender"; then + send_msg "$sendon_channel" "You can't change karma of yourself." + else + module_karma_add "$key" + fi + elif [[ "$query" =~ ^([a-zA-Z0-9].*)--$ ]]; then + local key="${BASH_REMATCH[1]}" + if module_karma_is_nick "$key" "$sender"; then + send_msg "$sendon_channel" "You can't change karma of yourself." + else + module_karma_substract "$key" + fi + fi + else + parse_hostmask_nick "$sender" 'sendon_channel' + # Karma is only possible in channels + if [[ "$query" =~ ^[a-zA-Z0-9].*(--|\+\+)$ ]]; then + send_notice "$sendon_channel" "You can only change karma in channels." + return 1 + fi + fi + return 0 +} + +module_karma_handler_karma() { + local sender="$1" + local sendon_channel + if [[ $2 =~ ^# ]]; then + sendon_channel="$2" + else + parse_hostmask_nick "$sender" 'sendon_channel' + fi + local parameters="$3" + if [[ $parameters =~ ^(.+)$ ]]; then + local key="${BASH_REMATCH[1]}" + module_karma_check "$key" + send_msg "$sendon_channel" "Karma for $key is $module_karma_check_return" + else + local sendernick + parse_hostmask_nick "$sender" 'sendernick' + feedback_bad_syntax "$sendernick" "karma" "<string>" + fi +} |