diff --git a/game/gamesrc/commands/default/comms.py b/game/gamesrc/commands/default/comms.py index a4d4abdcde..a52084c258 100644 --- a/game/gamesrc/commands/default/comms.py +++ b/game/gamesrc/commands/default/comms.py @@ -763,7 +763,6 @@ class CmdPage(MuxCommand): caller.msg(string) return - # Build a list of targets if not self.lhs: @@ -775,10 +774,10 @@ class CmdPage(MuxCommand): recobjs = [] for receiver in receivers: - obj = caller.search("*%s" % (receiver.lstrip('*')), global_search=True) - if not obj: + pobj = caller.search("*%s" % (receiver.lstrip('*')), global_search=True) + if not pobj: return - recobjs.append(obj) + recobjs.append(pobj) header = "{wPlayer{n {c%s{n {wpages:{n" % caller.key message = self.rhs @@ -786,7 +785,7 @@ class CmdPage(MuxCommand): msg = create.create_message(caller, message, receivers=recobjs) # tell the players they got a message. - for obj in recobjs: - obj.msg("%s %s" % (header, message)) - caller.msg("You paged %s with '%s'." % (recobjs, message)) - + for pobj in recobjs: + pobj.msg("%s %s" % (header, message)) + target_names = "{n,{c ".join([pobj.name for pobj in recobjs]) + caller.msg("You paged {c%s{n with: '%s'." % (target_names, message)) diff --git a/src/comms/managers.py b/src/comms/managers.py index 96f004e914..194ac721d6 100644 --- a/src/comms/managers.py +++ b/src/comms/managers.py @@ -66,8 +66,7 @@ class MsgManager(models.Manager): sender = to_object(sender) if not sender: return None - return [msg for msg in sender.sender_set.all() - if sender not in msg.hide_from_senders.all()] + return self.filter(db_sender=sender).exclude(db_hide_from_sender=False) def get_messages_by_receiver(self, receiver): """ @@ -76,8 +75,9 @@ class MsgManager(models.Manager): receiver = to_object(receiver) if not receiver: return None - return [msg for msg in receiver.receiver_set.all() - if receiver not in msg.hide_from_receivers.all()] + return [msg for msg in self.all() + if receiver in msg.recivers + and receiver not in msg.hide_from_receivers] def get_messages_by_channel(self, channel): """ @@ -86,9 +86,9 @@ class MsgManager(models.Manager): channel = to_object(channel, objtype='channel') if not channel: return None - return [msg for msg in channel.channel_set.all() - if channel not in msg.hide_from_channels.all()] - + return [msg for msg in self.all() + if channel in msg.channels + and channel not in msg.hide_from_channels] #TODO add search limited by send_times def text_search(self, searchstring, filterdict=None): diff --git a/src/comms/models.py b/src/comms/models.py index ec1164e693..9082bb133e 100644 --- a/src/comms/models.py +++ b/src/comms/models.py @@ -107,9 +107,9 @@ class Msg(SharedMemoryModel): # Stored as a comma-separated string of dbrefs. Can be used by the # game to mask out messages from being visible in the archive (no # messages are actually deleted) - #db_hide_from_sender = models.BooleanField(default=False) - #db_hide_from_receivers = models.CharField(max_length=255, null=True, blank=True) - #db_hide_from_channels = models.CharField(max_length=255, null=True, blank=True) + db_hide_from_sender = models.BooleanField(default=False) + db_hide_from_receivers = models.CharField(max_length=255, null=True, blank=True) + db_hide_from_channels = models.CharField(max_length=255, null=True, blank=True) # permission strings, separated by commas db_permissions = models.CharField(max_length=255, blank=True) diff --git a/src/objects/manager.py b/src/objects/manager.py index 29128aa298..403574cc80 100644 --- a/src/objects/manager.py +++ b/src/objects/manager.py @@ -4,7 +4,7 @@ Custom manager for Objects. from django.conf import settings from django.contrib.auth.models import User from src.typeclasses.managers import TypedObjectManager -from src.typeclasses.managers import returns_typeclass_list +from src.typeclasses.managers import returns_typeclass, returns_typeclass_list from src.utils import create # Try to use a custom way to parse id-tagged multimatches. @@ -62,17 +62,23 @@ class ObjectManager(TypedObjectManager): # ObjectManager Get methods # - @returns_typeclass_list + @returns_typeclass def get_object_with_user(self, user): """ Matches objects with obj.player.user matching the argument. - Both an user object and a user id may be supplied. + A player<->user is a one-to-relationship, so this always + returns just one result or None. + + user - mayb be a user object or user id. """ try: uid = int(user) except TypeError: - uid = user.id - return self.filter(db_player__user__id=uid) + uid = user.id + try: + return self.get(db_player__user__id=uid) + except Exception: + return None # This returns typeclass since get_object_with_user and get_dbref does. def player_name_search(self, search_string): @@ -273,7 +279,7 @@ class ObjectManager(TypedObjectManager): player_string = ostring.lstrip("*") player_match = self.player_name_search(player_string) if player_match is not None: - return [player_match] + return [player_match] if global_search or not location: # search all objects diff --git a/src/objects/models.py b/src/objects/models.py index f0ce5fb93e..4afb2a67ef 100644 --- a/src/objects/models.py +++ b/src/objects/models.py @@ -450,6 +450,7 @@ class ObjectDB(TypedObject): results = ObjectDB.objects.object_search(self, ostring, global_search, attribute_name) + if ignore_errors: return results return HANDLE_SEARCH_ERRORS(self, ostring, results, global_search) diff --git a/src/server/session.py b/src/server/session.py index 85b0bdd155..85eb00a5b8 100644 --- a/src/server/session.py +++ b/src/server/session.py @@ -140,9 +140,9 @@ class SessionProtocol(StatefulTelnetProtocol): character = ObjectDB.objects.get_object_with_user(self.uid) if not character: string = "No character match for session uid: %s" % self.uid - logger.log_errmsg(string) - return None - return character[0] + logger.log_errmsg(string) + else: + return character return None def execute_cmd(self, raw_string):