Some code refactoring (use of class instead of tuples)

This commit is contained in:
Némunaire 2012-04-11 17:33:57 +02:00
parent 448b455e77
commit 4f0744ab24
8 changed files with 333 additions and 200 deletions

13
atom.py
View File

@ -18,8 +18,18 @@ class AtomEntry:
except: except:
print (node.getElementsByTagName("updated")[0].firstChild.nodeValue[:10]) print (node.getElementsByTagName("updated")[0].firstChild.nodeValue[:10])
self.updated = time.localtime () self.updated = time.localtime ()
if len(node.getElementsByTagName("summary")) > 0:
self.summary = node.getElementsByTagName("summary")[0].firstChild.nodeValue self.summary = node.getElementsByTagName("summary")[0].firstChild.nodeValue
else:
self.summary = None
if len(node.getElementsByTagName("link")) > 0:
self.link = node.getElementsByTagName("link")[0].getAttribute ("href") self.link = node.getElementsByTagName("link")[0].getAttribute ("href")
else:
self.link = None
if len (node.getElementsByTagName("category")) > 1:
self.category = node.getElementsByTagName("category")[0].getAttribute ("term")
else:
self.category = None
if len (node.getElementsByTagName("link")) > 1: if len (node.getElementsByTagName("link")) > 1:
self.link2 = node.getElementsByTagName("link")[1].getAttribute ("href") self.link2 = node.getElementsByTagName("link")[1].getAttribute ("href")
else: else:
@ -42,6 +52,8 @@ class Atom:
def diff (self, other): def diff (self, other):
differ = list () differ = list ()
for k in other.entries.keys (): for k in other.entries.keys ():
if self.updated is None and k not in self.entries:
self.updated = entry.updated
if k not in self.entries and other.entries[k].updated >= self.updated: if k not in self.entries and other.entries[k].updated >= self.updated:
differ.append (other.entries[k]) differ.append (other.entries[k])
return differ return differ
@ -62,3 +74,4 @@ if __name__ == "__main__":
print (b.updated) print (b.updated)
diff = a.diff (b) diff = a.diff (b)
print (diff)

View File

@ -1,6 +1,7 @@
# coding=utf-8 # coding=utf-8
import re import re
import sys
from datetime import datetime from datetime import datetime
from datetime import date from datetime import date
from xml.dom.minidom import parse from xml.dom.minidom import parse
@ -44,7 +45,7 @@ def load_module(datas_path):
BIRTHDAYS = {} BIRTHDAYS = {}
filename = datas_path + "/birthdays.xml" filename = datas_path + "/birthdays.xml"
print ("Loading birthdays ...",) sys.stdout.write ("Loading birthdays ... ")
dom = parse(filename) dom = parse(filename)
xmlparse (dom.getElementsByTagName('birthdays')[0]) xmlparse (dom.getElementsByTagName('birthdays')[0])
print ("done (%d loaded)" % len(BIRTHDAYS)) print ("done (%d loaded)" % len(BIRTHDAYS))
@ -53,7 +54,7 @@ def load_module(datas_path):
def save_module(): def save_module():
"""Save the dates""" """Save the dates"""
global filename global filename
print ("Saving birthdays ...",) sys.stdout.write ("Saving birthdays ... ")
impl = getDOMImplementation() impl = getDOMImplementation()
newdoc = impl.createDocument(None, 'birthdays', None) newdoc = impl.createDocument(None, 'birthdays', None)

View File

@ -1,6 +1,7 @@
# coding=utf-8 # coding=utf-8
import re import re
import sys
from datetime import timedelta from datetime import timedelta
from datetime import datetime from datetime import datetime
from datetime import date from datetime import date
@ -51,7 +52,7 @@ def load_module(datas_path):
EVENTS = {} EVENTS = {}
filename = datas_path + "/events.xml" filename = datas_path + "/events.xml"
print ("Loading events ...",) sys.stdout.write ("Loading events ... ")
dom = parse(filename) dom = parse(filename)
xmlparse (dom.getElementsByTagName('events')[0]) xmlparse (dom.getElementsByTagName('events')[0])
print ("done (%d loaded)" % len(EVENTS)) print ("done (%d loaded)" % len(EVENTS))
@ -60,7 +61,7 @@ def load_module(datas_path):
def save_module(): def save_module():
"""Save the dates""" """Save the dates"""
global filename global filename
print ("Saving events ...",) sys.stdout.write ("Saving events ... ")
impl = getDOMImplementation() impl = getDOMImplementation()
newdoc = impl.createDocument(None, 'events', None) newdoc = impl.createDocument(None, 'events', None)

View File

@ -154,15 +154,12 @@ class Message:
def parsemsg (self, mods): def parsemsg (self, mods):
if re.match(".*(norme|coding style).*", self.content) is not None and re.match(".*(please|give|obtenir|now|plz|stp|svp|s'il (te|vous) pla.t|check).*", self.content) is not None:
norme.launch (self.srv.s, self.sender, self.content)
#Treat all messages starting with 'nemubot:' as distinct commands #Treat all messages starting with 'nemubot:' as distinct commands
elif self.content.find("%s:"%self.srv.nick) == 0: if self.content.find("%s:"%self.srv.nick) == 0:
messagel = self.content.lower() messagel = self.content.lower()
#Is it a simple response? #Is it a simple response?
if re.match(".*(m[' ]?entends?[ -]+tu|h?ear me|do you copy|ping).*", messagel) is not None: if re.match(".*(m[' ]?entends?[ -]+tu|h?ear me|do you copy|ping)", messagel) is not None:
self.send_chn ("%s: pong"%(self.sender)) self.send_chn ("%s: pong"%(self.sender))
elif re.match(".*di[st] (a|à) ([a-zA-Z0-9_]+) (.+)$", messagel) is not None: elif re.match(".*di[st] (a|à) ([a-zA-Z0-9_]+) (.+)$", messagel) is not None:

View File

@ -10,7 +10,7 @@ from datetime import datetime
from datetime import timedelta from datetime import timedelta
from xml.dom.minidom import parse from xml.dom.minidom import parse
imports = ["birthday", "qd", "events", "youtube"] imports = ["birthday", "qd", "events", "youtube", "watchWebsite"]
imports_launch = ["watchWebsite"] imports_launch = ["watchWebsite"]
mods = list () mods = list ()
import server import server
@ -51,7 +51,6 @@ for serveur in config.getElementsByTagName('server'):
for imp in imports_launch: for imp in imports_launch:
mod = __import__ (imp) mod = __import__ (imp)
mod.load_module (basedir + "/datas/")
mod.launch (servers) mod.launch (servers)
print ("Nemubot ready, my PID is %i!" % (os.getpid())) print ("Nemubot ready, my PID is %i!" % (os.getpid()))

217
qd.py
View File

@ -2,6 +2,7 @@
import re import re
import time import time
import sys
from datetime import timedelta from datetime import timedelta
from datetime import datetime from datetime import datetime
from datetime import date from datetime import date
@ -15,18 +16,105 @@ MANCHE = None
SCORES = dict () SCORES = dict ()
temps = dict () temps = dict ()
class Score:
def __init__(self):
#FourtyTwo
self.ftt = 0
#TwentyThree
self.twt = 0
self.pi = 0
self.notfound = 0
self.tententen = 0
self.leet = 0
self.great = 0
self.bad = 0
self.last = None
self.changed = False
def parse(self, item):
self.ftt = int(item.getAttribute("fourtytwo"))
self.twt = int(item.getAttribute("twentythree"))
self.pi = int(item.getAttribute("pi"))
self.notfound = int(item.getAttribute("notfound"))
self.tententen = int(item.getAttribute("tententen"))
self.leet = int(item.getAttribute("leet"))
self.great = int(item.getAttribute("great"))
self.bad = int(item.getAttribute("bad"))
def newWinner(self):
self.ftt = 0
self.twt = 0
self.pi = 1
self.notfound = 1
self.tententen = 0
self.leet = 1
self.great = -1
self.bad = -4
def isWinner(self):
return self.great >= 42
def playFtt(self):
if self.canPlay():
self.ftt += 1
self.last = datetime.now()
def playTwt(self):
if self.canPlay():
self.twt += 1
self.last = datetime.now()
def playPi(self):
if self.canPlay():
self.pi += 1
self.last = datetime.now()
def playNoutfound(self):
if self.canPlay():
self.notfound += 1
self.last = datetime.now()
def playTen(self):
if self.canPlay():
self.tententen += 1
self.last = datetime.now()
def playLeet(self):
if self.canPlay():
self.leet += 1
self.last = datetime.now()
def playGreat(self):
if self.canPlay():
self.great += 1
self.last = datetime.now()
def playBad(self):
if self.canPlay():
self.bad += 1
self.last = datetime.now()
def toTuple(self):
return (self.ftt, self.twt, self.pi, self.notfound, self.tententen, self.leet, self.great, self.bad)
def canPlay(self):
self.changed = True
return self.last == None or self.last.minute != datetime.now().minute or self.last.hour != datetime.now().hour or self.last.day != datetime.now().day
def hasChanged(self):
if self.changed:
self.changed = False
return True
else:
return False
def score(self):
return (self.ftt * 2 - self.bad * 10 + self.great * 5 + self.leet * 3 + self.pi * 3.1415 + self.twt + self.notfound * 4.04)
def details(self):
return "42: %d, 23: %d, bad: %d, great: %d, leet: %d, pi: %d, 404: %d, 10: %d = %d."%(self.ftt, self.twt, self.bad, self.great, self.leet, self.pi, self.notfound, self.tententen, self.score())
def xmlparse(node): def xmlparse(node):
"""Parse the given node and add scores to the global list.""" """Parse the given node and add scores to the global list."""
global SCORES, MANCHE global SCORES, MANCHE
for item in node.getElementsByTagName("score"): for item in node.getElementsByTagName("score"):
SCORES[item.getAttribute("name")] = (int(item.getAttribute("fourtytwo")), SCORES[item.getAttribute("name")] = Score ()
int(item.getAttribute("twentythree")), SCORES[item.getAttribute("name")].parse(item)
int(item.getAttribute("pi")),
int(item.getAttribute("notfound")),
int(item.getAttribute("tententen")),
int(item.getAttribute("leet")),
int(item.getAttribute("great")),
int(item.getAttribute("bad")))
manche = node.getElementsByTagName("manche")[0] manche = node.getElementsByTagName("manche")[0]
MANCHE = (int(manche.getAttribute("number")), MANCHE = (int(manche.getAttribute("number")),
manche.getAttribute("winner"), manche.getAttribute("winner"),
@ -42,22 +130,22 @@ def load_module(datas_path):
SCORES = dict () SCORES = dict ()
filename = datas_path + "/42.xml" filename = datas_path + "/42.xml"
print ("Loading 42scores ...",) sys.stdout.write ("Loading 42scores ... ")
dom = parse(filename) dom = parse(filename)
xmlparse (dom.documentElement) xmlparse (dom.documentElement)
print ("done (%d loaded, currently in round %d)" % (len(SCORES), -42)) print ("done (%d loaded, currently in round %d)" % (len(SCORES), -42))
def save_module(): def save_module():
"""Save the dates""" """Save the scores"""
global filename global filename
print ("Saving birthdays ...",) sys.stdout.write ("Saving 42scores ... ")
impl = getDOMImplementation() impl = getDOMImplementation()
newdoc = impl.createDocument(None, 'game', None) newdoc = impl.createDocument(None, 'game', None)
top = newdoc.documentElement top = newdoc.documentElement
for name in SCORES.keys(): for name in SCORES.keys():
scr = 'fourtytwo="%d" twentythree="%d" pi="%d" notfound="%d" tententen="%d" leet="%d" great="%d" bad="%d"'% SCORES[name] scr = 'fourtytwo="%d" twentythree="%d" pi="%d" notfound="%d" tententen="%d" leet="%d" great="%d" bad="%d"'% SCORES[name].toTuple()
item = parseString ('<score name="%s" %s />' % (name, scr)).documentElement item = parseString ('<score name="%s" %s />' % (name, scr)).documentElement
top.appendChild(item); top.appendChild(item);
@ -78,7 +166,7 @@ def help_full ():
def rev (tupl): def rev (tupl):
(k, v) = tupl (k, v) = tupl
return (v, k) return (v.score(), k)
def parseanswer (msg): def parseanswer (msg):
if msg.cmd[0] == "42" or msg.cmd[0] == "score" or msg.cmd[0] == "scores": if msg.cmd[0] == "42" or msg.cmd[0] == "score" or msg.cmd[0] == "scores":
@ -93,22 +181,15 @@ def parseanswer (msg):
if len(msg.cmd) > 1: if len(msg.cmd) > 1:
if msg.cmd[1].lower() in SCORES: if msg.cmd[1].lower() in SCORES:
(normal, bad, great, leet, pi, dt, nf) = user(msg.cmd[1]) phrase += " " + msg.cmd[1] + ": " + SCORES[msg.cmd[1].lower()].details()
phrase += " %s: 42: %d, 23: %d, bad: %d, great: %d, leet: %d, pi: %d, 404: %d = %d."%(msg.cmd[1], normal, dt, bad, great, leet, pi, nf, normal * 2 - bad * 10 + great * 5 + leet * 3 + pi * 3.1415 + dt + nf * 4.04)
else: else:
phrase = " %s n'a encore jamais joué,"%(msg.cmd[1]) phrase = " %s n'a encore jamais joué,"%(msg.cmd[1])
else: else:
joueurs = dict() for nom, scr in sorted(SCORES.items(), key=rev, reverse=True):
# for player in players:
for player in SCORES.keys():
if player in SCORES:
joueurs[player] = score(player)
for nom, scr in sorted(joueurs.items(), key=rev, reverse=True):
if phrase == "": if phrase == "":
phrase = " *%s: %d*,"%(nom, scr) phrase = " *%s: %d*,"%(nom, scr.score())
else: else:
phrase += " %s: %d,"%(nom, scr) phrase += " %s: %d,"%(nom, scr.score())
msg.send_chn ("Scores :%s" % (phrase[0:len(phrase)-1])) msg.send_chn ("Scores :%s" % (phrase[0:len(phrase)-1]))
return True return True
@ -116,12 +197,6 @@ def parseanswer (msg):
return False return False
def score(who):
(qd, dt, pi, nf, ttt, leet, great, bad) = user(who)
# return (normal * 2 + leet * 3 + pi * 3.1415 + dt + nf * 4.04) * (10000 * great / (1 + bad * 2.5))
return (qd * 2 - bad * 10 + great * 5 + leet * 3 + pi * 3.1415 + dt + nf * 4.04)
def win(s, who): def win(s, who):
global SCORES, MANCHE global SCORES, MANCHE
who = who.lower() who = who.lower()
@ -141,7 +216,7 @@ def win(s, who):
SCORES = dict() SCORES = dict()
# SCORES[maxi_name] = (-10, 0, -4, 0, 0, -2, 0) # SCORES[maxi_name] = (-10, 0, -4, 0, 0, -2, 0)
# SCORES[maxi_name] = (0, 0, 0, 0, 0, 0, 0) # SCORES[maxi_name] = (0, 0, 0, 0, 0, 0, 0)
SCORES[who] = (0, 0, 1, 1, 0, 1, -1, -4) SCORES[who].newWinner
if who != maxi_name: if who != maxi_name:
msg.send_global ("Félicitations %s, tu remportes cette manche terminée par %s, avec un score de %d !"%(maxi_name, who, maxi_scor)) msg.send_global ("Félicitations %s, tu remportes cette manche terminée par %s, avec un score de %d !"%(maxi_name, who, maxi_scor))
@ -154,95 +229,81 @@ def win(s, who):
save_module () save_module ()
def user(who):
who = who.lower()
if who in SCORES:
return SCORES[who]
else:
return (0, 0, 0, 0, 0, 0, 0, 0)
def canPlay(who):
who = who.lower()
if not who in temps or (temps[who].minute != datetime.now().minute or temps[who].hour != datetime.now().hour or temps[who].day != datetime.now().day):
temps[who] = datetime.now()
return True
else:
return False
def parseask (msg): def parseask (msg):
return False return False
def getUser(name):
global SCORES
if name not in SCORES:
SCORES[name] = Score()
return SCORES[name]
def parselisten (msg): def parselisten (msg):
# if msg.channel == "#nemutest": # if msg.channel == "#nemutest":
if msg.channel != "#nemutest": if msg.channel != "#nemutest":
(qd, dt, pi, nf, ttt, leet, great, bad) = user(msg.sender)
sum = qd + dt + pi + nf + ttt + leet + great + bad
if (msg.content.strip().startswith("42") and len (msg.content) < 5) or ((msg.content.strip().lower().startswith("quarante-deux") or msg.content.strip().lower().startswith("quarante deux")) and len (msg.content) < 17): if (msg.content.strip().startswith("42") and len (msg.content) < 5) or ((msg.content.strip().lower().startswith("quarante-deux") or msg.content.strip().lower().startswith("quarante deux")) and len (msg.content) < 17):
if datetime.now().minute == 10 and datetime.now().second == 10 and datetime.now().hour == 10: if datetime.now().minute == 10 and datetime.now().second == 10 and datetime.now().hour == 10:
ttt += 1 getUser(msg.sender).playTen()
great += 1 getUser(msg.sender).playGreat()
elif datetime.now().minute == 42: elif datetime.now().minute == 42:
if datetime.now().second == 0: if datetime.now().second == 0:
great += 1 getUser(msg.sender).playGreat()
qd += 1 getUser(msg.sender).playFtt()
else: else:
bad += 1 getUser(msg.sender).playBad()
if (msg.content.strip().startswith("23") and len (msg.content) < 5) or ((msg.content.strip().lower().startswith("vingt-trois") or msg.content.strip().lower().startswith("vingt trois")) and len (msg.content) < 14): if (msg.content.strip().startswith("23") and len (msg.content) < 5) or ((msg.content.strip().lower().startswith("vingt-trois") or msg.content.strip().lower().startswith("vingt trois")) and len (msg.content) < 14):
if datetime.now().minute == 23: if datetime.now().minute == 23:
if datetime.now().second == 0: if datetime.now().second == 0:
great += 1 getUser(msg.sender).playGreat()
dt += 1 getUser(msg.sender).playTwt()
else: else:
bad += 1 getUser(msg.sender).playBad()
if (msg.content.strip().startswith("101010") and len (msg.content) < 9): if (msg.content.strip().startswith("101010") and len (msg.content) < 9):
if datetime.now().minute == 10 and datetime.now().hour == 10: if datetime.now().minute == 10 and datetime.now().hour == 10:
if datetime.now().second == 10: if datetime.now().second == 10:
great += 1 getUser(msg.sender).playGreat()
ttt += 1 getUser(msg.sender).playTen()
else: else:
bad += 1 getUser(msg.sender).playBad()
if (msg.content.strip().startswith("12345") and len (msg.content) < 8) or (msg.content.strip().startswith("012345") and len (msg.content) < 9): if (msg.content.strip().startswith("12345") and len (msg.content) < 8) or (msg.content.strip().startswith("012345") and len (msg.content) < 9):
if datetime.now().hour == 1 and datetime.now().minute == 23 and datetime.now().second == 45: if datetime.now().hour == 1 and datetime.now().minute == 23 and datetime.now().second == 45:
great += 1 getUser(msg.sender).playGreat()
dt += 1 getUser(msg.sender).playTwt()
else: else:
bad += 1 getUser(msg.sender).playBad()
if len (msg.content) < 12 and (msg.content.strip().lower().startswith("leet time") or msg.content.strip().lower().startswith("leettime") or msg.content.strip().lower().startswith("l33t time") or msg.content.strip().lower().startswith("1337")): if len (msg.content) < 12 and (msg.content.strip().lower().startswith("leet time") or msg.content.strip().lower().startswith("leettime") or msg.content.strip().lower().startswith("l33t time") or msg.content.strip().lower().startswith("1337")):
if datetime.now().hour == 13 and datetime.now().minute == 37: if datetime.now().hour == 13 and datetime.now().minute == 37:
if datetime.now().second == 0: if datetime.now().second == 0:
great += 1 getUser(msg.sender).playGreat()
leet += 1 getUser(msg.sender).playLeet()
else: else:
bad += 1 getUser(msg.sender).playBad()
if len (msg.content) < 11 and (msg.content.strip().lower().startswith("pi time") or msg.content.strip().lower().startswith("pitime") or msg.content.strip().lower().startswith("3.14 time")): if len (msg.content) < 11 and (msg.content.strip().lower().startswith("pi time") or msg.content.strip().lower().startswith("pitime") or msg.content.strip().lower().startswith("3.14 time")):
if datetime.now().hour == 3 and datetime.now().minute == 14: if datetime.now().hour == 3 and datetime.now().minute == 14:
if datetime.now().second == 15 or datetime.now().second == 16: if datetime.now().second == 15 or datetime.now().second == 16:
great += 1 getUser(msg.sender).playGreat()
pi += 1 getUser(msg.sender).playPi()
else: else:
bad += 1 getUser(msg.sender).playBad()
if len (msg.content) < 16 and (msg.content.strip().lower().startswith("time not found") or msg.content.strip().lower().startswith("timenotfound") or msg.content.strip().lower().startswith("404 time")) or (len (msg.content) < 6 and msg.content.strip().lower().startswith("404")): if len (msg.content) < 16 and (msg.content.strip().lower().startswith("time not found") or msg.content.strip().lower().startswith("timenotfound") or msg.content.strip().lower().startswith("404 time")) or (len (msg.content) < 6 and msg.content.strip().lower().startswith("404")):
if datetime.now().hour == 4 and datetime.now().minute == 4: if datetime.now().hour == 4 and datetime.now().minute == 4:
if datetime.now().second == 0 or datetime.now().second == 4: if datetime.now().second == 0 or datetime.now().second == 4:
great += 1 getUser(msg.sender).playGreat()
nf += 1 getUser(msg.sender).playNotfound()
else: else:
bad += 1 getUser(msg.sender).playBad()
if sum != qd + dt + pi + nf + ttt + leet + great + bad and (canPlay (msg.sender) or (datetime.now().second == 45 and datetime.now().minute == 23 and datetime.now().hour == 1)): if getUser(msg.sender).isWinner():
SCORES[msg.sender.lower()] = (qd, dt, pi, nf, ttt, leet, great, bad)
if great >= 42:
print ("Nous avons un vainqueur ! Nouvelle manche :p") print ("Nous avons un vainqueur ! Nouvelle manche :p")
win(s, msg.sender) win(s, msg.sender)
else: elif getUser(msg.sender).hasChanged():
save_module () save_module ()
return False return False

View File

@ -29,7 +29,7 @@ class Server:
def send_msg (self, channel, msg, cmd = "PRIVMSG", endl = "\r\n"): def send_msg (self, channel, msg, cmd = "PRIVMSG", endl = "\r\n"):
for line in msg.split("\n"): for line in msg.split("\n"):
if line != "": if line != "" and self.accepted_channel(channel):
self.s.send (("%s %s :%s%s" % (cmd, channel, line, endl)).encode ()) self.s.send (("%s %s :%s%s" % (cmd, channel, line, endl)).encode ())
def send_global (self, msg, cmd = "PRIVMSG", endl = "\r\n"): def send_global (self, msg, cmd = "PRIVMSG", endl = "\r\n"):
@ -41,7 +41,7 @@ class Server:
_thread.start_new_thread(self.connect, (mods,)) _thread.start_new_thread(self.connect, (mods,))
def accepted_channel(self, channel): def accepted_channel(self, channel):
return (self.channels.find(channel) != -1) return (self.channels.count(channel) != -1)
def read(self, mods): def read(self, mods):
self.readbuffer = "" #Here we store all the messages from server self.readbuffer = "" #Here we store all the messages from server
@ -56,10 +56,10 @@ class Server:
for line in temp: for line in temp:
msg = message.Message (self, line) msg = message.Message (self, line)
try: # try:
msg.treat (mods) msg.treat (mods)
except: # except:
print ("Une erreur est survenue lors du traitement du message : %s"%line) # print ("Une erreur est survenue lors du traitement du message : %s"%line)
def connect(self, mods): def connect(self, mods):

View File

@ -2,6 +2,7 @@
import http.client import http.client
import hashlib import hashlib
import sys
import time import time
import _thread import _thread
from urllib.parse import unquote from urllib.parse import unquote
@ -16,15 +17,118 @@ filename = ""
SITES = [] SITES = []
SRVS = None SRVS = None
def xmlparse(node): class Site:
"""Parse the given node and add events to the global list.""" def __init__(self, item):
for item in node.getElementsByTagName("watch"): self.server = item.getAttribute("server")
self.page = item.getAttribute("page")
if item.getAttribute("type"): if item.getAttribute("type"):
type = item.getAttribute("type") self.type = item.getAttribute("type")
else: else:
type = "hash" self.type = "hash"
self.message = item.getAttribute("message")
self.thread = None
if item.getAttribute("time"):
self.updateTime = int(item.getAttribute("time"))
else:
self.updateTime = 60
self.lastChange = 0
self.lastpage = None
self.run = True
self.channels = list()
for channel in item.getElementsByTagName('channel'):
self.channels.append(channel.getAttribute("name"))
def start (self):
self.thread = _thread.start_new_thread (startThread, (self,))
def send_message (self, msg):
global SRVS
if len(self.channels) > 0:
for server in SRVS:
for chan in self.channels:
server.send_msg (chan, msg)
else:
for server in SRVS:
server.send_global (msg)
def treat_atom (self, content):
change=False
f = atom.Atom (content)
if self.lastpage is not None:
diff = self.lastpage.diff (f)
if len(diff) > 0:
print ("[%s] Page differ!"%self.server)
if f.id == "http://public.nbr23.com/rss.php":
for d in diff:
if d.category == None:
messageI = self.message % ("quel est ce nouveau fichier", "%s")
elif d.category == "Music":
messageI = self.message % ("quelles sont ces nouvelles musiques", "%s")
elif d.category == "TV_Shows":
messageI = self.message % ("quelle est cette nouvelle série", "%s")
elif d.category == "Movies":
messageI = self.message % ("quel est ce nouveau film", "%s")
elif d.category == "Books":
messageI = self.message % ("quel est ce nouveau livre", "%s")
else:
messageI = self.message % ("quel est ce nouveau fichier", "%s")
self.send_message (messageI % unquote (d.link))
elif f.id == "http://musik.p0m.fr/atom.php?nemubot":
for d in diff:
youtube.send_global (d.link2, self.message % (d.title, unquote (d.link)))
elif self.message.find ("%s") >= 0:
print ("[%s] Send message!"%self.server)
for d in diff:
self.send_message (self.message % unquote (d.title))
else:
self.send_message (self.message)
change=True
return (f, change)
def check (self):
while self.run:
try:
# print ("Check %s/%s"%(self.server, self.page))
content = getPage(self.server, self.page)
if self.type == "atom":
(self.lastpage, change) = self.treat_atom (content)
if change:
if self.lastChange <= 0:
self.lastChange -= 1
else:
self.lastChange = 0
else:
self.lastChange += 1
else:
hash = hashlib.sha224(content).hexdigest()
if hash != self.lastpage:
if self.lastpage is not None:
self.send_message ()
self.lastpage = hash
if self.lastChange <= 0:
self.lastChange -= 1
else:
self.lastChange = 0
else:
self.lastChange += 1
#Update check time intervalle
#TODO
if self.updateTime < 10:
self.updateTime = 10
if self.updateTime > 400:
self.updateTime = 400
time.sleep(self.updateTime)
except:
print ("Une erreur est survenue lors de la récupération de la page " + self.server + "/" + self.page)
time.sleep(self.updateTime * 3)
SITES.append ((item.getAttribute("server"), item.getAttribute("page"), type, item.getAttribute("message"), None, 40))
def load_module(datas_path): def load_module(datas_path):
@ -33,9 +137,10 @@ def load_module(datas_path):
SITES = [] SITES = []
filename = datas_path + "/watch.xml" filename = datas_path + "/watch.xml"
print ("Loading watchsites ...",) sys.stdout.write ("Loading watchsites ... ")
dom = parse(filename) dom = parse(filename)
xmlparse (dom.documentElement) for item in dom.documentElement.getElementsByTagName("watch"):
SITES.append (Site (item))
print ("done (%d loaded)" % len(SITES)) print ("done (%d loaded)" % len(SITES))
@ -43,41 +148,47 @@ def launch (servers):
global SRVS global SRVS
SRVS = servers SRVS = servers
for site in SITES: for site in SITES:
_thread.start_new_thread (startThread, (site,)) site.start ()
def send_global (msg): def save_module():
for server in SRVS: """Save the module state"""
server.send_global (msg) global filename
sys.stdout.write ("Saving watched sites ... ")
impl = getDOMImplementation()
newdoc = impl.createDocument(None, 'service', None)
top = newdoc.documentElement
for site in SITES:
item = parseString ('<watch server="%s" page="%s" message="%s" type="%s" time="%d" />' % (site.server, site.page, site.message, site.type, site.updateTime)).documentElement
if len(site.channels) > 0:
for chan in site.channels:
item.appendChild(parseString ('<channel name="%s" />' % (chan)).documentElement);
top.appendChild(item);
with open(filename, "w") as f:
newdoc.writexml (f)
print ("done")
def help_tiny ():
"""Line inserted in the response to the command !help"""
return None
def help_full ():
return None
def parseanswer (msg):
if msg.cmd[0] == "watch":
print ("print states here")
return True
return False
def parseask (msg):
return False
def parselisten (msg):
return False
def treat_atom (lastpage, content, message):
change=False
f = atom.Atom (content)
if lastpage is not None:
diff = lastpage.diff (f)
if len(diff) > 0:
if f.id == "http://public.nbr23.com/rss.php":
for d in diff:
if d.summary == "Music":
messageI = message % ("quelles sont ces nouvelles musiques", "%s")
elif d.summary == "TV_Shows":
messageI = message % ("quelle est cette nouvelle série", "%s")
elif d.summary == "Movies":
messageI = message % ("quel est ce nouveau film", "%s")
elif d.summary == "Books":
messageI = message % ("quel est ce nouveau livre", "%s")
else:
messageI = message % ("quel est ce nouveau fichier", "%s")
send_global (messageI % unquote (d.link))
elif f.id == "http://musik.p0m.fr/atom.php?nemubot":
for d in diff:
youtube.send_global (d.link2, message % (d.title, unquote (d.link)))
elif message.find ("%s") >= 0:
for d in diff:
send_global (message % unquote (d.link))
else:
send_global (message)
change=True
return (f,change)
def getPage (s, p): def getPage (s, p):
conn = http.client.HTTPConnection(s) conn = http.client.HTTPConnection(s)
@ -90,54 +201,4 @@ def getPage (s, p):
return data return data
def startThread(site): def startThread(site):
(srv, page, type, message, lastpage, updateTime) = site site.check ()
lastChange = 0
while 1:
content = getPage(srv, page)
if type == "atom":
(lastpage, change) = treat_atom (lastpage, content, message)
if change:
if lastChange <= 0:
lastChange -= 1
else:
lastChange = 0
else:
lastChange += 1
else:
hash = hashlib.sha224(content).hexdigest()
if hash != lastpage:
if lastpage is not None:
send_global (message)
lastpage = hash
if lastChange <= 0:
lastChange -= 1
else:
lastChange = 0
else:
lastChange += 1
#Update check time intervalle
if lastChange >= 1 and updateTime < 60:
updateTime *= 2
elif lastChange >= 10 and updateTime < 200:
updateTime *= 1.25
elif lastChange >= 50 and updateTime < 500:
updateTime *= 1.1
elif lastChange < 0 and updateTime < 60:
updateTime /= 2
elif lastChange <= 0 and updateTime < 200:
updateTime /= 3
elif lastChange <= 0 and updateTime > 350:
updateTime /= 7
elif lastChange <= 0:
updateTime /= 4.5
if updateTime < 10:
updateTime = 10
if updateTime > 500:
updateTime = 500
time.sleep(updateTime)