Some code refactoring (use of class instead of tuples)
This commit is contained in:
parent
448b455e77
commit
4f0744ab24
17
atom.py
17
atom.py
|
@ -18,8 +18,18 @@ class AtomEntry:
|
|||
except:
|
||||
print (node.getElementsByTagName("updated")[0].firstChild.nodeValue[:10])
|
||||
self.updated = time.localtime ()
|
||||
self.summary = node.getElementsByTagName("summary")[0].firstChild.nodeValue
|
||||
self.link = node.getElementsByTagName("link")[0].getAttribute ("href")
|
||||
if len(node.getElementsByTagName("summary")) > 0:
|
||||
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")
|
||||
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:
|
||||
self.link2 = node.getElementsByTagName("link")[1].getAttribute ("href")
|
||||
else:
|
||||
|
@ -42,6 +52,8 @@ class Atom:
|
|||
def diff (self, other):
|
||||
differ = list ()
|
||||
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:
|
||||
differ.append (other.entries[k])
|
||||
return differ
|
||||
|
@ -62,3 +74,4 @@ if __name__ == "__main__":
|
|||
print (b.updated)
|
||||
|
||||
diff = a.diff (b)
|
||||
print (diff)
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
# coding=utf-8
|
||||
|
||||
import re
|
||||
import sys
|
||||
from datetime import datetime
|
||||
from datetime import date
|
||||
from xml.dom.minidom import parse
|
||||
|
@ -44,7 +45,7 @@ def load_module(datas_path):
|
|||
BIRTHDAYS = {}
|
||||
filename = datas_path + "/birthdays.xml"
|
||||
|
||||
print ("Loading birthdays ...",)
|
||||
sys.stdout.write ("Loading birthdays ... ")
|
||||
dom = parse(filename)
|
||||
xmlparse (dom.getElementsByTagName('birthdays')[0])
|
||||
print ("done (%d loaded)" % len(BIRTHDAYS))
|
||||
|
@ -53,7 +54,7 @@ def load_module(datas_path):
|
|||
def save_module():
|
||||
"""Save the dates"""
|
||||
global filename
|
||||
print ("Saving birthdays ...",)
|
||||
sys.stdout.write ("Saving birthdays ... ")
|
||||
|
||||
impl = getDOMImplementation()
|
||||
newdoc = impl.createDocument(None, 'birthdays', None)
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
# coding=utf-8
|
||||
|
||||
import re
|
||||
import sys
|
||||
from datetime import timedelta
|
||||
from datetime import datetime
|
||||
from datetime import date
|
||||
|
@ -51,7 +52,7 @@ def load_module(datas_path):
|
|||
EVENTS = {}
|
||||
filename = datas_path + "/events.xml"
|
||||
|
||||
print ("Loading events ...",)
|
||||
sys.stdout.write ("Loading events ... ")
|
||||
dom = parse(filename)
|
||||
xmlparse (dom.getElementsByTagName('events')[0])
|
||||
print ("done (%d loaded)" % len(EVENTS))
|
||||
|
@ -60,7 +61,7 @@ def load_module(datas_path):
|
|||
def save_module():
|
||||
"""Save the dates"""
|
||||
global filename
|
||||
print ("Saving events ...",)
|
||||
sys.stdout.write ("Saving events ... ")
|
||||
|
||||
impl = getDOMImplementation()
|
||||
newdoc = impl.createDocument(None, 'events', None)
|
||||
|
|
|
@ -154,15 +154,12 @@ class Message:
|
|||
|
||||
|
||||
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
|
||||
elif self.content.find("%s:"%self.srv.nick) == 0:
|
||||
if self.content.find("%s:"%self.srv.nick) == 0:
|
||||
messagel = self.content.lower()
|
||||
|
||||
#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))
|
||||
|
||||
elif re.match(".*di[st] (a|à) ([a-zA-Z0-9_]+) (.+)$", messagel) is not None:
|
||||
|
|
|
@ -10,7 +10,7 @@ from datetime import datetime
|
|||
from datetime import timedelta
|
||||
from xml.dom.minidom import parse
|
||||
|
||||
imports = ["birthday", "qd", "events", "youtube"]
|
||||
imports = ["birthday", "qd", "events", "youtube", "watchWebsite"]
|
||||
imports_launch = ["watchWebsite"]
|
||||
mods = list ()
|
||||
import server
|
||||
|
@ -51,7 +51,6 @@ for serveur in config.getElementsByTagName('server'):
|
|||
|
||||
for imp in imports_launch:
|
||||
mod = __import__ (imp)
|
||||
mod.load_module (basedir + "/datas/")
|
||||
mod.launch (servers)
|
||||
|
||||
print ("Nemubot ready, my PID is %i!" % (os.getpid()))
|
||||
|
|
223
qd.py
223
qd.py
|
@ -2,6 +2,7 @@
|
|||
|
||||
import re
|
||||
import time
|
||||
import sys
|
||||
from datetime import timedelta
|
||||
from datetime import datetime
|
||||
from datetime import date
|
||||
|
@ -15,18 +16,105 @@ MANCHE = None
|
|||
SCORES = 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):
|
||||
"""Parse the given node and add scores to the global list."""
|
||||
global SCORES, MANCHE
|
||||
for item in node.getElementsByTagName("score"):
|
||||
SCORES[item.getAttribute("name")] = (int(item.getAttribute("fourtytwo")),
|
||||
int(item.getAttribute("twentythree")),
|
||||
int(item.getAttribute("pi")),
|
||||
int(item.getAttribute("notfound")),
|
||||
int(item.getAttribute("tententen")),
|
||||
int(item.getAttribute("leet")),
|
||||
int(item.getAttribute("great")),
|
||||
int(item.getAttribute("bad")))
|
||||
SCORES[item.getAttribute("name")] = Score ()
|
||||
SCORES[item.getAttribute("name")].parse(item)
|
||||
|
||||
manche = node.getElementsByTagName("manche")[0]
|
||||
MANCHE = (int(manche.getAttribute("number")),
|
||||
manche.getAttribute("winner"),
|
||||
|
@ -42,22 +130,22 @@ def load_module(datas_path):
|
|||
SCORES = dict ()
|
||||
filename = datas_path + "/42.xml"
|
||||
|
||||
print ("Loading 42scores ...",)
|
||||
sys.stdout.write ("Loading 42scores ... ")
|
||||
dom = parse(filename)
|
||||
xmlparse (dom.documentElement)
|
||||
print ("done (%d loaded, currently in round %d)" % (len(SCORES), -42))
|
||||
|
||||
def save_module():
|
||||
"""Save the dates"""
|
||||
"""Save the scores"""
|
||||
global filename
|
||||
print ("Saving birthdays ...",)
|
||||
sys.stdout.write ("Saving 42scores ... ")
|
||||
|
||||
impl = getDOMImplementation()
|
||||
newdoc = impl.createDocument(None, 'game', None)
|
||||
top = newdoc.documentElement
|
||||
|
||||
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
|
||||
top.appendChild(item);
|
||||
|
||||
|
@ -78,7 +166,7 @@ def help_full ():
|
|||
|
||||
def rev (tupl):
|
||||
(k, v) = tupl
|
||||
return (v, k)
|
||||
return (v.score(), k)
|
||||
|
||||
def parseanswer (msg):
|
||||
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 msg.cmd[1].lower() in SCORES:
|
||||
(normal, bad, great, leet, pi, dt, nf) = user(msg.cmd[1])
|
||||
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)
|
||||
phrase += " " + msg.cmd[1] + ": " + SCORES[msg.cmd[1].lower()].details()
|
||||
else:
|
||||
phrase = " %s n'a encore jamais joué,"%(msg.cmd[1])
|
||||
else:
|
||||
joueurs = dict()
|
||||
# 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):
|
||||
for nom, scr in sorted(SCORES.items(), key=rev, reverse=True):
|
||||
if phrase == "":
|
||||
phrase = " *%s: %d*,"%(nom, scr)
|
||||
phrase = " *%s: %d*,"%(nom, scr.score())
|
||||
else:
|
||||
phrase += " %s: %d,"%(nom, scr)
|
||||
phrase += " %s: %d,"%(nom, scr.score())
|
||||
|
||||
msg.send_chn ("Scores :%s" % (phrase[0:len(phrase)-1]))
|
||||
return True
|
||||
|
@ -116,12 +197,6 @@ def parseanswer (msg):
|
|||
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):
|
||||
global SCORES, MANCHE
|
||||
who = who.lower()
|
||||
|
@ -141,7 +216,7 @@ def win(s, who):
|
|||
SCORES = dict()
|
||||
# SCORES[maxi_name] = (-10, 0, -4, 0, 0, -2, 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:
|
||||
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 ()
|
||||
|
||||
|
||||
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):
|
||||
return False
|
||||
|
||||
|
||||
def getUser(name):
|
||||
global SCORES
|
||||
if name not in SCORES:
|
||||
SCORES[name] = Score()
|
||||
return SCORES[name]
|
||||
|
||||
|
||||
def parselisten (msg):
|
||||
# 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 datetime.now().minute == 10 and datetime.now().second == 10 and datetime.now().hour == 10:
|
||||
ttt += 1
|
||||
great += 1
|
||||
getUser(msg.sender).playTen()
|
||||
getUser(msg.sender).playGreat()
|
||||
elif datetime.now().minute == 42:
|
||||
if datetime.now().second == 0:
|
||||
great += 1
|
||||
qd += 1
|
||||
getUser(msg.sender).playGreat()
|
||||
getUser(msg.sender).playFtt()
|
||||
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 datetime.now().minute == 23:
|
||||
if datetime.now().second == 0:
|
||||
great += 1
|
||||
dt += 1
|
||||
getUser(msg.sender).playGreat()
|
||||
getUser(msg.sender).playTwt()
|
||||
else:
|
||||
bad += 1
|
||||
getUser(msg.sender).playBad()
|
||||
|
||||
if (msg.content.strip().startswith("101010") and len (msg.content) < 9):
|
||||
if datetime.now().minute == 10 and datetime.now().hour == 10:
|
||||
if datetime.now().second == 10:
|
||||
great += 1
|
||||
ttt += 1
|
||||
getUser(msg.sender).playGreat()
|
||||
getUser(msg.sender).playTen()
|
||||
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 datetime.now().hour == 1 and datetime.now().minute == 23 and datetime.now().second == 45:
|
||||
great += 1
|
||||
dt += 1
|
||||
getUser(msg.sender).playGreat()
|
||||
getUser(msg.sender).playTwt()
|
||||
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 datetime.now().hour == 13 and datetime.now().minute == 37:
|
||||
if datetime.now().second == 0:
|
||||
great += 1
|
||||
leet += 1
|
||||
getUser(msg.sender).playGreat()
|
||||
getUser(msg.sender).playLeet()
|
||||
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 datetime.now().hour == 3 and datetime.now().minute == 14:
|
||||
if datetime.now().second == 15 or datetime.now().second == 16:
|
||||
great += 1
|
||||
pi += 1
|
||||
getUser(msg.sender).playGreat()
|
||||
getUser(msg.sender).playPi()
|
||||
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 datetime.now().hour == 4 and datetime.now().minute == 4:
|
||||
if datetime.now().second == 0 or datetime.now().second == 4:
|
||||
great += 1
|
||||
nf += 1
|
||||
getUser(msg.sender).playGreat()
|
||||
getUser(msg.sender).playNotfound()
|
||||
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)):
|
||||
SCORES[msg.sender.lower()] = (qd, dt, pi, nf, ttt, leet, great, bad)
|
||||
if great >= 42:
|
||||
print ("Nous avons un vainqueur ! Nouvelle manche :p")
|
||||
win(s, msg.sender)
|
||||
else:
|
||||
save_module ()
|
||||
if getUser(msg.sender).isWinner():
|
||||
print ("Nous avons un vainqueur ! Nouvelle manche :p")
|
||||
win(s, msg.sender)
|
||||
elif getUser(msg.sender).hasChanged():
|
||||
save_module ()
|
||||
return False
|
||||
|
|
12
server.py
12
server.py
|
@ -29,7 +29,7 @@ class Server:
|
|||
|
||||
def send_msg (self, channel, msg, cmd = "PRIVMSG", endl = "\r\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 ())
|
||||
|
||||
def send_global (self, msg, cmd = "PRIVMSG", endl = "\r\n"):
|
||||
|
@ -41,7 +41,7 @@ class Server:
|
|||
_thread.start_new_thread(self.connect, (mods,))
|
||||
|
||||
def accepted_channel(self, channel):
|
||||
return (self.channels.find(channel) != -1)
|
||||
return (self.channels.count(channel) != -1)
|
||||
|
||||
def read(self, mods):
|
||||
self.readbuffer = "" #Here we store all the messages from server
|
||||
|
@ -56,10 +56,10 @@ class Server:
|
|||
|
||||
for line in temp:
|
||||
msg = message.Message (self, line)
|
||||
try:
|
||||
msg.treat (mods)
|
||||
except:
|
||||
print ("Une erreur est survenue lors du traitement du message : %s"%line)
|
||||
# try:
|
||||
msg.treat (mods)
|
||||
# except:
|
||||
# print ("Une erreur est survenue lors du traitement du message : %s"%line)
|
||||
|
||||
|
||||
def connect(self, mods):
|
||||
|
|
261
watchWebsite.py
261
watchWebsite.py
|
@ -2,6 +2,7 @@
|
|||
|
||||
import http.client
|
||||
import hashlib
|
||||
import sys
|
||||
import time
|
||||
import _thread
|
||||
from urllib.parse import unquote
|
||||
|
@ -16,15 +17,118 @@ filename = ""
|
|||
SITES = []
|
||||
SRVS = None
|
||||
|
||||
def xmlparse(node):
|
||||
"""Parse the given node and add events to the global list."""
|
||||
for item in node.getElementsByTagName("watch"):
|
||||
if item.getAttribute("type"):
|
||||
type = item.getAttribute("type")
|
||||
else:
|
||||
type = "hash"
|
||||
class Site:
|
||||
def __init__(self, item):
|
||||
self.server = item.getAttribute("server")
|
||||
self.page = item.getAttribute("page")
|
||||
if item.getAttribute("type"):
|
||||
self.type = item.getAttribute("type")
|
||||
else:
|
||||
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):
|
||||
|
@ -33,9 +137,10 @@ def load_module(datas_path):
|
|||
SITES = []
|
||||
filename = datas_path + "/watch.xml"
|
||||
|
||||
print ("Loading watchsites ...",)
|
||||
sys.stdout.write ("Loading watchsites ... ")
|
||||
dom = parse(filename)
|
||||
xmlparse (dom.documentElement)
|
||||
for item in dom.documentElement.getElementsByTagName("watch"):
|
||||
SITES.append (Site (item))
|
||||
print ("done (%d loaded)" % len(SITES))
|
||||
|
||||
|
||||
|
@ -43,101 +148,57 @@ def launch (servers):
|
|||
global SRVS
|
||||
SRVS = servers
|
||||
for site in SITES:
|
||||
_thread.start_new_thread (startThread, (site,))
|
||||
site.start ()
|
||||
|
||||
def send_global (msg):
|
||||
for server in SRVS:
|
||||
server.send_global (msg)
|
||||
def save_module():
|
||||
"""Save the module state"""
|
||||
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):
|
||||
conn = http.client.HTTPConnection(s)
|
||||
conn.request("GET", "/%s"%(p))
|
||||
conn = http.client.HTTPConnection(s)
|
||||
conn.request("GET", "/%s"%(p))
|
||||
|
||||
res = conn.getresponse()
|
||||
data = res.read()
|
||||
res = conn.getresponse()
|
||||
data = res.read()
|
||||
|
||||
conn.close()
|
||||
return data
|
||||
conn.close()
|
||||
return data
|
||||
|
||||
def startThread(site):
|
||||
(srv, page, type, message, lastpage, updateTime) = site
|
||||
|
||||
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)
|
||||
site.check ()
|
||||
|
|
Loading…
Reference in New Issue