diff --git a/docs/source/Coding/Changelog.md b/docs/source/Coding/Changelog.md index a358bbcdc1..43f6d0ad1d 100644 --- a/docs/source/Coding/Changelog.md +++ b/docs/source/Coding/Changelog.md @@ -48,6 +48,10 @@ template properly (InspectorCaracal) - [Fix][pull3545]: Fix fallback issue in cmdhandler for local-object cmdsets (InspectorCaracal) - [Fix][pull3554]: Fix/readd custom `ic` command to the `character_creator` contrib (InspectorCaracal) +- [Fix][pull3466]: Make sure the `website/base.html` website base is targeted + explicitly so it doesn't get overridden by same file name elsewhere in app (InspectorCaracal) +- [fix][issue3387]: Update all game template doc strings to be more up-to-date + (Griatch) - [Docs]: Doc fixes (Griatch, chiizujin, InspectorCaracal, iLPDev) [pull3470]: https://github.com/evennia/evennia/pull/3470 @@ -79,7 +83,9 @@ [pull3549]: https://github.com/evennia/evennia/pull/3549 [pull3554]: https://github.com/evennia/evennia/pull/3554 [pull3523]: https://github.com/evennia/evennia/pull/3523 +[pull3566]: https://github.com/evennia/evennia/pull/3566 [issue3522]: https://github.com/evennia/evennia/issue/3522 +[issue3387]: https://github.com/evennia/evennia/issue/3387 ## Evennia 4.1.1 diff --git a/evennia/accounts/accounts.py b/evennia/accounts/accounts.py index 828dc53563..e92c245fb6 100644 --- a/evennia/accounts/accounts.py +++ b/evennia/accounts/accounts.py @@ -16,13 +16,14 @@ import time import typing from random import getrandbits -import evennia from django.conf import settings from django.contrib.auth import authenticate, password_validation from django.core.exceptions import ImproperlyConfigured, ValidationError from django.utils import timezone from django.utils.module_loading import import_string from django.utils.translation import gettext as _ + +import evennia from evennia.accounts.manager import AccountManager from evennia.accounts.models import AccountDB from evennia.commands.cmdsethandler import CmdSetHandler @@ -30,17 +31,24 @@ from evennia.comms.models import ChannelDB from evennia.objects.models import ObjectDB from evennia.scripts.scripthandler import ScriptHandler from evennia.server.models import ServerConfig -from evennia.server.signals import (SIGNAL_ACCOUNT_POST_CREATE, - SIGNAL_ACCOUNT_POST_LOGIN_FAIL, - SIGNAL_OBJECT_POST_PUPPET, - SIGNAL_OBJECT_POST_UNPUPPET) +from evennia.server.signals import ( + SIGNAL_ACCOUNT_POST_CREATE, + SIGNAL_ACCOUNT_POST_LOGIN_FAIL, + SIGNAL_OBJECT_POST_PUPPET, + SIGNAL_OBJECT_POST_UNPUPPET, +) from evennia.server.throttle import Throttle from evennia.typeclasses.attributes import ModelAttributeBackend, NickHandler from evennia.typeclasses.models import TypeclassBase from evennia.utils import class_from_module, create, logger from evennia.utils.optionhandler import OptionHandler -from evennia.utils.utils import (is_iter, lazy_property, make_iter, to_str, - variable_from_module) +from evennia.utils.utils import ( + is_iter, + lazy_property, + make_iter, + to_str, + variable_from_module, +) __all__ = ("DefaultAccount", "DefaultGuest") diff --git a/evennia/accounts/migrations/0004_auto_20150403_2339.py b/evennia/accounts/migrations/0004_auto_20150403_2339.py index 5191eaf51b..8b8e642c5e 100644 --- a/evennia/accounts/migrations/0004_auto_20150403_2339.py +++ b/evennia/accounts/migrations/0004_auto_20150403_2339.py @@ -2,9 +2,10 @@ import django.core.validators -import evennia.accounts.manager from django.db import migrations, models +import evennia.accounts.manager + class Migration(migrations.Migration): diff --git a/evennia/accounts/tests.py b/evennia/accounts/tests.py index 87bca0eea6..d6268b3162 100644 --- a/evennia/accounts/tests.py +++ b/evennia/accounts/tests.py @@ -3,14 +3,18 @@ from random import randint from unittest import TestCase -import evennia from django.test import override_settings -from evennia.accounts.accounts import (AccountSessionHandler, DefaultAccount, - DefaultGuest) +from mock import MagicMock, Mock, patch + +import evennia +from evennia.accounts.accounts import ( + AccountSessionHandler, + DefaultAccount, + DefaultGuest, +) from evennia.utils import create from evennia.utils.test_resources import BaseEvenniaTest from evennia.utils.utils import uses_database -from mock import MagicMock, Mock, patch class TestAccountSessionHandler(TestCase): diff --git a/evennia/commands/default/comms.py b/evennia/commands/default/comms.py index c75d837407..5c5df209b2 100644 --- a/evennia/commands/default/comms.py +++ b/evennia/commands/default/comms.py @@ -9,6 +9,7 @@ Communication commands: from django.conf import settings from django.db.models import Q + from evennia.accounts import bots from evennia.accounts.models import AccountDB from evennia.comms.comms import DefaultChannel @@ -1412,9 +1413,7 @@ class CmdPage(COMMAND_DEFAULT_CLASS): message = f"{caller.key} {message.strip(':').strip()}" # create the persistent message object - target_perms = " or ".join( - [f"id({target.id})" for target in targets + [caller]] - ) + target_perms = " or ".join([f"id({target.id})" for target in targets + [caller]]) create.create_message( caller, message, diff --git a/evennia/comms/comms.py b/evennia/comms/comms.py index e901d4860d..5b1a0bc028 100644 --- a/evennia/comms/comms.py +++ b/evennia/comms/comms.py @@ -5,10 +5,11 @@ Base typeclass for in-game Channels. import re -import evennia from django.contrib.contenttypes.models import ContentType from django.urls import reverse from django.utils.text import slugify + +import evennia from evennia.comms.managers import ChannelManager from evennia.comms.models import ChannelDB from evennia.typeclasses.models import TypeclassBase diff --git a/evennia/comms/models.py b/evennia/comms/models.py index d323770858..efab6ee4d3 100644 --- a/evennia/comms/models.py +++ b/evennia/comms/models.py @@ -22,6 +22,7 @@ necessary to easily be able to delete connections on the fly). from django.conf import settings from django.db import models from django.utils import timezone + from evennia.comms import managers from evennia.locks.lockhandler import LockHandler from evennia.typeclasses.models import TypedObject diff --git a/evennia/contrib/base_systems/components/component.py b/evennia/contrib/base_systems/components/component.py index edcf21de78..2754373a3c 100644 --- a/evennia/contrib/base_systems/components/component.py +++ b/evennia/contrib/base_systems/components/component.py @@ -15,16 +15,17 @@ class BaseComponent(type): This is the metaclass for components, responsible for registering components to the listing. """ + def __new__(cls, name, parents, attrs): """ Every class that uses this metaclass will be registered as a component in the Component Listing using its name. All of them require a unique name. """ - attrs_name = attrs.get('name') + attrs_name = attrs.get("name") if attrs_name and not COMPONENT_LISTING.get(attrs_name): new_fields = {} - attrs['_fields'] = new_fields + attrs["_fields"] = new_fields for parent in parents: _parent_fields = getattr(parent, "_fields") if _parent_fields: diff --git a/evennia/contrib/base_systems/components/tests.py b/evennia/contrib/base_systems/components/tests.py index 6087a4d6f6..a40b239eb1 100644 --- a/evennia/contrib/base_systems/components/tests.py +++ b/evennia/contrib/base_systems/components/tests.py @@ -87,23 +87,23 @@ class TestComponents(EvenniaTest): def test_character_components_set_fields_properly(self): test_a_fields = self.char1.test_a._fields - self.assertIn('my_int', test_a_fields) - self.assertIn('my_list', test_a_fields) + self.assertIn("my_int", test_a_fields) + self.assertIn("my_list", test_a_fields) self.assertEqual(len(test_a_fields), 2) test_b_fields = self.char1.test_b._fields - self.assertIn('my_int', test_b_fields) - self.assertIn('my_list', test_b_fields) - self.assertIn('default_tag', test_b_fields) - self.assertIn('single_tag', test_b_fields) - self.assertIn('multiple_tags', test_b_fields) - self.assertIn('default_single_tag', test_b_fields) + self.assertIn("my_int", test_b_fields) + self.assertIn("my_list", test_b_fields) + self.assertIn("default_tag", test_b_fields) + self.assertIn("single_tag", test_b_fields) + self.assertIn("multiple_tags", test_b_fields) + self.assertIn("default_single_tag", test_b_fields) self.assertEqual(len(test_b_fields), 6) test_ic_a_fields = self.char1.ic_a._fields - self.assertIn('my_int', test_ic_a_fields) - self.assertIn('my_list', test_ic_a_fields) - self.assertIn('my_other_int', test_ic_a_fields) + self.assertIn("my_int", test_ic_a_fields) + self.assertIn("my_list", test_ic_a_fields) + self.assertIn("my_other_int", test_ic_a_fields) self.assertEqual(len(test_ic_a_fields), 3) def test_inherited_typeclass_does_not_include_child_class_components(self): diff --git a/evennia/contrib/game_systems/achievements/__init__.py b/evennia/contrib/game_systems/achievements/__init__.py index 15d57e7025..76553e0b47 100644 --- a/evennia/contrib/game_systems/achievements/__init__.py +++ b/evennia/contrib/game_systems/achievements/__init__.py @@ -1,8 +1,8 @@ from .achievements import ( - get_achievement, - search_achievement, - all_achievements, - track_achievements, - get_achievement_progress, CmdAchieve, + all_achievements, + get_achievement, + get_achievement_progress, + search_achievement, + track_achievements, ) diff --git a/evennia/contrib/game_systems/achievements/achievements.py b/evennia/contrib/game_systems/achievements/achievements.py index f0cd189e12..82eed2a9e5 100644 --- a/evennia/contrib/game_systems/achievements/achievements.py +++ b/evennia/contrib/game_systems/achievements/achievements.py @@ -50,11 +50,18 @@ Example: """ from collections import Counter + from django.conf import settings -from evennia.utils import logger -from evennia.utils.utils import all_from_module, is_iter, make_iter, string_partial_matching -from evennia.utils.evmore import EvMore + from evennia.commands.default.muxcommand import MuxCommand +from evennia.utils import logger +from evennia.utils.evmore import EvMore +from evennia.utils.utils import ( + all_from_module, + is_iter, + make_iter, + string_partial_matching, +) # this is either a string of the attribute name, or a tuple of strings of the attribute name and category _ACHIEVEMENT_ATTR = make_iter(getattr(settings, "ACHIEVEMENT_CONTRIB_ATTRIBUTE", "achievements")) @@ -322,12 +329,12 @@ class CmdAchieve(MuxCommand): elif not achievement_data.get("progress"): status = "|yNot Started|n" else: - count = achievement_data.get("count",1) + count = achievement_data.get("count", 1) # is this achievement tracking items separately? if is_iter(achievement_data["progress"]): # we'll display progress as how many items have been completed completed = Counter(val >= count for val in achievement_data["progress"])[True] - pct = (completed * 100) // len(achievement_data['progress']) + pct = (completed * 100) // len(achievement_data["progress"]) else: # we display progress as the percent of the total count pct = (achievement_data["progress"] * 100) // count @@ -379,8 +386,7 @@ class CmdAchieve(MuxCommand): elif "all" in self.switches: # we merge our progress data into the full dict of achievements achievement_data = { - key: data | progress_data.get(key, {}) - for key, data in achievements.items() + key: data | progress_data.get(key, {}) for key, data in achievements.items() } # we show all of the currently available achievements regardless of progress status diff --git a/evennia/contrib/game_systems/achievements/tests.py b/evennia/contrib/game_systems/achievements/tests.py index b552972af3..74975fe329 100644 --- a/evennia/contrib/game_systems/achievements/tests.py +++ b/evennia/contrib/game_systems/achievements/tests.py @@ -1,5 +1,7 @@ -from evennia.utils.test_resources import BaseEvenniaTest, BaseEvenniaCommandTest from mock import patch + +from evennia.utils.test_resources import BaseEvenniaCommandTest, BaseEvenniaTest + from . import achievements _dummy_achievements = { diff --git a/evennia/contrib/grid/extended_room/extended_room.py b/evennia/contrib/grid/extended_room/extended_room.py index b91c3c1f30..a313a8fc17 100644 --- a/evennia/contrib/grid/extended_room/extended_room.py +++ b/evennia/contrib/grid/extended_room/extended_room.py @@ -47,8 +47,17 @@ from collections import deque from django.conf import settings from django.db.models import Q -from evennia import (CmdSet, DefaultRoom, EvEditor, FuncParser, - InterruptCommand, default_cmds, gametime, utils) + +from evennia import ( + CmdSet, + DefaultRoom, + EvEditor, + FuncParser, + InterruptCommand, + default_cmds, + gametime, + utils, +) from evennia.typeclasses.attributes import AttributeProperty from evennia.utils.utils import list_to_string, repeat diff --git a/evennia/contrib/rpg/character_creator/character_creator.py b/evennia/contrib/rpg/character_creator/character_creator.py index 05b88b201b..694393b75a 100644 --- a/evennia/contrib/rpg/character_creator/character_creator.py +++ b/evennia/contrib/rpg/character_creator/character_creator.py @@ -22,9 +22,9 @@ from random import choices from django.conf import settings from evennia import DefaultAccount -from evennia.commands.default.muxcommand import MuxAccountCommand -from evennia.commands.default.account import CmdIC from evennia.commands.cmdset import CmdSet +from evennia.commands.default.account import CmdIC +from evennia.commands.default.muxcommand import MuxAccountCommand from evennia.objects.models import ObjectDB from evennia.utils.evmenu import EvMenu from evennia.utils.utils import is_iter, string_partial_matching diff --git a/evennia/help/models.py b/evennia/help/models.py index 8d1a1e8509..37565256f7 100644 --- a/evennia/help/models.py +++ b/evennia/help/models.py @@ -15,6 +15,7 @@ from django.db import models from django.urls import reverse from django.utils import timezone from django.utils.text import slugify + from evennia.help.manager import HelpEntryManager from evennia.locks.lockhandler import LockHandler from evennia.typeclasses.models import AliasHandler, Tag, TagHandler diff --git a/evennia/objects/objects.py b/evennia/objects/objects.py index 7cc4266324..7038ae9574 100644 --- a/evennia/objects/objects.py +++ b/evennia/objects/objects.py @@ -10,10 +10,11 @@ import time import typing from collections import defaultdict -import evennia import inflect from django.conf import settings from django.utils.translation import gettext as _ + +import evennia from evennia.commands import cmdset from evennia.commands.cmdsethandler import CmdSetHandler from evennia.objects.manager import ObjectManager @@ -23,9 +24,17 @@ from evennia.server.signals import SIGNAL_EXIT_TRAVERSED from evennia.typeclasses.attributes import ModelAttributeBackend, NickHandler from evennia.typeclasses.models import TypeclassBase from evennia.utils import ansi, create, funcparser, logger, search -from evennia.utils.utils import (class_from_module, compress_whitespace, dbref, - is_iter, iter_to_str, lazy_property, - make_iter, to_str, variable_from_module) +from evennia.utils.utils import ( + class_from_module, + compress_whitespace, + dbref, + is_iter, + iter_to_str, + lazy_property, + make_iter, + to_str, + variable_from_module, +) _INFLECT = inflect.engine() _MULTISESSION_MODE = settings.MULTISESSION_MODE diff --git a/evennia/scripts/scripts.py b/evennia/scripts/scripts.py index 2fb0de1408..64d279e414 100644 --- a/evennia/scripts/scripts.py +++ b/evennia/scripts/scripts.py @@ -6,12 +6,13 @@ ability to run timers. """ from django.utils.translation import gettext as _ +from twisted.internet.defer import Deferred, maybeDeferred +from twisted.internet.task import LoopingCall + from evennia.scripts.manager import ScriptManager from evennia.scripts.models import ScriptDB from evennia.typeclasses.models import TypeclassBase from evennia.utils import create, logger -from twisted.internet.defer import Deferred, maybeDeferred -from twisted.internet.task import LoopingCall __all__ = ["DefaultScript", "DoNothing", "Store"] diff --git a/evennia/server/portal/telnet.py b/evennia/server/portal/telnet.py index cc0d2256a4..46d1de0baa 100644 --- a/evennia/server/portal/telnet.py +++ b/evennia/server/portal/telnet.py @@ -474,7 +474,7 @@ class TelnetProtocol(Telnet, StatefulTelnetProtocol, _BASE_SESSION_CLASS): _RE_N.sub("", prompt) + ("||n" if prompt.endswith("|") else "|n"), strip_ansi=nocolor, xterm256=xterm256, - truecolor=truecolor + truecolor=truecolor, ) if mxp: prompt = mxp_parse(prompt) @@ -511,7 +511,7 @@ class TelnetProtocol(Telnet, StatefulTelnetProtocol, _BASE_SESSION_CLASS): strip_ansi=nocolor, xterm256=xterm256, mxp=mxp, - truecolor=truecolor + truecolor=truecolor, ) if mxp: linetosend = mxp_parse(linetosend) diff --git a/evennia/server/portal/ttype.py b/evennia/server/portal/ttype.py index 58705eb12d..d1b4c738b2 100644 --- a/evennia/server/portal/ttype.py +++ b/evennia/server/portal/ttype.py @@ -130,10 +130,10 @@ class Ttype: self.protocol.protocol_flags["NOPROMPTGOAHEAD"] = False if ( - clientname.startswith("XTERM") - or clientname.endswith("-256COLOR") - or clientname - in ( + clientname.startswith("XTERM") + or clientname.endswith("-256COLOR") + or clientname + in ( "ATLANTIS", # > 0.9.9.0 (aug 2009) "CMUD", # > 3.04 (mar 2009) "KILDCLIENT", # > 2.2.0 (sep 2005) @@ -143,17 +143,13 @@ class Ttype: "BEIP", # > 2.00.206 (late 2009) (BeipMu) "POTATO", # > 2.00 (maybe earlier) "TINYFUGUE", # > 4.x (maybe earlier) - ) + ) ): xterm256 = True # use name to identify support for xterm truecolor truecolor = False - if (clientname.endswith("-TRUECOLOR") or - clientname in ( - "AXMUD", - "TINTIN" - )): + if clientname.endswith("-TRUECOLOR") or clientname in ("AXMUD", "TINTIN"): truecolor = True # all clients supporting TTYPE at all seem to support ANSI @@ -169,9 +165,9 @@ class Ttype: tupper = term.upper() # identify xterm256 based on flag xterm256 = ( - tupper.endswith("-256COLOR") - or tupper.endswith("XTERM") # Apple Terminal, old Tintin - and not tupper.endswith("-COLOR") # old Tintin, Putty + tupper.endswith("-256COLOR") + or tupper.endswith("XTERM") # Apple Terminal, old Tintin + and not tupper.endswith("-COLOR") # old Tintin, Putty ) if xterm256: self.protocol.protocol_flags["ANSI"] = True diff --git a/evennia/typeclasses/models.py b/evennia/typeclasses/models.py index ac33727c8e..476e11b045 100644 --- a/evennia/typeclasses/models.py +++ b/evennia/typeclasses/models.py @@ -26,7 +26,6 @@ these to create custom managers. """ -import evennia from django.conf import settings from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ObjectDoesNotExist @@ -37,21 +36,30 @@ from django.urls import reverse from django.utils import timezone from django.utils.encoding import smart_str from django.utils.text import slugify + +import evennia from evennia.locks.lockhandler import LockHandler from evennia.server.signals import SIGNAL_TYPED_OBJECT_POST_RENAME from evennia.typeclasses import managers -from evennia.typeclasses.attributes import (Attribute, AttributeHandler, - AttributeProperty, DbHolder, - InMemoryAttributeBackend, - ModelAttributeBackend) -from evennia.typeclasses.tags import (AliasHandler, PermissionHandler, Tag, - TagCategoryProperty, TagHandler, - TagProperty) -from evennia.utils.idmapper.models import (SharedMemoryModel, - SharedMemoryModelBase) +from evennia.typeclasses.attributes import ( + Attribute, + AttributeHandler, + AttributeProperty, + DbHolder, + InMemoryAttributeBackend, + ModelAttributeBackend, +) +from evennia.typeclasses.tags import ( + AliasHandler, + PermissionHandler, + Tag, + TagCategoryProperty, + TagHandler, + TagProperty, +) +from evennia.utils.idmapper.models import SharedMemoryModel, SharedMemoryModelBase from evennia.utils.logger import log_trace -from evennia.utils.utils import (class_from_module, inherits_from, is_iter, - lazy_property) +from evennia.utils.utils import class_from_module, inherits_from, is_iter, lazy_property __all__ = ("TypedObject",) diff --git a/evennia/utils/ansi.py b/evennia/utils/ansi.py index 68dbc0c103..a3145c21d9 100644 --- a/evennia/utils/ansi.py +++ b/evennia/utils/ansi.py @@ -69,8 +69,8 @@ from collections import OrderedDict from django.conf import settings from evennia.utils import logger, utils -from evennia.utils.utils import to_str from evennia.utils.hex_colors import HexColors +from evennia.utils.utils import to_str hex2truecolor = HexColors() hex_sub = HexColors.hex_sub diff --git a/evennia/utils/eveditor.py b/evennia/utils/eveditor.py index 0259faeaa0..2657d61393 100644 --- a/evennia/utils/eveditor.py +++ b/evennia/utils/eveditor.py @@ -722,7 +722,7 @@ class CmdEditorGroup(CmdEditorBase): } align_name = {"f": "Full", "c": "Center", "l": "Left", "r": "Right"} # shift width arg right if no alignment specified - if self.arg1.startswith('='): + if self.arg1.startswith("="): self.arg2 = self.arg1 self.arg1 = None if self.arg1 and self.arg1.lower() not in align_map: diff --git a/evennia/utils/evmenu.py b/evennia/utils/evmenu.py index 1a4838371f..6bf4361827 100644 --- a/evennia/utils/evmenu.py +++ b/evennia/utils/evmenu.py @@ -272,17 +272,28 @@ from fnmatch import fnmatch from inspect import getfullargspec, isfunction from math import ceil -import evennia from django.conf import settings + # i18n from django.utils.translation import gettext as _ + +import evennia from evennia import CmdSet, Command from evennia.commands import cmdhandler from evennia.utils import logger from evennia.utils.ansi import strip_ansi from evennia.utils.evtable import EvColumn, EvTable -from evennia.utils.utils import (crop, dedent, inherits_from, is_iter, m_len, - make_iter, mod_import, pad, to_str) +from evennia.utils.utils import ( + crop, + dedent, + inherits_from, + is_iter, + m_len, + make_iter, + mod_import, + pad, + to_str, +) # read from protocol NAWS later? _MAX_TEXT_WIDTH = settings.CLIENT_DEFAULT_WIDTH diff --git a/evennia/utils/tests/test_funcparser.py b/evennia/utils/tests/test_funcparser.py index 96892283fe..7756a95999 100644 --- a/evennia/utils/tests/test_funcparser.py +++ b/evennia/utils/tests/test_funcparser.py @@ -10,10 +10,11 @@ from ast import literal_eval from unittest.mock import MagicMock, patch from django.test import TestCase, override_settings -from evennia.utils import funcparser, test_resources from parameterized import parameterized from simpleeval import simple_eval +from evennia.utils import funcparser, test_resources + def _test_callable(*args, **kwargs): kwargs.pop("funcparser", None) diff --git a/evennia/utils/tests/test_text2html.py b/evennia/utils/tests/test_text2html.py index 74bd61bf18..f8aec0c1d4 100644 --- a/evennia/utils/tests/test_text2html.py +++ b/evennia/utils/tests/test_text2html.py @@ -49,9 +49,7 @@ class TestText2Html(TestCase): # True Color self.assertEqual( 'redfoo', - parser.format_styles( - f'\x1b[38;2;255;0;0m' + "red" + ansi.ANSI_NORMAL + "foo" - ), + parser.format_styles(f"\x1b[38;2;255;0;0m" + "red" + ansi.ANSI_NORMAL + "foo"), ) def test_remove_bells(self): diff --git a/evennia/utils/tests/test_truecolor.py b/evennia/utils/tests/test_truecolor.py index 33fddeca16..c505cc1f86 100644 --- a/evennia/utils/tests/test_truecolor.py +++ b/evennia/utils/tests/test_truecolor.py @@ -1,6 +1,7 @@ from django.test import TestCase -from evennia.utils.ansi import ANSIString as AN, ANSIParser +from evennia.utils.ansi import ANSIParser +from evennia.utils.ansi import ANSIString as AN parser = ANSIParser().parse_ansi diff --git a/evennia/utils/text2html.py b/evennia/utils/text2html.py index bb9d642915..6b1e0057d7 100644 --- a/evennia/utils/text2html.py +++ b/evennia/utils/text2html.py @@ -12,7 +12,6 @@ import re from html import escape as html_escape from .ansi import * - from .hex_colors import HexColors # All xterm256 RGB equivalents