Source code for redditwarp.model_loaders.message
from __future__ import annotations
from typing import Any, Mapping, Optional, Sequence
from datetime import datetime, timezone
from ..core.const import AUTHORIZATION_BASE_URL
from ..models.message import CommentMessageCause, MailboxMessage, ComposedMessage, CommentMessage
[docs]def load_mailbox_message(d: Mapping[str, Any]) -> MailboxMessage:
return MailboxMessage(
d=d,
subject=d['subject'],
author_name=d['author'] or '',
unread=d['new'],
)
[docs]def load_composed_message(d: Mapping[str, Any]) -> ComposedMessage:
src_user_name: Optional[str] = d['author']
src_subr_name: Optional[str] = None
dst_user_name: Optional[str] = None
dst_subr_name: Optional[str] = None
dest: str = d['dest']
if dest.startswith('#'):
dst_subr_name = dest.lstrip('#')
else:
src_subr_name = d['subreddit']
dst_user_name = dest
up = load_mailbox_message(d)
return ComposedMessage(
d=up.d,
subject=up.subject,
author_name=up.author_name,
unread=up.unread,
id=int(d['id'], 36),
unixtime=(unixtime := int(d['created_utc'])),
datetime=datetime.fromtimestamp(unixtime, timezone.utc),
body=d['body'],
body_html=d['body_html'],
distinguished=d['distinguished'] or '',
src_user_name=src_user_name,
src_subr_name=src_subr_name,
dst_user_name=dst_user_name,
dst_subr_name=dst_subr_name,
src_user_id=(
int(x.partition('_')[2], 36)
if (x := d['author_fullname']) else
{
None: None,
'reddit': 81524,
'welcomebot': 404087392163,
}.get(src_user_name)
),
)
[docs]def load_comment_message(d: Mapping[str, Any]) -> CommentMessage:
up = load_mailbox_message(d)
return CommentMessage(
d=up.d,
subject=up.subject,
author_name=up.author_name,
unread=up.unread,
cause={
'username_mention': CommentMessageCause.USERNAME_MENTION,
'post_reply': CommentMessageCause.SUBMISSION_REPLY,
'comment_reply': CommentMessageCause.COMMENT_REPLY,
}[d['type']],
submission=CommentMessage.Submission(
id=int((context := d['context']).split('/', 5)[4], 36),
title=d['link_title'],
comment_count=d['num_comments'],
permalink_path=(permalink_path := '/'.join(context.split('/', 6)[:-1]) + '/'),
permalink=AUTHORIZATION_BASE_URL + permalink_path,
),
comment=CommentMessage.Comment(
id=int(d['id'], 36),
created_ut=(created_ut := int(d['created_utc'])),
created_at=datetime.fromtimestamp(created_ut, timezone.utc),
author_name=d['author'],
author_id=int(d['author_fullname'].partition('_')[2], 36),
subreddit_name=d['subreddit'],
permalink_path=(permalink_path := context.partition('?')[0]),
permalink=AUTHORIZATION_BASE_URL + permalink_path,
is_top_level=(is_top_level := (parent_id := d['parent_id']).startswith('t3_')),
has_parent_comment=(has_parent_comment := not is_top_level),
parent_comment_id36=(parent_comment_id36 := parent_id.partition('_')[2] if has_parent_comment else ''),
parent_comment_idn=(parent_comment_idn := int(parent_comment_id36, 36) if has_parent_comment else 0),
parent_comment_id=parent_comment_idn,
score=d['score'],
body=d['body'],
body_html=d['body_html'],
voted={False: -1, None: 0, True: 1}[d['likes']],
),
)
[docs]def load_composed_message_thread(d: Mapping[str, Any]) -> Sequence[ComposedMessage]:
first = load_composed_message(d)
children = []
if replies := d['replies']:
children = [load_composed_message(d['data']) for d in replies['data']['children']]
return [first] + children