mirror of
https://github.com/evennia/evennia.git
synced 2026-03-25 01:06:32 +01:00
Made objects auto-unsubscribe from tickerhandler when deleted (resolves #515). Fixed a bug that made typeclass loading mechanism not report errors as verbosely as it could.
This commit is contained in:
parent
ce2d11ad12
commit
57144b2c21
3 changed files with 48 additions and 17 deletions
|
|
@ -80,6 +80,10 @@ class Ticker(object):
|
|||
"""
|
||||
for key, (obj, args, kwargs) in self.subscriptions.items():
|
||||
hook_key = yield kwargs.get("hook_key", "at_tick")
|
||||
if not obj:
|
||||
# object was deleted between calls
|
||||
self.validate()
|
||||
continue
|
||||
try:
|
||||
yield _GA(obj, hook_key)(*args, **kwargs)
|
||||
except Exception:
|
||||
|
|
@ -108,7 +112,7 @@ class Ticker(object):
|
|||
if not subs:
|
||||
self.task.stop()
|
||||
elif subs:
|
||||
print "starting with start_delay=", start_delay
|
||||
#print "starting with start_delay=", start_delay
|
||||
self.task.start(self.interval, now=False, start_delay=start_delay)
|
||||
|
||||
def add(self, store_key, obj, *args, **kwargs):
|
||||
|
|
@ -174,6 +178,7 @@ class TickerPool(object):
|
|||
for ticker in self.tickers.values():
|
||||
ticker.stop()
|
||||
|
||||
|
||||
class TickerHandler(object):
|
||||
"""
|
||||
The Tickerhandler maintains a pool of tasks for subscribing
|
||||
|
|
@ -266,15 +271,31 @@ class TickerHandler(object):
|
|||
self.save()
|
||||
self.ticker_pool.add(store_key, obj, interval, *args, **kwargs)
|
||||
|
||||
def remove(self, obj, interval):
|
||||
def remove(self, obj, interval=None):
|
||||
"""
|
||||
Remove object from ticker with given interval.
|
||||
Remove object from ticker, or only this object ticking
|
||||
at a given interval.
|
||||
"""
|
||||
isdb, store_key = self._store_key(obj, interval)
|
||||
if isdb:
|
||||
self.ticker_storage.pop(store_key, None)
|
||||
self.save()
|
||||
self.ticker_pool.remove(store_key, interval)
|
||||
if interval:
|
||||
isdb, store_key = self._store_key(obj, interval)
|
||||
if isdb:
|
||||
self.ticker_storage.pop(store_key, None)
|
||||
self.save()
|
||||
self.ticker_pool.remove(store_key, interval)
|
||||
else:
|
||||
# remove all objects with any intervals
|
||||
intervals = self.ticker_pool.tickers.keys()
|
||||
should_save = False
|
||||
for interval in intervals:
|
||||
isdb, store_key = self._store_key(obj, interval)
|
||||
if isdb:
|
||||
self.ticker_storage.pop(store_key, None)
|
||||
should_save = True
|
||||
self.ticker_pool.remove(store_key, interval)
|
||||
if should_save:
|
||||
self.save()
|
||||
|
||||
|
||||
|
||||
def clear(self, interval=None):
|
||||
"""
|
||||
|
|
@ -306,5 +327,6 @@ class TickerHandler(object):
|
|||
if ticker:
|
||||
return ticker.subscriptions.values()
|
||||
|
||||
|
||||
# main tickerhandler
|
||||
TICKER_HANDLER = TickerHandler()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue