1
0
Fork 0

Start reworking message.py

The reset command now reload server and message
This commit is contained in:
Némunaire 2012-05-21 18:14:33 +02:00
parent 6607646c49
commit 716fa5675a
3 changed files with 55 additions and 112 deletions

View File

@ -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)

View File

@ -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

View File

@ -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)