From ddb87d6aead1d690596328561092065f8240d26a Mon Sep 17 00:00:00 2001 From: Griatch Date: Sat, 20 Feb 2016 12:53:17 +0100 Subject: [PATCH] Made IRC work with new send mechanism, as per #924. --- evennia/players/bots.py | 15 +++++++-------- evennia/players/players.py | 8 ++++++++ evennia/server/portal/irc.py | 21 +++++++++++++++------ evennia/server/sessionhandler.py | 3 ++- 4 files changed, 32 insertions(+), 15 deletions(-) diff --git a/evennia/players/bots.py b/evennia/players/bots.py index 396597951..a5bec0d81 100644 --- a/evennia/players/bots.py +++ b/evennia/players/bots.py @@ -135,12 +135,12 @@ class Bot(DefaultPlayer): """ pass - def msg(self, text=None, from_obj=None, session=None, **kwargs): + def msg(self, text=None, from_obj=None, session=None, options=None, **kwargs): """ Evennia -> outgoing protocol """ - super(Bot, self).msg(text=text, from_obj=from_obj, session=session, **kwargs) + super(Bot, self).msg(text=text, from_obj=from_obj, session=session, options=options, **kwargs) def execute_cmd(self, raw_string, session=None): """ @@ -233,14 +233,14 @@ class IRCBot(Bot): - from_obj (str): dbid of an object sending this text. """ - options = kwargs.get("options", {}) + from_obj = kwargs.get("from_obj", None) + options = kwargs.get("options", None) or {} if not self.ndb.ev_channel and self.db.ev_channel: # cache channel lookup self.ndb.ev_channel = self.db.ev_channel if "from_channel" in options and text and self.ndb.ev_channel.dbid == options["from_channel"]: - if "from_obj" not in options or options["from_obj"] != [self.id]: - text = "bot_data_out %s" % text - super(IRCBot, self).msg(text=text) + if not from_obj or from_obj != [self.id]: + super(IRCBot, self).msg(text=text, options={"bot_data_out": True}) def execute_cmd(self, text=None, session=None): """ @@ -391,8 +391,7 @@ class IMC2Bot(Bot): self.ndb.ev_channel = self.db.ev_channel if "from_channel" in options and text and self.ndb.ev_channel.dbid == options["from_channel"]: if "from_obj" not in options or options["from_obj"] != [self.id]: - text = "bot_data_out %s" % text - self.msg(text=text) + self.msg(text=text, options={"bot_data_out": True}) def execute_cmd(self, text=None, session=None): """ diff --git a/evennia/players/players.py b/evennia/players/players.py index 77e652da7..62e2e00c1 100644 --- a/evennia/players/players.py +++ b/evennia/players/players.py @@ -409,6 +409,14 @@ class DefaultPlayer(with_metaclass(TypeclassBase, PlayerDB)): from_obj.at_msg_send(text=text, to_obj=self, **kwargs) except Exception: pass + try: + if not self.at_msg_receive(text=text, **kwargs): + # abort message to this player + return + except Exception: + pass + + kwargs["options"] = options # session relay sessions = make_iter(session) if session else self.sessions.all() diff --git a/evennia/server/portal/irc.py b/evennia/server/portal/irc.py index 99f9e35c1..7e781634a 100644 --- a/evennia/server/portal/irc.py +++ b/evennia/server/portal/irc.py @@ -204,20 +204,29 @@ class IRCBot(irc.IRCClient, Session): """ self.sessionhandler.data_in(self, text=text, **kwargs) - def data_out(self, text=None, **kwargs): + def send_text(self, *args, **kwargs): """ - Data from server-> IRC. + Send channel text to IRC + + Args: + text (str): Outgoing text Kwargs: - text (str): Outgoing text. - kwargs (any): Other data to protocol. + bot_data_out (bool): If True, echo to channel. """ - if text.startswith("bot_data_out"): - text = text.split(" ", 1)[1] + text = args[0] if args else "" + if text and kwargs['options'].get("bot_data_out", False): text = parse_irc_colors(text) self.say(self.channel, text) + def send_default(self, *args, **kwargs): + """ + Ignore other types of sends. + + """ + pass + class IRCBotFactory(protocol.ReconnectingClientFactory): """ diff --git a/evennia/server/sessionhandler.py b/evennia/server/sessionhandler.py index e873223e6..d952eb18c 100644 --- a/evennia/server/sessionhandler.py +++ b/evennia/server/sessionhandler.py @@ -152,7 +152,7 @@ class SessionHandler(dict): applied. """ - options = kwargs.get("options", None) or {} + options = kwargs.pop("options", None) or {} raw = options.get("raw", False) strip_inlinefunc = options.get("strip_inlinefunc", False) @@ -204,6 +204,7 @@ class SessionHandler(dict): rkwargs[key] = [ _validate(data), {} ] else: rkwargs[key] = [ [_validate(data)], {} ] + rkwargs[key][1]["options"] = options return rkwargs