New bot class and XML based working
This commit is contained in:
parent
d3ac511096
commit
0f00e63ee3
9 changed files with 1020 additions and 471 deletions
316
qd.py
316
qd.py
|
|
@ -1,103 +1,165 @@
|
|||
# coding=utf-8
|
||||
from datetime import date
|
||||
from datetime import datetime
|
||||
|
||||
import re
|
||||
import time
|
||||
from datetime import timedelta
|
||||
from datetime import datetime
|
||||
from datetime import date
|
||||
from xml.dom.minidom import parse
|
||||
from xml.dom.minidom import parseString
|
||||
from xml.dom.minidom import getDOMImplementation
|
||||
|
||||
filename = ""
|
||||
channels = "#nemutest #42sh #epitagueule"
|
||||
MANCHE = None
|
||||
SCORES = dict ()
|
||||
temps = dict ()
|
||||
|
||||
manche = (2, 'maxence23', datetime(2012, 3, 7, 22, 23, 0, 0), "colona", 193)
|
||||
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")))
|
||||
manche = node.getElementsByTagName("manche")[0]
|
||||
MANCHE = (int(manche.getAttribute("number")),
|
||||
manche.getAttribute("winner"),
|
||||
int(manche.getAttribute("winner_score")),
|
||||
manche.getAttribute("who"),
|
||||
datetime.now ())
|
||||
# time.strptime (manche.getAttribute("date")))
|
||||
|
||||
#score42 = {'nemunaire': (46, 5, 19, 1, 1, 27), 'cocacompany': (1, 0, 0, 0, 0, 0), 'nelson': (5, 5, 0, 0, 0, 1), 'xetal': (10, 2, 0, 0, 0, 2), 'colona': (31, 4, 32, 0, 1, 13), 'bob': (47, 4, 19, 0, 1, 27), 'benf': (12, 8, 0, 0, 1, 2), 'maxence23': (46, 18, 42, 1, 1, 45)}
|
||||
score42 = {'nemunaire': (49, 1, 40, 2, 2, 42, 2), 'xetal': (1, 0, 0, 0, 0, 0, 0), 'benf': (3, 0, 0, 0, 0, 0, 0), 'colona': (23, 0, 9, 0, 1, 18, 0), 'nelson': (7, 0, 0, 0, 0, 3, 0), 'maxence23': (43, -4, 25, 1, 1, 37, 0), 'bob': (39, 1, 14, 1, 0, 26, 0), 'cccompany': (1, 0, 0, 0, 0, 1, 0)}
|
||||
def load_module(datas_path):
|
||||
"""Load this module"""
|
||||
global MANCHE, SCORES, filename
|
||||
MANCHE = None
|
||||
SCORES = dict ()
|
||||
filename = datas_path + "/42.xml"
|
||||
|
||||
temps = dict()
|
||||
print ("Loading 42scores ...",)
|
||||
dom = parse(filename)
|
||||
xmlparse (dom.documentElement)
|
||||
print ("done (%d loaded, currently in round %d)" % (len(SCORES), -42))
|
||||
|
||||
def scores(s, cmd, where):
|
||||
global score42
|
||||
if len(cmd) > 1 and (cmd[1] == "help" or cmd[1] == "aide"):
|
||||
s.send("PRIVMSG %s :Formule : normal * 2 - bad * 10 + great * 5 + leet * 3 + pi * 3.1415 + dt + not_found * 4.04\r\n"%(where))
|
||||
elif len(cmd) > 1 and (cmd[1] == "manche"):
|
||||
txt = "Nous sommes dans la %de manche, commencée par %s le %s et gagnée par %s avec %d points"%manche
|
||||
s.send("PRIVMSG %s :%s\r\n"%(where, txt))
|
||||
def save_module():
|
||||
"""Save the dates"""
|
||||
global filename
|
||||
print ("Saving birthdays ...",)
|
||||
|
||||
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]
|
||||
item = parseString ('<score name="%s" %s />' % (name, scr)).documentElement
|
||||
top.appendChild(item);
|
||||
|
||||
top.appendChild(parseString ('<manche number="%d" winner="%s" winner_score="%d" who="%s" date="%s" />' % MANCHE).documentElement)
|
||||
|
||||
with open(filename, "w") as f:
|
||||
newdoc.writexml (f)
|
||||
print ("done")
|
||||
|
||||
|
||||
def help_tiny ():
|
||||
"""Line inserted in the response to the command !help"""
|
||||
return "!42: display scores\n!42 help: display the performed calculate\n!42 manche: display information about current round\n!42 /who/: show the /who/'s scores"
|
||||
|
||||
def help_full ():
|
||||
return "!anniv /who/: gives the remaining time before the anniversary of /who/\nIf /who/ is not given, gives the remaining time before your anniversary.\n\n To set yout birthday, say it to nemubot :)"
|
||||
|
||||
|
||||
def rev (tupl):
|
||||
(k, v) = tupl
|
||||
return (v, k)
|
||||
|
||||
def parseanswer (msg):
|
||||
if msg.cmd[0] == "42" or msg.cmd[0] == "score" or msg.cmd[0] == "scores":
|
||||
global SCORES, MANCHE
|
||||
if len(msg.cmd) > 1 and (msg.cmd[1] == "help" or msg.cmd[1] == "aide"):
|
||||
msg.send_chn ("Formule : normal * 2 - bad * 10 + great * 5 + leet * 3 + pi * 3.1415 + dt + not_found * 4.04")
|
||||
elif len(msg.cmd) > 1 and (msg.cmd[1] == "manche" or msg.cmd[1] == "round"):
|
||||
msg.send_chn ("Nous sommes dans la %de manche, gagnée par %s avec %d points et commencée par %s le %s"%MANCHE)
|
||||
#elif where == "#nemutest":
|
||||
else:
|
||||
phrase = ""
|
||||
if where == "#42sh":
|
||||
players = ["Bob", "colona", "maxence23", "nemunaire", "Xetal"]
|
||||
elif where == "#tc":
|
||||
players = ["benf", "Bob", "maxence23", "nemunaire", "Xetal"]
|
||||
elif where == "#epitagueule":
|
||||
players = ["benf", "Bob", "colona", "cccompany", "maxence23", "nelson", "nemunaire", "Xetal"]
|
||||
else:
|
||||
players = score42.keys()
|
||||
phrase = ""
|
||||
|
||||
if len(cmd) > 1:
|
||||
if cmd[1].lower() in score42:
|
||||
(normal, bad, great, leet, pi, dt, nf) = user(cmd[1])
|
||||
phrase += " %s: 42: %d, 23: %d, bad: %d, great: %d, leet: %d, pi: %d, 404: %d = %d."%(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:
|
||||
phrase = " %s n'a encore jamais joué,"%(cmd[1])
|
||||
else:
|
||||
joueurs = dict()
|
||||
# for player in players:
|
||||
for player in score42.keys():
|
||||
if player in score42:
|
||||
joueurs[player] = score(player)
|
||||
|
||||
for nom, scr in sorted(joueurs.iteritems(), key=lambda (k,v): (v,k), reverse=True):
|
||||
if phrase == "":
|
||||
phrase = " *%s: %d*,"%(nom, scr)
|
||||
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)
|
||||
else:
|
||||
phrase += " %s: %d,"%(nom, scr)
|
||||
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)
|
||||
|
||||
s.send("PRIVMSG %s :Scores :%s\r\n"%(where, phrase[0:len(phrase)-1]))
|
||||
for nom, scr in sorted(joueurs.items(), key=rev, reverse=True):
|
||||
if phrase == "":
|
||||
phrase = " *%s: %d*,"%(nom, scr)
|
||||
else:
|
||||
phrase += " %s: %d,"%(nom, scr)
|
||||
|
||||
msg.send_chn ("Scores :%s" % (phrase[0:len(phrase)-1]))
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
|
||||
def score(who):
|
||||
(normal, bad, great, leet, pi, dt, nf) = user(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 (normal * 2 - bad * 10 + great * 5 + leet * 3 + pi * 3.1415 + dt + nf * 4.04)
|
||||
|
||||
return (qd * 2 - bad * 10 + great * 5 + leet * 3 + pi * 3.1415 + dt + nf * 4.04)
|
||||
|
||||
|
||||
def win(s, who):
|
||||
global score42, manche
|
||||
global SCORES, MANCHE
|
||||
who = who.lower()
|
||||
|
||||
(num_manche, whosef, dayte, winner, nb_points) = manche
|
||||
(num_manche, winner, nb_points, whosef, dayte) = MANCHE
|
||||
|
||||
maxi_scor = 0
|
||||
maxi_name = None
|
||||
|
||||
for player in score42.keys():
|
||||
for player in SCORES.keys():
|
||||
scr = score(player)
|
||||
if scr > maxi_scor:
|
||||
maxi_scor = scr
|
||||
maxi_name = player
|
||||
|
||||
#Reset !
|
||||
score42 = dict()
|
||||
# score42[maxi_name] = (-10, 0, -4, 0, 0, -2, 0)
|
||||
score42[maxi_name] = (0, 0, 0, 0, 0, 0, 0)
|
||||
score42[who] = (0, -4, -1, 1, 1, 1, 0)
|
||||
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)
|
||||
|
||||
for chan in channels.split(' '):
|
||||
if who != maxi_name:
|
||||
s.send("PRIVMSG %s :Félicitations %s, tu remportes cette manche terminée par %s, avec un score de %d !\r\n"%(chan, maxi_name, who, maxi_scor))
|
||||
else:
|
||||
s.send("PRIVMSG %s :Félicitations %s, tu remportes cette manche avec %d points !\r\n"%(chan, maxi_name, maxi_scor))
|
||||
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))
|
||||
else:
|
||||
msg.send_global ("Félicitations %s, tu remportes cette manche avec %d points !"%(maxi_name, maxi_scor))
|
||||
|
||||
manche = (num_manche + 1, who, datetime.now(), maxi_name, maxi_scor)
|
||||
MANCHE = (num_manche + 1, maxi_name, maxi_scor, who, datetime.now ())
|
||||
|
||||
print ("Nouvelle manche :", MANCHE)
|
||||
save_module ()
|
||||
|
||||
print "Nouvelle manche :", manche
|
||||
print datetime.now(), score42
|
||||
|
||||
|
||||
def user(who):
|
||||
who = who.lower()
|
||||
if who in score42:
|
||||
return score42[who]
|
||||
if who in SCORES:
|
||||
return SCORES[who]
|
||||
else:
|
||||
return (0, 0, 0, 0, 0, 0, 0)
|
||||
return (0, 0, 0, 0, 0, 0, 0, 0)
|
||||
|
||||
|
||||
def canPlay(who):
|
||||
|
|
@ -109,70 +171,78 @@ def canPlay(who):
|
|||
return False
|
||||
|
||||
|
||||
def go(s, sender, msgpart, where):
|
||||
if where != "#nemutest":
|
||||
great = 0
|
||||
def parseask (msg):
|
||||
return False
|
||||
|
||||
if (msgpart.strip().startswith("42") and len (msgpart) < 5) or ((msgpart.strip().lower().startswith("quarante-deux") or msgpart.strip().lower().startswith("quarante deux")) and len (msgpart) < 17):
|
||||
(normal, bad, great, leet, pi, dt, nf) = user(sender[0])
|
||||
if canPlay(sender[0]):
|
||||
if datetime.now().minute == 42:
|
||||
if datetime.now().second == 0:
|
||||
great += 1
|
||||
normal += 1
|
||||
else:
|
||||
bad += 1
|
||||
score42[sender[0].lower()] = (normal, bad, great, leet, pi, dt, nf)
|
||||
print datetime.now(), score42
|
||||
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 (msgpart.strip().startswith("23") and len (msgpart) < 5) or ((msgpart.strip().lower().startswith("vingt-trois") or msgpart.strip().lower().startswith("vingt trois")) and len (msgpart) < 14):
|
||||
(normal, bad, great, leet, pi, dt, nf) = user(sender[0])
|
||||
if canPlay(sender[0]):
|
||||
if datetime.now().minute == 23:
|
||||
if datetime.now().second == 0:
|
||||
great += 1
|
||||
dt += 1
|
||||
else:
|
||||
bad += 1
|
||||
score42[sender[0].lower()] = (normal, bad, great, leet, pi, dt, nf)
|
||||
print datetime.now(), score42
|
||||
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
|
||||
elif datetime.now().minute == 42:
|
||||
if datetime.now().second == 0:
|
||||
great += 1
|
||||
qd += 1
|
||||
else:
|
||||
bad += 1
|
||||
|
||||
if len (msgpart) < 12 and (msgpart.strip().lower().startswith("leet time") or msgpart.strip().lower().startswith("leettime") or msgpart.strip().lower().startswith("l33t time") or msgpart.strip().lower().startswith("1337")):
|
||||
(normal, bad, great, leet, pi, dt, nf) = user(sender[0])
|
||||
if canPlay(sender[0]):
|
||||
if datetime.now().hour == 13 and datetime.now().minute == 37:
|
||||
if datetime.now().second == 0:
|
||||
great += 1
|
||||
leet += 1
|
||||
else:
|
||||
bad += 1
|
||||
score42[sender[0].lower()] = (normal, bad, great, leet, pi, dt, nf)
|
||||
print datetime.now(), score42
|
||||
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
|
||||
else:
|
||||
bad += 1
|
||||
|
||||
if len (msgpart) < 11 and (msgpart.strip().lower().startswith("pi time") or msgpart.strip().lower().startswith("pitime") or msgpart.strip().lower().startswith("3.14 time")):
|
||||
(normal, bad, great, leet, pi, dt, nf) = user(sender[0])
|
||||
if canPlay(sender[0]):
|
||||
if datetime.now().hour == 3 and datetime.now().minute == 14:
|
||||
if datetime.now().second == 15 or datetime.now().second == 16:
|
||||
great += 1
|
||||
pi += 1
|
||||
else:
|
||||
bad += 1
|
||||
score42[sender[0].lower()] = (normal, bad, great, leet, pi, dt, nf)
|
||||
print datetime.now(), score42
|
||||
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
|
||||
else:
|
||||
bad += 1
|
||||
|
||||
if len (msgpart) < 16 and (msgpart.strip().lower().startswith("time not found") or msgpart.strip().lower().startswith("timenotfound") or msgpart.strip().lower().startswith("404 time")) or (len (msgpart) < 6 and msgpart.strip().lower().startswith("404")):
|
||||
(normal, bad, great, leet, pi, dt, nf) = user(sender[0])
|
||||
if canPlay(sender[0]):
|
||||
if datetime.now().hour == 4 and datetime.now().minute == 04:
|
||||
if datetime.now().second == 0 or datetime.now().second == 4:
|
||||
great += 1
|
||||
nf += 1
|
||||
else:
|
||||
bad += 1
|
||||
score42[sender[0].lower()] = (normal, bad, great, leet, pi, dt, nf)
|
||||
print datetime.now(), score42
|
||||
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
|
||||
else:
|
||||
bad += 1
|
||||
|
||||
if great >= 42:
|
||||
print "Nous avons un vainqueur ! Nouvelle manche :p"
|
||||
win(s, sender[0])
|
||||
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
|
||||
else:
|
||||
bad += 1
|
||||
|
||||
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
|
||||
else:
|
||||
bad += 1
|
||||
|
||||
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
|
||||
else:
|
||||
bad += 1
|
||||
|
||||
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 ()
|
||||
return False
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue