diff --git a/message.py b/message.py index bb5de34..391e4e8 100644 --- a/message.py +++ b/message.py @@ -88,114 +88,40 @@ class Message: def __init__ (self, srv, line): self.srv = srv self.time = datetime.now () - self.channel = "" - self.content = "" line = line.rstrip() #remove trailing 'rn' - if line.find(' PRIVMSG ') != -1: #Call a parsing function - complete = line[1:].split(':',1) #Parse the message into useful data - info = complete[0].split(' ') - self.cmd = "PRIVMSG" - if len(complete) < 2 or len (info) < 3: - last = "" - info = list() - for lettre in line: - if len(info) > 2: - complete[1] += lettre - elif lettre == ":" or lettre == " ": - if last != "": - info.append(last) - if len(info) > 2: - complete = list() - complete.append(" ".join(info)) - complete.append("") - else: - last += lettre - - 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.content = complete[1] - - elif line.find(' NICK ') != -1: - complete = line[1:].split(':',1) #Parse the message into useful data - if len(complete) > 1: - info = complete[0].split(' ') - - self.cmd = "NICK" - self.sender = (info[0].split('!'))[0] - self.realname = (info[0].split('!'))[1] - self.content = complete[1] - else: - self.cmd = "NONE" - - elif line.find(' JOIN ') != -1: - complete = line[1:].split(':',1) #Parse the message into useful data - if len(complete) > 1: - info = complete[0].split(' ') - - self.cmd = "JOIN" - self.sender = (info[0].split('!'))[0] - self.realname = (info[0].split('!'))[1] - self.channel = complete[1] - else: - self.cmd = "NONE" - - elif line.find(' PART ') != -1: - complete = line[1:].split(':',1) #Parse the message into useful data - info = complete[0].split(' ') - - self.cmd = "PART" - self.sender = (info[0].split('!'))[0] - self.realname = (info[0].split('!'))[1] - self.channel = info[2] - if len (complete) > 1: - self.content = complete[1] - else: - self.content = "" - - elif line.find(' QUIT ') != -1: - complete = line[1:].split(':',1) #Parse the message into useful data - info = complete[0].split(' ') - - self.cmd = "QUIT" - self.sender = (info[0].split('!'))[0] - self.realname = (info[0].split('!'))[1] - self.channel = info[2] - if len (complete) > 1: - self.content = complete[1] - else: - 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 - line = line.split() - - self.cmd = "PING" - self.content = line[1] - + words = line.split(' ') + if words[0][0] == ':': + self.name = words[0][1:] + self.cmd = words[1] else: - self.cmd = "UNKNOWN" - print (line) + self.cmd = words[0] + self.name = None + + if self.cmd == 'PING': + self.content = words[1] + elif self.name is not None: + self.sender = (self.name.split('!'))[0] + if self.sender != self.name: + self.realname = (self.name.split('!'))[1] + else: + self.realname = self.sender + + if self.cmd == 'PRIVMSG': + self.channel = words[2] + self.content = words[3] + if self.content[0] == ':': + self.content = line.split(':', 2)[2] + else: + print (line) + else: + if self.cmd == 'PRIVMSG': + self.channel = words[2] + self.content = words[3] + if self.content[0] == ':': + self.content = line.split(':', 2)[2] + else: + print (line) @property def is_owner(self): @@ -237,6 +163,8 @@ class Message: def treat (self, mods): if self.cmd == "PING": self.pong () + elif self.cmd == "PRIVMSG" and self.name is None: + self.parsectcp () elif self.cmd == "PRIVMSG" and self.authorize(): self.parsemsg (mods) elif self.cmd == "NICK": @@ -251,6 +179,10 @@ class Message: self.srv.s.send(("PONG %s\r\n" % self.content).encode ()) + def parsectcp(self): + if self.content == 'VERSION': + self.srv.send_ctcp_response(self.channel, self.sender, "VERSION nemubot v3") + def reparsemsg(self): if self.mods is not None: self.parsemsg(self.mods) diff --git a/prompt.py b/prompt.py index e77beff..6dc9e62 100644 --- a/prompt.py +++ b/prompt.py @@ -1,10 +1,11 @@ import sys import shlex import traceback -import _thread +import imp from xml.dom.minidom import parse -import server +server = __import__("server") +imp.reload(server) selectedServer = None MODS = list() @@ -82,6 +83,7 @@ def load(cmds, servers): return def close(cmds, servers): + global selectedServer if len(cmds) > 1: for s in cmds[1:]: if s in servers: @@ -209,7 +211,7 @@ CAPS = { 'exit': end, #Alias for quit 'reset': end, #Reload the prompt 'load': load, #Load a servers configuration file - 'close': load, #Disconnect and remove a server from the list + 'close': close, #Disconnect and remove a server from the list 'select': select, #Select a server 'list': liste, #Show lists 'connect': connect, #Connect to a server diff --git a/server.py b/server.py index 7ef8660..4335421 100644 --- a/server.py +++ b/server.py @@ -3,8 +3,10 @@ import traceback import socket import threading import time +import imp -import message +message = __import__("message") +imp.reload(message) class Server(threading.Thread): def __init__(self, server, nick, owner, realname): @@ -41,6 +43,12 @@ class Server(threading.Thread): def id(self): return self.host + ":" + str(self.port) + def send_ctcp_response(self, me, to, msg, cmd = "NOTICE", endl = "\r\n"): + if msg is not None and channel is not None: + for line in msg.split("\n"): + if line != "": + self.s.send ((":%s %s %s :%s%s" % (me, cmd, to, line, endl)).encode ()) + def send_msg_final(self, channel, msg, cmd = "PRIVMSG", endl = "\r\n"): if msg is not None and channel is not None: for line in msg.split("\n"): @@ -97,9 +105,10 @@ class Server(threading.Thread): self.s.send(b"PASS " + self.password.encode () + b"\r\n") self.s.send(("NICK %s\r\n" % self.nick).encode ()) self.s.send(("USER %s %s bla :%s\r\n" % (self.nick, self.host, self.realname)).encode ()) - print ("Connection to %s:%d completed" % (self.host, self.port)) + print ("Connection to %s:%d completed with version 2.0" % (self.host, self.port)) - self.s.send(("JOIN %s\r\n" % ' '.join (self.channels)).encode ()) + if len(self.channels) > 0: + self.s.send(("JOIN %s\r\n" % ' '.join (self.channels)).encode ()) print ("Listen to channels: %s" % ' '.join (self.channels)) readbuffer = "" #Here we store all the messages from server @@ -113,8 +122,8 @@ class Server(threading.Thread): readbuffer = temp.pop( ) for line in temp: - msg = message.Message (self, line) try: + msg = message.Message (self, line) msg.treat (self.mods) except: print ("Une erreur est survenue lors du traitement du message : %s"%line)