Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # coding: utf-8
- OBSCENE_PATH="obscene_words.txt"
- CHARS_PATH="chars_words.txt"
- FILT_CACHE={}
- DEVOICE=0x1
- TIMER=0x2
- BAN_COUNT=0x3
- LAST_MSG=0x4
- LAST_TIME=0x5
- MSG_COUNT=0x6
- KICK_COUNT=0x7
- DEVOICE_UPTO=0x8
- LASTKICK=0x9
- def loadFilt():
- global obscene_words
- obscene_words = eval(utils.readFile(getFilePath(RESOURCE_DIR,OBSCENE_PATH), encoding="utf-8"))
- def setDefaulFiltValues(conference):
- if getConferenceConfigKey(conference, "filt") is None:
- setConferenceConfigKey(conference, "filt",{'status':0,'protect':0,'obscene':0,'dev':None,'censnick':0,'lnick':None,'age':None,'special':None,'idle':None,'caps':0,'fence':0,'autoban':None,'flood':{'time':0,'diff':0,'per':0,'count':0,'dev':0}})
- def configFilt(msgType, conference, nick, param):
- Sets=getConferenceConfigKey(conference, "filt")
- switch={1:u'включена',0:u'отключена'}
- if param:
- param=param.split()
- if param[0]=='default' :
- Sets={'status':1,'protect':0,'obscene':1,'dev':120,'censnick':1,'lnick':20,'age':16,'special':4,'idle':None,'caps':1,'fence':1,'autoban':None,'flood':{'time':1,'diff':1,'per':5,'count':2,'dev':20}}
- sendMsg(msgType, conference, nick,u'Произведена установка параметров по умолчанию')
- elif param[0] in ['on','1']:
- Sets['status']=1
- sendMsg(msgType, conference, nick,u'Общая фильтрация включена')
- elif param[0] in ['off','0']:
- Sets['status']=0
- sendMsg(msgType, conference, nick,u'Общая фильтрация отключена')
- elif param[0]=="obscene" and len(param)>=2:
- if param[1] in ['on','1'] :
- Sets['obscene']=1
- sendMsg(msgType, conference, nick,u'Фильтрация мата включена')
- elif param[1] in ['off','0'] :
- Sets['obscene']=0
- sendMsg(msgType, conference, nick,u'Фильтрация мата отключена')
- elif param[1]=='dev' and len(param)>=3:
- if param[2] in ['None','0']:
- Sets['dev']=None
- sendMsg(msgType, conference, nick,u'Молчание за мат отключено')
- elif param[2].isdigit():
- Sets['dev']=int(param[2])
- sendMsg(msgType, conference, nick,u'Молчание за мат %s'%getTimeStr(Sets['dev']))
- else : sendMsg(msgType, conference, nick,u'Обратись к помощи по команде!')
- elif param[1]=='ban' and len(param)>=3:
- if param[2] in ['None','0'] :
- Sets['autoban']=None
- sendMsg(msgType, conference, nick,u'Автобан полсе нескольких нарушений отключён')
- elif param[2].isdigit():
- Sets['autoban']=int(param[2])
- sendMsg(msgType, conference, nick,u'Автобан после %s нарушений включён.Будем банить!=)'%param[2])
- else : sendMsg(msgType, conference, nick,u'Обратись к помощи по команде!')
- elif param[0]=="len" and len(param)>=2:
- if param[1] in ['None','0'] :
- Sets['lnick']=None
- sendMsg(msgType, conference, nick,u'Фильтрация длинных ников отключена')
- elif param[1].isdigit() :
- Sets['lnick']=int(param[1])
- sendMsg(msgType, conference, nick,u'Фильтрация длинных ников установлена с %s символов'%param[1])
- else : sendMsg(msgType, conference, nick,u'Обратись к помощи по команде!')
- elif param[0]=="age" and len(param)>=2:
- if param[1] in ['None','0']:
- Sets['age']=None
- sendMsg(msgType, conference, nick,u'Возрастное ограничение отключено')
- elif param[1].isdigit():
- Sets['age']=int(param[1])
- sendMsg(msgType, conference, nick,u'Возрастное ограничение установлено до %s лет'%param[1])
- else : sendMsg(msgType, conference, nick,u'Обратись к помощи по команде!')
- elif param[0]=='symbols'and len(param)>=2:
- if param[1] in ['None','0']:
- Sets['special']=None
- sendMsg(msgType, conference, nick,u'Фильтрация специальных символов внике отключена')
- elif param[1].isdigit():
- Sets['special']=int(param[1])
- sendMsg(msgType, conference, nick,u'Фильтрация специальных символов в нике установлена от %s штук '%param[1])
- else: sendMsg(msgType, conference, nick,u'Обратись к помощи по команде!')
- elif param[0]=='censnick' and len(param)>=2:
- if param[1] in ['on','1'] : Sets['censnick']=1
- elif param[1] in ['off','0'] : Sets['censnick']=0
- else : sendMsg(msgType, conference, nick,u'Обратись к помощи по команде!')
- sendMsg(msgType, conference, nick,u'Фильтрация мата в нике %s'%switch[Sets['censnick']])
- elif param[0]=='idle' and len(param)>=2:
- if param[1] in ['None','0']:
- Sets['idle']=None
- sendMsg(msgType, conference, nick,u'Автокик за молчание отключен')
- elif param[1].isdigit():
- Sets['idle']=int(param[1])
- sendMsg(msgType, conference, nick,u'Автокик за молчание в чате более %s '%getTimeStr(Sets['idle']))
- else: sendMsg(msgType, conference, nick,u'Обратись к помощи по команде!')
- elif param[0]=='caps' and len(param)>=2:
- if param[1] in ['on','1'] : Sets['caps']=1
- elif param[1] in ['off','0'] : Sets['caps']=0
- else : sendMsg(msgType, conference, nick,u'Обратись к помощи по команде!')
- sendMsg(msgType, conference, nick,u'Фильтрация капса в сообщениях %s'%switch[Sets['caps']])
- elif param[0]=='fence' and len(param)>=2:
- if param[1] in ['on','1'] : Sets['fence']=1
- elif param[1] in ['off','0'] : Sets['fence']=0
- else : sendMsg(msgType, conference, nick,u'Обратись к помощи по команде!')
- sendMsg(msgType, conference, nick,u'Фильтрация забора\капса в нике %s'%switch[Sets['fence']])
- elif param[0]=='antibot' and len(param)>=2:
- if param[1] in ['on','1'] : Sets['protect']=1
- elif param[1] in ['off','0'] : Sets['protect']=0
- else : sendMsg(msgType, conference, nick,u'Обратись к помощи по команде!')
- sendMsg(msgType, conference, nick,u'AntiBot Protection© %s'%switch[Sets['protect']])
- elif param[0]=='flood':
- if param[1]=='time' and len(param)>=3:
- if param[2] in ['on','1'] : Sets['flood']['time']=1
- elif param[2] in ['off','0'] : Sets['flood']['time']=0
- else : sendMsg(msgType, conference, nick,u'Обратись к помощи по команде!')
- sendMsg(msgType, conference, nick,u'Временная фильтрация сообщений %s'%switch[Sets['flood']['time']])
- elif param[1]=='diff' and len(param)>=3:
- if param[2] in ['on','1'] : Sets['flood']['diff']=1
- elif param[2] in ['off','0'] : Sets['flood']['diff']=0
- else : sendMsg(msgType, conference, nick,u'Обратись к помощи по команде!')
- sendMsg(msgType, conference, nick,u'Фильтрация подозрительно одинаковых сообщений %s'%switch[Sets['flood']['diff']])
- elif param[1]=='period' and len(param)>=3:
- if param[2].isdigit():
- Sets['flood']['per']=int(param[2])
- sendMsg(msgType, conference, nick,u'Время между нарушениями за флуд %s '%getTimeStr(Sets['flood']['per']))
- else: sendMsg(msgType, conference, nick,u'Обратись к помощи по команде!')
- elif param[1]=='count' and len(param)>=3:
- if param[2].isdigit():
- Sets['flood']['count']=int(param[2])
- sendMsg(msgType, conference, nick,u'Количество нарушений за флуд %s '%param[2])
- else: sendMsg(msgType, conference, nick,u'Обратись к помощи по команде!')
- elif param[1]=='dev' and len(param)>=3:
- if param[2].isdigit():
- Sets['flood']['dev']=int(param[2])
- sendMsg(msgType, conference, nick,u'Молчание за флуд %s'%getTimeStr(Sets['flood']['dev']))
- else : sendMsg(msgType, conference, nick,u'Обратись к помощи по команде!')
- else:
- sendMsg(msgType, conference, nick,u'Обратись к помощи по команде!')
- return
- setConferenceConfigKey(conference, "filt",Sets)
- saveConferenceConfig(conference)
- else:
- buf=[]
- buf.append(u'Общая фильтрация %s\n'%switch[Sets['status']])
- buf.append(u'AntiBot Protection© %s\n'%switch[Sets['protect']])
- buf.append(u'Фильтрация мата %s\n'%switch[Sets['obscene']])
- buf.append(u'Временная фильтрация собщений %s\n'%switch[Sets['flood']['time']])
- buf.append(u'Фильтрация подозрительно одинаковых сообщений %s\n'%switch[Sets['flood']['diff']])
- buf.append(u'Время между киками %s\n'%getTimeStr(Sets['flood']['per']))
- buf.append(u'Время молчания за флуд %s\n'%getTimeStr(Sets['flood']['dev']))
- buf.append(u'Количество киков за флуд %d\n'%Sets['flood']['count'])
- buf.append(u'Фильтрация мата в нике %s\n'%switch[Sets['censnick']])
- buf.append(u'Фильтрация забора\капса в сообщения %s\n'%switch[Sets['caps']])
- buf.append(u'Фильтрация забора\капса в нике %s\n'%switch[Sets['fence']])
- if Sets['autoban'] : buf.append(u'Автобан после %d нарушений \n'%Sets['autoban'])
- else : buf.append(u'Автобан за нарушения выключен\n')
- if Sets['lnick'] : buf.append(u'Ограничение длины ника в %s символов\n'%Sets['lnick'])
- else : buf.append(u'Фильтрация длины ников отключена\n')
- if Sets['age'] : buf.append(u'Возрастное ограничени до %d лет\n'%Sets['age'])
- else : buf.append(u'Возрастная фильтрация отключена\n')
- if Sets['dev'] : buf.append(u'Молчание за мат %s\n'%getTimeStr(Sets['dev']))
- else : buf.append(u'Молчание за мат отключено\n')
- if Sets['special'] : buf.append(u'Ограничение специальных символов в нике от %s штук\n'%Sets['special'])
- else : buf.append(u'Ограничение специальных символов отключено\n')
- if Sets['idle'] : buf.append(u'Автокик за молчание %s\n'%getTimeStr(Sets['idle']))
- else : buf.append(u'Автокик за молчание отключен\n')
- sendMsg(msgType, conference, nick, " ".join(buf))
- def AutomatProcess():
- for conference in gConferences.keys():
- if getConferenceConfigKey(conference, "filt")['idle']:
- for nick in gConferences[conference].keys():
- if gConferences[conference][nick][NICK_HERE]:
- if getAccess(conference,getTrueJID(nick))<15:
- SetTimer=getConferenceConfigKey(conference, "filt")['idle']
- Idle=time.time()-gConferences[conference][nick][NICK_IDLE]
- if Idle > SetTimer :
- setMUCRole(conference,nick,protocol.ROLE_NONE,u'Молчание в чате более %s'%getTimeStr(Idle))
- for conference in FILT_CACHE.keys() :
- for user in FILT_CACHE[conference]:
- if FILT_CACHE[conference][user][TIMER]:
- if time.time()>=FILT_CACHE[conference][user][DEVOICE_UPTO]:
- nick=getNickByJID(conference,user)
- if nick:
- setMUCRole(conference,nick,protocol.ROLE_PARTICIPANT)
- FILT_CACHE[conference][user].update({TIMER:False,DEVOICE:False,DEVOICE_UPTO:None})
- startTimer(1,AutomatProcess)
- class Filt_Presence(UserProfile):
- def __init__(self,stanza,conference,nick,truejid):
- sets=getConferenceConfigKey(conference,'filt')
- if truejid is None or getAccess(conference,truejid)>11 or not sets['status']: return
- if conference not in FILT_CACHE : FILT_CACHE[conference]={}
- if stanza.getType() is None:
- if sets['lnick'] and len(concatNickName(nick))>sets['lnick']:
- setMUCRole(conference,nick,protocol.ROLE_NONE,u'Слишком длинный ник,не более %d символов'%sets['lnick'])
- return
- if sets['censnick'] and IsCens(concatNickName(nick)):
- setMUCRole(conference,nick,protocol.ROLE_NONE,u'Нецензурный ник! смени!!!')
- return
- if sets['special'] and sets['special']<sum([1 for x in concatNickName(nick) if x.lower() not in u'qwertyuiopasdfghjklzxcvbnm1234567890ёйцукенгшщзхъфывапролджэячсмитьбю ']):
- setMUCRole(conference,nick,protocol.ROLE_NONE,u'Не более %d спецсимволов в нике'%sets['special'])
- return
- if sets['fence'] :
- ccnt=sum([1 for x in concatNickName(nick) if x.isupper()])
- if ccnt>=len(concatNickName(nick))/3 and ccnt>=4:
- setMUCRole(conference,nick,protocol.ROLE_NONE,u'Слишком много капса\ЗаБоРа в нике')
- return
- if truejid in FILT_CACHE[conference] and FILT_CACHE[conference][truejid][DEVOICE]:
- setMUCRole(conference,nick,protocol.ROLE_VISITOR)
- if not FILT_CACHE[conference][truejid][TIMER]:
- FILT_CACHE[conference][truejid][DEVOICE_UPTO]=FILT_CACHE[conference][truejid][DEVOICE_UPTO]+time.time()
- FILT_CACHE[conference][truejid][TIMER]=True
- if sets['age']:
- UserProfile.__init__(self,truejid,lambda stanza,conf,nick,age : setMUCRole(conference,nick,protocol.ROLE_NONE,u'Возрастное ограничение') if int(getProfileArgs(stanza)['age'])<age else None if 'age' in getProfileArgs(stanza) and isNickOnline(conference, nick) else None,conference,nick,sets['age'])
- class Filt_Message:
- def __init__(self,stanza,msgType,conference,nick,truejid,text):
- sets=getConferenceConfigKey(conference,'filt')
- if truejid is None or conference not in FILT_CACHE or getAccess(conference,truejid)>11 or not sets['status'] : return
- if truejid not in FILT_CACHE[conference]:
- FILT_CACHE[conference].update({truejid:{DEVOICE:False,TIMER:False,BAN_COUNT:0,LAST_MSG:0,LAST_TIME:None,MSG_COUNT:0,KICK_COUNT:0,DEVOICE_UPTO:None,LASTKICK:None}})
- self.lastmsg=FILT_CACHE[conference][truejid][LAST_MSG]
- self.lasttime=FILT_CACHE[conference][truejid][LAST_TIME]
- FILT_CACHE[conference][truejid][LAST_MSG]=text
- FILT_CACHE[conference][truejid][LAST_TIME]=time.time()
- if sets['flood']['time'] and self.floodTime(sets,conference,truejid):
- if sets['flood']['per'] and sets['flood']['count'] and sets['flood']['dev']:
- if not FILT_CACHE[conference][truejid][LASTKICK]:
- FILT_CACHE[conference][truejid][KICK_COUNT]+=1
- elif FILT_CACHE[conference][truejid][LASTKICK]:
- if time.time()-FILT_CACHE[conference][truejid][LASTKICK]<=sets['flood']['per']:
- FILT_CACHE[conference][truejid][KICK_COUNT]+=1
- else:
- FILT_CACHE[conference][truejid][KICK_COUNT]=0
- FILT_CACHE[conference][truejid][LASTKICK]=time.time()
- if FILT_CACHE[conference][truejid][KICK_COUNT]>=sets['flood']['count']:
- FILT_CACHE[conference][truejid].update({LASTKICK:None,DEVOICE:True,DEVOICE_UPTO:sets['flood']['dev'],KICK_COUNT:0})
- setMUCRole(conference,nick,protocol.ROLE_NONE,u'ФЛУД!!!\nСлишком быстрая отправка сообщений!\nУстановлен запрет на общение в чате %s'%getTimeStr(sets['flood']['dev']))
- else:
- setMUCRole(conference,nick,protocol.ROLE_NONE,u'ФЛУД!!!\nСлишком быстрая отправка сообщений!')
- return
- if sets['obscene'] and IsCens(text) :
- reason=u'Нецензурно!"%s"'%text
- if sets['autoban']:
- FILT_CACHE[conference][truejid][BAN_COUNT]+=1
- if FILT_CACHE[conference][truejid][BAN_COUNT]>sets['autoban'] :
- setMUCAffiliation(conference,truejid,protocol.ITEM_JID,protocol.AFF_OUTCAST,u'Превышено допустимое количество нарушений')
- del FILT_CACHE[conference][truejid]
- return
- reason+=u'\nПРЕДУПРЕЖДЕНИЕ!\nРАБОТАЕТ АВТОБАН! ЛИМИТ НАРУШЕНИЙ %d,ПОСЛЕ ВЫ БУДЕТЕ ЗАБАНЕНЫ!'%(sets['autoban']-FILT_CACHE[conference][truejid][BAN_COUNT])
- if sets['dev']:
- FILT_CACHE[conference][truejid].update({DEVOICE:True,TIMER:False,DEVOICE_UPTO:sets['dev']})
- setMUCRole(conference,nick,protocol.ROLE_NONE,reason+u'\nУстановлен запрет на общение в чате %s'%(getTimeStr(sets['dev'])))
- return
- else :
- setMUCRole(conference,nick,protocol.ROLE_NONE,reason)
- return
- if sets['flood']['diff'] and self.floodDiff(text,conference,truejid):
- setMUCRole(conference,nick,protocol.ROLE_NONE,u'ФЛУД!!!\nПодозрительно одинаковые сообщения!!')
- return
- if sets['caps']:
- for x in gConferences[conference].iterkeys():
- if text.startswith(concatNickName(x)):
- text=text.replace(concatNickName(x),'')
- if text :
- ccnt=sum([1 for x in text if x.isupper()])
- if ccnt>=len(text)/3 and ccnt>=5:
- setMUCRole(conference,nick,protocol.ROLE_NONE,u'Слишком много капса(ЗаБоРа) в сообщении!')
- return
- def floodTime(self,sets,conference,truejid):
- if self.lasttime and time.time()-self.lasttime<=2.5:
- FILT_CACHE[conference][truejid][MSG_COUNT]+=1
- if FILT_CACHE[conference][truejid][MSG_COUNT]>=2 :
- FILT_CACHE[conference][truejid][MSG_COUNT]=0
- return True
- def floodDiff(self,text,conference,truejid):
- if self.lastmsg and self.lasttime :
- if time.time()-self.lasttime>60 : return False
- else:
- diff=sum([1 for x in text.split() for y in self.lastmsg.split() if x==y])
- if diff:
- diffLen=(len(text.split())+len(self.lastmsg.split()))/3
- if diff>=diffLen:
- FILT_CACHE[conference][truejid][MSG_COUNT]+=1
- if FILT_CACHE[conference][truejid][MSG_COUNT]>=1 :
- FILT_CACHE[conference][truejid][MSG_COUNT]=0
- return True
- else :
- return False
- class Filt_AntiBotProtect(Ping):
- def __init__(self,conference, nick, truejid, aff, role):
- if truejid and getAccess(conference,truejid)<11 and getConferenceConfigKey(conference,'filt')['protect']:
- timer=startTimer(2,lambda conference,nick : setMUCRole(conference,nick,protocol.ROLE_NONE,u'AntiBot'),conference,nick)
- Ping.__init__(self,truejid,None,conference,nick,timer)
- def pParse(self,stanza):
- conference,nick,timer=self.args
- timer.cancel()
- if stanza.getType()==protocol.TYPE_ERROR or None and isNickOnline(conference, nick):
- setMUCRole(conference,nick,protocol.ROLE_NONE,u'AntiBot')
- registerEventHandler(AutomatProcess, EVT_STARTUP)
- registerEventHandler(loadFilt, EVT_STARTUP)
- registerEventHandler(Filt_AntiBotProtect, EVT_USERJOIN)
- registerEventHandler(Filt_Presence, EVT_PRS | H_CONFERENCE)
- registerEventHandler(Filt_Message,EVT_MSG | H_CONFERENCE)
- registerEventHandler(setDefaulFiltValues, EVT_ADDCONFERENCE)
- registerCommand(configFilt, u"filt", 20,
- u'\nfilt default устанавливает параметры по умолчанию \n\
- filt caps -[1,on]/[0,off] включает/отключает фильтрацию капса и забора в тексте\n\
- filt antibot [1,on]/[0,off] включает/отключает детект ботов,которые заходят в комнату\n\
- filt flood time -[1,on]/[0,off] включает/отключает детект флуда на быструю отправку сообщений\n\
- filt flood diff -[1,on]/[0,off] включает/отключает проверку сообщений на совпадения\n\
- filt flood period - устанавливает максимальное время между киками, которые будут расцениваться как нарушение за флуд, 0 - выключение*\n\
- filt flood count - количество киков после которых будет установлено ограничение на общение в чате, 0 -выключение*\n\
- filt flood dev - время молчания за флуд,0-отключение*\n\
- filt fence -[1,on]/[0,off] включает/отключает фильтрацию забора в нике \n\
- filt [1,off]/[0,off]-включение/отключение фильтра\n\
- filt obscene [1,on]/[0,off]-включение/отключения фильтра матов\n\
- filt obscene dev - устанавливает время молчания за мат,None/0 - отключение \n\
- filt obscene ban - устанавливает максимальное количество нарушений, после которых даётся бан,None/0 - отключение \n\
- filt censnick [1,on]/[0,off]-включение/отключение фильтра матов в нике\n\
- filt len - допустимая длина ника,None/0 - отключение\n\
- filt age - минимальный возраст посетителя,None/0 - отключение\n\
- filt idle - автокик за молчание в чате,None/0 отключение\n\
- filt symbols -максимальное количество спец символов в нике,None/0 - отключение\n\
- * - работают при условии включенной временной фильтрации и включеного состояния этих функций',
- None,
- None,
- CMD_CONFERENCE)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement