aboutsummaryrefslogtreecommitdiffstats
path: root/modules/m_kick_ban.sh
diff options
context:
space:
mode:
Diffstat (limited to 'modules/m_kick_ban.sh')
-rw-r--r--modules/m_kick_ban.sh145
1 files changed, 145 insertions, 0 deletions
diff --git a/modules/m_kick_ban.sh b/modules/m_kick_ban.sh
new file mode 100644
index 0000000..d234c62
--- /dev/null
+++ b/modules/m_kick_ban.sh
@@ -0,0 +1,145 @@
+#!/bin/bash
+# -*- coding: utf-8 -*-
+###########################################################################
+# #
+# envbot - an IRC bot in bash #
+# Copyright (C) 2007-2008 Arvid Norlander #
+# Copyright (C) 2007-2008 EmErgE <halt.system@gmail.com> #
+# #
+# 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/>. #
+# #
+###########################################################################
+#---------------------------------------------------------------------
+## Kicking and banning.
+#---------------------------------------------------------------------
+
+module_kick_ban_INIT() {
+ modinit_API='2'
+ modinit_HOOKS='after_load after_connect on_numeric'
+ unset module_kick_ban_next_unset module_kick_ban_timed_bans
+ commands_register "$1" 'kick' || return 1
+ commands_register "$1" 'ban' || return 1
+ helpentry_module_kick_ban_description="Provides kick and ban commands."
+
+ helpentry_kick_ban_kick_syntax='[<#channel>] <nick> <reason>'
+ helpentry_kick_ban_kick_description='Kick someone from a channel. Channel parameter only needed if not sent in a channel.'
+
+ helpentry_kick_ban_ban_syntax='<#channel> <nick> [<duration>]'
+ helpentry_kick_ban_ban_description='Ban someone from a channel. Duration is optional and defaults to infinite.'
+}
+
+module_kick_ban_UNLOAD() {
+ unset module_kick_ban_TBAN_supported
+}
+
+module_kick_ban_REHASH() {
+ return 0
+}
+
+# Lets check if TBAN is supported
+# :photon.kuonet-ng.org 461 envbot TBAN :Not enough parameters.
+# :photon.kuonet-ng.org 304 envbot :SYNTAX TBAN <channel> <duration> <banmask>
+module_kick_ban_after_connect() {
+ module_kick_ban_TBAN_supported=0
+ send_raw "TBAN"
+}
+
+# HACK: If module is loaded after connect, module_kick_ban_after_connect won't
+# get called, therefore lets check if we are connected here and check for
+# TBAN here if that is the case.
+module_kick_ban_after_load() {
+ if [[ $server_connected -eq 1 ]]; then
+ module_kick_ban_TBAN_supported=0
+ send_raw "TBAN"
+ fi
+}
+
+module_kick_ban_on_numeric() {
+ if [[ $1 == $numeric_ERR_NEEDMOREPARAMS ]]; then
+ if [[ "$2" =~ ^TBAN\ : ]]; then
+ module_kick_ban_TBAN_supported=1
+ fi
+ fi
+}
+
+module_kick_ban_handler_kick() {
+ # Accept this anywhere, unless someone can give a good reason not to.
+ local sender="$1"
+ local sendon_channel="$2"
+ local parameters="$3"
+ if [[ $parameters =~ ^((#[^ ]+)\ )(.*) ]]; then
+ local channel="${BASH_REMATCH[2]}"
+ parameters="${BASH_REMATCH[3]}"
+ else
+ if ! [[ $channel =~ ^# ]]; then
+ if [[ $sendon_channel =~ ^# ]]; then
+ local channel="$sendon_channel"
+ else
+ local sendernick
+ parse_hostmask_nick "$sender" 'sendernick'
+ feedback_bad_syntax "$sendernick" "kick" "[<#channel>] <nick> <reason> # Channel must be send when the message is not sent in a channel"
+ return 0
+ fi
+ fi
+ fi
+
+ if [[ "$parameters" =~ ^([^ ]+)\ (.+) ]]; then
+ local nick="${BASH_REMATCH[1]}"
+ local kickmessage="${BASH_REMATCH[2]}"
+ if access_check_capab "kick" "$sender" "$channel"; then
+ send_raw "KICK $channel $nick :$kickmessage"
+ access_log_action "$sender" "kicked $nick from $channel with kick message: $kickmessage"
+ else
+ access_fail "$sender" "make the bot kick somebody" "kick"
+ fi
+ else
+ local sendernick
+ parse_hostmask_nick "$sender" 'sendernick'
+ feedback_bad_syntax "$sendernick" "kick" "[<#channel>] <nick> <reason> # Channel must be send when the message is not sent in a channel"
+ fi
+}
+
+module_kick_ban_handler_ban() {
+ local sender="$1"
+ local sendon_channel="$2"
+ local parameters="$3"
+ if [[ "$parameters" =~ ^(#[^ ]+)\ ([^ ]+)(\ ([0-9]+))? ]]; then
+ local channel="${BASH_REMATCH[1]}"
+ local nick="${BASH_REMATCH[2]}"
+ # Optional parameter.
+ local duration="${BASH_REMATCH[4]}"
+ if access_check_capab "ban" "$sender" "$channel"; then
+ if [[ $duration ]]; then
+ # send_modes "$channel" "+b" get_hostmask $nick <-- not implemented yet
+ if [[ $module_kick_ban_TBAN_supported -eq 1 ]]; then
+ send_raw "TBAN $channel $duration $nick"
+ else
+ send_modes "$channel" "+b $nick"
+ local sendernick
+ parse_hostmask_nick "$sender" 'sendernick'
+ send_notice "$sendernick" "Sorry ban will not be timed, this IRCd didn't support TBAN command when I checked before."
+ fi
+ else
+ send_modes "$channel" "+b $nick"
+ fi
+ access_log_action "$sender" "banned $nick from $channel"
+ else
+ access_fail "$sender" "make the bot ban somebody" "ban"
+ fi
+ else
+ local sendernick
+ parse_hostmask_nick "$sender" 'sendernick'
+ feedback_bad_syntax "$sendernick" "ban" "<#channel> <nick> [<duration>]"
+ fi
+}