Resolve merge conflicts
This commit is contained in:
commit
edff348d87
5 changed files with 52 additions and 14 deletions
|
|
@ -32,6 +32,8 @@ without arguments starts a full interactive Python console.
|
||||||
- Make code auto-formatted with Black.
|
- Make code auto-formatted with Black.
|
||||||
- Make default `set` command able to edit nested structures (PR by Aaron McMillan)
|
- Make default `set` command able to edit nested structures (PR by Aaron McMillan)
|
||||||
- Allow running Evennia test suite from core repo with `make test`.
|
- Allow running Evennia test suite from core repo with `make test`.
|
||||||
|
- Return `store_key` from `TickerHandler.add` and add `store_key` as a kwarg to
|
||||||
|
the `TickerHandler.remove` method. This makes it easier to manage tickers.
|
||||||
|
|
||||||
|
|
||||||
## Evennia 0.9 (2018-2019)
|
## Evennia 0.9 (2018-2019)
|
||||||
|
|
|
||||||
|
|
@ -168,9 +168,8 @@ class ScriptBase(ScriptDB, metaclass=TypeclassBase):
|
||||||
Start task runner.
|
Start task runner.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
if self.ndb._task:
|
if not self.ndb._task:
|
||||||
return
|
self.ndb._task = ExtendedLoopingCall(self._step_task)
|
||||||
self.ndb._task = ExtendedLoopingCall(self._step_task)
|
|
||||||
|
|
||||||
if self.db._paused_time:
|
if self.db._paused_time:
|
||||||
# the script was paused; restarting
|
# the script was paused; restarting
|
||||||
|
|
|
||||||
|
|
@ -499,6 +499,11 @@ class TickerHandler(object):
|
||||||
callback every time it is called. This must be data possible
|
callback every time it is called. This must be data possible
|
||||||
to pickle!
|
to pickle!
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
store_key (tuple): The immutable store-key for this ticker. This can
|
||||||
|
be stored and passed into `.remove(store_key=store_key)` later to
|
||||||
|
easily stop this ticker later.
|
||||||
|
|
||||||
Notes:
|
Notes:
|
||||||
The callback will be identified by type and stored either as
|
The callback will be identified by type and stored either as
|
||||||
as combination of serialized database object + methodname or
|
as combination of serialized database object + methodname or
|
||||||
|
|
@ -521,17 +526,29 @@ class TickerHandler(object):
|
||||||
self.ticker_storage[store_key] = (args, kwargs)
|
self.ticker_storage[store_key] = (args, kwargs)
|
||||||
self.ticker_pool.add(store_key, *args, **kwargs)
|
self.ticker_pool.add(store_key, *args, **kwargs)
|
||||||
self.save()
|
self.save()
|
||||||
|
return store_key
|
||||||
|
|
||||||
def remove(self, interval=60, callback=None, idstring="", persistent=True):
|
def remove(
|
||||||
|
self, interval=60, callback=None, idstring="", persistent=True, store_key=None
|
||||||
|
):
|
||||||
"""
|
"""
|
||||||
Remove object from ticker or only remove it from tickers with
|
Remove ticker subscription from handler.
|
||||||
a given interval.
|
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
interval (int, optional): Interval of ticker to remove.
|
interval (int, optional): Interval of ticker to remove.
|
||||||
callback (callable function or method): Either a function or
|
callback (callable function or method): Either a function or
|
||||||
the method of a typeclassed object.
|
the method of a typeclassed object.
|
||||||
idstring (str, optional): Identifier id of ticker to remove.
|
idstring (str, optional): Identifier id of ticker to remove.
|
||||||
|
persistent (bool, optional): Whether this ticker is persistent or not.
|
||||||
|
store_key (str, optional): If given, all other kwargs are ignored and only
|
||||||
|
this is used to identify the ticker.
|
||||||
|
|
||||||
|
Raises:
|
||||||
|
KeyError: If no matching ticker was found to remove.
|
||||||
|
|
||||||
|
Notes:
|
||||||
|
The store-key is normally built from the interval/callback/idstring/persistent values;
|
||||||
|
but if the `store_key` is explicitly given, this is used instead.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
if isinstance(callback, int):
|
if isinstance(callback, int):
|
||||||
|
|
@ -539,13 +556,17 @@ class TickerHandler(object):
|
||||||
"TICKER_HANDLER.remove has changed: "
|
"TICKER_HANDLER.remove has changed: "
|
||||||
"the interval is now the first argument, callback the second."
|
"the interval is now the first argument, callback the second."
|
||||||
)
|
)
|
||||||
|
if not store_key:
|
||||||
obj, path, callfunc = self._get_callback(callback)
|
obj, path, callfunc = self._get_callback(callback)
|
||||||
store_key = self._store_key(obj, path, interval, callfunc, idstring, persistent)
|
store_key = self._store_key(
|
||||||
|
obj, path, interval, callfunc, idstring, persistent
|
||||||
|
)
|
||||||
to_remove = self.ticker_storage.pop(store_key, None)
|
to_remove = self.ticker_storage.pop(store_key, None)
|
||||||
if to_remove:
|
if to_remove:
|
||||||
self.ticker_pool.remove(store_key)
|
self.ticker_pool.remove(store_key)
|
||||||
self.save()
|
self.save()
|
||||||
|
else:
|
||||||
|
raise KeyError(f"No Ticker was found matching the store-key {store_key}.")
|
||||||
|
|
||||||
def clear(self, interval=None):
|
def clear(self, interval=None):
|
||||||
"""
|
"""
|
||||||
|
|
|
||||||
|
|
@ -587,7 +587,15 @@ def to_pickle(data):
|
||||||
return [process_item(val) for val in item]
|
return [process_item(val) for val in item]
|
||||||
elif hasattr(item, "sessid") and hasattr(item, "conn_time"):
|
elif hasattr(item, "sessid") and hasattr(item, "conn_time"):
|
||||||
return pack_session(item)
|
return pack_session(item)
|
||||||
return pack_dbobj(item)
|
try:
|
||||||
|
return pack_dbobj(item)
|
||||||
|
except TypeError:
|
||||||
|
return item
|
||||||
|
except Exception:
|
||||||
|
logger.log_error(
|
||||||
|
f"The object {item} of type {type(item)} could not be stored."
|
||||||
|
)
|
||||||
|
raise
|
||||||
|
|
||||||
return process_item(data)
|
return process_item(data)
|
||||||
|
|
||||||
|
|
@ -726,12 +734,20 @@ def from_pickle(data, db_obj=None):
|
||||||
|
|
||||||
def do_pickle(data):
|
def do_pickle(data):
|
||||||
"""Perform pickle to string"""
|
"""Perform pickle to string"""
|
||||||
return dumps(data, protocol=PICKLE_PROTOCOL)
|
try:
|
||||||
|
return dumps(data, protocol=PICKLE_PROTOCOL)
|
||||||
|
except Exception:
|
||||||
|
logger.log_error(f"Could not pickle data for storage: {data}")
|
||||||
|
raise
|
||||||
|
|
||||||
|
|
||||||
def do_unpickle(data):
|
def do_unpickle(data):
|
||||||
"""Retrieve pickle from pickled string"""
|
"""Retrieve pickle from pickled string"""
|
||||||
return loads(to_bytes(data))
|
try:
|
||||||
|
return loads(to_bytes(data))
|
||||||
|
except Exception:
|
||||||
|
logger.log_error(f"Could not unpickle data from storage: {data}")
|
||||||
|
raise
|
||||||
|
|
||||||
|
|
||||||
def dbserialize(data):
|
def dbserialize(data):
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ snippet #577349 on http://code.activestate.com.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import re
|
import re
|
||||||
import cgi
|
from html import escape as html_escape
|
||||||
from .ansi import *
|
from .ansi import *
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -326,7 +326,7 @@ class TextToHTMLparser(object):
|
||||||
"""
|
"""
|
||||||
cdict = match.groupdict()
|
cdict = match.groupdict()
|
||||||
if cdict["htmlchars"]:
|
if cdict["htmlchars"]:
|
||||||
return cgi.escape(cdict["htmlchars"])
|
return html_escape(cdict["htmlchars"])
|
||||||
elif cdict["lineend"]:
|
elif cdict["lineend"]:
|
||||||
return "<br>"
|
return "<br>"
|
||||||
elif cdict["firstspace"]:
|
elif cdict["firstspace"]:
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue