diff --git a/SEChatBrowser.py b/SEChatBrowser.py index 657aa79..9a12d22 100644 --- a/SEChatBrowser.py +++ b/SEChatBrowser.py @@ -18,6 +18,7 @@ def __init__(self): self.chatfkey="" self.chatroot="http://chat.stackexchange.com" self.sockets={} + self.rooms={} def loginSEOpenID(self,user,password): fkey=self.getSoup("https://openid.stackexchange.com/account/login").find('input',{"name":"fkey"})['value'] logindata={"email":user,"password":password,"fkey":fkey} @@ -69,6 +70,9 @@ def getSomething(self,relurl): def getSoup(self,url): return BeautifulSoup(self.session.get(url).content) def initSocket(self,roomno,func): + """ + Does not work. Use polling of /events + """ eventtime=json.loads(self.postSomething("/chats/"+str(roomno)+"/events",{"since":0,"mode":"Messages","msgCount":100}))['time'] print eventtime wsurl=json.loads(self.postSomething("/ws-auth",{"roomid":roomno}))['url']+"?l="+str(eventtime) @@ -88,6 +92,25 @@ def runner(): print "r2" def post(self,url,data): return self.session.post(url,data) + def joinRoom(self,roomid): + roomid=str(roomid) + self.session.head(self.getURL("/rooms/"+roomid)) + self.rooms[roomid]={} + eventtime=json.loads(self.postSomething("/chats/"+str(roomid)+"/events",{"since":0,"mode":"Messages","msgCount":100}))['time'] + self.rooms[roomid]["eventtime"]=eventtime + def pokeRoom(self,roomid): + roomid=str(roomid) + if(not self.rooms[roomid]): + return false + pokeresult=self.postSomething("/events",{"r"+roomid:self.rooms[roomid]['eventtime']}) + pokeresult=json.loads(pokeresult) + try: + roomresult=pokeresult["r"+str(roomid)] + newtime=roomresult["t"] + self.rooms[roomid]["eventtime"]=newtime + except KeyError: + "NOP" + return pokeresult def getURL(self,rel): if(rel[0]!="/"): rel="/"+rel diff --git a/SEChatWrapper.py b/SEChatWrapper.py index d4858f0..b08738e 100644 --- a/SEChatWrapper.py +++ b/SEChatWrapper.py @@ -1,5 +1,6 @@ import SEChatBrowser - +import threading +import time class SEChatWrapper: def __init__(self,site="SE"): self.br=SEChatBrowser.SEChatBrowser() @@ -15,3 +16,24 @@ def login(self,username,password): self.br.loginMSO() def sendMessage(self,room,text): return self.br.postSomething("/chats/"+room+"/messages/new",{"text":text}) + def joinRoom(self,roomid): + self.br.joinRoom(roomid) + def watchRoom(self,roomid,func,interval): + def pokeMe(): + while(True): + try: + pokeresult=self.br.pokeRoom(roomid) + events=pokeresult["r"+str(roomid)]["e"] + func(events) + except KeyError: + "NOP" + finally: + time.sleep(interval) + thethread=threading.Thread(target=pokeMe) + thethread.setDaemon(True) + thethread.start() + return thethread + +""" +[{"event_type":1,"time_stamp":1391324366,"content":"boooo","id":25123259,"user_id":31768,"user_name":"ManishEarth","room_id":11540,"room_name":"Charcoal HQ","message_id":13536215}] +""" diff --git a/__init__.py b/__init__.py index e69de29..121287c 100644 --- a/__init__.py +++ b/__init__.py @@ -0,0 +1,3 @@ +""" +The ChatExchange package +""" diff --git a/test.py b/test.py index 63466f9..cef8129 100644 --- a/test.py +++ b/test.py @@ -2,6 +2,7 @@ import SEChatWrapper import getpass import os +import time #Run `. setp.sh` to set the below testing environment variables if("ChatExchangeU" in os.environ): @@ -14,9 +15,15 @@ else: password=getpass.getpass("Password: ") -a=SEChatWrapper.SEChatWrapper("SE") +a=SEChatWrapper.SEChatWrapper("MSO") a.login(username,password) def omsg(msg): - print msg -a.br.initSocket("11540",omsg) + print "\n>> ("+msg[0]['user_name']+") ",msg[0]['content'] +a.joinRoom("89") + +a.watchRoom("89",omsg,1) #print a.sendMessage("11540","Manish is still testing the wrapper --the wrapper, ca 15 milliseconds ago") +print "Ready" +while(True): + b=raw_input("<< ") + a.sendMessage("89",b)