diff --git a/nemubot/message/command.py b/nemubot/message/command.py index 895d16e..6c208b2 100644 --- a/nemubot/message/command.py +++ b/nemubot/message/command.py @@ -22,7 +22,7 @@ class Command(Abstract): """This class represents a specialized TextMessage""" def __init__(self, cmd, args=None, kwargs=None, *nargs, **kargs): - Abstract.__init__(self, *nargs, **kargs) + super().__init__(*nargs, **kargs) self.cmd = cmd self.args = args if args is not None else list() diff --git a/nemubot/message/directask.py b/nemubot/message/directask.py index 03c7902..3b1fabb 100644 --- a/nemubot/message/directask.py +++ b/nemubot/message/directask.py @@ -28,7 +28,7 @@ class DirectAsk(Text): designated -- the user designated by the message """ - Text.__init__(self, *args, **kargs) + super().__init__(*args, **kargs) self.designated = designated diff --git a/nemubot/message/printer/IRC.py b/nemubot/message/printer/IRC.py index 320366c..df9cb9f 100644 --- a/nemubot/message/printer/IRC.py +++ b/nemubot/message/printer/IRC.py @@ -22,4 +22,4 @@ class IRC(SocketPrinter): def visit_Text(self, msg): self.pp += "PRIVMSG %s :" % ",".join(msg.to) - SocketPrinter.visit_Text(self, msg) + super().visit_Text(msg) diff --git a/nemubot/message/response.py b/nemubot/message/response.py new file mode 100644 index 0000000..fba864b --- /dev/null +++ b/nemubot/message/response.py @@ -0,0 +1,34 @@ +# Nemubot is a smart and modulable IM bot. +# Copyright (C) 2012-2015 Mercier Pierre-Olivier +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +from nemubot.message.abstract import Abstract + + +class Response(Abstract): + + def __init__(self, cmd, args=None, *nargs, **kargs): + super().__init__(*nargs, **kargs) + + self.cmd = cmd + self.args = args if args is not None else list() + + def __str__(self): + return self.cmd + " @" + ",@".join(self.args) + + @property + def cmds(self): + # TODO: this is for legacy modules + return [self.cmd] + self.args diff --git a/nemubot/message/text.py b/nemubot/message/text.py index ec90a36..f691a04 100644 --- a/nemubot/message/text.py +++ b/nemubot/message/text.py @@ -28,7 +28,7 @@ class Text(Abstract): message -- the parsed message """ - Abstract.__init__(self, *args, **kargs) + super().__init__(*args, **kargs) self.message = message diff --git a/nemubot/server/DCC.py b/nemubot/server/DCC.py index 6655d52..644a8cb 100644 --- a/nemubot/server/DCC.py +++ b/nemubot/server/DCC.py @@ -31,7 +31,7 @@ PORTS = list() class DCC(server.AbstractServer): def __init__(self, srv, dest, socket=None): - server.Server.__init__(self) + super().__init__(self) self.error = False # An error has occur, closing the connection? self.messages = list() # Message queued before connexion diff --git a/nemubot/server/IRC.py b/nemubot/server/IRC.py index e433176..e09c77e 100644 --- a/nemubot/server/IRC.py +++ b/nemubot/server/IRC.py @@ -55,7 +55,7 @@ class IRC(SocketServer): self.realname = realname self.id = self.username + "@" + host + ":" + str(port) - SocketServer.__init__(self, host=host, port=port, ssl=ssl) + super().__init__(host=host, port=port, ssl=ssl) self.printer = IRCPrinter self.encoding = encoding @@ -232,8 +232,8 @@ class IRC(SocketServer): # Open/close - def _open(self): - if SocketServer._open(self): + def open(self): + if super().open(): if self.password is not None: self.write("PASS :" + self.password) if self.capabilities is not None: @@ -244,9 +244,10 @@ class IRC(SocketServer): return False - def _close(self): - if self.connected: self.write("QUIT") - return SocketServer._close(self) + def close(self): + if not self.closed: + self.write("QUIT") + return super().close() # Writes: as inherited @@ -254,7 +255,7 @@ class IRC(SocketServer): # Read def read(self): - for line in SocketServer.read(self): + for line in super().read(): # PING should be handled here, so start parsing here :/ msg = IRCMessage(line, self.encoding) diff --git a/nemubot/server/abstract.py b/nemubot/server/abstract.py index 8e3dc3b..518d7d6 100644 --- a/nemubot/server/abstract.py +++ b/nemubot/server/abstract.py @@ -32,6 +32,8 @@ class AbstractServer(io.IOBase): send_callback -- Callback when developper want to send a message """ + super().__init__() + if not hasattr(self, "id"): raise Exception("No id defined for this server. Please set one!") diff --git a/nemubot/server/socket.py b/nemubot/server/socket.py index 907b3c3..6876d2f 100644 --- a/nemubot/server/socket.py +++ b/nemubot/server/socket.py @@ -26,7 +26,7 @@ class SocketServer(AbstractServer): def __init__(self, sock_location=None, host=None, port=None, ssl=False, socket=None, id=None): if id is not None: self.id = id - AbstractServer.__init__(self) + super().__init__() if sock_location is not None: self.filename = sock_location elif host is not None: @@ -44,18 +44,17 @@ class SocketServer(AbstractServer): @property - def connected(self): + def closed(self): """Indicator of the connection aliveness""" - return self.socket is not None + return self.socket is None # Open/close - def _open(self): - import os + def open(self): import socket - if self.connected: + if not self.closed: return True try: @@ -66,11 +65,14 @@ class SocketServer(AbstractServer): else: self.socket = socket.create_connection((self.host, self.port)) self.logger.info("Connected to %s:%d", self.host, self.port) - except socket.error as e: + except: self.socket = None - self.logger.critical("Unable to connect to %s:%d: %s", - self.host, self.port, - os.strerror(e.errno)) + if hasattr(self, "filename"): + self.logger.exception("Unable to connect to %s", + self.filename) + else: + self.logger.exception("Unable to connect to %s:%d", + self.host, self.port) return False # Wrap the socket for SSL @@ -79,17 +81,17 @@ class SocketServer(AbstractServer): ctx = ssl.SSLContext(ssl.PROTOCOL_TLSv1) self.socket = ctx.wrap_socket(self.socket) - return True + return super().open() - def _close(self): + def close(self): import socket from nemubot.server import _lock _lock.release() self._sending_queue.join() _lock.acquire() - if self.connected: + if not self.closed: try: self.socket.shutdown(socket.SHUT_RDWR) self.socket.close() @@ -98,16 +100,16 @@ class SocketServer(AbstractServer): self.socket = None - return True + return super().close() # Write def _write(self, cnt): - if not self.connected: + if self.closed: return - self.socket.send(cnt) + self.socket.sendall(cnt) def format(self, txt): @@ -120,7 +122,7 @@ class SocketServer(AbstractServer): # Read def read(self): - if not self.connected: + if self.closed: return [] raw = self.socket.recv(1024) @@ -147,7 +149,7 @@ class SocketListener(AbstractServer): def __init__(self, new_server_cb, id, sock_location=None, host=None, port=None, ssl=None): self.id = id - AbstractServer.__init__(self) + super().__init__() self.new_server_cb = new_server_cb self.sock_location = sock_location self.host = host @@ -161,30 +163,31 @@ class SocketListener(AbstractServer): @property - def connected(self): + def closed(self): """Indicator of the connection aliveness""" - return self.socket is not None + return self.socket is None - def _open(self): + def open(self): import os import socket - self.socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) if self.sock_location is not None: + self.socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) try: os.remove(self.sock_location) except FileNotFoundError: pass self.socket.bind(self.sock_location) elif self.host is not None and self.port is not None: + self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.socket.bind((self.host, self.port)) self.socket.listen(5) - return True + return super().open() - def _close(self): + def close(self): import os import socket @@ -196,10 +199,13 @@ class SocketListener(AbstractServer): except socket.error: pass + return super().close() + + # Read def read(self): - if not self.connected: + if self.closed: return [] conn, addr = self.socket.accept()