From e354ed6bdc9c0c7ce3e64d568aafacbe1599ad52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?N=C3=A9munaire?= Date: Tue, 17 Jan 2012 18:28:51 +0100 Subject: [PATCH] Add nemuspeak bot --- nemuspeak.py | 131 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100755 nemuspeak.py diff --git a/nemuspeak.py b/nemuspeak.py new file mode 100755 index 0000000..0b48fbe --- /dev/null +++ b/nemuspeak.py @@ -0,0 +1,131 @@ +#!/usr/bin/python2.7 +# coding=utf-8 + +import sys +import socket +import string +import os +import re +import subprocess +from datetime import datetime +from datetime import timedelta +import thread + +if len(sys.argv) > 1: + sys.exit(0) + +#HOST='192.168.0.242' +HOST = 'nemunai.re' +PORT = 2778 +#HOST = 'irc.rezosup.org' +#PORT = 6667 +NICK = 'nemunaire' +IDENT = 'nemuspeak' +REALNAME = 'nemubot speaker' +OWNER = 'nemunaire' #The bot owner's nick +CHANLIST = ['#42sh', '#korteam'] +readbuffer = '' #Here we store all the messages from server + +queue = [] +talkEC = 0 +stopSpk = 0 +lastmsg = [] + +s = socket.socket( ) #Create the socket +s.connect((HOST, PORT)) #Connect to server +s.send("PASS %s\r\n" % "McsuapTesbuf") +s.send("NICK %s\r\n" % NICK) +s.send("USER %s %s bla :%s\r\n" % (IDENT, HOST, REALNAME)) +#s.send("JOIN %s\r\n" % CHANLIST) + +print("Welcome on Nemubot speaker. I operate on %s. My PID is %i" % (CHANLIST, os.getpid())) + +def speak(endstate): + global lastmsg + talkEC = 1 + stopSpk = 0 + + if len(lastmsg) < 1: + lastmsg = queue.pop(0) + + while not stopSpk and len(queue) > 0: + msg = queue.pop(0) + + sentence = "" + force = 0 + + if force or msg[2] - lastmsg[2] > timedelta(0, 500): + sentence += "À {0} heure {1} : ".format(msg[2].hour, msg[2].minute) + force = 1 + + if force or msg[0] != lastmsg[0]: + if msg[0] == NICK: + sentence += "En message privé. " + else: + sentence += "Sur " + msg[0] + ". " + force = 1 + + if force or msg[1] != lastmsg[1]: + sentence += msg[1] + " dit : " + + sentence += msg[3] + + print "Blabla: " + sentence + subprocess.call(["espeak", "-v", "fr", sentence]) + + lastmsg = msg + + talkEC = endstate + + +def parsemsg(msg): + complete = msg[1:].split(':',1) #Parse the message into useful data + info = complete[0].split(' ') + msgpart = complete[1] + sender = info[0].split('!') + + if CHANLIST.count(info[2]) >= 0 or info[2] == NICK: + #Treat all messages starting with '`' as command + if msgpart[0] == '`' and sender[0] == OWNER: + cmd=msgpart[1:].split(' ') + + if cmd[0] == 'stop': + print "Bye!" + sys.exit (0) + + elif cmd[0] == 'speak': + thread.start_new_thread(speak, (0,)) + + elif cmd[0] == 'save': + stopSpk = 1 + + elif cmd[0] == 'add' and len(cmd) > 1: + CHANLIST.append(cmd[1]) + print cmd[1] + " added to listed channels" + + + elif sender[0] != OWNER: + queue.append([info[2], sender[0], datetime.now(), msgpart]) + if talkEC == 0: + thread.start_new_thread(speak, (0,)) + + +def read(): + global s, readbuffer + while 1: + readbuffer = readbuffer + s.recv(1024) #recieve server messages + temp = readbuffer.split("\n") + readbuffer = temp.pop( ) + + for line in temp: + line = line.rstrip() #remove trailing 'rn' + + if line.find('PRIVMSG') != -1: #Call a parsing function + parsemsg(line) + + line = line.split() + + if(line[0] == 'PING'): #If server pings then pong + s.send("PONG %s\r\n" % line[1]) + +read()