From c8d495d508a716c33d7eaff5199fc645eebbc2b3 Mon Sep 17 00:00:00 2001 From: Nemunaire Date: Mon, 6 Apr 2015 09:50:13 +0200 Subject: [PATCH] Split messages class into multiple files --- modules/alias.py | 2 +- modules/cmd_server.py | 6 +- modules/more.py | 6 +- modules/speak.py | 30 +++--- modules/ycc.py | 6 +- nemubot/exception.py | 6 +- nemubot/hooks/messagehook.py | 4 +- nemubot/message/__init__.py | 165 ++++----------------------------- nemubot/message/abstract.py | 90 ++++++++++++++++++ nemubot/message/command.py | 43 +++++++++ nemubot/message/directask.py | 39 ++++++++ nemubot/message/printer/IRC.py | 36 +++---- nemubot/message/text.py | 41 ++++++++ nemubot/modulecontext.py | 2 +- nemubot/server/IRC.py | 2 +- 15 files changed, 280 insertions(+), 198 deletions(-) create mode 100644 nemubot/message/abstract.py create mode 100644 nemubot/message/command.py create mode 100644 nemubot/message/directask.py create mode 100644 nemubot/message/text.py diff --git a/modules/alias.py b/modules/alias.py index 050e2d6..ef03172 100644 --- a/modules/alias.py +++ b/modules/alias.py @@ -10,7 +10,7 @@ import shlex from nemubot import context from nemubot.exception import IRCException from nemubot.hooks import hook -from nemubot.message import TextMessage, Command +from nemubot.message import Command from nemubot.tools.xmlparser.node import ModuleState nemubotversion = 3.4 diff --git a/modules/cmd_server.py b/modules/cmd_server.py index 0134f8f..8fdadb5 100644 --- a/modules/cmd_server.py +++ b/modules/cmd_server.py @@ -142,9 +142,9 @@ def send(toks, **kwargs): % (toks[1], srv.id)) return 3 - from nemubot.message import TextMessage - srv.send_response(TextMessage(" ".join(toks[2:]), server=None, - to=[toks[1]])) + from nemubot.message import Text + srv.send_response(Text(" ".join(toks[2:]), server=None, + to=[toks[1]])) return 0 diff --git a/modules/more.py b/modules/more.py index 72c5864..302d20e 100644 --- a/modules/more.py +++ b/modules/more.py @@ -20,7 +20,7 @@ import logging -from nemubot.message import TextMessage, DirectAsk +from nemubot.message import Text, DirectAsk from nemubot.hooks import hook nemubotversion = 3.4 @@ -120,8 +120,8 @@ class Response: self.get_message(maxlen - len(self.nick) - 2), server=None, to=self.receivers) else: - return TextMessage(self.get_message(maxlen), - server=None, to=self.receivers) + return Text(self.get_message(maxlen), + server=None, to=self.receivers) def get_message(self, maxlen): if self.alone and len(self.messages) > 1: diff --git a/modules/speak.py b/modules/speak.py index f5c88c2..972aa13 100644 --- a/modules/speak.py +++ b/modules/speak.py @@ -7,7 +7,7 @@ import subprocess from threading import Thread from nemubot.hooks import hook -from nemubot.message import TextMessage +from nemubot.message import Text from nemubot.message.visitor import AbstractVisitor nemubotversion = 3.4 @@ -51,7 +51,7 @@ class SpeakerVisitor(AbstractVisitor): self.last = last - def visit_TextMessage(self, msg): + def visit_Text(self, msg): force = (self.last is None) if force or msg.date - self.last.date > timedelta(0, 500): @@ -86,27 +86,27 @@ class SpeakerVisitor(AbstractVisitor): def visit_DirectAsk(self, msg): - res = TextMessage("%s: %s" % (msg.designated, msg.message), - server=msg.server, date=msg.date, - to=msg.to, frm=msg.frm) + res = Text("%s: %s" % (msg.designated, msg.message), + server=msg.server, date=msg.date, + to=msg.to, frm=msg.frm) res.accept(self) def visit_Command(self, msg): - res = TextMessage("Bang %s%s%s" % (msg.cmd, - " " if len(msg.args) else "", - " ".join(msg.args)), - server=msg.server, date=msg.date, - to=msg.to, frm=msg.frm) + res = Text("Bang %s%s%s" % (msg.cmd, + " " if len(msg.args) else "", + " ".join(msg.args)), + server=msg.server, date=msg.date, + to=msg.to, frm=msg.frm) res.accept(self) def visit_OwnerCommand(self, msg): - res = TextMessage("Owner Bang %s%s%s" % (msg.cmd, - " " if len(msg.args) else "", - " ".join(msg.args)), - server=msg.server, date=msg.date, - to=msg.to, frm=msg.frm) + res = Text("Owner Bang %s%s%s" % (msg.cmd, + " " if len(msg.args) else "", + " ".join(msg.args)), + server=msg.server, date=msg.date, + to=msg.to, frm=msg.frm) res.accept(self) diff --git a/modules/ycc.py b/modules/ycc.py index fba6650..c05296f 100644 --- a/modules/ycc.py +++ b/modules/ycc.py @@ -8,7 +8,7 @@ from urllib.parse import quote from nemubot.exception import IRCException from nemubot.hooks import hook -from nemubot.message import TextMessage +from nemubot.message import Text from nemubot.tools import web nemubotversion = 3.4 @@ -37,8 +37,8 @@ def gen_response(res, msg, srv): if res is None: raise IRCException("mauvaise URL : %s" % srv) else: - return TextMessage("URL pour %s : %s" % (srv, res), server=None, - to=msg.to_response) + return Text("URL pour %s : %s" % (srv, res), server=None, + to=msg.to_response) @hook("cmd_hook", "ycc") diff --git a/nemubot/exception.py b/nemubot/exception.py index 04c142e..93e6a53 100644 --- a/nemubot/exception.py +++ b/nemubot/exception.py @@ -30,6 +30,6 @@ class IRCException(Exception): server=msg.server, to=msg.to_response) else: - from nemubot.message import TextMessage - return TextMessage(self.message, - server=msg.server, to=msg.to_response) + from nemubot.message import Text + return Text(self.message, + server=msg.server, to=msg.to_response) diff --git a/nemubot/hooks/messagehook.py b/nemubot/hooks/messagehook.py index 939286d..8f76114 100644 --- a/nemubot/hooks/messagehook.py +++ b/nemubot/hooks/messagehook.py @@ -39,12 +39,12 @@ class MessageHook(AbstractHook): def match(self, msg, server=None): - if not isinstance(msg, nemubot.message.AbstractMessage): + if not isinstance(msg, nemubot.message.abstract.Abstract): return True elif isinstance(msg, nemubot.message.Command): return self.is_matching(msg.cmd, msg.to, server) - elif isinstance(msg, nemubot.message.TextMessage): + elif isinstance(msg, nemubot.message.Text): return self.is_matching(msg.message, msg.to, server) else: return False diff --git a/nemubot/message/__init__.py b/nemubot/message/__init__.py index 232f557..31d7313 100644 --- a/nemubot/message/__init__.py +++ b/nemubot/message/__init__.py @@ -1,5 +1,3 @@ -# -*- coding: utf-8 -*- - # Nemubot is a smart and modulable IM bot. # Copyright (C) 2012-2015 Mercier Pierre-Olivier # @@ -16,157 +14,28 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -from datetime import datetime, timezone - - -class AbstractMessage: - - """This class represents an abstract message""" - - def __init__(self, server, date=None, to=None, to_response=None, frm=None): - """Initialize an abstract message - - Arguments: - server -- the servir identifier - date -- time of the message reception, default: now - to -- list of recipients - to_response -- if channel(s) where send the response differ - frm -- the sender - """ - - self.server = server - self.date = datetime.now(timezone.utc) if date is None else date - self.to = to if to is not None else list() - self._to_response = (to_response if (to_response is None or - isinstance(to_response, list)) - else [ to_response ]) - self.frm = frm # None allowed when it designate this bot - - self.frm_owner = False # Filled later, in consumer - - - @property - def to_response(self): - if self._to_response is not None: - return self._to_response - else: - return self.to - - - @property - def receivers(self): - # TODO: this is for legacy modules - return self.to_response - - @property - def channel(self): - # TODO: this is for legacy modules - return self.to_response[0] - - @property - def nick(self): - # TODO: this is for legacy modules - return self.frm - - - def accept(self, visitor): - visitor.visit(self) - - - def export_args(self, without=list()): - if not isinstance(without, list): - without = [ without ] - - ret = { - "server": self.server, - "date": self.date, - "to": self.to, - "to_response": self._to_response, - "frm": self.frm - } - - for w in without: - if w in ret: - del ret[w] - - return ret - - -class TextMessage(AbstractMessage): - - """This class represent a simple message send to someone""" - - def __init__(self, message, *args, **kargs): - """Initialize a message with no particular specificity - - Argument: - message -- the parsed message - """ - - AbstractMessage.__init__(self, *args, **kargs) - - self.message = message - - def __str__(self): - return self.message - - @property - def text(self): - # TODO: this is for legacy modules - return self.message - - -class DirectAsk(TextMessage): - - """This class represents a message to this bot""" - - def __init__(self, designated, *args, **kargs): - """Initialize a message to a specific person - - Argument: - designated -- the user designated by the message - """ - - TextMessage.__init__(self, *args, **kargs) - - self.designated = designated - - def respond(self, message): - return DirectAsk(self.frm, - message, - server=self.server, - to=self.to_response) - - -class Command(AbstractMessage): - - """This class represents a specialized TextMessage""" - - def __init__(self, cmd, args=None, *nargs, **kargs): - AbstractMessage.__init__(self, *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 - - -class OwnerCommand(Command): - - """This class represents a special command incomming from the owner""" - - pass +from nemubot.message.abstract import Abstract +from nemubot.message.text import Text +from nemubot.message.directask import DirectAsk +from nemubot.message.command import Command +from nemubot.message.command import OwnerCommand def reload(): + global Abstract, Text, DirectAsk, Command, OwnerCommand import imp + import nemubot.message.abstract + imp.reload(nemubot.message.abstract) + Abstract = nemubot.message.abstract.Abstract + imp.reload(nemubot.message.text) + Text = nemubot.message.text.Text + imp.reload(nemubot.message.directask) + DirectAsk = nemubot.message.directask.DirectAsk + imp.reload(nemubot.message.command) + Command = nemubot.message.command.Command + OwnerCommand = nemubot.message.command.OwnerCommand + import nemubot.message.visitor imp.reload(nemubot.message.visitor) diff --git a/nemubot/message/abstract.py b/nemubot/message/abstract.py new file mode 100644 index 0000000..e308e0c --- /dev/null +++ b/nemubot/message/abstract.py @@ -0,0 +1,90 @@ +# 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 datetime import datetime, timezone + + +class Abstract: + + """This class represents an abstract message""" + + def __init__(self, server, date=None, to=None, to_response=None, frm=None): + """Initialize an abstract message + + Arguments: + server -- the servir identifier + date -- time of the message reception, default: now + to -- list of recipients + to_response -- if channel(s) where send the response differ + frm -- the sender + """ + + self.server = server + self.date = datetime.now(timezone.utc) if date is None else date + self.to = to if to is not None else list() + self._to_response = (to_response if (to_response is None or + isinstance(to_response, list)) + else [ to_response ]) + self.frm = frm # None allowed when it designate this bot + + self.frm_owner = False # Filled later, in consumer + + + @property + def to_response(self): + if self._to_response is not None: + return self._to_response + else: + return self.to + + + @property + def receivers(self): + # TODO: this is for legacy modules + return self.to_response + + @property + def channel(self): + # TODO: this is for legacy modules + return self.to_response[0] + + @property + def nick(self): + # TODO: this is for legacy modules + return self.frm + + + def accept(self, visitor): + visitor.visit(self) + + + def export_args(self, without=list()): + if not isinstance(without, list): + without = [ without ] + + ret = { + "server": self.server, + "date": self.date, + "to": self.to, + "to_response": self._to_response, + "frm": self.frm + } + + for w in without: + if w in ret: + del ret[w] + + return ret diff --git a/nemubot/message/command.py b/nemubot/message/command.py new file mode 100644 index 0000000..842b19f --- /dev/null +++ b/nemubot/message/command.py @@ -0,0 +1,43 @@ +# 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 Command(Abstract): + + """This class represents a specialized TextMessage""" + + def __init__(self, cmd, args=None, *nargs, **kargs): + Abstract.__init__(self, *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 + + +class OwnerCommand(Command): + + """This class represents a special command incomming from the owner""" + + pass diff --git a/nemubot/message/directask.py b/nemubot/message/directask.py new file mode 100644 index 0000000..03c7902 --- /dev/null +++ b/nemubot/message/directask.py @@ -0,0 +1,39 @@ +# 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.text import Text + + +class DirectAsk(Text): + + """This class represents a message to this bot""" + + def __init__(self, designated, *args, **kargs): + """Initialize a message to a specific person + + Argument: + designated -- the user designated by the message + """ + + Text.__init__(self, *args, **kargs) + + self.designated = designated + + def respond(self, message): + return DirectAsk(self.frm, + message, + server=self.server, + to=self.to_response) diff --git a/nemubot/message/printer/IRC.py b/nemubot/message/printer/IRC.py index 9c622ab..1386e45 100644 --- a/nemubot/message/printer/IRC.py +++ b/nemubot/message/printer/IRC.py @@ -16,7 +16,7 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -from nemubot.message import TextMessage +from nemubot.message import Text from nemubot.message.visitor import AbstractVisitor @@ -26,7 +26,7 @@ class IRC(AbstractVisitor): self.pp = "" - def visit_TextMessage(self, msg): + def visit_Text(self, msg): self.pp += "PRIVMSG %s :" % ",".join(msg.to) if isinstance(msg.message, str): self.pp += msg.message @@ -40,31 +40,31 @@ class IRC(AbstractVisitor): # Avoid nick starting message when discussing on user channel if len(others) != len(msg.to): - res = TextMessage(msg.message, - server=msg.server, date=msg.date, - to=msg.to, frm=msg.frm) + res = Text(msg.message, + server=msg.server, date=msg.date, + to=msg.to, frm=msg.frm) res.accept(self) if len(others): - res = TextMessage("%s: %s" % (msg.designated, msg.message), - server=msg.server, date=msg.date, - to=others, frm=msg.frm) + res = Text("%s: %s" % (msg.designated, msg.message), + server=msg.server, date=msg.date, + to=others, frm=msg.frm) res.accept(self) def visit_Command(self, msg): - res = TextMessage("!%s%s%s" % (msg.cmd, - " " if len(msg.args) else "", - " ".join(msg.args)), - server=msg.server, date=msg.date, - to=msg.to, frm=msg.frm) + res = Text("!%s%s%s" % (msg.cmd, + " " if len(msg.args) else "", + " ".join(msg.args)), + server=msg.server, date=msg.date, + to=msg.to, frm=msg.frm) res.accept(self) def visit_OwnerCommand(self, msg): - res = TextMessage("`%s%s%s" % (msg.cmd, - " " if len(msg.args) else "", - " ".join(msg.args)), - server=msg.server, date=msg.date, - to=msg.to, frm=msg.frm) + res = Text("`%s%s%s" % (msg.cmd, + " " if len(msg.args) else "", + " ".join(msg.args)), + server=msg.server, date=msg.date, + to=msg.to, frm=msg.frm) res.accept(self) diff --git a/nemubot/message/text.py b/nemubot/message/text.py new file mode 100644 index 0000000..ec90a36 --- /dev/null +++ b/nemubot/message/text.py @@ -0,0 +1,41 @@ +# 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 Text(Abstract): + + """This class represent a simple message send to someone""" + + def __init__(self, message, *args, **kargs): + """Initialize a message with no particular specificity + + Argument: + message -- the parsed message + """ + + Abstract.__init__(self, *args, **kargs) + + self.message = message + + def __str__(self): + return self.message + + @property + def text(self): + # TODO: this is for legacy modules + return self.message diff --git a/nemubot/modulecontext.py b/nemubot/modulecontext.py index 4c6193f..625d526 100644 --- a/nemubot/modulecontext.py +++ b/nemubot/modulecontext.py @@ -20,7 +20,7 @@ def convert_legacy_store(old): elif old == "ask_hook" or old == "ask_rgxp" or old == "ask_default": return "in_DirectAsk" elif old == "msg_hook" or old == "msg_rgxp" or old == "msg_default": - return "in_TextMessage" + return "in_Text" elif old == "all_post": return "post" elif old == "all_pre": diff --git a/nemubot/server/IRC.py b/nemubot/server/IRC.py index d698fcd..718a9bc 100644 --- a/nemubot/server/IRC.py +++ b/nemubot/server/IRC.py @@ -432,6 +432,6 @@ class IRCMessage: # Normal message else: - return message.TextMessage(message=text, **common_args) + return message.Text(message=text, **common_args) return None