2013-07-20 2 views
-3

Так что в настоящее время моя проблема с этим ботом для моего канала Twitch заключается в том, что он мешает мне иметь несколько слов в 1 строке, в то время как Authlist создается как список.IRC бот, составляющий список запрещенных слов?

Пример: Я хочу запретить слова foo1, foo2, foo3 и foo4, но, имея их все в одной строке, мне нужно набрать все 4 из них в чате, чтобы мой бот смог запретить человека, но нет, если он произнес одно из четырех слов.

Заранее благодарен!

import socket 

authlist = "patyyebot patyye" 
banword = "foo1 foo2 foo3 foo4" 
server = "patyye.jtvirc.com" 
name = "patyyebot" 
port = 6667 
channel = "#patyye" 
password = "xx" 
irc = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
irc.connect((server, port)) 
irc.send("PASS " + password + "\n") 
irc.send("NICK " + name + "\n") 
irc.send("USER patyyebot patyyebot patyyebot :PatyYeBot\n") 
irc.send("JOIN " + channel + "\n") 
while True: 

    def message(msg): 
     irc.send("PRIVMSG " + channel + " :" + msg + "\n") 
    def ban(msg): 
     irc.send("PRIVMSG " + channel + " :/ban " + msg + "\n") 


    data = irc.recv(1204) 
    data = data.strip('\r\n') 
    senderusr = data.split(" ") 
    senderusr = senderusr[0] 
    senderusr = senderusr.split("!") 
    senderusr = senderusr[0] 
    senderusr = senderusr.strip(":") 

    print data 
    if data.find == "PONG" : 
     irc.send("PING") 

    if "!facebook" in data and senderusr in authlist: 
     message("@" + senderusr + ": Facebook is private") 

    if "!twitter" in data: 
     message("Follow PatyYe on Twitter: https://twitter.com/PatyYe") 

    if data in banword: 
     message("@" + senderusr + ": zei een gebanned woord! Ban uitgevoerd") 
     ban(senderusr) 
+0

Это немного трудно для меня, чтобы понять, что именно вы имеете в виду. Вы только хотите запретить, если все 4 слова появляются или 1 из них достаточно? Можете ли вы перефразировать свои критерии? – immortal

+0

Я думаю, он хочет запретить любое одно из слов. Вы должны разделить строку на массив (пробел - разделитель). Затем перейдем к массиву и найдите слова. – varesa

ответ

1

Один из способов сделать это состоит в использовании yourstring.split() для разделения разделенных пробелами строку запрещенных слов в списке:

>>> banned_string = "word1 word2 word3" 
>>> banned_string.split() 
['word1', 'word2', 'word3'] 

Затем вы можете итерацию над словами и искать их в сообщение.

Полный пример:

def checkmessage(msg): 
    banned_words = "badword1 badword2 badword3" 
    banned_list= banned_words.split() 

    for word in banned_list: 
     if word in msg: 
      print("banned for saying: " + word) 
      return 
    print("not banned") 


msg1 = "Nothing special here" 
msg2 = "I say the badword2." 

checkmessage(msg1) 
checkmessage(msg2) 

Исполнительное что результаты программы в:

not banned 
banned for saying: badword2 
+0

Спасибо, что это сработало! –

+0

Я добавил некоторые функциональные возможности, чтобы иметь слова в файле, поэтому он будет проверять сейчас, если это запрещенное слово или нет! Защиту checkmessage (MSG): \t banfile = открыт ('file.txt', 'г') \t banned_words = banfile.read() \t banned_list = banned_words.split() \t banfile.close() –

+0

@ PatrickKnobbout Хорошо, что вы получили его на работу. Вы должны отметить этот ответ как принятый, поэтому вопрос «решается». Не стесняйтесь также повышать :) – varesa

2

Использование регулярных выражений вы можете избежать петли и проверить все слова в один проход.

Вы можете подвергать цензуре только запрещенные слова (если вы регистрируете/архивирование разговоров):

>>> banned_words = "phuck azz deeck peach" 
>>> regexp = '|'.join(banned_words.split()) 
>>> message = "You son of a peach!" 
>>> import re 
>>> re.sub(regexp, '[beeeeeep]', message) 
'You son of a [beeeeeep]!' 

Или вы можете проверить для запрещенных слов и запретить пользователю:

>>> if re.search(regexp, message): print "Consider yourself banned, sir!" 
... 
Consider yourself banned, sir! 

[ обновление]

Джон писал:

Вероятно, лучше всего поставить banned_words в порядке убывания длины (чтобы соответствовать самые длинные слова, первые) и запускать их через re.escape на всякий случай ... - Джон Клементс

В зависимости от источника списка вы можете избежать последовательности которые имеют особое значение для регулярных выражений, чтобы быть в безопасности.

>>> ordered_list = sorted(banned_words.split(), key=lambda x: len(x), reverse=True) 
>>> ordered_list 
['phuck', 'deeck', 'peach', 'azz'] 
>>> regexp = '|'.join([re.escape(word) for word in ordered_list]) 
>>> regexp 
'phuck|deeck|peach|azz' 

Вы, вероятно, хотите улучшить регулярное выражение для того, чтобы сделать его чувствительно к регистру и соответствовать границам слов (предотвращение ложных срабатываний).

Он также может быть хорошей идеей, чтобы обернуть регулярное выражение \ Ь (...) \ б, чтобы вы случайно запретить кому-то за слова «импичмент» (или, что более реально, «Сканторп»). - Ilmari Karonen

Помните, что вы должны избежать обратной косой черты (или использовать сырые строки):

>>> regexp = r'\b(' + regexp + r')\b' 
>>> regexp 
'\\b(phuck|deeck|peach|azz)\\b' 
+2

Наверное, лучше всего поставить banned_words в порядке убывания длины (чтобы соответствовать самым длинным словам вначале) и запускать их через 're.escape' на всякий случай ... –

+0

@JonClements: хороший совет. –

+0

Возможно, было бы неплохо обернуть regexp в '\ b (...) \ b', чтобы вы случайно не запретили кому-то говорить« импичмент »(или, что более реалистично),« [Scunthorpe] (http: // en.wikipedia.org/wiki/Scunthorpe_problem) "). –

Смежные вопросы