mirror of
https://github.com/evennia/evennia.git
synced 2026-03-16 21:06:30 +01:00
Clean up Msg objects
This commit is contained in:
parent
3218d74381
commit
e38604ab02
3 changed files with 89 additions and 96 deletions
26
evennia/comms/migrations/0020_auto_20210514_2210.py
Normal file
26
evennia/comms/migrations/0020_auto_20210514_2210.py
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
# Generated by Django 2.2.16 on 2021-05-14 22:10
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('comms', '0019_auto_20210514_2032'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RemoveField(
|
||||
model_name='msg',
|
||||
name='db_hide_from_channels',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='msg',
|
||||
name='db_receivers_channels',
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='msg',
|
||||
name='db_receiver_external',
|
||||
field=models.CharField(blank=True, db_index=True, help_text='identifier for single external receiver, for use with receivers without a database existence.', max_length=1024, null=True, verbose_name='external receiver'),
|
||||
),
|
||||
]
|
||||
|
|
@ -53,17 +53,16 @@ class Msg(SharedMemoryModel):
|
|||
- db_sender_accounts: Account senders
|
||||
- db_sender_objects: Object senders
|
||||
- db_sender_scripts: Script senders
|
||||
- db_sender_external: External senders (defined as string names)
|
||||
- db_sender_external: External sender (defined as string name)
|
||||
- db_receivers_accounts: Receiving accounts
|
||||
- db_receivers_objects: Receiving objects
|
||||
- db_receivers_scripts: Receiveing scripts
|
||||
- db_receivers_channels: Receiving channels
|
||||
- db_receiver_external: External sender (defined as string name)
|
||||
- db_header: Header text
|
||||
- db_message: The actual message text
|
||||
- db_date_created: time message was created / sent
|
||||
- db_hide_from_sender: bool if message should be hidden from sender
|
||||
- db_hide_from_receivers: list of receiver objects to hide message from
|
||||
- db_hide_from_channels: list of channels objects to hide message from
|
||||
- db_lock_storage: Internal storage of lock strings.
|
||||
|
||||
"""
|
||||
|
|
@ -75,9 +74,6 @@ class Msg(SharedMemoryModel):
|
|||
# These databse fields are all set using their corresponding properties,
|
||||
# named same as the field, but withtout the db_* prefix.
|
||||
|
||||
# Sender is either an account, an object or an external sender, like
|
||||
# an IRC channel; normally there is only one, but if co-modification of
|
||||
# a message is allowed, there may be more than one "author"
|
||||
db_sender_accounts = models.ManyToManyField(
|
||||
"accounts.AccountDB",
|
||||
related_name="sender_account_set",
|
||||
|
|
@ -109,9 +105,7 @@ class Msg(SharedMemoryModel):
|
|||
help_text="identifier for external sender, for example a sender over an "
|
||||
"IRC connection (i.e. someone who doesn't have an exixtence in-game).",
|
||||
)
|
||||
# The destination objects of this message. Stored as a
|
||||
# comma-separated string of object dbrefs. Can be defined along
|
||||
# with channels below.
|
||||
|
||||
db_receivers_accounts = models.ManyToManyField(
|
||||
"accounts.AccountDB",
|
||||
related_name="receiver_account_set",
|
||||
|
|
@ -131,8 +125,15 @@ class Msg(SharedMemoryModel):
|
|||
blank=True,
|
||||
help_text="script_receivers",
|
||||
)
|
||||
db_receivers_channels = models.ManyToManyField(
|
||||
"ChannelDB", related_name="channel_set", blank=True, help_text="channel recievers"
|
||||
|
||||
db_receiver_external = models.CharField(
|
||||
"external receiver",
|
||||
max_length=1024,
|
||||
null=True,
|
||||
blank=True,
|
||||
db_index=True,
|
||||
help_text="identifier for single external receiver, for use with "
|
||||
"receivers without a database existence."
|
||||
)
|
||||
|
||||
# header could be used for meta-info about the message if your system needs
|
||||
|
|
@ -149,7 +150,7 @@ class Msg(SharedMemoryModel):
|
|||
"locks", blank=True, help_text="access locks on this message."
|
||||
)
|
||||
|
||||
# these can be used to filter/hide a given message from supplied objects/accounts/channels
|
||||
# these can be used to filter/hide a given message from supplied objects/accounts
|
||||
db_hide_from_accounts = models.ManyToManyField(
|
||||
"accounts.AccountDB", related_name="hide_from_accounts_set", blank=True
|
||||
)
|
||||
|
|
@ -157,10 +158,6 @@ class Msg(SharedMemoryModel):
|
|||
db_hide_from_objects = models.ManyToManyField(
|
||||
"objects.ObjectDB", related_name="hide_from_objects_set", blank=True
|
||||
)
|
||||
# NOTE: deprecated in 1.0. Not used for channels anymore
|
||||
db_hide_from_channels = models.ManyToManyField(
|
||||
"ChannelDB", related_name="hide_from_channels_set", blank=True
|
||||
)
|
||||
|
||||
db_tags = models.ManyToManyField(
|
||||
Tag,
|
||||
|
|
@ -172,10 +169,6 @@ class Msg(SharedMemoryModel):
|
|||
objects = managers.MsgManager()
|
||||
_is_deleted = False
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
SharedMemoryModel.__init__(self, *args, **kwargs)
|
||||
self.extra_senders = []
|
||||
|
||||
class Meta(object):
|
||||
"Define Django meta options"
|
||||
verbose_name = "Msg"
|
||||
|
|
@ -196,26 +189,24 @@ class Msg(SharedMemoryModel):
|
|||
# value = self.attr and del self.attr respectively (where self
|
||||
# is the object in question).
|
||||
|
||||
# sender property (wraps db_sender_*)
|
||||
# @property
|
||||
def __senders_get(self):
|
||||
"Getter. Allows for value = self.sender"
|
||||
@property
|
||||
def senders(self):
|
||||
"Getter. Allows for value = self.senders"
|
||||
return (
|
||||
list(self.db_sender_accounts.all())
|
||||
+ list(self.db_sender_objects.all())
|
||||
+ list(self.db_sender_scripts.all())
|
||||
+ self.extra_senders
|
||||
+ [self.db_sender_external]
|
||||
)
|
||||
|
||||
# @sender.setter
|
||||
def __senders_set(self, senders):
|
||||
@senders.setter
|
||||
def senders(self, senders):
|
||||
"Setter. Allows for self.sender = value"
|
||||
for sender in make_iter(senders):
|
||||
if not sender:
|
||||
continue
|
||||
if isinstance(sender, str):
|
||||
self.db_sender_external = sender
|
||||
self.extra_senders.append(sender)
|
||||
self.save(update_fields=["db_sender_external"])
|
||||
continue
|
||||
if not hasattr(sender, "__dbclass__"):
|
||||
|
|
@ -228,32 +219,32 @@ class Msg(SharedMemoryModel):
|
|||
elif clsname == "ScriptDB":
|
||||
self.db_sender_scripts.add(sender)
|
||||
|
||||
# @sender.deleter
|
||||
def __senders_del(self):
|
||||
@senders.deleter
|
||||
def senders(self):
|
||||
"Deleter. Clears all senders"
|
||||
self.db_sender_accounts.clear()
|
||||
self.db_sender_objects.clear()
|
||||
self.db_sender_scripts.clear()
|
||||
self.db_sender_external = ""
|
||||
self.extra_senders = []
|
||||
self.save()
|
||||
|
||||
senders = property(__senders_get, __senders_set, __senders_del)
|
||||
|
||||
def remove_sender(self, senders):
|
||||
"""
|
||||
Remove a single sender or a list of senders.
|
||||
|
||||
Args:
|
||||
senders (Account, Object, str or list): Senders to remove.
|
||||
If a string, removes the external sender.
|
||||
|
||||
"""
|
||||
if isinstance(senders, str):
|
||||
self.db_sender_external = ""
|
||||
self.save(update_fields=["db_sender_external"])
|
||||
return
|
||||
|
||||
for sender in make_iter(senders):
|
||||
if not sender:
|
||||
continue
|
||||
if isinstance(sender, str):
|
||||
self.db_sender_external = ""
|
||||
self.save(update_fields=["db_sender_external"])
|
||||
if not hasattr(sender, "__dbclass__"):
|
||||
raise ValueError("This is a not a typeclassed object!")
|
||||
clsname = sender.__dbclass__.__name__
|
||||
|
|
@ -268,21 +259,29 @@ class Msg(SharedMemoryModel):
|
|||
def receivers(self):
|
||||
"""
|
||||
Getter. Allows for value = self.receivers.
|
||||
Returns four lists of receivers: accounts, objects, scripts and channels.
|
||||
Returns four lists of receivers: accounts, objects, scripts and
|
||||
external_receivers.
|
||||
|
||||
"""
|
||||
return (
|
||||
list(self.db_receivers_accounts.all())
|
||||
+ list(self.db_receivers_objects.all())
|
||||
+ list(self.db_receivers_scripts.all())
|
||||
+ list(self.db_receivers_channels.all())
|
||||
+ [self.db_receiver_external]
|
||||
)
|
||||
|
||||
@receivers.setter
|
||||
def receivers(self, receivers):
|
||||
"""
|
||||
Setter. Allows for self.receivers = value.
|
||||
This appends a new receiver to the message.
|
||||
Setter. Allows for self.receivers = value. This appends a new receiver
|
||||
to the message. If a string, replaces an external receiver.
|
||||
|
||||
"""
|
||||
if isinstance(receivers, str):
|
||||
self.db_receiver_external = receivers
|
||||
self.save(update_fields=['db_receiver_external'])
|
||||
return
|
||||
|
||||
for receiver in make_iter(receivers):
|
||||
if not receiver:
|
||||
continue
|
||||
|
|
@ -295,8 +294,6 @@ class Msg(SharedMemoryModel):
|
|||
self.db_receivers_accounts.add(receiver)
|
||||
elif clsname == "ScriptDB":
|
||||
self.db_receivers_scripts.add(receiver)
|
||||
elif clsname == "ChannelDB":
|
||||
self.db_receivers_channels.add(receiver)
|
||||
|
||||
@receivers.deleter
|
||||
def receivers(self):
|
||||
|
|
@ -304,22 +301,28 @@ class Msg(SharedMemoryModel):
|
|||
self.db_receivers_accounts.clear()
|
||||
self.db_receivers_objects.clear()
|
||||
self.db_receivers_scripts.clear()
|
||||
self.db_receivers_channels.clear()
|
||||
self.db_receiver_external = ""
|
||||
self.save()
|
||||
|
||||
|
||||
def remove_receiver(self, receivers):
|
||||
"""
|
||||
Remove a single receiver or a list of receivers.
|
||||
Remove a single receiver, a list of receivers, or a single extral receiver.
|
||||
|
||||
Args:
|
||||
receivers (Account, Object, Script, Channel or list): Receiver to remove.
|
||||
receivers (Account, Object, Script, list or str): Receiver
|
||||
to remove. A string removes the external receiver.
|
||||
|
||||
"""
|
||||
if isinstance(receivers, str):
|
||||
self.db_receiver_external = ""
|
||||
self.save(update_fields="db_receiver_external")
|
||||
return
|
||||
|
||||
for receiver in make_iter(receivers):
|
||||
if not receiver:
|
||||
continue
|
||||
if not hasattr(receiver, "__dbclass__"):
|
||||
elif not hasattr(receiver, "__dbclass__"):
|
||||
raise ValueError("This is a not a typeclassed object!")
|
||||
clsname = receiver.__dbclass__.__name__
|
||||
if clsname == "ObjectDB":
|
||||
|
|
@ -328,41 +331,17 @@ class Msg(SharedMemoryModel):
|
|||
self.db_receivers_accounts.remove(receiver)
|
||||
elif clsname == "ScriptDB":
|
||||
self.db_receivers_scripts.remove(receiver)
|
||||
elif clsname == "ChannelDB":
|
||||
self.db_receivers_channels.remove(receiver)
|
||||
|
||||
# channels property
|
||||
# @property
|
||||
def __channels_get(self):
|
||||
"Getter. Allows for value = self.channels. Returns a list of channels."
|
||||
return self.db_receivers_channels.all()
|
||||
|
||||
# @channels.setter
|
||||
def __channels_set(self, value):
|
||||
"""
|
||||
Setter. Allows for self.channels = value.
|
||||
Requires a channel to be added.
|
||||
"""
|
||||
for val in (v for v in make_iter(value) if v):
|
||||
self.db_receivers_channels.add(val)
|
||||
|
||||
# @channels.deleter
|
||||
def __channels_del(self):
|
||||
"Deleter. Allows for del self.channels"
|
||||
self.db_receivers_channels.clear()
|
||||
self.save()
|
||||
|
||||
channels = property(__channels_get, __channels_set, __channels_del)
|
||||
|
||||
def __hide_from_get(self):
|
||||
"""
|
||||
Getter. Allows for value = self.hide_from.
|
||||
Returns 3 lists of accounts, objects and channels
|
||||
Returns two lists of accounts and objects.
|
||||
|
||||
"""
|
||||
return (
|
||||
self.db_hide_from_accounts.all(),
|
||||
self.db_hide_from_objects.all(),
|
||||
self.db_hide_from_channels.all(),
|
||||
)
|
||||
|
||||
# @hide_from_sender.setter
|
||||
|
|
@ -378,15 +357,12 @@ class Msg(SharedMemoryModel):
|
|||
self.db_hide_from_accounts.add(hider.__dbclass__)
|
||||
elif clsname == "ObjectDB":
|
||||
self.db_hide_from_objects.add(hider.__dbclass__)
|
||||
elif clsname == "ChannelDB":
|
||||
self.db_hide_from_channels.add(hider.__dbclass__)
|
||||
|
||||
# @hide_from_sender.deleter
|
||||
def __hide_from_del(self):
|
||||
"Deleter. Allows for del self.hide_from_senders"
|
||||
self.db_hide_from_accounts.clear()
|
||||
self.db_hide_from_objects.clear()
|
||||
self.db_hide_from_channels.clear()
|
||||
self.save()
|
||||
|
||||
hide_from = property(__hide_from_get, __hide_from_set, __hide_from_del)
|
||||
|
|
@ -398,11 +374,7 @@ class Msg(SharedMemoryModel):
|
|||
def __str__(self):
|
||||
"This handles what is shown when e.g. printing the message"
|
||||
senders = ",".join(getattr(obj, "key", str(obj)) for obj in self.senders)
|
||||
|
||||
receivers = ",".join(
|
||||
["[%s]" % getattr(obj, "key", str(obj)) for obj in self.channels]
|
||||
+ [getattr(obj, "key", str(obj)) for obj in self.receivers]
|
||||
)
|
||||
receivers = ",".join(getattr(obj, "key", str(obj)) for obj in self.receivers)
|
||||
return "%s->%s: %s" % (senders, receivers, crop(self.message, width=40))
|
||||
|
||||
def access(self, accessing_obj, access_type="read", default=False):
|
||||
|
|
@ -440,7 +412,6 @@ class TempMsg(object):
|
|||
self,
|
||||
senders=None,
|
||||
receivers=None,
|
||||
channels=None,
|
||||
message="",
|
||||
header="",
|
||||
type="",
|
||||
|
|
@ -452,18 +423,16 @@ class TempMsg(object):
|
|||
|
||||
Args:
|
||||
senders (any or list, optional): Senders of the message.
|
||||
receivers (Account, Object, Channel or list, optional): Receivers of this message.
|
||||
channels (Channel or list, optional): Channels to send to.
|
||||
receivers (Account, Object, Script or list, optional): Receivers of this message.
|
||||
message (str, optional): Message to send.
|
||||
header (str, optional): Header of message.
|
||||
type (str, optional): Message class, if any.
|
||||
lockstring (str, optional): Lock for the message.
|
||||
hide_from (Account, Object, Channel or list, optional): Entities to hide this message from.
|
||||
hide_from (Account, Object, or list, optional): Entities to hide this message from.
|
||||
|
||||
"""
|
||||
self.senders = senders and make_iter(senders) or []
|
||||
self.receivers = receivers and make_iter(receivers) or []
|
||||
self.channels = channels and make_iter(channels) or []
|
||||
self.type = type
|
||||
self.header = header
|
||||
self.message = message
|
||||
|
|
@ -480,9 +449,7 @@ class TempMsg(object):
|
|||
This handles what is shown when e.g. printing the message.
|
||||
"""
|
||||
senders = ",".join(obj.key for obj in self.senders)
|
||||
receivers = ",".join(
|
||||
["[%s]" % obj.key for obj in self.channels] + [obj.key for obj in self.receivers]
|
||||
)
|
||||
receivers = ",".join(obj.key for obj in self.receivers)
|
||||
return "%s->%s: %s" % (senders, receivers, crop(self.message, width=40))
|
||||
|
||||
def remove_sender(self, sender):
|
||||
|
|
@ -504,7 +471,7 @@ class TempMsg(object):
|
|||
Remove a receiver or a list of receivers
|
||||
|
||||
Args:
|
||||
receiver (Object, Account, Channel, str or list): Receivers to remove.
|
||||
receiver (Object, Account, Script, str or list): Receivers to remove.
|
||||
"""
|
||||
|
||||
for o in make_iter(receiver):
|
||||
|
|
|
|||
|
|
@ -368,22 +368,22 @@ def create_message(
|
|||
|
||||
Args:
|
||||
senderobj (Object, Account, Script, str or list): The entity (or
|
||||
entities) sending the Msg. If a `str`, this is the id-string
|
||||
entities) sending the Msg. If a `str`, this is the id-string
|
||||
for an external sender type.
|
||||
message (str): Text with the message. Eventual headers, titles
|
||||
etc should all be included in this text string. Formatting
|
||||
will be retained.
|
||||
receivers (Object, Account or list): An Account/Object to send
|
||||
to, or a list of them.
|
||||
receivers (Object, Account, Script, str or list): An Account/Object to send
|
||||
to, or a list of them. If a string, it's an identifier for an external
|
||||
receiver.
|
||||
locks (str): Lock definition string.
|
||||
tags (list): A list of tags or tuples `(tag, category)`.
|
||||
header (str): Mime-type or other optional information for the message
|
||||
|
||||
Notes:
|
||||
The Comm system is created very open-ended, so it's fully possible
|
||||
to let a message both go to several channels and to several
|
||||
receivers at the same time, it's up to the command definitions to
|
||||
limit this as desired.
|
||||
The Comm system is created to be very open-ended, so it's fully
|
||||
possible to let a message both go several receivers at the same time,
|
||||
it's up to the command definitions to limit this as desired.
|
||||
|
||||
"""
|
||||
if 'channels' in kwargs:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue