Add the @event/del switch to delete events

This commit is contained in:
Vincent Le Goff 2017-03-18 16:52:29 -07:00 committed by Griatch
parent 8dc5c69d00
commit ccdb56c139
3 changed files with 99 additions and 2 deletions

View file

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

View file

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

View file

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