From 122400bd1795a4fecadbc3240753543618442c5f Mon Sep 17 00:00:00 2001 From: Sfan5 Date: Sun, 28 Apr 2013 20:47:21 +0200 Subject: [PATCH] [ChOp] Add !op and !deop; Add badword filtering --- COMMANDS.md | 3 +++ chop.py | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 79 insertions(+), 1 deletion(-) diff --git a/COMMANDS.md b/COMMANDS.md index 2624da2..152f999 100644 --- a/COMMANDS.md +++ b/COMMANDS.md @@ -19,11 +19,14 @@ Required arguments are enclosed in { and }, optional arguments are enclosed in \ calc.py !c {expression} Calculate expression using Google Calculator Anyone chop.py + !op {nick} [nick] ... Op nick Admins + !deop {nick} [nick] ... DeOp nick Admins !voice {nick} [nick] ... Voice nick Admins !devoice {nick} [nick] ... DeVoice nick Admins !ban {nick/mask} [nick/mask] ... Ban nick/mask Admins !unban {nick/mask} [nick/mask] ... UnBan nick/mask Admins !kick {nick} [nick] ... Voice nick Admins + !badword {on/off} Enable/Disable badword functionality Admins forumutils.py !sfu {searchstring} Search Minetest Forum users using searchstring Anyone !sfulimit {user} {'reset'/number} Set search limit for user Admins diff --git a/chop.py b/chop.py index 01d3c68..812df36 100644 --- a/chop.py +++ b/chop.py @@ -3,7 +3,33 @@ chop.py - Phenny Channel Administration Module Copyright 2013, Sfan5 """ -import os +import os, web, re + +chop = {} +chop["badword_limit"] = 4 +chop["badword_enabled"] = True +chop["victims"] = {} # for future use +badword_list = web.get("http://sfan5.minetest.net/badwords.txt") + +def num_badwords(sentence): + badwords = 0 + for bwl in badword_list.split("\n"): + arg = bwl.split(" ") + if len(arg) < 2: continue + arg[1] = arg[1].rstrip("\n\r") + if arg[0] == "regex": rgx = re.compile(arg[1]) + for word in sentence.split(" "): + word = word.rstrip(",.;") + word = word.lstrip(",.;") + if arg[0] == "raw": + if word.lower() == arg[1].lower(): + badwords += 1 + elif arg[0] == "regex": + if not rgx.match(word) == None: + badwords += 1 + if arg[0] == "regex": del rgx + + return badwords def voice(phenny, input): if not input.admin: return @@ -82,3 +108,52 @@ def unban(phenny, input): phenny.write(['MODE', input.sender, '-b', va], "") unban.commands = ['unban'] + +def op(phenny, input): + if not input.admin: return + if not input.sender.startswith('#'): return + # Can only be done in a channel by an admin + arg = input.group(2) + if not arg: return + arg = arg.split(" ") + for va in arg: + phenny.write(['MODE', input.sender, '+o', va], "") + +op.commands = ['op'] + +def deop(phenny, input): + if not input.admin: return + if not input.sender.startswith('#'): return + # Can only be done in a channel by an admin + arg = input.group(2) + if not arg: return + arg = arg.split(" ") + for va in arg: + phenny.write(['MODE', input.sender, '-o', va], "") + +deop.commands = ['deop'] + +def badword_watcher(phenny, input): + if not input.sender.startswith('#'): return + if not chop["badword_enabled"]: return + bwc = num_badwords(input.group(0)) + if bwc > chop["badword_limit"]: + phenny.write(['KICK', input.sender, input.nick], "CHOP!") #"Stop using badwords!") + try: + chop["victims"][input.nick] += 1 + except: + chop["victims"][input.nick] = 1 + +badword_watcher.priority = 'high' +badword_watcher.rule = r'.*' + +def badword_ctrl(phenny, input): + if not input.admin: return + arg = input.group(2) + if not arg: return + if arg == "enable" or arg == "on": + chop["badword_enabled"] = True + elif arg == "disable" or arg == "off": + chop["badword_enabled"] = False + +badword_ctrl.commands = ['badword']