Chatear en RedIrc

jueves, 17 de marzo de 2016

Banea a usuarios en hexchat/xchat según expresiones regulares

hexchat

Plugin para hexchat/xchat que explora los mensajes enviados a canales y banea a los usuarios cuando el mensaje coincide con una expresión regular (menos a los usuarios con estatus +v o superiores).

Comandos que admite el plugin:
  1. /BW   Lista los filtros actuales en el canal actual.
  2. /BW+ Añade un nuevo filtro.
  3. /BW-  Elimina el filtro dado.
(Nota: La acción se ejecutara siempre en el canal activo donde ejecutemos el comando).

Por defecto el plugin usa expresiones regulares REGEX, si quieres usar expresiones WILDCARD inhabilita regex (linea 10):
regex = 0
Puedes cambiar el mensaje de expulsión por el que quieras (linea 13):
reason = "Detectadas palabras prohibidas"
Si cambias algo del archivo debes actualizar para que los cambios se apliquen ejecutando en el cliente:
/PY reload badword

[accordion] [item title="Codigo badWords.py"]
#!/usr/bin/python
# coding:utf8

import xchat, re, shelve
from fnmatch import fnmatch

# Usa regex o wildcard para encontrar coincidencias, si 0 se usaran filtros 
# wildcard

regex = 1

# Mensaje de expulsión generico por defecto en ocurrencias
reason = "Detectadas palabras prohibidas"

##

badwords = {}

db = shelve.open("%s/badwords.db" % xchat.get_info("configdir"))
if "info" in db:
    badwords = db["info"]
db.close()

__module_name__ = "badWord" 
__module_version__ = "1.0" 
__module_description__ = "Banea a usuarios según expresiones regulares"

xchat.emit_print("Channel Message",
                 "\x02\x033"+ __module_name__ + "\x0f",
                 "Cargado.")
xchat.emit_print("Channel Message",
                 "\x02\x033"+ __module_name__ + "\x0f",
                 "\tComandos: /BW, /BW+, /BW-")

def badWord_cb(word, word_eol, userdata):   
    nick = word[0].split('!')[0].lstrip(':')
    chan = word[2]
    msg = ' '.join(word[3:]).lstrip(':')

    c = xchat.find_context(channel=chan)
    
    if c:
        if chan in badwords:
            for key in badwords[chan]:
                if (regex and re.match(key, msg, re.IGNORECASE)) or \
                        (not regex and fnmatch(msg.lower(),key.lower())):
                    for user in c.get_list("users"):
                        if nick == user.nick and not user.prefix:
                            c.command("KICKBAN " + nick + " " + reason)
                            break

    return xchat.EAT_NONE

def addBadWord_cb(word, word_eol, userdata):
    global badwords
    
    chan = xchat.get_info("channel")
    msg = ' '.join(word[1:])
    
    if len(word) >= 2:
        if not chan in badwords:
            badwords[chan] = []
        try:
            re.match(msg, "test")
            badwords[chan].append(msg)
            xchat.emit_print("Channel Message",
                            __module_name__,
                            "Filtro añadido en \x02" + chan + "\x02")
        except:
            xchat.emit_print("Channel Message",
                            __module_name__,
                            "\x034REGEX invalido!\x03")
    else:
        xchat.emit_print("Channel Message", 
                        __module_name__, 
                        "\x02Sintasis:\x02 /BW+ ")        
    
    return xchat.EAT_XCHAT

def delBadWord_cb(word, word_eol, userdata):
    global badwords
    
    chan = xchat.get_info("channel")
    msg = ' '.join(word[1:])
    
    if len(word) >= 2:
        if chan in badwords and msg in badwords[chan]:
            badwords[chan].remove(msg)
            xchat.emit_print("Channel Message",
                            __module_name__,
                            "Filtro eliminado en \x02" + chan + "\x02")
            if len(badwords[chan]) == 0:
                del(badwords[chan])
        else:
            xchat.emit_print("Channel Message",
                            __module_name__,
                            "\x034NO existe el filtro dado!\x03")
    else:
        xchat.emit_print("Channel Message",
                        __module_name__,
                        "\x02Sintasis:\x02 /BW- ")
                        
    return xchat.EAT_XCHAT

def listBadWord_cb(word, word_eol, userdata):

    chan = xchat.get_info("channel")
    
    if chan in badwords:
        xchat.emit_print("Channel Message", __module_name__, ' ')
        xchat.emit_print("Channel Message", 
                        __module_name__,
                        'Lista de \x1fpalabras prohibidas\x1f en \x02\x034' + chan + ":\x0f")
        xchat.emit_print("Channel Message", __module_name__, ' ')
        
        i = 0
        for key in badwords[chan]:
            i += 1
            xchat.emit_print("Channel Message", 
                            __module_name__,
                            "\t\x02" + str(i) + "\x02 - " + key)
        
        xchat.emit_print("Channel Message", __module_name__, ' ')
        xchat.emit_print("Channel Message", 
                         __module_name__,
                         "\x02" + str(i) + "\x02 filtros totales en \x02" + chan + "\x02")


    else:
        xchat.emit_print("Channel Message",
                        __module_name__,
                        "\x034NO hay filtros\x03. Use: \x02/BW+ \x02")

    return xchat.EAT_XCHAT

def unload_cb(userdata):  
    global badwords

    db = shelve.open("%s/badwords.db" % xchat.get_info("configdir"))
    db["info"] = badwords
    db.close()    
    
    xchat.emit_print("Channel Message", "\x02\x034"+__module_name__+"\x0f", "Descargado.")

xchat.hook_server("PRIVMSG", badWord_cb)
xchat.hook_server("NOTICE", badWord_cb)
xchat.hook_command("BW+", addBadWord_cb)
xchat.hook_command("BW-", delBadWord_cb)
xchat.hook_command("BW",  listBadWord_cb)
xchat.hook_unload(unload_cb)
[/item] [/accordion]

Instalación:


- Linux


Copiar el archivo badWords a ~/.config/hexchat/addons/, para xchat copiarlo en ~/.xchat/scripts.
cp ~/Descargas/badWords.py ~/.config/hexchat/addons/
hexchat -e -c "PY load badWords.py"

- Windows


Al instalar Hexchat/xchat debemos marcar la opción de Language Interfaces para que se descargue y instale:

Instalar python desde hexchat

De no ser así, descargar python y instalar normalmente.

(Nota: La arquitectura debe coincidir, o sea, si tienes hexchat/xchat de 32 bits debes asegurarte de bajar python de 32 bits).

Una vez instalado, copiar badWords a %appdata%\HexChat\addons o %appdata%/xchat2/scripts para xchat.

Para finalizar, carga el plugin ejecutando el siguiente comando en el iRC:
/PY load badWords.py

No hay comentarios:

Publicar un comentario