Advertisement
Guest User

Untitled

a guest
Sep 22nd, 2017
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 21.22 KB | None | 0 0
  1. # coding: utf-8
  2. OBSCENE_PATH="obscene_words.txt"
  3. CHARS_PATH="chars_words.txt"
  4.  
  5. FILT_CACHE={}
  6.  
  7. DEVOICE=0x1
  8. TIMER=0x2
  9. BAN_COUNT=0x3
  10. LAST_MSG=0x4
  11. LAST_TIME=0x5
  12. MSG_COUNT=0x6
  13. KICK_COUNT=0x7
  14. DEVOICE_UPTO=0x8
  15. LASTKICK=0x9
  16.  
  17. def loadFilt():
  18.     global obscene_words
  19.     obscene_words = eval(utils.readFile(getFilePath(RESOURCE_DIR,OBSCENE_PATH), encoding="utf-8"))
  20.  
  21.  
  22. def setDefaulFiltValues(conference):
  23.     if getConferenceConfigKey(conference, "filt") is None:
  24.         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}})
  25.  
  26.  
  27. def configFilt(msgType, conference, nick, param):
  28.     Sets=getConferenceConfigKey(conference, "filt")
  29.     switch={1:u'включена',0:u'отключена'}
  30.     if param:
  31.         param=param.split()
  32.         if param[0]=='default' :
  33.             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}}
  34.             sendMsg(msgType, conference, nick,u'Произведена установка параметров по умолчанию')
  35.         elif param[0] in ['on','1']:
  36.             Sets['status']=1
  37.             sendMsg(msgType, conference, nick,u'Общая фильтрация включена')
  38.         elif param[0] in ['off','0']:
  39.             Sets['status']=0
  40.             sendMsg(msgType, conference, nick,u'Общая фильтрация отключена')
  41.         elif param[0]=="obscene" and len(param)>=2:
  42.             if param[1] in ['on','1'] :
  43.                 Sets['obscene']=1
  44.                 sendMsg(msgType, conference, nick,u'Фильтрация мата включена')
  45.             elif param[1] in ['off','0'] :
  46.                 Sets['obscene']=0
  47.                 sendMsg(msgType, conference, nick,u'Фильтрация мата отключена')
  48.             elif param[1]=='dev' and len(param)>=3:
  49.                 if param[2] in ['None','0']:
  50.                     Sets['dev']=None
  51.                     sendMsg(msgType, conference, nick,u'Молчание за мат отключено')
  52.                 elif param[2].isdigit():
  53.                     Sets['dev']=int(param[2])
  54.                     sendMsg(msgType, conference, nick,u'Молчание за мат %s'%getTimeStr(Sets['dev']))
  55.                 else : sendMsg(msgType, conference, nick,u'Обратись к помощи по команде!')
  56.             elif param[1]=='ban' and len(param)>=3:
  57.                 if param[2] in ['None','0'] :
  58.                     Sets['autoban']=None
  59.                     sendMsg(msgType, conference, nick,u'Автобан полсе нескольких нарушений отключён')
  60.                 elif param[2].isdigit():
  61.                     Sets['autoban']=int(param[2])
  62.                     sendMsg(msgType, conference, nick,u'Автобан после %s нарушений включён.Будем банить!=)'%param[2])
  63.             else :  sendMsg(msgType, conference, nick,u'Обратись к помощи по команде!')
  64.         elif param[0]=="len" and len(param)>=2:
  65.             if param[1] in ['None','0'] :
  66.                 Sets['lnick']=None
  67.                 sendMsg(msgType, conference, nick,u'Фильтрация длинных ников отключена')
  68.             elif param[1].isdigit() :
  69.                 Sets['lnick']=int(param[1])
  70.                 sendMsg(msgType, conference, nick,u'Фильтрация длинных ников установлена с %s символов'%param[1])
  71.             else :  sendMsg(msgType, conference, nick,u'Обратись к помощи по команде!')
  72.         elif param[0]=="age" and len(param)>=2:
  73.             if param[1] in ['None','0']:
  74.                 Sets['age']=None
  75.                 sendMsg(msgType, conference, nick,u'Возрастное ограничение отключено')
  76.             elif param[1].isdigit():
  77.                 Sets['age']=int(param[1])
  78.                 sendMsg(msgType, conference, nick,u'Возрастное ограничение установлено до %s лет'%param[1])
  79.             else :  sendMsg(msgType, conference, nick,u'Обратись к помощи по команде!')
  80.         elif param[0]=='symbols'and len(param)>=2:
  81.             if param[1] in ['None','0']:
  82.                 Sets['special']=None
  83.                 sendMsg(msgType, conference, nick,u'Фильтрация специальных символов внике отключена')
  84.             elif param[1].isdigit():
  85.                 Sets['special']=int(param[1])
  86.                 sendMsg(msgType, conference, nick,u'Фильтрация специальных символов в нике установлена  от %s штук '%param[1])
  87.             else: sendMsg(msgType, conference, nick,u'Обратись к помощи по команде!')
  88.         elif param[0]=='censnick' and len(param)>=2:
  89.             if param[1] in ['on','1'] : Sets['censnick']=1
  90.             elif param[1] in ['off','0'] : Sets['censnick']=0
  91.             else : sendMsg(msgType, conference, nick,u'Обратись к помощи по команде!')
  92.             sendMsg(msgType, conference, nick,u'Фильтрация мата в нике %s'%switch[Sets['censnick']])
  93.         elif param[0]=='idle' and len(param)>=2:
  94.             if param[1] in ['None','0']:
  95.                 Sets['idle']=None
  96.                 sendMsg(msgType, conference, nick,u'Автокик за молчание отключен')
  97.             elif param[1].isdigit():
  98.                 Sets['idle']=int(param[1])
  99.                 sendMsg(msgType, conference, nick,u'Автокик за молчание в чате более %s '%getTimeStr(Sets['idle']))
  100.             else: sendMsg(msgType, conference, nick,u'Обратись к помощи по команде!')
  101.         elif param[0]=='caps' and len(param)>=2:
  102.             if param[1] in ['on','1'] : Sets['caps']=1
  103.             elif param[1] in ['off','0'] : Sets['caps']=0
  104.             else : sendMsg(msgType, conference, nick,u'Обратись к помощи по команде!')
  105.             sendMsg(msgType, conference, nick,u'Фильтрация капса в сообщениях %s'%switch[Sets['caps']])
  106.         elif param[0]=='fence' and len(param)>=2:
  107.             if param[1] in ['on','1'] : Sets['fence']=1
  108.             elif param[1] in ['off','0'] : Sets['fence']=0
  109.             else : sendMsg(msgType, conference, nick,u'Обратись к помощи по команде!')
  110.             sendMsg(msgType, conference, nick,u'Фильтрация забораапса в нике %s'%switch[Sets['fence']])
  111.         elif param[0]=='antibot' and len(param)>=2:
  112.             if param[1] in ['on','1'] : Sets['protect']=1
  113.             elif param[1] in ['off','0'] : Sets['protect']=0
  114.             else : sendMsg(msgType, conference, nick,u'Обратись к помощи по команде!')
  115.             sendMsg(msgType, conference, nick,u'AntiBot Protection© %s'%switch[Sets['protect']])
  116.         elif  param[0]=='flood':
  117.             if param[1]=='time' and len(param)>=3:
  118.                 if param[2] in ['on','1'] : Sets['flood']['time']=1
  119.                 elif param[2] in ['off','0'] : Sets['flood']['time']=0
  120.                 else : sendMsg(msgType, conference, nick,u'Обратись к помощи по команде!')
  121.                 sendMsg(msgType, conference, nick,u'Временная фильтрация сообщений %s'%switch[Sets['flood']['time']])
  122.             elif param[1]=='diff' and len(param)>=3:
  123.                 if param[2] in ['on','1'] : Sets['flood']['diff']=1
  124.                 elif param[2] in ['off','0'] : Sets['flood']['diff']=0
  125.                 else : sendMsg(msgType, conference, nick,u'Обратись к помощи по команде!')
  126.                 sendMsg(msgType, conference, nick,u'Фильтрация подозрительно одинаковых сообщений %s'%switch[Sets['flood']['diff']])
  127.             elif param[1]=='period' and len(param)>=3:
  128.                 if param[2].isdigit():
  129.                     Sets['flood']['per']=int(param[2])
  130.                     sendMsg(msgType, conference, nick,u'Время между нарушениями за флуд %s '%getTimeStr(Sets['flood']['per']))
  131.                 else: sendMsg(msgType, conference, nick,u'Обратись к помощи по команде!')
  132.             elif param[1]=='count' and len(param)>=3:
  133.                 if param[2].isdigit():
  134.                     Sets['flood']['count']=int(param[2])
  135.                     sendMsg(msgType, conference, nick,u'Количество нарушений за флуд %s '%param[2])
  136.                 else: sendMsg(msgType, conference, nick,u'Обратись к помощи по команде!')
  137.             elif param[1]=='dev' and len(param)>=3:
  138.                 if param[2].isdigit():
  139.                     Sets['flood']['dev']=int(param[2])
  140.                     sendMsg(msgType, conference, nick,u'Молчание за флуд %s'%getTimeStr(Sets['flood']['dev']))
  141.                 else : sendMsg(msgType, conference, nick,u'Обратись к помощи по команде!')
  142.         else:
  143.             sendMsg(msgType, conference, nick,u'Обратись к помощи по команде!')
  144.             return
  145.         setConferenceConfigKey(conference, "filt",Sets)
  146.         saveConferenceConfig(conference)
  147.     else:
  148.         buf=[]
  149.         buf.append(u'Общая фильтрация %s\n'%switch[Sets['status']])
  150.         buf.append(u'AntiBot Protection© %s\n'%switch[Sets['protect']])
  151.         buf.append(u'Фильтрация мата %s\n'%switch[Sets['obscene']])
  152.         buf.append(u'Временная фильтрация собщений %s\n'%switch[Sets['flood']['time']])
  153.         buf.append(u'Фильтрация подозрительно одинаковых сообщений %s\n'%switch[Sets['flood']['diff']])
  154.         buf.append(u'Время между киками %s\n'%getTimeStr(Sets['flood']['per']))
  155.         buf.append(u'Время молчания за флуд %s\n'%getTimeStr(Sets['flood']['dev']))
  156.         buf.append(u'Количество киков за флуд %d\n'%Sets['flood']['count'])
  157.         buf.append(u'Фильтрация мата в нике %s\n'%switch[Sets['censnick']])
  158.         buf.append(u'Фильтрация забораапса в сообщения %s\n'%switch[Sets['caps']])
  159.         buf.append(u'Фильтрация забораапса в нике %s\n'%switch[Sets['fence']])
  160.         if Sets['autoban'] : buf.append(u'Автобан после %d нарушений \n'%Sets['autoban'])
  161.         else : buf.append(u'Автобан за нарушения выключен\n')
  162.         if Sets['lnick'] : buf.append(u'Ограничение длины ника в %s символов\n'%Sets['lnick'])
  163.         else :  buf.append(u'Фильтрация длины ников отключена\n')
  164.         if Sets['age'] : buf.append(u'Возрастное ограничени до %d лет\n'%Sets['age'])
  165.         else :  buf.append(u'Возрастная фильтрация отключена\n')
  166.         if Sets['dev'] : buf.append(u'Молчание за мат %s\n'%getTimeStr(Sets['dev']))
  167.         else : buf.append(u'Молчание за мат отключено\n')
  168.         if Sets['special'] : buf.append(u'Ограничение специальных символов в нике от %s штук\n'%Sets['special'])
  169.         else : buf.append(u'Ограничение специальных символов отключено\n')
  170.         if Sets['idle'] : buf.append(u'Автокик за молчание %s\n'%getTimeStr(Sets['idle']))
  171.         else : buf.append(u'Автокик за молчание отключен\n')
  172.         sendMsg(msgType, conference, nick, " ".join(buf))
  173.  
  174. def AutomatProcess():
  175.     for conference in gConferences.keys():
  176.         if getConferenceConfigKey(conference, "filt")['idle']:
  177.             for nick in gConferences[conference].keys():
  178.                 if gConferences[conference][nick][NICK_HERE]:
  179.                     if getAccess(conference,getTrueJID(nick))<15:
  180.                         SetTimer=getConferenceConfigKey(conference, "filt")['idle']
  181.                         Idle=time.time()-gConferences[conference][nick][NICK_IDLE]
  182.                         if Idle > SetTimer :
  183.                             setMUCRole(conference,nick,protocol.ROLE_NONE,u'Молчание в чате более %s'%getTimeStr(Idle))
  184.     for conference in FILT_CACHE.keys() :
  185.         for user in FILT_CACHE[conference]:
  186.             if FILT_CACHE[conference][user][TIMER]:
  187.                 if time.time()>=FILT_CACHE[conference][user][DEVOICE_UPTO]:
  188.                     nick=getNickByJID(conference,user)
  189.                     if nick:
  190.                         setMUCRole(conference,nick,protocol.ROLE_PARTICIPANT)
  191.                     FILT_CACHE[conference][user].update({TIMER:False,DEVOICE:False,DEVOICE_UPTO:None})
  192.     startTimer(1,AutomatProcess)
  193.  
  194.  
  195.  
  196. class Filt_Presence(UserProfile):
  197.     def __init__(self,stanza,conference,nick,truejid):
  198.         sets=getConferenceConfigKey(conference,'filt')
  199.         if truejid is None or getAccess(conference,truejid)>11 or not sets['status']: return
  200.         if conference not in FILT_CACHE : FILT_CACHE[conference]={}
  201.         if stanza.getType() is None:
  202.             if sets['lnick'] and len(concatNickName(nick))>sets['lnick']:
  203.                 setMUCRole(conference,nick,protocol.ROLE_NONE,u'Слишком длинный ник,не более %d символов'%sets['lnick'])
  204.                 return
  205.             if sets['censnick'] and IsCens(concatNickName(nick)):
  206.                 setMUCRole(conference,nick,protocol.ROLE_NONE,u'Нецензурный ник! смени!!!')
  207.                 return
  208.             if sets['special'] and sets['special']<sum([1 for x in concatNickName(nick) if x.lower() not in u'qwertyuiopasdfghjklzxcvbnm1234567890ёйцукенгшщзхъфывапролджэячсмитьбю ']):
  209.                 setMUCRole(conference,nick,protocol.ROLE_NONE,u'Не более %d спецсимволов в нике'%sets['special'])
  210.                 return
  211.             if sets['fence'] :
  212.                 ccnt=sum([1 for x in concatNickName(nick) if x.isupper()])
  213.                 if ccnt>=len(concatNickName(nick))/3 and ccnt>=4:
  214.                     setMUCRole(conference,nick,protocol.ROLE_NONE,u'Слишком много капсааБоРа в нике')
  215.                     return
  216.             if truejid in FILT_CACHE[conference] and FILT_CACHE[conference][truejid][DEVOICE]:
  217.                 setMUCRole(conference,nick,protocol.ROLE_VISITOR)
  218.                 if not FILT_CACHE[conference][truejid][TIMER]:
  219.                     FILT_CACHE[conference][truejid][DEVOICE_UPTO]=FILT_CACHE[conference][truejid][DEVOICE_UPTO]+time.time()
  220.                     FILT_CACHE[conference][truejid][TIMER]=True
  221.             if sets['age']:
  222.                 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'])
  223. class Filt_Message:
  224.     def __init__(self,stanza,msgType,conference,nick,truejid,text):
  225.         sets=getConferenceConfigKey(conference,'filt')
  226.         if truejid is None or conference not in FILT_CACHE or getAccess(conference,truejid)>11 or not sets['status'] : return
  227.         if truejid not in FILT_CACHE[conference]:
  228.                 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}})
  229.         self.lastmsg=FILT_CACHE[conference][truejid][LAST_MSG]
  230.         self.lasttime=FILT_CACHE[conference][truejid][LAST_TIME]
  231.         FILT_CACHE[conference][truejid][LAST_MSG]=text
  232.         FILT_CACHE[conference][truejid][LAST_TIME]=time.time()
  233.         if sets['flood']['time'] and self.floodTime(sets,conference,truejid):
  234.             if sets['flood']['per'] and sets['flood']['count'] and sets['flood']['dev']:
  235.                 if not FILT_CACHE[conference][truejid][LASTKICK]:
  236.                     FILT_CACHE[conference][truejid][KICK_COUNT]+=1
  237.                 elif FILT_CACHE[conference][truejid][LASTKICK]:
  238.                     if time.time()-FILT_CACHE[conference][truejid][LASTKICK]<=sets['flood']['per']:
  239.                         FILT_CACHE[conference][truejid][KICK_COUNT]+=1
  240.                     else:
  241.                         FILT_CACHE[conference][truejid][KICK_COUNT]=0
  242.                 FILT_CACHE[conference][truejid][LASTKICK]=time.time()
  243.                 if FILT_CACHE[conference][truejid][KICK_COUNT]>=sets['flood']['count']:
  244.                     FILT_CACHE[conference][truejid].update({LASTKICK:None,DEVOICE:True,DEVOICE_UPTO:sets['flood']['dev'],KICK_COUNT:0})
  245.                     setMUCRole(conference,nick,protocol.ROLE_NONE,u'ФЛУД!!!\nСлишком быстрая отправка сообщений!\nУстановлен запрет на общение в чате %s'%getTimeStr(sets['flood']['dev']))
  246.                 else:
  247.                     setMUCRole(conference,nick,protocol.ROLE_NONE,u'ФЛУД!!!\nСлишком быстрая отправка сообщений!')
  248.             return
  249.         if sets['obscene'] and IsCens(text) :
  250.             reason=u'Нецензурно!"%s"'%text
  251.             if sets['autoban']:
  252.                 FILT_CACHE[conference][truejid][BAN_COUNT]+=1
  253.                 if FILT_CACHE[conference][truejid][BAN_COUNT]>sets['autoban'] :
  254.                     setMUCAffiliation(conference,truejid,protocol.ITEM_JID,protocol.AFF_OUTCAST,u'Превышено допустимое количество нарушений')
  255.                     del FILT_CACHE[conference][truejid]
  256.                     return
  257.                 reason+=u'\nПРЕДУПРЕЖДЕНИЕ!\nРАБОТАЕТ АВТОБАН! ЛИМИТ НАРУШЕНИЙ %d,ПОСЛЕ ВЫ БУДЕТЕ ЗАБАНЕНЫ!'%(sets['autoban']-FILT_CACHE[conference][truejid][BAN_COUNT])
  258.             if sets['dev']:
  259.                 FILT_CACHE[conference][truejid].update({DEVOICE:True,TIMER:False,DEVOICE_UPTO:sets['dev']})
  260.                 setMUCRole(conference,nick,protocol.ROLE_NONE,reason+u'\nУстановлен запрет на общение в чате %s'%(getTimeStr(sets['dev'])))
  261.                 return
  262.             else :
  263.                 setMUCRole(conference,nick,protocol.ROLE_NONE,reason)
  264.                 return
  265.         if sets['flood']['diff'] and self.floodDiff(text,conference,truejid):
  266.             setMUCRole(conference,nick,protocol.ROLE_NONE,u'ФЛУД!!!\nПодозрительно одинаковые сообщения!!')
  267.             return
  268.         if sets['caps']:
  269.             for x in gConferences[conference].iterkeys():
  270.                 if text.startswith(concatNickName(x)):
  271.                     text=text.replace(concatNickName(x),'')
  272.             if text :
  273.                 ccnt=sum([1 for x in text if x.isupper()])
  274.                 if ccnt>=len(text)/3 and ccnt>=5:
  275.                     setMUCRole(conference,nick,protocol.ROLE_NONE,u'Слишком много капса(ЗаБоРа) в сообщении!')
  276.                     return
  277.     def floodTime(self,sets,conference,truejid):
  278.         if self.lasttime and time.time()-self.lasttime<=2.5:
  279.             FILT_CACHE[conference][truejid][MSG_COUNT]+=1
  280.             if FILT_CACHE[conference][truejid][MSG_COUNT]>=2 :
  281.                 FILT_CACHE[conference][truejid][MSG_COUNT]=0
  282.                 return True
  283.     def floodDiff(self,text,conference,truejid):
  284.         if self.lastmsg and self.lasttime :
  285.             if time.time()-self.lasttime>60 : return False
  286.             else:
  287.                 diff=sum([1 for x in text.split() for y in self.lastmsg.split() if x==y])
  288.                 if diff:
  289.                     diffLen=(len(text.split())+len(self.lastmsg.split()))/3
  290.                     if diff>=diffLen:
  291.                         FILT_CACHE[conference][truejid][MSG_COUNT]+=1
  292.                         if FILT_CACHE[conference][truejid][MSG_COUNT]>=1 :
  293.                             FILT_CACHE[conference][truejid][MSG_COUNT]=0
  294.                             return True
  295.         else :
  296.             return False
  297.  
  298. class Filt_AntiBotProtect(Ping):
  299.     def __init__(self,conference, nick, truejid, aff, role):
  300.         if truejid and getAccess(conference,truejid)<11 and getConferenceConfigKey(conference,'filt')['protect']:
  301.             timer=startTimer(2,lambda conference,nick : setMUCRole(conference,nick,protocol.ROLE_NONE,u'AntiBot'),conference,nick)
  302.             Ping.__init__(self,truejid,None,conference,nick,timer)
  303.     def pParse(self,stanza):
  304.         conference,nick,timer=self.args
  305.         timer.cancel()
  306.         if stanza.getType()==protocol.TYPE_ERROR or None and isNickOnline(conference, nick):
  307.             setMUCRole(conference,nick,protocol.ROLE_NONE,u'AntiBot')
  308.  
  309. registerEventHandler(AutomatProcess, EVT_STARTUP)
  310. registerEventHandler(loadFilt, EVT_STARTUP)
  311. registerEventHandler(Filt_AntiBotProtect, EVT_USERJOIN)
  312. registerEventHandler(Filt_Presence, EVT_PRS | H_CONFERENCE)
  313. registerEventHandler(Filt_Message,EVT_MSG | H_CONFERENCE)
  314. registerEventHandler(setDefaulFiltValues, EVT_ADDCONFERENCE)
  315. registerCommand(configFilt, u"filt", 20,
  316. u'\nfilt default устанавливает параметры по умолчанию \n\
  317. filt caps -[1,on]/[0,off] включает/отключает фильтрацию капса и забора в тексте\n\
  318. filt antibot [1,on]/[0,off] включает/отключает детект ботов,которые заходят в комнату\n\
  319. filt flood time -[1,on]/[0,off] включает/отключает детект флуда на быструю отправку сообщений\n\
  320. filt flood diff -[1,on]/[0,off] включает/отключает проверку сообщений на совпадения\n\
  321. filt flood period - устанавливает максимальное время между киками, которые будут расцениваться как нарушение за флуд, 0 - выключение*\n\
  322. filt flood count - количество киков после которых будет установлено ограничение на общение в чате, 0 -выключение*\n\
  323. filt flood dev - время молчания за флуд,0-отключение*\n\
  324. filt fence -[1,on]/[0,off] включает/отключает фильтрацию забора в нике \n\
  325. filt [1,off]/[0,off]-включение/отключение фильтра\n\
  326. filt obscene [1,on]/[0,off]-включение/отключения фильтра матов\n\
  327. filt obscene dev - устанавливает время молчания за мат,None/0 - отключение \n\
  328. filt obscene ban - устанавливает максимальное количество нарушений, после которых даётся бан,None/0 - отключение \n\
  329. filt censnick [1,on]/[0,off]-включение/отключение фильтра матов в нике\n\
  330. filt len - допустимая длина ника,None/0 - отключение\n\
  331. filt age - минимальный возраст посетителя,None/0 - отключение\n\
  332. filt idle - автокик за молчание в чате,None/0 отключение\n\
  333. filt symbols -максимальное количество спец символов в нике,None/0 - отключение\n\
  334. * - работают при условии включенной временной фильтрации и включеного состояния этих функций',
  335.                 None,
  336.                 None,
  337.                 CMD_CONFERENCE)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement