diff options
Diffstat (limited to 'discord/message.py')
| -rw-r--r-- | discord/message.py | 51 |
1 files changed, 26 insertions, 25 deletions
diff --git a/discord/message.py b/discord/message.py index e6e2fdd1..c50f8ab5 100644 --- a/discord/message.py +++ b/discord/message.py @@ -107,43 +107,44 @@ class Message: Reactions to a message. Reactions can be either custom emoji or standard unicode emoji. """ - __slots__ = [ 'edited_timestamp', 'timestamp', 'tts', 'content', 'channel', + __slots__ = ( 'edited_timestamp', 'timestamp', 'tts', 'content', 'channel', 'mention_everyone', 'embeds', 'id', 'mentions', 'author', - 'channel_mentions', 'server', '_raw_mentions', 'attachments', - '_clean_content', '_raw_channel_mentions', 'nonce', 'pinned', - 'role_mentions', '_raw_role_mentions', 'type', 'call', - '_system_content', 'reactions' ] + 'channel_mentions', 'server', '_cs_raw_mentions', 'attachments', + '_cs_clean_content', '_cs_raw_channel_mentions', 'nonce', 'pinned', + 'role_mentions', '_cs_raw_role_mentions', 'type', 'call', + '_cs_system_content', '_state', 'reactions' ) - def __init__(self, **kwargs): + def __init__(self, *, state, channel, data): + self._state = state self.reactions = kwargs.pop('reactions') for reaction in self.reactions: reaction.message = self - self._update(**kwargs) + self._update(channel, data) - def _update(self, **data): + def _update(self, channel, data): # at the moment, the timestamps seem to be naive so they have no time zone and operate on UTC time. # we can use this to our advantage to use strptime instead of a complicated parsing routine. # example timestamp: 2015-08-21T12:03:45.782000+00:00 # sometimes the .%f modifier is missing - self.edited_timestamp = utils.parse_time(data.get('edited_timestamp')) - self.timestamp = utils.parse_time(data.get('timestamp')) + self.edited_timestamp = utils.parse_time(data['edited_timestamp']) + self.timestamp = utils.parse_time(data['timestamp']) self.tts = data.get('tts', False) self.pinned = data.get('pinned', False) - self.content = data.get('content') - self.mention_everyone = data.get('mention_everyone') - self.embeds = data.get('embeds') - self.id = data.get('id') - self.channel = data.get('channel') - self.author = User(**data.get('author', {})) + self.content = data['content'] + self.mention_everyone = data['mention_everyone'] + self.embeds = data['embeds'] + self.id = data['id'] + self.channel = channel + self.author = self._state.try_insert_user(data['author']) self.nonce = data.get('nonce') - self.attachments = data.get('attachments') + self.attachments = data['attachments'] self.type = try_enum(MessageType, data.get('type')) - self._handle_upgrades(data.get('channel_id')) + self._handle_upgrades(data['channel_id']) self._handle_mentions(data.get('mentions', []), data.get('mention_roles', [])) self._handle_call(data.get('call')) # clear the cached properties - cached = filter(lambda attr: attr[0] == '_', self.__slots__) + cached = filter(lambda attr: attr.startswith('_cs_'), self.__slots__) for attr in cached: try: delattr(self, attr) @@ -155,7 +156,7 @@ class Message: self.channel_mentions = [] self.role_mentions = [] if getattr(self.channel, 'is_private', True): - self.mentions = [User(**m) for m in mentions] + self.mentions = [self._state.try_insert_user(m) for m in mentions] return if self.server is not None: @@ -193,7 +194,7 @@ class Message: call['participants'] = participants self.call = CallMessage(message=self, **call) - @utils.cached_slot_property('_raw_mentions') + @utils.cached_slot_property('_cs_raw_mentions') def raw_mentions(self): """A property that returns an array of user IDs matched with the syntax of <@user_id> in the message content. @@ -203,21 +204,21 @@ class Message: """ return re.findall(r'<@!?([0-9]+)>', self.content) - @utils.cached_slot_property('_raw_channel_mentions') + @utils.cached_slot_property('_cs_raw_channel_mentions') def raw_channel_mentions(self): """A property that returns an array of channel IDs matched with the syntax of <#channel_id> in the message content. """ return re.findall(r'<#([0-9]+)>', self.content) - @utils.cached_slot_property('_raw_role_mentions') + @utils.cached_slot_property('_cs_raw_role_mentions') def raw_role_mentions(self): """A property that returns an array of role IDs matched with the syntax of <@&role_id> in the message content. """ return re.findall(r'<@&([0-9]+)>', self.content) - @utils.cached_slot_property('_clean_content') + @utils.cached_slot_property('_cs_clean_content') def clean_content(self): """A property that returns the content in a "cleaned up" manner. This basically means that mentions are transformed @@ -288,7 +289,7 @@ class Message: if found is not None: self.author = found - @utils.cached_slot_property('_system_content') + @utils.cached_slot_property('_cs_system_content') def system_content(self): """A property that returns the content that is rendered regardless of the :attr:`Message.type`. |