Sep 03 06:21:19 <wikimon> [ http://zenit.senecac.on.ca/wiki/index.php?title=CDOT& ] was changed by [ ShaneStrauss ] on [ 06:18, 3 September 2011 ] Sep 03 09:11:19 <wikimon> [ http://zenit.senecac.on.ca/wiki/index.php?title=CDOT& ] was changed by [ Fossjon ] on [ 09:08, 3 September 2011 ]
#!/usr/bin/python import os import re import select import socket import sys import time import urllib2 def listfilt(listobjc, filtstri, onceonly=0): outpflag = 0 outplist = [] for listitem in listobjc: if (re.match("^" + filtstri + "$", listitem)): outplist.append(listitem) if (onceonly == 1): outpflag = 1 elif (outpflag == 1): outplist.append(listitem) return outplist def getspage(urlnstri): headitem = "" try: websobjc = urllib2.urlopen(urlnstri, None, 10) dataread = websobjc.read().replace("\t", "").replace("\r", "").replace("\n", "") listlist = dataread.replace("<li", "\n<li").replace("</li", "</li\n").split("\n") listlist = listfilt(listlist, "<li.*checked.*") linklist = re.sub("(<a [^>]+>[^<]+</a>)", "\n\\1\n", listlist[0]).split("\n") linklist = listfilt(linklist, "<a [^>]+>[^<]+</a>.*") pagestri = re.sub("action=history[&]*", "", urlnstri).strip() datestri = re.sub("<[^>]+>", "", linklist[1]).strip() namestri = re.sub("<[^>]+>", "", linklist[2]).strip() headitem = ("[ %s ] was changed by [ %s ] on [ %s ]" % (pagestri, namestri, datestri)) except KeyboardInterrupt: sys.exit(0) except: pass return headitem sendline_last = 0; sendline_list = [] def sendline(circobjc, sendstri): global sendline_last global sendline_list prestime = time.time() tempstri = sendstri.strip() if (tempstri != ""): sendline_list.append(tempstri) if (((prestime - sendline_last) >= 1) and (len(sendline_list) > 0)): print("[SEND] %s" % (sendline_list[0])) circobjc.send(sendline_list[0] + "\r\n") sendline_list.pop(0) sendline_last = prestime readline_data = "" def readline(circobjc): global readline_data outpstri = "" (readlist, outplist, errolist) = select.select([circobjc], [], [], 0) if (circobjc in readlist): tempstri = circobjc.recv(2**20) if (not tempstri): readline_data = "" return None readline_data += tempstri try: newlindx = readline_data.index("\n") except: newlindx = -1 if (newlindx != -1): outpstri = readline_data[:newlindx].strip() newlindx += 1 readline_data = readline_data[newlindx:] return outpstri procirco_last = 0 def procirco(circobjc, channame, lastmesg): global procirco_last prestime = time.time() if ((prestime - procirco_last) >= 60): sendline(circobjc, "JOIN " + channame) procirco_last = prestime regxobjc = re.match("^PING (.*)$", lastmesg) if (regxobjc): sendline(circobjc, "PONG " + regxobjc.group(1)) def newcirco(hostname, nickname): circobjc = socket.socket(socket.AF_INET, socket.SOCK_STREAM) circobjc.connect((hostname, 6667)) sendline(circobjc, "USER Alex * * : Bob") sendline(circobjc, "NICK %s" % (nickname)) return circobjc def main(): if (len(sys.argv) < 4): print("Usage: %s <host> <nick> <chan>" % (sys.argv[0])) sys.exit(0) hostname = sys.argv[1]; nickname = sys.argv[2]; channame = sys.argv[3] pagelist = []; lastlist = []; lasttime = 0 circobjc = None; circline = ""; circflag = 0 while (1): circflag = 0 prestime = time.time() if (circobjc == None): circobjc = newcirco(hostname, nickname) else: circline = readline(circobjc) if (circline == None): circobjc = None else: circflag = 1 if (circline != ""): print("[RECV] %s" % (circline)) procirco(circobjc, channame, circline) regxobjc = re.match("^:([^!]+)![^ ]+ privmsg [^ ]+ :%s add (.*)$" % (nickname), circline, re.I) if (regxobjc): if (regxobjc.group(2) not in pagelist): pagelist.append(regxobjc.group(2)) lastlist.append("") lasttime = 0 regxobjc = re.match("^:([^!]+)![^ ]+ privmsg [^ ]+ :%s del (.*)$" % (nickname), circline, re.I) if (regxobjc): for x in range(len(pagelist) - 1, -1, -1): try: if (re.match(regxobjc.group(2), pagelist[x], re.I)): sendline(circobjc, "PRIVMSG %s :deleting [ %s ]" % (regxobjc.group(1), pagelist[x])) lastlist.pop(x) pagelist.pop(x) except: pass regxobjc = re.match("^:([^!]+)![^ ]+ privmsg [^ ]+ :%s out.*$" % (nickname), circline, re.I) if (regxobjc): for listitem in lastlist: sendline(circobjc, "PRIVMSG %s :%s" % (regxobjc.group(1), listitem)) if ((prestime - lasttime) >= (5 * 60)): for x in range(0, len(pagelist)): tempoutp = getspage(pagelist[x]) if ((tempoutp != "") and (tempoutp != lastlist[x])): if (lastlist[x] != ""): sendline(circobjc, "PRIVMSG %s :%s" % (channame, tempoutp)) lastlist[x] = tempoutp lasttime = prestime sendline(circobjc, "") if (circflag == 0): time.sleep(1) if (__name__ == "__main__"): main()