From ccdb56c139e6d6405fda782d35cf391eccaa4e2a Mon Sep 17 00:00:00 2001 From: Vincent Le Goff Date: Sat, 18 Mar 2017 16:52:29 -0700 Subject: [PATCH] Add the @event/del switch to delete events --- evennia/contrib/events/commands.py | 48 +++++++++++++++++++++++++++- evennia/contrib/events/custom.py | 2 +- evennia/contrib/events/scripts.py | 51 ++++++++++++++++++++++++++++++ 3 files changed, 99 insertions(+), 2 deletions(-) diff --git a/evennia/contrib/events/commands.py b/evennia/contrib/events/commands.py index 4088477775..e848baff7b 100644 --- a/evennia/contrib/events/commands.py +++ b/evennia/contrib/events/commands.py @@ -364,7 +364,53 @@ class CmdEvent(COMMAND_DEFAULT_CLASS): def del_event(self): """Delete an event.""" obj = self.obj - self.msg("Calling del.") + event_name = self.event_name + parameters = self.parameters + events = self.handler.get_events(obj) + types = self.handler.get_event_types(obj) + + # If no event name is specified, display the list of events + if not event_name: + self.list_events() + return + + # Check that the event exists + if not event_name in events: + self.msg("The event name {} can't be found in {}.".format( + event_name, obj)) + return + + # If there's only one event, just delete it + if len(events[event_name]) == 1: + parameters = 0 + event = events[event_name][0] + else: + if not parameters: + self.msg("Which event do you wish to delete? Specify " \ + "a number.") + self.list_events() + return + + # Check that the parameter points to an existing event + try: + parameters = int(parameters) - 1 + assert parameters >= 0 + event = events[event_name][parameters] + except (AssertionError, ValueError): + self.msg("The event {} {} cannot be found in {}.".format( + event_name, parameters, obj)) + return + + # If caller can't edit without validation, forbid deleting + # others' works + if not self.autovalid and event["author"] is not self.caller: + self.msg("You cannot delete this event created by someone else.") + return + + # Delete the event + self.handler.del_event(obj, event_name, parameters) + self.msg("The event {} {} of {} was deleted.".format( + obj, event_name, parameters + 1)) def accept_event(self): """Accept an event.""" diff --git a/evennia/contrib/events/custom.py b/evennia/contrib/events/custom.py index 46f95aab90..8c0c41a376 100644 --- a/evennia/contrib/events/custom.py +++ b/evennia/contrib/events/custom.py @@ -217,7 +217,7 @@ def create_time_event(obj, event_name, number, parameters): seconds, key = get_next_wait(parameters) script = create_script("evennia.contrib.events.scripts.TimeEventScript", interval=seconds, obj=obj) script.key = key - script.desc = "time event called regularly on {}".format(key) + script.desc = "event on {}".format(key) script.db.time_format = parameters script.db.number = number diff --git a/evennia/contrib/events/scripts.py b/evennia/contrib/events/scripts.py index 38df34f4f7..557bf02ff5 100644 --- a/evennia/contrib/events/scripts.py +++ b/evennia/contrib/events/scripts.py @@ -178,6 +178,57 @@ class EventHandler(DefaultScript): # If not valid, set it in 'to_valid' if not valid and (obj, event_name, number) not in self.db.to_valid: self.db.to_valid.append((obj, event_name, number)) + elif valid and (obj, event_name, number) in self.db.to_valid: + self.db.to_valid.remove((obj, event_name, number)) + + + def del_event(self, obj, event_name, number): + """ + Delete the specified event. + + Args: + obj (Object): the typeclassed object containing the event. + event_name (str): the name of the event to delete. + number (int): the number of the event to delete. + + """ + obj_events = self.db.events.get(obj, {}) + events = obj_events.get(event_name, []) + + # Delete the event itself + try: + code = events[number]["code"] + except IndexError: + return + else: + logger.log_info("Deleting event {} {} of {}:\n{}".format( + event_name, number, obj, code)) + del events[number] + + # Change IDs of events to be validated + i = 0 + while i < len(self.db.to_valid): + t_obj, t_event_name, t_number = self.db.to_valid[i] + if obj is t_obj and event_name == t_event_name: + if t_number == number: + # Strictly equal, delete the event + del self.db.to_valid[i] + i -= 1 + elif t_number > number: + # Change the ID for this event + self.db.to_valid.insert(i, (t_obj, t_event_name, + t_number - 1)) + del self.db.to_valid[i + 1] + i += 1 + + # Delete time-related events associated with this object + for script in list(obj.scripts.all()): + if isinstance(script, TimeEventScript): + if script.obj is obj and script.db.event_name == event_name: + if script.db.number == number: + script.stop() + elif script.db.number > number: + script.db.number -= 1 def accept_event(self, obj, event_name, number): """