Merge branch 'master' of /home/nemunaire/git/nemubot
Conflicts: nemubot.py watchWebsite.py
This commit is contained in:
commit
f676ce11c6
10 changed files with 457 additions and 285 deletions
113
alias.py
Normal file
113
alias.py
Normal file
|
|
@ -0,0 +1,113 @@
|
||||||
|
# coding=utf-8
|
||||||
|
|
||||||
|
import re
|
||||||
|
import sys
|
||||||
|
from datetime import datetime
|
||||||
|
from xml.dom.minidom import parse
|
||||||
|
from xml.dom.minidom import parseString
|
||||||
|
from xml.dom.minidom import getDOMImplementation
|
||||||
|
|
||||||
|
filename = ""
|
||||||
|
ALIAS = {}
|
||||||
|
variables = {}
|
||||||
|
|
||||||
|
def load_module(datas_path):
|
||||||
|
"""Load this module"""
|
||||||
|
global ALIAS, filename
|
||||||
|
SCORES = dict ()
|
||||||
|
filename = datas_path + "/alias.xml"
|
||||||
|
|
||||||
|
sys.stdout.write ("Loading aliaslist ... ")
|
||||||
|
dom = parse(filename)
|
||||||
|
for item in dom.documentElement.getElementsByTagName("alias"):
|
||||||
|
ALIAS[item.getAttribute("alias")] = item.getAttribute("origin")
|
||||||
|
for item in dom.documentElement.getElementsByTagName("variable"):
|
||||||
|
variables[item.getAttribute("name")] = item.getAttribute("value")
|
||||||
|
print ("done (%d aliases and %d vars)" % (len(ALIAS), len (variables)))
|
||||||
|
|
||||||
|
def save_module():
|
||||||
|
"""Save the aliases"""
|
||||||
|
global ALIAS, variables, filename
|
||||||
|
sys.stdout.write ("Saving aliases ... ")
|
||||||
|
|
||||||
|
impl = getDOMImplementation()
|
||||||
|
newdoc = impl.createDocument(None, 'aliaslist', None)
|
||||||
|
top = newdoc.documentElement
|
||||||
|
|
||||||
|
for name in ALIAS.keys():
|
||||||
|
item = parseString ('<alias alias="%s" origin="%s" />' % (name, ALIAS[name])).documentElement
|
||||||
|
top.appendChild(item);
|
||||||
|
|
||||||
|
for name in variables.keys():
|
||||||
|
item = parseString ('<variable name="%s" value="%s" />' % (name, variables[name])).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 "alias module"
|
||||||
|
|
||||||
|
def help_full ():
|
||||||
|
return "TODO"
|
||||||
|
|
||||||
|
|
||||||
|
def parseanswer (msg):
|
||||||
|
global ALIAS, variables
|
||||||
|
if msg.cmd[0] == "set":
|
||||||
|
if len (msg.cmd) > 2:
|
||||||
|
variables[msg.cmd[1]] = " ".join(msg.cmd[2:])
|
||||||
|
msg.send_snd("Variable $%s définie." % msg.cmd[1])
|
||||||
|
else:
|
||||||
|
msg.send_snd("!set prend au minimum deux arguments : le nom de la variable et sa valeur.")
|
||||||
|
return True
|
||||||
|
elif msg.cmd[0] in ALIAS:
|
||||||
|
msg.content = msg.content.replace("!" + msg.cmd[0], ALIAS[msg.cmd[0]], 1)
|
||||||
|
|
||||||
|
cnt = msg.content.split(' ')
|
||||||
|
for i in range(0,len(cnt)):
|
||||||
|
if len (cnt[i]) and cnt[i][0] == '$':
|
||||||
|
if cnt[i][1] == '$' and len(cnt[i]) == 2:
|
||||||
|
cnt[i] = "$"
|
||||||
|
elif cnt[i] == "$sender":
|
||||||
|
cnt[i] = msg.sender
|
||||||
|
elif cnt[i] == "$chan" or cnt[i] == "$channel":
|
||||||
|
cnt[i] = msg.channel
|
||||||
|
elif cnt[i] == "$date":
|
||||||
|
now = datetime.now()
|
||||||
|
cnt[i] = ("%d/%d/%d %d:%d:%d"%(now.day, now.month, now.year, now.hour, now.minute, now.second))
|
||||||
|
elif cnt[i] == "$date,":
|
||||||
|
now = datetime.now()
|
||||||
|
cnt[i] = ("%d/%d/%d %d:%d:%d,"%(now.day, now.month, now.year, now.hour, now.minute, now.second))
|
||||||
|
elif cnt[i] == "$date.":
|
||||||
|
now = datetime.now()
|
||||||
|
cnt[i] = ("%d/%d/%d %d:%d:%d."%(now.day, now.month, now.year, now.hour, now.minute, now.second))
|
||||||
|
elif cnt[i][1:] in variables:
|
||||||
|
cnt[i] = variables[cnt[i][1:]]
|
||||||
|
else:
|
||||||
|
cnt[i] = ""
|
||||||
|
msg.content = " ".join(cnt)
|
||||||
|
msg.reparsemsg()
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def parseask (msg):
|
||||||
|
global ALIAS
|
||||||
|
if re.match(".*(set|cr[ée]{2}|nouvel(le)?) alias.*", msg.content) is not None:
|
||||||
|
result = re.match(".*alias !?([a-zA-Z0-9_-]+) (pour|=|:) (.+)$", msg.content)
|
||||||
|
if result.group(1) in ALIAS or result.group(3).find("alias") >= 0:
|
||||||
|
msg.send_snd("Cet alias est déjà défini.")
|
||||||
|
else:
|
||||||
|
ALIAS[result.group(1)] = result.group(3)
|
||||||
|
msg.send_snd("Nouvel alias %s défini avec succès." % result.group(1))
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def parselisten (msg):
|
||||||
|
return False
|
||||||
2
atom.py
2
atom.py
|
|
@ -26,7 +26,7 @@ class AtomEntry:
|
||||||
self.link = node.getElementsByTagName("link")[0].getAttribute ("href")
|
self.link = node.getElementsByTagName("link")[0].getAttribute ("href")
|
||||||
else:
|
else:
|
||||||
self.link = None
|
self.link = None
|
||||||
if len (node.getElementsByTagName("category")) > 1:
|
if len (node.getElementsByTagName("category")) >= 1:
|
||||||
self.category = node.getElementsByTagName("category")[0].getAttribute ("term")
|
self.category = node.getElementsByTagName("category")[0].getAttribute ("term")
|
||||||
else:
|
else:
|
||||||
self.category = None
|
self.category = None
|
||||||
|
|
|
||||||
47
events.py
47
events.py
|
|
@ -5,15 +5,30 @@ 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
|
||||||
|
import time
|
||||||
from xml.dom.minidom import parse
|
from xml.dom.minidom import parse
|
||||||
from xml.dom.minidom import parseString
|
from xml.dom.minidom import parseString
|
||||||
from xml.dom.minidom import getDOMImplementation
|
from xml.dom.minidom import getDOMImplementation
|
||||||
|
|
||||||
filename = ""
|
filename = ""
|
||||||
EVENTS = {}
|
EVENTS = {}
|
||||||
|
STREND = {}
|
||||||
|
|
||||||
|
class Strend:
|
||||||
|
def __init__(self, item):
|
||||||
|
if item is not None:
|
||||||
|
self.name = item.getAttribute("name")
|
||||||
|
self.start = datetime.fromtimestamp (time.mktime (time.strptime (item.getAttribute("start")[:19], "%Y-%m-%d %H:%M:%S")))
|
||||||
|
self.proprio = item.getAttribute("proprio")
|
||||||
|
else:
|
||||||
|
self.start = datetime.now()
|
||||||
|
|
||||||
|
|
||||||
def xmlparse(node):
|
def xmlparse(node):
|
||||||
"""Parse the given node and add events to the global list."""
|
"""Parse the given node and add events to the global list."""
|
||||||
|
for item in node.getElementsByTagName("strend"):
|
||||||
|
STREND[item.getAttribute("name")] = Strend(item)
|
||||||
|
|
||||||
for item in node.getElementsByTagName("event"):
|
for item in node.getElementsByTagName("event"):
|
||||||
if (item.hasAttribute("year")):
|
if (item.hasAttribute("year")):
|
||||||
year = int(item.getAttribute("year"))
|
year = int(item.getAttribute("year"))
|
||||||
|
|
@ -48,8 +63,9 @@ def xmlparse(node):
|
||||||
|
|
||||||
def load_module(datas_path):
|
def load_module(datas_path):
|
||||||
"""Load this module"""
|
"""Load this module"""
|
||||||
global EVENTS, filename
|
global EVENTS, STREND, filename
|
||||||
EVENTS = {}
|
EVENTS = {}
|
||||||
|
STREND = {}
|
||||||
filename = datas_path + "/events.xml"
|
filename = datas_path + "/events.xml"
|
||||||
|
|
||||||
sys.stdout.write ("Loading events ... ")
|
sys.stdout.write ("Loading events ... ")
|
||||||
|
|
@ -67,6 +83,10 @@ def save_module():
|
||||||
newdoc = impl.createDocument(None, 'events', None)
|
newdoc = impl.createDocument(None, 'events', None)
|
||||||
top = newdoc.documentElement
|
top = newdoc.documentElement
|
||||||
|
|
||||||
|
for name in STREND.keys():
|
||||||
|
item = parseString ('<strend name="%s" start="%s" proprio="%s" />' % (name, STREND[name].start, STREND[name].proprio)).documentElement
|
||||||
|
top.appendChild(item);
|
||||||
|
|
||||||
for name in EVENTS.keys():
|
for name in EVENTS.keys():
|
||||||
(day, msg_before, msg_after) = EVENTS[name]
|
(day, msg_before, msg_after) = EVENTS[name]
|
||||||
bonus=""
|
bonus=""
|
||||||
|
|
@ -96,6 +116,7 @@ def help_full ():
|
||||||
|
|
||||||
|
|
||||||
def parseanswer(msg):
|
def parseanswer(msg):
|
||||||
|
global STREND
|
||||||
if msg.cmd[0] == "we" or msg.cmd[0] == "week-end" or msg.cmd[0] == "weekend":
|
if msg.cmd[0] == "we" or msg.cmd[0] == "week-end" or msg.cmd[0] == "weekend":
|
||||||
ndate = datetime.today() + timedelta(5 - datetime.today().weekday())
|
ndate = datetime.today() + timedelta(5 - datetime.today().weekday())
|
||||||
ndate = datetime(ndate.year, ndate.month, ndate.day, 0, 0, 1)
|
ndate = datetime(ndate.year, ndate.month, ndate.day, 0, 0, 1)
|
||||||
|
|
@ -116,6 +137,30 @@ def parseanswer(msg):
|
||||||
"Il reste %s avant les vacances :)",
|
"Il reste %s avant les vacances :)",
|
||||||
"Profitons, c'est les vacances depuis %s."))
|
"Profitons, c'est les vacances depuis %s."))
|
||||||
return True
|
return True
|
||||||
|
elif msg.cmd[0] == "start" and len(msg.cmd) > 1:
|
||||||
|
if msg.cmd[1] not in STREND:
|
||||||
|
STREND[msg.cmd[1]] = Strend(None)
|
||||||
|
STREND[msg.cmd[1]].proprio = msg.sender
|
||||||
|
STREND[msg.cmd[1]].name = msg.cmd[1]
|
||||||
|
|
||||||
|
msg.send_snd ("%s commencé le %s"% (msg.cmd[1], datetime.now()))
|
||||||
|
else:
|
||||||
|
msg.send_snd ("%s existe déjà."% (msg.cmd[1]))
|
||||||
|
|
||||||
|
elif msg.cmd[0] == "end" and len(msg.cmd) > 1:
|
||||||
|
if msg.cmd[1] in STREND:
|
||||||
|
msg.send_chn ("%s a duré %s." % (msg.cmd[1], msg.just_countdown(datetime.now () - STREND[msg.cmd[1]].start)))
|
||||||
|
if STREND[msg.cmd[1]].proprio == msg.sender:
|
||||||
|
del STREND[msg.cmd[1]]
|
||||||
|
else:
|
||||||
|
msg.send_snd ("Vous ne pouvez pas terminer le compteur %s, créé par %s."% (msg.cmd[1], STREND[msg.cmd[1]].proprio))
|
||||||
|
else:
|
||||||
|
msg.send_snd ("%s n'est pas un compteur connu."% (msg.cmd[1]))
|
||||||
|
|
||||||
|
elif msg.cmd[0] == "eventslist" or msg.cmd[0] == "eventlist" or msg.cmd[0] == "eventsliste" or msg.cmd[0] == "eventliste":
|
||||||
|
msg.send_snd ("Compteurs connus : %s." % ", ".join(STREND.keys()))
|
||||||
|
elif msg.cmd[0] in STREND:
|
||||||
|
msg.send_chn ("%s commencé il y a %s." % (msg.cmd[0], msg.just_countdown(datetime.now () - STREND[msg.cmd[0]].start)))
|
||||||
elif msg.cmd[0] in EVENTS:
|
elif msg.cmd[0] in EVENTS:
|
||||||
(day, msg_before, msg_after) = EVENTS[msg.cmd[0]]
|
(day, msg_before, msg_after) = EVENTS[msg.cmd[0]]
|
||||||
if day is None:
|
if day is None:
|
||||||
|
|
|
||||||
162
message.py
162
message.py
|
|
@ -1,17 +1,95 @@
|
||||||
#!/usr/bin/python2.7
|
|
||||||
# coding=utf-8
|
# coding=utf-8
|
||||||
|
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
from datetime import timedelta
|
||||||
import re
|
import re
|
||||||
import socket
|
import sys
|
||||||
import string
|
import string
|
||||||
import time
|
import time
|
||||||
import imp
|
import imp
|
||||||
|
import random
|
||||||
|
from xml.dom.minidom import parse
|
||||||
|
from xml.dom.minidom import parseString
|
||||||
|
from xml.dom.minidom import getDOMImplementation
|
||||||
|
|
||||||
|
BANLIST = []
|
||||||
|
CREDITS = {}
|
||||||
|
filename = ""
|
||||||
|
|
||||||
|
def load_module(datas_path):
|
||||||
|
global BANLIST, CREDITS, filename
|
||||||
|
CREDITS = dict ()
|
||||||
|
|
||||||
|
BANLIST = list ()
|
||||||
|
filename = datas_path + "/general.xml"
|
||||||
|
|
||||||
|
sys.stdout.write ("Loading banlist ... ")
|
||||||
|
dom = parse(filename)
|
||||||
|
for item in dom.documentElement.getElementsByTagName("ban"):
|
||||||
|
BANLIST.append(item.getAttribute("name"))
|
||||||
|
print ("done (%d users banned)" % (len(BANLIST)))
|
||||||
|
|
||||||
|
|
||||||
|
def save_module():
|
||||||
|
global BANLIST, ALIAS, filename
|
||||||
|
sys.stdout.write ("Saving banlist ... ")
|
||||||
|
|
||||||
|
impl = getDOMImplementation()
|
||||||
|
newdoc = impl.createDocument(None, 'global', None)
|
||||||
|
top = newdoc.documentElement
|
||||||
|
|
||||||
|
for name in BANLIST:
|
||||||
|
item = parseString ('<ban name="%s" />' % (name)).documentElement
|
||||||
|
top.appendChild(item);
|
||||||
|
|
||||||
|
with open(filename, "w") as f:
|
||||||
|
newdoc.writexml (f)
|
||||||
|
print ("done")
|
||||||
|
|
||||||
|
|
||||||
|
class Credits:
|
||||||
|
def __init__ (self, name):
|
||||||
|
self.name = name
|
||||||
|
self.credits = 5
|
||||||
|
self.randsec = timedelta(seconds=random.randint(0, 55))
|
||||||
|
self.lastmessage = datetime.now() + self.randsec
|
||||||
|
self.iask = True
|
||||||
|
|
||||||
|
def ask(self):
|
||||||
|
if self.name in BANLIST:
|
||||||
|
return False
|
||||||
|
|
||||||
|
now = datetime.now() + self.randsec
|
||||||
|
if self.lastmessage.minute == now.minute and (self.lastmessage.second == now.second or self.lastmessage.second == now.second - 1):
|
||||||
|
print("AUTOBAN %s: too low time between messages" % self.name)
|
||||||
|
BANLIST.append(self.name)
|
||||||
|
#self.credits -= self.credits / 2 #Une alternative
|
||||||
|
return False
|
||||||
|
|
||||||
|
self.iask = True
|
||||||
|
return self.credits > 0 or self.lastmessage.minute != now.minute
|
||||||
|
|
||||||
|
def speak(self):
|
||||||
|
if self.iask:
|
||||||
|
self.iask = False
|
||||||
|
now = datetime.now() + self.randsec
|
||||||
|
if self.lastmessage.minute != now.minute:
|
||||||
|
self.credits = min (15, self.credits + 5)
|
||||||
|
self.lastmessage = now
|
||||||
|
|
||||||
|
self.credits -= 1
|
||||||
|
return self.credits > -3
|
||||||
|
|
||||||
|
def to_string(self):
|
||||||
|
print ("%s: %d ; reset: %d" % (self.name, self.credits, self.randsec.seconds))
|
||||||
|
|
||||||
|
|
||||||
class Message:
|
class Message:
|
||||||
def __init__ (self, srv, line):
|
def __init__ (self, srv, line):
|
||||||
self.srv = srv
|
self.srv = srv
|
||||||
self.time = datetime.now ()
|
self.time = datetime.now ()
|
||||||
|
self.channel = ""
|
||||||
|
self.content = ""
|
||||||
line = line.rstrip() #remove trailing 'rn'
|
line = line.rstrip() #remove trailing 'rn'
|
||||||
|
|
||||||
if line.find(' PRIVMSG ') != -1: #Call a parsing function
|
if line.find(' PRIVMSG ') != -1: #Call a parsing function
|
||||||
|
|
@ -20,6 +98,17 @@ class Message:
|
||||||
|
|
||||||
self.cmd = "PRIVMSG"
|
self.cmd = "PRIVMSG"
|
||||||
self.sender = (info[0].split('!'))[0]
|
self.sender = (info[0].split('!'))[0]
|
||||||
|
self.realname = (info[0].split('!'))[1]
|
||||||
|
self.channel = info[2]
|
||||||
|
self.content = complete[1]
|
||||||
|
|
||||||
|
elif line.find(' ACTION ') != -1:
|
||||||
|
complete = line[1:].split(':',1) #Parse the message into useful data
|
||||||
|
info = complete[0].split(' ')
|
||||||
|
|
||||||
|
self.cmd = "ACTION"
|
||||||
|
self.sender = (info[0].split('!'))[0]
|
||||||
|
self.realname = (info[0].split('!'))[1]
|
||||||
self.channel = info[2]
|
self.channel = info[2]
|
||||||
self.content = complete[1]
|
self.content = complete[1]
|
||||||
|
|
||||||
|
|
@ -30,6 +119,7 @@ class Message:
|
||||||
|
|
||||||
self.cmd = "NICK"
|
self.cmd = "NICK"
|
||||||
self.sender = (info[0].split('!'))[0]
|
self.sender = (info[0].split('!'))[0]
|
||||||
|
self.realname = (info[0].split('!'))[1]
|
||||||
self.content = complete[1]
|
self.content = complete[1]
|
||||||
else:
|
else:
|
||||||
self.cmd = "NONE"
|
self.cmd = "NONE"
|
||||||
|
|
@ -41,6 +131,7 @@ class Message:
|
||||||
|
|
||||||
self.cmd = "JOIN"
|
self.cmd = "JOIN"
|
||||||
self.sender = (info[0].split('!'))[0]
|
self.sender = (info[0].split('!'))[0]
|
||||||
|
self.realname = (info[0].split('!'))[1]
|
||||||
self.channel = complete[1]
|
self.channel = complete[1]
|
||||||
else:
|
else:
|
||||||
self.cmd = "NONE"
|
self.cmd = "NONE"
|
||||||
|
|
@ -51,12 +142,23 @@ class Message:
|
||||||
|
|
||||||
self.cmd = "PART"
|
self.cmd = "PART"
|
||||||
self.sender = (info[0].split('!'))[0]
|
self.sender = (info[0].split('!'))[0]
|
||||||
|
self.realname = (info[0].split('!'))[1]
|
||||||
self.channel = info[2]
|
self.channel = info[2]
|
||||||
if len (complete) > 1:
|
if len (complete) > 1:
|
||||||
self.content = complete[1]
|
self.content = complete[1]
|
||||||
else:
|
else:
|
||||||
self.content = ""
|
self.content = ""
|
||||||
|
|
||||||
|
elif line.find(' MODE ') != -1:
|
||||||
|
complete = line[1:].split(' ')
|
||||||
|
if len(complete) >= 5:
|
||||||
|
self.cmd = "MODE"
|
||||||
|
self.channel = complete[2]
|
||||||
|
self.mode = complete[3]
|
||||||
|
self.sender = complete[4]
|
||||||
|
else:
|
||||||
|
self.cmd = "NONE"
|
||||||
|
|
||||||
elif line.find(' PING ') != -1: #If server pings then pong
|
elif line.find(' PING ') != -1: #If server pings then pong
|
||||||
line = line.split()
|
line = line.split()
|
||||||
|
|
||||||
|
|
@ -69,26 +171,41 @@ class Message:
|
||||||
|
|
||||||
|
|
||||||
def send_msg (self, channel, msg, cmd = "PRIVMSG", endl = "\r\n"):
|
def send_msg (self, channel, msg, cmd = "PRIVMSG", endl = "\r\n"):
|
||||||
self.srv.send_msg (channel, msg, cmd, endl)
|
if CREDITS[self.realname].speak():
|
||||||
|
self.srv.send_msg (channel, msg, cmd, endl)
|
||||||
|
|
||||||
def send_global (self, msg, cmd = "PRIVMSG", endl = "\r\n"):
|
def send_global (self, msg, cmd = "PRIVMSG", endl = "\r\n"):
|
||||||
self.srv.send_global (msg, cmd, endl)
|
if CREDITS[self.realname].speak():
|
||||||
|
self.srv.send_global (msg, cmd, endl)
|
||||||
|
|
||||||
def send_chn (self, msg):
|
def send_chn (self, msg):
|
||||||
"""Send msg on the same channel as receive message"""
|
"""Send msg on the same channel as receive message"""
|
||||||
self.srv.send_msg (self.channel, msg)
|
if CREDITS[self.realname].speak():
|
||||||
|
if self.channel == self.srv.nick:
|
||||||
|
self.send_snd (msg)
|
||||||
|
else:
|
||||||
|
self.srv.send_msg (self.channel, msg)
|
||||||
|
|
||||||
def send_snd (self, msg):
|
def send_snd (self, msg):
|
||||||
"""Send msg to the sender who send the original message"""
|
"""Send msg to the sender who send the original message"""
|
||||||
self.srv.send_msg (self.sender, msg)
|
if CREDITS[self.realname].speak():
|
||||||
|
self.srv.send_msg_usr (self.sender, msg)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def authorize (self):
|
||||||
|
if self.realname not in CREDITS:
|
||||||
|
CREDITS[self.realname] = Credits(self.realname)
|
||||||
|
elif self.content[0] == '`':
|
||||||
|
return True
|
||||||
|
elif not CREDITS[self.realname].ask():
|
||||||
|
return False
|
||||||
|
return self.srv.accepted_channel(self.channel)
|
||||||
|
|
||||||
def treat (self, mods):
|
def treat (self, mods):
|
||||||
if self.cmd == "PING":
|
if self.cmd == "PING":
|
||||||
self.pong ()
|
self.pong ()
|
||||||
elif self.cmd == "PRIVMSG" and self.srv.accepted_channel(self.channel):
|
elif self.cmd == "PRIVMSG" and self.authorize():
|
||||||
self.parsemsg (mods)
|
self.parsemsg (mods)
|
||||||
elif self.cmd == "NICK":
|
elif self.cmd == "NICK":
|
||||||
print ("%s change de nom pour %s" % (self.sender, self.content))
|
print ("%s change de nom pour %s" % (self.sender, self.content))
|
||||||
|
|
@ -102,6 +219,12 @@ class Message:
|
||||||
self.srv.s.send(("PONG %s\r\n" % self.content).encode ())
|
self.srv.s.send(("PONG %s\r\n" % self.content).encode ())
|
||||||
|
|
||||||
|
|
||||||
|
def reparsemsg(self):
|
||||||
|
if self.mods is not None:
|
||||||
|
self.parsemsg(self.mods)
|
||||||
|
else:
|
||||||
|
print ("Can't reparse message")
|
||||||
|
|
||||||
def parsemsg (self, mods):
|
def parsemsg (self, mods):
|
||||||
#Treat all messages starting with 'nemubot:' as distinct commands
|
#Treat all messages starting with 'nemubot:' as distinct commands
|
||||||
if self.content.find("%s:"%self.srv.nick) == 0:
|
if self.content.find("%s:"%self.srv.nick) == 0:
|
||||||
|
|
@ -124,12 +247,10 @@ class Message:
|
||||||
|
|
||||||
elif re.match(".*di[st] sur (#[a-zA-Z0-9]+) (.+)$", self.content) is not None:
|
elif re.match(".*di[st] sur (#[a-zA-Z0-9]+) (.+)$", self.content) is not None:
|
||||||
result = re.match(".*di[st] sur (#[a-zA-Z0-9]+) (.+)$", self.content)
|
result = re.match(".*di[st] sur (#[a-zA-Z0-9]+) (.+)$", self.content)
|
||||||
if self.srv.channels.count(result.group(1)):
|
self.send_msg(result.group(1), result.group(2))
|
||||||
self.send_msg(result.group(1), result.group(2))
|
|
||||||
elif re.match(".*di[st] (.+) sur (#[a-zA-Z0-9]+)$", self.content) is not None:
|
elif re.match(".*di[st] (.+) sur (#[a-zA-Z0-9]+)$", self.content) is not None:
|
||||||
result = re.match(".*di[st] (.+) sur (#[a-zA-Z0-9]+)$", self.content)
|
result = re.match(".*di[st] (.+) sur (#[a-zA-Z0-9]+)$", self.content)
|
||||||
if self.srv.channels.count(result.group(2)):
|
self.send_msg(result.group(2), result.group(1))
|
||||||
self.send_msg(result.group(2), result.group(1))
|
|
||||||
|
|
||||||
#Try modules
|
#Try modules
|
||||||
else:
|
else:
|
||||||
|
|
@ -153,8 +274,27 @@ class Message:
|
||||||
self.send_snd ("Usage: `reload /module/.")
|
self.send_snd ("Usage: `reload /module/.")
|
||||||
self.send_snd ("Loaded modules: " + ', '.join(mods.keys()) + ".")
|
self.send_snd ("Loaded modules: " + ', '.join(mods.keys()) + ".")
|
||||||
|
|
||||||
|
elif self.cmd[0] == "ban":
|
||||||
|
if len(self.cmd) > 1:
|
||||||
|
BANLIST.append(self.cmd[1])
|
||||||
|
else:
|
||||||
|
print (BANLIST)
|
||||||
|
elif self.cmd[0] == "banlist":
|
||||||
|
print (BANLIST)
|
||||||
|
elif self.cmd[0] == "unban":
|
||||||
|
if len(self.cmd) > 1:
|
||||||
|
BANLIST.remove(self.cmd[1])
|
||||||
|
|
||||||
|
elif self.cmd[0] == "credits":
|
||||||
|
if len(self.cmd) > 1 and self.cmd[1] in CREDITS:
|
||||||
|
self.send_chn ("%s a %d crédits." % (self.cmd[1], CREDITS[self.cmd[1]]))
|
||||||
|
else:
|
||||||
|
for c in CREDITS.keys():
|
||||||
|
print (CREDITS[c].to_string())
|
||||||
|
|
||||||
#Messages stating with !
|
#Messages stating with !
|
||||||
elif self.content[0] == '!':
|
elif self.content[0] == '!':
|
||||||
|
self.mods = mods
|
||||||
self.cmd = self.content[1:].split(' ')
|
self.cmd = self.content[1:].split(' ')
|
||||||
if self.cmd[0] == "help":
|
if self.cmd[0] == "help":
|
||||||
if len (self.cmd) > 1:
|
if len (self.cmd) > 1:
|
||||||
|
|
|
||||||
110
nemubot.py
110
nemubot.py
|
|
@ -10,10 +10,10 @@ 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", "watchWebsite", "soutenance", "whereis"]
|
imports = ["birthday", "qd", "events", "youtube", "watchWebsite", "soutenance", "whereis", "alias"]
|
||||||
imports_launch = ["watchWebsite"]
|
imports_launch = ["watchWebsite"]
|
||||||
mods = {}
|
mods = {}
|
||||||
import server
|
import server, message
|
||||||
|
|
||||||
if len(sys.argv) != 2 and len(sys.argv) != 3:
|
if len(sys.argv) != 2 and len(sys.argv) != 3:
|
||||||
print ("This script takes exactly 1 arg: a XML config file")
|
print ("This script takes exactly 1 arg: a XML config file")
|
||||||
|
|
@ -26,6 +26,9 @@ def onSignal(signum, frame):
|
||||||
for imp in mods.keys():
|
for imp in mods.keys():
|
||||||
mods[imp].save_module ()
|
mods[imp].save_module ()
|
||||||
|
|
||||||
|
#Save banlist before quit
|
||||||
|
message.save_module ()
|
||||||
|
|
||||||
sys.exit (0)
|
sys.exit (0)
|
||||||
signal.signal(signal.SIGINT, onSignal)
|
signal.signal(signal.SIGINT, onSignal)
|
||||||
|
|
||||||
|
|
@ -33,12 +36,13 @@ if len(sys.argv) == 3:
|
||||||
basedir = sys.argv[2]
|
basedir = sys.argv[2]
|
||||||
else:
|
else:
|
||||||
basedir = "./"
|
basedir = "./"
|
||||||
print (basedir, len(sys.argv))
|
|
||||||
|
|
||||||
dom = parse(sys.argv[1])
|
dom = parse(sys.argv[1])
|
||||||
config = dom.getElementsByTagName('config')[0]
|
config = dom.getElementsByTagName('config')[0]
|
||||||
servers = list ()
|
servers = list ()
|
||||||
|
|
||||||
|
message.load_module (basedir + "/datas/")
|
||||||
|
|
||||||
for imp in imports:
|
for imp in imports:
|
||||||
mod = __import__ (imp)
|
mod = __import__ (imp)
|
||||||
mods[imp] = mod
|
mods[imp] = mod
|
||||||
|
|
@ -59,103 +63,3 @@ while prompt != "quit":
|
||||||
prompt=sys.stdin.readlines ()
|
prompt=sys.stdin.readlines ()
|
||||||
|
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
|
|
||||||
def parsemsg(msg):
|
|
||||||
global birthdays, score42
|
|
||||||
complete = msg[1:].split(':',1) #Parse the message into useful data
|
|
||||||
info = complete[0].split(' ')
|
|
||||||
msgpart = complete[1]
|
|
||||||
sender = info[0].split('!')
|
|
||||||
|
|
||||||
if len(msgpart) <= 0:
|
|
||||||
return
|
|
||||||
|
|
||||||
qd.go (s, sender, msgpart, info[2])
|
|
||||||
|
|
||||||
if CHANLIST.find(info[2]) != -1 and re.match(".*(norme|coding style).*", msgpart) is not None and re.match(".*(please|give|obtenir|now|plz|stp|svp|s'il (te|vous) pla.t|check).*", msgpart) is not None:
|
|
||||||
norme.launch (s, sender, msgpart)
|
|
||||||
|
|
||||||
elif CHANLIST.find(info[2]) != -1 and msgpart[0] == '!': #Treat all messages starting with '!' as command
|
|
||||||
cmd = msgpart[1:].split(' ')
|
|
||||||
if cmd[0] == 'help' or cmd[0] == 'h':
|
|
||||||
s.send("PRIVMSG %s :Pour me demander quelque chose, commencer votre message par !.\nVoici ce dont je suis capable :\r\n"%(sender[0]))
|
|
||||||
s.send("PRIVMSG %s : - !new-year !newyear !ny : Affiche le temps restant avant la nouvelle année\r\n"%(sender[0]))
|
|
||||||
s.send("PRIVMSG %s : - !end-of-world !worldend !eow : Temps restant avant la fin du monde\r\n"%(sender[0]))
|
|
||||||
s.send("PRIVMSG %s : - !weekend !week-end !we : Affiche le temps restant avant le prochain week-end\r\n"%(sender[0]))
|
|
||||||
s.send("PRIVMSG %s : - !partiels : Affiche le temps restant avant les prochains partiels\r\n"%(sender[0]))
|
|
||||||
s.send("PRIVMSG %s : - !vacs !vacances !holidays !free-time : Affiche le temps restant avant les prochaines vacances\r\n"%(sender[0]))
|
|
||||||
s.send("PRIVMSG %s : - !jpo !next-jpo : Affiche le temps restant avant la prochaine JPO\r\n"%(sender[0]))
|
|
||||||
s.send("PRIVMSG %s : - !42 !scores : Affiche les scores des gens\r\n"%(sender[0]))
|
|
||||||
|
|
||||||
if cmd[0] == 'score' or cmd[0] == 'scores' or cmd[0] == '42':
|
|
||||||
qd.scores(s, cmd, info[2])
|
|
||||||
|
|
||||||
if cmd[0] == 'chronos' or cmd[0] == 'edt' or cmd[0] == 'cours':
|
|
||||||
s.send("PRIVMSG %s :chronos\r\n"%(info[2]))
|
|
||||||
|
|
||||||
|
|
||||||
if cmd[0] == 'jpo' or cmd[0] == 'JPO' or cmd[0] == 'next-jpo':
|
|
||||||
#ndate = datetime(2012, 5, 12, 8, 30, 1)
|
|
||||||
#ndate = datetime(2012, 3, 31, 8, 30, 1)
|
|
||||||
ndate = datetime(2012, 3, 17, 8, 30, 1)
|
|
||||||
#ndate = datetime(2012, 2, 4, 8, 30, 1)
|
|
||||||
newyear.launch (s, info[2], ndate, ["Il reste%s avant la prochaine JPO... We want you!", "Nous somme en pleine JPO depuis%s"], cmd)
|
|
||||||
if cmd[0] == 'professional-project' or cmd[0] == 'project-professionnel' or cmd[0] == 'projet-professionnel' or cmd[0] == 'project-professionel' or cmd[0] == 'tc' or cmd[0] == 'next-rendu' or cmd[0] == 'rendu':
|
|
||||||
ndate = datetime(2012, 3, 18, 23, 42, 1)
|
|
||||||
newyear.launch (s, info[2], ndate, ["Il reste%s avant la fermeture du rendu de TC-5 et de corewar, vite au boulot !", "À %s près, il aurait encore été possible de rendre"], cmd)
|
|
||||||
|
|
||||||
|
|
||||||
elif msgpart[0] == '`' and sender[0] == OWNER and CHANLIST.find(info[2]) != -1: #Treat all messages starting with '`' as command
|
|
||||||
cmd=msgpart[1:].split(' ')
|
|
||||||
if cmd[0]=='op':
|
|
||||||
s.send("MODE %s +o %s\r\n" % (info[2], cmd[1]))
|
|
||||||
if cmd[0]=='deop':
|
|
||||||
s.send("MODE %s -o %s\r\n" % (info[2], cmd[1]))
|
|
||||||
if cmd[0]=='voice':
|
|
||||||
s.send('MODE '+info[2]+' +v '+cmd[1]+'n')
|
|
||||||
if cmd[0]=='devoice':
|
|
||||||
s.send('MODE '+info[2]+' -v '+cmd[1]+'n')
|
|
||||||
if cmd[0]=='restart':
|
|
||||||
print ("Restarting thread")
|
|
||||||
launch(s)
|
|
||||||
if cmd[0]=='stop':
|
|
||||||
print ("Bye!")
|
|
||||||
s.send("PRIVMSG %s :Bye!\r\n"%(info[2]))
|
|
||||||
sys.exit (0)
|
|
||||||
if cmd[0]=='sys':
|
|
||||||
syscmd(msgpart[1:],info[2])
|
|
||||||
|
|
||||||
if msgpart[0]=='-' and sender[0]==OWNER : #Treat msgs with - as explicit command to send to server
|
|
||||||
cmd=msgpart[1:]
|
|
||||||
#s.send(cmd+'n')
|
|
||||||
print ('cmd='+cmd)
|
|
||||||
|
|
||||||
def read():
|
|
||||||
global s, readbuffer
|
|
||||||
while 1:
|
|
||||||
readbuffer = readbuffer + s.recv(1024) #recieve server messages
|
|
||||||
temp = readbuffer.split("\n")
|
|
||||||
readbuffer = temp.pop( )
|
|
||||||
#signal.signal(signal.SIGHUP, onSignal)
|
|
||||||
|
|
||||||
for line in temp:
|
|
||||||
print (line)
|
|
||||||
line = line.rstrip() #remove trailing 'rn'
|
|
||||||
|
|
||||||
if line.find('PRIVMSG') != -1: #Call a parsing function
|
|
||||||
parsemsg(line)
|
|
||||||
|
|
||||||
line = line.split()
|
|
||||||
|
|
||||||
if(line[0] == 'PING'): #If server pings then pong
|
|
||||||
s.send("PONG %s\r\n" % line[1])
|
|
||||||
|
|
||||||
def launch(s):
|
|
||||||
# thread.start_new_thread(ontime.startThread, (s,datetime(2012, 1, 18, 6, 0, 1),["Il reste%s avant la fin de Wikipédia", "C'est fini, Wikipédia a sombrée depuis%s"],CHANLIST))
|
|
||||||
# thread.start_new_thread(ontime.startThread, (s,datetime(2012, 2, 23, 0, 0, 1),[],CHANLIST))
|
|
||||||
thread.start_new_thread(watchWebsite.startThread, (s, "you.p0m.fr", "", "#42sh #epitaguele", "Oh, quelle est cette nouvelle image sur http://you.p0m.fr/ ? :p"))
|
|
||||||
thread.start_new_thread(watchWebsite.startThread, (s, "intra.nbr23.com", "", "#42sh", "Oh, quel est ce nouveau film sur http://intra.nbr23.com/ ? :p"))
|
|
||||||
print ("Launched successfuly")
|
|
||||||
|
|
||||||
launch(s)
|
|
||||||
read()
|
|
||||||
|
|
|
||||||
173
nemuspeak.py
173
nemuspeak.py
|
|
@ -1,9 +1,8 @@
|
||||||
#!/usr/bin/python2.7
|
#!/usr/bin/python3
|
||||||
# coding=utf-8
|
# coding=utf-8
|
||||||
|
|
||||||
import sys
|
import sys
|
||||||
import socket
|
import socket
|
||||||
import string
|
|
||||||
import signal
|
import signal
|
||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
|
|
@ -11,10 +10,10 @@ import subprocess
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from datetime import timedelta
|
from datetime import timedelta
|
||||||
from xml.dom.minidom import parse
|
from xml.dom.minidom import parse
|
||||||
import thread
|
import _thread
|
||||||
|
|
||||||
if len(sys.argv) <= 1:
|
if len(sys.argv) <= 1:
|
||||||
print "This script takes exactly 1 arg: a XML config file"
|
print ("This script takes exactly 1 arg: a XML config file")
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
def onSignal(signum, frame):
|
def onSignal(signum, frame):
|
||||||
|
|
@ -22,13 +21,19 @@ def onSignal(signum, frame):
|
||||||
sys.exit (0)
|
sys.exit (0)
|
||||||
signal.signal(signal.SIGINT, onSignal)
|
signal.signal(signal.SIGINT, onSignal)
|
||||||
|
|
||||||
|
if len(sys.argv) == 3:
|
||||||
|
basedir = sys.argv[2]
|
||||||
|
else:
|
||||||
|
basedir = "./"
|
||||||
|
|
||||||
|
import message
|
||||||
|
|
||||||
SMILEY = list()
|
SMILEY = list()
|
||||||
CORRECTIONS = list()
|
CORRECTIONS = list()
|
||||||
g_queue = list()
|
g_queue = list()
|
||||||
talkEC = 0
|
talkEC = 0
|
||||||
stopSpk = 0
|
stopSpk = 0
|
||||||
lastmsg = []
|
lastmsg = None
|
||||||
|
|
||||||
dom = parse(sys.argv[1])
|
dom = parse(sys.argv[1])
|
||||||
|
|
||||||
|
|
@ -57,13 +62,14 @@ for correct in config.getElementsByTagName('correction'):
|
||||||
CORRECTIONS.append((" " + (correct.getAttribute("bad") + " "), (" " + correct.getAttribute("good") + " ")))
|
CORRECTIONS.append((" " + (correct.getAttribute("bad") + " "), (" " + correct.getAttribute("good") + " ")))
|
||||||
print ("%d corrections loaded"%len(CORRECTIONS))
|
print ("%d corrections loaded"%len(CORRECTIONS))
|
||||||
|
|
||||||
|
|
||||||
def speak(endstate):
|
def speak(endstate):
|
||||||
global lastmsg, g_queue, talkEC, stopSpk
|
global lastmsg, g_queue, talkEC, stopSpk
|
||||||
talkEC = 1
|
talkEC = 1
|
||||||
stopSpk = 0
|
stopSpk = 0
|
||||||
|
|
||||||
if len(lastmsg) < 1:
|
if lastmsg is None:
|
||||||
lastmsg = g_queue.pop(0)
|
lastmsg = message.Message(None, "")
|
||||||
|
|
||||||
while not stopSpk and len(g_queue) > 0:
|
while not stopSpk and len(g_queue) > 0:
|
||||||
msg = g_queue.pop(0)
|
msg = g_queue.pop(0)
|
||||||
|
|
@ -71,51 +77,55 @@ def speak(endstate):
|
||||||
sentence = ""
|
sentence = ""
|
||||||
force = 0
|
force = 0
|
||||||
|
|
||||||
if force or msg[2] - lastmsg[2] > timedelta(0, 500):
|
#Skip identic body
|
||||||
sentence += "A {0} heure {1} : ".format(msg[2].hour, msg[2].minute)
|
if msg.content == lastmsg.content:
|
||||||
|
continue
|
||||||
|
|
||||||
|
if force or msg.time - lastmsg.time > timedelta(0, 500):
|
||||||
|
sentence += "A {0} heure {1} : ".format(msg.time.hour, msg.time.minute)
|
||||||
force = 1
|
force = 1
|
||||||
|
|
||||||
if force or msg[0] != lastmsg[0]:
|
if force or msg.channel != lastmsg.channel:
|
||||||
if msg[0] == OWNER:
|
if msg.channel == OWNER:
|
||||||
sentence += "En message priver. " #Just to avoid é :p
|
sentence += "En message priver. " #Just to avoid é :p
|
||||||
else:
|
else:
|
||||||
sentence += "Sur " + msg[0] + ". "
|
sentence += "Sur " + msg.channel + ". "
|
||||||
force = 1
|
force = 1
|
||||||
|
|
||||||
action = 0
|
action = 0
|
||||||
if msg[3].find("ACTION ") == 1:
|
if msg.content.find("ACTION ") == 1:
|
||||||
sentence += msg[1] + " "
|
sentence += msg.sender + " "
|
||||||
msg[3] = msg[3].replace("ACTION ", "")
|
msg.content = msg.content.replace("ACTION ", "")
|
||||||
action = 1
|
action = 1
|
||||||
for (txt, mood) in SMILEY:
|
for (txt, mood) in SMILEY:
|
||||||
if msg[3].find(txt) >= 0:
|
if msg.content.find(txt) >= 0:
|
||||||
sentence += msg[1] + (" %s : "%mood)
|
sentence += msg.sender + (" %s : "%mood)
|
||||||
msg[3] = msg[3].replace(txt, "")
|
msg.content = msg.content.replace(txt, "")
|
||||||
action = 1
|
action = 1
|
||||||
break
|
break
|
||||||
|
|
||||||
for (bad, good) in CORRECTIONS:
|
for (bad, good) in CORRECTIONS:
|
||||||
if msg[3].find(bad) >= 0:
|
if msg.content.find(bad) >= 0:
|
||||||
msg[3] = (" " + msg[3] + " ").replace(bad, good)
|
msg.content = (" " + msg.content + " ").replace(bad, good)
|
||||||
|
|
||||||
if action == 0 and (force or msg[1] != lastmsg[1]):
|
if action == 0 and (force or msg.sender != lastmsg.sender):
|
||||||
sentence += msg[1] + " dit : "
|
sentence += msg.sender + " dit : "
|
||||||
|
|
||||||
if re.match(".*(https?://)?(www\\.)?ycc.fr/[a-z0-9A-Z]+.*", msg[3]) is not None:
|
if re.match(".*(https?://)?(www\\.)?ycc.fr/[a-z0-9A-Z]+.*", msg.content) is not None:
|
||||||
msg[3] = re.sub("(https?://)?(www\\.)?ycc.fr/[a-z0-9A-Z]+", " U.R.L Y.C.C ", msg[3])
|
msg.content = re.sub("(https?://)?(www\\.)?ycc.fr/[a-z0-9A-Z]+", " U.R.L Y.C.C ", msg.content)
|
||||||
|
|
||||||
if re.match(".*https?://.*", msg[3]) is not None:
|
if re.match(".*https?://.*", msg.content) is not None:
|
||||||
msg[3] = re.sub(r'https?://[^ ]+', " U.R.L ", msg[3])
|
msg.content = re.sub(r'https?://[^ ]+', " U.R.L ", msg.content)
|
||||||
|
|
||||||
if re.match("^ *[^a-zA-Z0-9 ][a-zA-Z]{2}[^a-zA-Z0-9 ]", msg[3]) is not None:
|
if re.match("^ *[^a-zA-Z0-9 ][a-zA-Z]{2}[^a-zA-Z0-9 ]", msg.content) is not None:
|
||||||
if sentence != "":
|
if sentence != "":
|
||||||
intro = subprocess.call(["espeak", "-v", "fr", sentence])
|
intro = subprocess.call(["espeak", "-v", "fr", sentence])
|
||||||
#intro.wait()
|
#intro.wait()
|
||||||
|
|
||||||
lang = msg[3][1:3].lower()
|
lang = msg.content[1:3].lower()
|
||||||
sentence = msg[3][4:]
|
sentence = msg.content[4:]
|
||||||
else:
|
else:
|
||||||
sentence += msg[3]
|
sentence += msg.content
|
||||||
|
|
||||||
spk = subprocess.call(["espeak", "-v", lang, sentence])
|
spk = subprocess.call(["espeak", "-v", lang, sentence])
|
||||||
#spk.wait()
|
#spk.wait()
|
||||||
|
|
@ -128,74 +138,6 @@ def speak(endstate):
|
||||||
talkEC = 1
|
talkEC = 1
|
||||||
|
|
||||||
|
|
||||||
def parsemsg (msg, CHANLIST):
|
|
||||||
global g_queue, NICK, stopSpk, talkEC
|
|
||||||
complete = msg[1:].split(':',1) #Parse the message into useful data
|
|
||||||
info = complete[0].split(' ')
|
|
||||||
msgpart = complete[1]
|
|
||||||
sender = info[0].split('!')
|
|
||||||
|
|
||||||
#Skip on empty content
|
|
||||||
if len(msgpart) <= 0:
|
|
||||||
return
|
|
||||||
|
|
||||||
#Bad format, try to fix that
|
|
||||||
if len(info) == 1:
|
|
||||||
pv = msg.index(" ", msg.index("PRIVMSG") + 9)
|
|
||||||
complete = [ msg[1:pv], msg[pv:] ]
|
|
||||||
info = complete[0].split(' ')
|
|
||||||
msgpart = complete[1].strip()
|
|
||||||
if msgpart[0] == ":":
|
|
||||||
msgpart = msgpart[1:]
|
|
||||||
sender = info[0].split('!')
|
|
||||||
|
|
||||||
if len(CHANLIST) == 0 or CHANLIST.count(info[2]) >= 0 or info[2] == NICK:
|
|
||||||
#Treat all messages starting with '`' as command
|
|
||||||
if msgpart[0] == '`' and sender[0] == OWNER:
|
|
||||||
cmd=msgpart[1:].split(' ')
|
|
||||||
|
|
||||||
if cmd[0] == 'stop':
|
|
||||||
print "Bye!"
|
|
||||||
sys.exit (0)
|
|
||||||
|
|
||||||
elif cmd[0] == 'speak':
|
|
||||||
thread.start_new_thread(speak, (0,))
|
|
||||||
|
|
||||||
elif cmd[0] == 'reset':
|
|
||||||
while len(g_queue) > 0:
|
|
||||||
g_queue.pop()
|
|
||||||
|
|
||||||
elif cmd[0] == 'save':
|
|
||||||
if talkEC == 0:
|
|
||||||
talkEC = 1
|
|
||||||
stopSpk = 1
|
|
||||||
|
|
||||||
elif cmd[0] == 'test':
|
|
||||||
parsemsg(":Quelqun!someone@p0m.fr PRIVMSG %s :Ceci est un message de test ;)"%(CHANLIST[0]), CHANLIST)
|
|
||||||
|
|
||||||
elif cmd[0] == 'list':
|
|
||||||
print "Currently listened channels:"
|
|
||||||
for chan in CHANLIST:
|
|
||||||
print chan
|
|
||||||
print "-- "
|
|
||||||
|
|
||||||
elif cmd[0] == 'add' and len(cmd) > 1:
|
|
||||||
CHANLIST.append(cmd[1])
|
|
||||||
print cmd[1] + " added to listened channels"
|
|
||||||
|
|
||||||
elif cmd[0] == 'del' and len(cmd) > 1:
|
|
||||||
if CHANLIST.count(cmd[1]) > 0:
|
|
||||||
CHANLIST.remove(cmd[1])
|
|
||||||
print cmd[1] + " removed from listened channels"
|
|
||||||
else:
|
|
||||||
print cmd[1] + " not in listened channels"
|
|
||||||
|
|
||||||
elif sender[0] != OWNER and (len(CHANLIST) == 0 or CHANLIST.count(info[2]) > 0 or info[2] == OWNER):
|
|
||||||
g_queue.append([info[2], sender[0], datetime.now(), msgpart])
|
|
||||||
if talkEC == 0:
|
|
||||||
thread.start_new_thread(speak, (0,))
|
|
||||||
|
|
||||||
|
|
||||||
class Server:
|
class Server:
|
||||||
def __init__(self, server):
|
def __init__(self, server):
|
||||||
if server.hasAttribute("server"):
|
if server.hasAttribute("server"):
|
||||||
|
|
@ -216,33 +158,38 @@ class Server:
|
||||||
self.channels.append(channel.getAttribute("name"))
|
self.channels.append(channel.getAttribute("name"))
|
||||||
|
|
||||||
def launch(self):
|
def launch(self):
|
||||||
thread.start_new_thread(self.connect, ())
|
_thread.start_new_thread(self.connect, ())
|
||||||
|
|
||||||
|
def authorize(self, msg):
|
||||||
|
return msg.sender != OWNER and (msg.channel == OWNER or msg.channel in self.channels)
|
||||||
|
|
||||||
def read(self):
|
def read(self):
|
||||||
readbuffer = "" #Here we store all the messages from server
|
readbuffer = "" #Here we store all the messages from server
|
||||||
while 1:
|
while 1:
|
||||||
readbuffer = readbuffer + self.s.recv(1024) #recieve server messages
|
try:
|
||||||
|
readbuffer = readbuffer + self.s.recv(1024).decode() #recieve server messages
|
||||||
|
except UnicodeDecodeError:
|
||||||
|
print ("ERREUR de décodage unicode")
|
||||||
|
continue
|
||||||
temp = readbuffer.split("\n")
|
temp = readbuffer.split("\n")
|
||||||
readbuffer = temp.pop( )
|
readbuffer = temp.pop( )
|
||||||
|
|
||||||
for line in temp:
|
for line in temp:
|
||||||
line = line.rstrip() #remove trailing 'rn'
|
msg = message.Message(self, line)
|
||||||
|
if msg.cmd == "PING":
|
||||||
if line.find('PRIVMSG') != -1: #Call a parsing function
|
self.s.send(("PONG %s\r\n" % msg.content).encode ())
|
||||||
parsemsg(unicode(line, encoding='utf-8', errors='ignore'), self.channels)
|
elif msg.cmd == "PRIVMSG" and self.authorize(msg):
|
||||||
|
g_queue.append(msg)
|
||||||
line = line.split()
|
if talkEC == 0:
|
||||||
|
_thread.start_new_thread(speak, (0,))
|
||||||
if(line[0] == 'PING'): #If server pings then pong
|
|
||||||
self.s.send("PONG %s\r\n" % line[1])
|
|
||||||
|
|
||||||
def connect(self):
|
def connect(self):
|
||||||
self.s = socket.socket( ) #Create the socket
|
self.s = socket.socket( ) #Create the socket
|
||||||
self.s.connect((self.host, self.port)) #Connect to server
|
self.s.connect((self.host, self.port)) #Connect to server
|
||||||
if self.password != None:
|
if self.password != None:
|
||||||
self.s.send("PASS %s\r\n" % self.password)
|
self.s.send(("PASS %s\r\n" % self.password).encode())
|
||||||
self.s.send("NICK %s\r\n" % NICK)
|
self.s.send(("NICK %s\r\n" % NICK).encode())
|
||||||
self.s.send("USER %s %s bla :%s\r\n" % (NICK, self.host, REALNAME))
|
self.s.send(("USER %s %s bla :%s\r\n" % (NICK, self.host, REALNAME)).encode())
|
||||||
self.read()
|
self.read()
|
||||||
|
|
||||||
for server in config.getElementsByTagName('server'):
|
for server in config.getElementsByTagName('server'):
|
||||||
|
|
@ -250,7 +197,7 @@ for server in config.getElementsByTagName('server'):
|
||||||
srv.launch()
|
srv.launch()
|
||||||
|
|
||||||
def sighup_h(signum, frame):
|
def sighup_h(signum, frame):
|
||||||
print "Signal reçu..."
|
print ("Signal reçu...")
|
||||||
if os.path.exists("/tmp/isPresent"):
|
if os.path.exists("/tmp/isPresent"):
|
||||||
thread.start_new_thread(speak, (0,))
|
thread.start_new_thread(speak, (0,))
|
||||||
else:
|
else:
|
||||||
|
|
|
||||||
61
qd.py
61
qd.py
|
|
@ -57,35 +57,27 @@ class Score:
|
||||||
def playFtt(self):
|
def playFtt(self):
|
||||||
if self.canPlay():
|
if self.canPlay():
|
||||||
self.ftt += 1
|
self.ftt += 1
|
||||||
self.last = datetime.now()
|
|
||||||
def playTwt(self):
|
def playTwt(self):
|
||||||
if self.canPlay():
|
if self.canPlay():
|
||||||
self.twt += 1
|
self.twt += 1
|
||||||
self.last = datetime.now()
|
|
||||||
def playPi(self):
|
def playPi(self):
|
||||||
if self.canPlay():
|
if self.canPlay():
|
||||||
self.pi += 1
|
self.pi += 1
|
||||||
self.last = datetime.now()
|
|
||||||
def playNoutfound(self):
|
def playNoutfound(self):
|
||||||
if self.canPlay():
|
if self.canPlay():
|
||||||
self.notfound += 1
|
self.notfound += 1
|
||||||
self.last = datetime.now()
|
|
||||||
def playTen(self):
|
def playTen(self):
|
||||||
if self.canPlay():
|
if self.canPlay():
|
||||||
self.tententen += 1
|
self.tententen += 1
|
||||||
self.last = datetime.now()
|
|
||||||
def playLeet(self):
|
def playLeet(self):
|
||||||
if self.canPlay():
|
if self.canPlay():
|
||||||
self.leet += 1
|
self.leet += 1
|
||||||
self.last = datetime.now()
|
|
||||||
def playGreat(self):
|
def playGreat(self):
|
||||||
if self.canPlay():
|
if self.canPlay():
|
||||||
self.great += 1
|
self.great += 1
|
||||||
self.last = datetime.now()
|
|
||||||
def playBad(self):
|
def playBad(self):
|
||||||
if self.canPlay():
|
if self.canPlay():
|
||||||
self.bad += 1
|
self.bad += 1
|
||||||
self.last = datetime.now()
|
|
||||||
|
|
||||||
def toTuple(self):
|
def toTuple(self):
|
||||||
return (self.ftt, self.twt, self.pi, self.notfound, self.tententen, self.leet, self.great, self.bad)
|
return (self.ftt, self.twt, self.pi, self.notfound, self.tententen, self.leet, self.great, self.bad)
|
||||||
|
|
@ -97,6 +89,7 @@ class Score:
|
||||||
def hasChanged(self):
|
def hasChanged(self):
|
||||||
if self.changed:
|
if self.changed:
|
||||||
self.changed = False
|
self.changed = False
|
||||||
|
self.last = datetime.now()
|
||||||
return True
|
return True
|
||||||
else:
|
else:
|
||||||
return False
|
return False
|
||||||
|
|
@ -186,10 +179,12 @@ def parseanswer (msg):
|
||||||
phrase = " %s n'a encore jamais joué,"%(msg.cmd[1])
|
phrase = " %s n'a encore jamais joué,"%(msg.cmd[1])
|
||||||
else:
|
else:
|
||||||
for nom, scr in sorted(SCORES.items(), key=rev, reverse=True):
|
for nom, scr in sorted(SCORES.items(), key=rev, reverse=True):
|
||||||
if phrase == "":
|
score = scr.score()
|
||||||
phrase = " *%s: %d*,"%(nom, scr.score())
|
if score != 0:
|
||||||
else:
|
if phrase == "":
|
||||||
phrase += " %s: %d,"%(nom, scr.score())
|
phrase = " *%s: %d*,"%(nom, score)
|
||||||
|
else:
|
||||||
|
phrase += " %s: %d,"%(nom, 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
|
||||||
|
|
@ -197,9 +192,9 @@ def parseanswer (msg):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
def win(s, who):
|
def win(msg):
|
||||||
global SCORES, MANCHE
|
global SCORES, MANCHE
|
||||||
who = who.lower()
|
who = msg.sender.lower()
|
||||||
|
|
||||||
(num_manche, winner, nb_points, whosef, dayte) = MANCHE
|
(num_manche, winner, nb_points, whosef, dayte) = MANCHE
|
||||||
|
|
||||||
|
|
@ -207,7 +202,7 @@ def win(s, who):
|
||||||
maxi_name = None
|
maxi_name = None
|
||||||
|
|
||||||
for player in SCORES.keys():
|
for player in SCORES.keys():
|
||||||
scr = score(player)
|
scr = SCORES[player].score()
|
||||||
if scr > maxi_scor:
|
if scr > maxi_scor:
|
||||||
maxi_scor = scr
|
maxi_scor = scr
|
||||||
maxi_name = player
|
maxi_name = player
|
||||||
|
|
@ -216,12 +211,12 @@ 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].newWinner
|
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_chn ("Félicitations %s, tu remportes cette manche terminée par %s, avec un score de %d !"%(maxi_name, who, maxi_scor))
|
||||||
else:
|
else:
|
||||||
msg.send_global ("Félicitations %s, tu remportes cette manche avec %d points !"%(maxi_name, maxi_scor))
|
msg.send_chn ("Félicitations %s, tu remportes cette manche avec %d points !"%(maxi_name, maxi_scor))
|
||||||
|
|
||||||
MANCHE = (num_manche + 1, maxi_name, maxi_scor, who, datetime.now ())
|
MANCHE = (num_manche + 1, maxi_name, maxi_scor, who, datetime.now ())
|
||||||
|
|
||||||
|
|
@ -244,58 +239,58 @@ def parselisten (msg):
|
||||||
# if msg.channel == "#nemutest":
|
# if msg.channel == "#nemutest":
|
||||||
if msg.channel != "#nemutest":
|
if msg.channel != "#nemutest":
|
||||||
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 msg.time.minute == 10 and msg.time.second == 10 and msg.time.hour == 10:
|
||||||
getUser(msg.sender).playTen()
|
getUser(msg.sender).playTen()
|
||||||
getUser(msg.sender).playGreat()
|
getUser(msg.sender).playGreat()
|
||||||
elif datetime.now().minute == 42:
|
elif msg.time.minute == 42:
|
||||||
if datetime.now().second == 0:
|
if msg.time.second == 0:
|
||||||
getUser(msg.sender).playGreat()
|
getUser(msg.sender).playGreat()
|
||||||
getUser(msg.sender).playFtt()
|
getUser(msg.sender).playFtt()
|
||||||
else:
|
else:
|
||||||
getUser(msg.sender).playBad()
|
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 msg.time.minute == 23:
|
||||||
if datetime.now().second == 0:
|
if msg.time.second == 0:
|
||||||
getUser(msg.sender).playGreat()
|
getUser(msg.sender).playGreat()
|
||||||
getUser(msg.sender).playTwt()
|
getUser(msg.sender).playTwt()
|
||||||
else:
|
else:
|
||||||
getUser(msg.sender).playBad()
|
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 msg.time.minute == 10 and msg.time.hour == 10:
|
||||||
if datetime.now().second == 10:
|
if msg.time.second == 10:
|
||||||
getUser(msg.sender).playGreat()
|
getUser(msg.sender).playGreat()
|
||||||
getUser(msg.sender).playTen()
|
getUser(msg.sender).playTen()
|
||||||
else:
|
else:
|
||||||
getUser(msg.sender).playBad()
|
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 msg.time.hour == 1 and msg.time.minute == 23 and msg.time.second == 45:
|
||||||
getUser(msg.sender).playGreat()
|
getUser(msg.sender).playGreat()
|
||||||
getUser(msg.sender).playTwt()
|
getUser(msg.sender).playTwt()
|
||||||
else:
|
else:
|
||||||
getUser(msg.sender).playBad()
|
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("leetime") 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("leetime") 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 msg.time.hour == 13 and msg.time.minute == 37:
|
||||||
if datetime.now().second == 0:
|
if msg.time.second == 0:
|
||||||
getUser(msg.sender).playGreat()
|
getUser(msg.sender).playGreat()
|
||||||
getUser(msg.sender).playLeet()
|
getUser(msg.sender).playLeet()
|
||||||
else:
|
else:
|
||||||
getUser(msg.sender).playBad()
|
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 msg.time.hour == 3 and msg.time.minute == 14:
|
||||||
if datetime.now().second == 15 or datetime.now().second == 16:
|
if msg.time.second == 15 or msg.time.second == 16:
|
||||||
getUser(msg.sender).playGreat()
|
getUser(msg.sender).playGreat()
|
||||||
getUser(msg.sender).playPi()
|
getUser(msg.sender).playPi()
|
||||||
else:
|
else:
|
||||||
getUser(msg.sender).playBad()
|
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 msg.time.hour == 4 and msg.time.minute == 4:
|
||||||
if datetime.now().second == 0 or datetime.now().second == 4:
|
if msg.time.second == 0 or msg.time.second == 4:
|
||||||
getUser(msg.sender).playGreat()
|
getUser(msg.sender).playGreat()
|
||||||
getUser(msg.sender).playNotfound()
|
getUser(msg.sender).playNotfound()
|
||||||
else:
|
else:
|
||||||
|
|
@ -303,7 +298,7 @@ def parselisten (msg):
|
||||||
|
|
||||||
if getUser(msg.sender).isWinner():
|
if getUser(msg.sender).isWinner():
|
||||||
print ("Nous avons un vainqueur ! Nouvelle manche :p")
|
print ("Nous avons un vainqueur ! Nouvelle manche :p")
|
||||||
win(s, msg.sender)
|
win(msg)
|
||||||
elif getUser(msg.sender).hasChanged():
|
elif getUser(msg.sender).hasChanged():
|
||||||
save_module ()
|
save_module ()
|
||||||
return False
|
return False
|
||||||
|
|
|
||||||
31
server.py
31
server.py
|
|
@ -1,3 +1,5 @@
|
||||||
|
import sys
|
||||||
|
import traceback
|
||||||
import socket
|
import socket
|
||||||
import _thread
|
import _thread
|
||||||
import time
|
import time
|
||||||
|
|
@ -23,16 +25,26 @@ class Server:
|
||||||
else:
|
else:
|
||||||
self.password = None
|
self.password = None
|
||||||
|
|
||||||
|
self.listen_nick = True
|
||||||
|
|
||||||
self.channels = list()
|
self.channels = list()
|
||||||
for channel in server.getElementsByTagName('channel'):
|
for channel in server.getElementsByTagName('channel'):
|
||||||
self.channels.append(channel.getAttribute("name"))
|
self.channels.append(channel.getAttribute("name"))
|
||||||
|
|
||||||
def send_msg (self, channel, msg, cmd = "PRIVMSG", endl = "\r\n"):
|
def send_msg_final(self, channel, msg, cmd = "PRIVMSG", endl = "\r\n"):
|
||||||
if msg is not None and channel is not None:
|
if msg is not None and channel is not None:
|
||||||
for line in msg.split("\n"):
|
for line in msg.split("\n"):
|
||||||
if line != "" and self.accepted_channel(channel):
|
if line != "":
|
||||||
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_msg_usr (self, user, msg):
|
||||||
|
if user is not None and user[0] != "#":
|
||||||
|
self.send_msg_final(user, msg)
|
||||||
|
|
||||||
|
def send_msg (self, channel, msg, cmd = "PRIVMSG", endl = "\r\n"):
|
||||||
|
if self.accepted_channel(channel):
|
||||||
|
self.send_msg_final(channel, msg, cmd, endl)
|
||||||
|
|
||||||
def send_global (self, msg, cmd = "PRIVMSG", endl = "\r\n"):
|
def send_global (self, msg, cmd = "PRIVMSG", endl = "\r\n"):
|
||||||
for channel in self.channels:
|
for channel in self.channels:
|
||||||
self.send_msg (channel, msg, cmd, endl)
|
self.send_msg (channel, msg, cmd, endl)
|
||||||
|
|
@ -43,7 +55,10 @@ 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.count(channel) != -1)
|
if self.listen_nick:
|
||||||
|
return self.channels.count(channel) or channel == self.nick
|
||||||
|
else:
|
||||||
|
return self.channels.count(channel)
|
||||||
|
|
||||||
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
|
||||||
|
|
@ -58,10 +73,12 @@ 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)
|
||||||
|
exc_type, exc_value, exc_traceback = sys.exc_info()
|
||||||
|
traceback.print_exception(exc_type, exc_value, exc_traceback)
|
||||||
|
|
||||||
|
|
||||||
def connect(self, mods):
|
def connect(self, mods):
|
||||||
|
|
|
||||||
|
|
@ -117,7 +117,7 @@ class Site:
|
||||||
hash = hashlib.sha224(content).hexdigest()
|
hash = hashlib.sha224(content).hexdigest()
|
||||||
if hash != self.lastpage:
|
if hash != self.lastpage:
|
||||||
if self.lastpage is not None:
|
if self.lastpage is not None:
|
||||||
self.send_message ()
|
self.send_message (self.message)
|
||||||
self.lastpage = hash
|
self.lastpage = hash
|
||||||
if self.lastChange <= 0:
|
if self.lastChange <= 0:
|
||||||
self.lastChange -= 1
|
self.lastChange -= 1
|
||||||
|
|
@ -138,7 +138,7 @@ class Site:
|
||||||
except:
|
except:
|
||||||
print ("Une erreur est survenue lors de la récupération de la page " + self.server + "/" + self.page)
|
print ("Une erreur est survenue lors de la récupération de la page " + self.server + "/" + self.page)
|
||||||
exc_type, exc_value, exc_traceback = sys.exc_info()
|
exc_type, exc_value, exc_traceback = sys.exc_info()
|
||||||
traceback.print_tb(exc_traceback)
|
traceback.print_exception(exc_type, exc_value, exc_traceback)
|
||||||
time.sleep(self.updateTime * 3)
|
time.sleep(self.updateTime * 3)
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -177,7 +177,7 @@ def save_module():
|
||||||
item.appendChild(parseString ('<channel name="%s" />' % (chan)).documentElement);
|
item.appendChild(parseString ('<channel name="%s" />' % (chan)).documentElement);
|
||||||
b64 = base64.b64encode(pickle.dumps(site.lastpage)).decode()
|
b64 = base64.b64encode(pickle.dumps(site.lastpage)).decode()
|
||||||
item.appendChild(newdoc.createTextNode(b64));
|
item.appendChild(newdoc.createTextNode(b64));
|
||||||
print (site.server)
|
#print (site.server)
|
||||||
top.appendChild(item);
|
top.appendChild(item);
|
||||||
|
|
||||||
with open(filename, "w") as f:
|
with open(filename, "w") as f:
|
||||||
|
|
|
||||||
37
whereis.py
37
whereis.py
|
|
@ -52,10 +52,8 @@ class User(object):
|
||||||
return 'en midlab'
|
return 'en midlab'
|
||||||
elif self.ip.startswith('10.250'):
|
elif self.ip.startswith('10.250'):
|
||||||
return 'en cisco'
|
return 'en cisco'
|
||||||
elif self.ip.startswith('10'):
|
|
||||||
return 'quelque part sur le PIE (%s)'%self.ip
|
|
||||||
else:
|
else:
|
||||||
return "chez lui"
|
return None
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def poste(self):
|
def poste(self):
|
||||||
|
|
@ -103,27 +101,40 @@ def help_tiny ():
|
||||||
return "Find a user on the PIE"
|
return "Find a user on the PIE"
|
||||||
|
|
||||||
def help_full ():
|
def help_full ():
|
||||||
return "!whereis /who/: gives the position of /who/."
|
return "!whereis /who/: gives the position of /who/.\n!whereare /who/ [/other who/ ...]: gives the position of /who/."
|
||||||
|
|
||||||
datas = None
|
datas = None
|
||||||
|
|
||||||
def parseanswer (msg):
|
def parseanswer (msg):
|
||||||
global datas
|
global datas
|
||||||
if msg.cmd[0] == "whereis" or msg.cmd[0] == "ouest":
|
if msg.cmd[0] == "whereis" or msg.cmd[0] == "whereare" or msg.cmd[0] == "ouest" or msg.cmd[0] == "ousont":
|
||||||
if datas is not None:
|
if datas is not None:
|
||||||
datas = datas.update ()
|
datas = datas.update ()
|
||||||
if datas is None:
|
if datas is None:
|
||||||
datas = UpdatedStorage()
|
datas = UpdatedStorage()
|
||||||
|
|
||||||
if len(msg.cmd) >= 2:
|
if len(msg.cmd) > 10:
|
||||||
name = msg.cmd[1]
|
msg.send_snd ("Demande moi moins de personnes à la fois dans ton !%s" % msg.cmd[0])
|
||||||
else:
|
return True
|
||||||
name = msg.sender
|
|
||||||
|
|
||||||
if name in datas.users:
|
pasla = list()
|
||||||
msg.send_chn ("%s est %s (%s)." %(name, datas.users[name].poste, unquote(datas.users[name].location)))
|
|
||||||
else:
|
for name in msg.cmd:
|
||||||
msg.send_chn ("%s n'est pas connecté sur le PIE." % name)
|
if name == "whereis" or name == "whereare" or name == "ouest" or name == "ousont":
|
||||||
|
if len(msg.cmd) >= 2:
|
||||||
|
continue
|
||||||
|
else:
|
||||||
|
name = msg.sender
|
||||||
|
|
||||||
|
if name in datas.users:
|
||||||
|
msg.send_chn ("%s est %s (%s)." %(name, datas.users[name].poste, unquote(datas.users[name].location)))
|
||||||
|
else:
|
||||||
|
pasla.append(name)
|
||||||
|
|
||||||
|
if len(pasla) == 1:
|
||||||
|
msg.send_chn ("%s n'est pas connecté sur le PIE." % pasla[0])
|
||||||
|
elif len(pasla) > 1:
|
||||||
|
msg.send_chn ("%s ne sont pas connectés sur le PIE." % ", ".join(pasla))
|
||||||
|
|
||||||
return True
|
return True
|
||||||
elif msg.cmd[0] == "ip":
|
elif msg.cmd[0] == "ip":
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue