nemubot/whereis.py
Némunaire e375f23f71 Stability improvements
New module whereis
2012-04-18 23:35:58 +02:00

147 lines
3.5 KiB
Python

# coding=utf-8
import re
import sys
import socket
import time
from datetime import datetime
from datetime import date
from datetime import timedelta
from urllib.parse import unquote
from xml.dom.minidom import parse
from xml.dom.minidom import parseString
from xml.dom.minidom import getDOMImplementation
NS_SERVER = 'ns-server.epita.fr'
NS_PORT = 4242
class UpdatedStorage:
def __init__(self):
sock = connect_to_ns(NS_SERVER, NS_PORT)
self.users = dict()
for l in list_users(sock):
u = User(l)
self.users[u.login] = u
sock.close()
self.lastUpdate = datetime.now ()
def update(self):
if datetime.now () - self.lastUpdate < timedelta(minutes=10):
return self
else:
return None
class User(object):
def __init__(self, line):
fields = line.split()
self.login = fields[1]
self.ip = fields[2]
self.location = fields[8]
self.promo = fields[9]
@property
def sm(self):
if self.ip.startswith('10.200'):
return 'en SM' + self.ip.split('.')[2]
elif self.ip.startswith('10.247'):
return 'en pasteur'
elif self.ip.startswith('10.248'):
return 'en srlab'
elif self.ip.startswith('10.249'):
return 'en midlab'
elif self.ip.startswith('10.250'):
return 'en cisco'
elif self.ip.startswith('10'):
return 'quelque part sur le PIE (%s)'%self.ip
else:
return "chez lui"
@property
def poste(self):
if self.sm is None:
if self.ip.startswith('10'):
return 'quelque part sur le PIE (%s)'%self.ip
else:
return "chez lui"
else:
return self.sm + " rangée " + self.ip.split('.')[2] + " poste " + self.ip.split('.')[3]
def __cmp__(self, other):
return cmp(self.login, other.login)
def __hash__(self):
return hash(self.login)
def connect_to_ns(server, port):
s = socket.socket()
s.connect((server, port))
s.recv(8192) # salut ...
return s
def list_users(sock):
sock.send('list_users\n'.encode())
buf = ''
while True:
tmp = sock.recv(8192).decode()
buf += tmp
if '\nrep 002' in tmp or tmp == '':
break
return buf.split('\n')[:-2]
def load_module(datas_path):
"""Load this module"""
return
def save_module():
"""Save the module state"""
return
def help_tiny ():
"""Line inserted in the response to the command !help"""
return "Find a user on the PIE"
def help_full ():
return "!whereis /who/: gives the position of /who/."
datas = None
def parseanswer (msg):
global datas
if msg.cmd[0] == "whereis" or msg.cmd[0] == "ouest":
if datas is not None:
datas = datas.update ()
if datas is None:
datas = UpdatedStorage()
if len(msg.cmd) >= 2:
name = msg.cmd[1]
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:
msg.send_chn ("%s n'est pas connecté sur le PIE." % name)
return True
elif msg.cmd[0] == "ip":
if len(msg.cmd) >= 2:
name = msg.cmd[1]
else:
name = msg.sender
if name in datas.users:
msg.send_chn ("L'ip de %s est %s." %(name, datas.users[name].ip))
else:
msg.send_chn ("%s n'est pas connecté à netsoul." % name)
return True
return False
def parseask (msg):
return False
def parselisten (msg):
return False