mirror of
https://github.com/zulip/zulip.git
synced 2026-06-24 21:08:25 +08:00
* Have the `get_active_presence_idle_user_ids` function look at all the user data, not just `private_message` and `mentioned`. * Fix a couple of incorrect `missedmessage_hook` tests, which did not catch the earlier behaviour. * Add some comments to the tests for this function for clarity. * Add a helper to create `UserMessageNotificationsData` objects from the user ID lists. This will later help us deduplicate code in the event_queue logic. This fixes a bug which earlier existed, that if a user turned on stream notifications, and received a message in that stream which did not mention them, they wouldn't be in the `presence_idle_users` list, and hence would never get notifications for that message. Note that, after this commit, users might still not get notifications in the above scenarios in some cases, because the downstream logic in the notification queue consumers sometimes erroneously skips sending notifications for stream messages.
89 lines
2.7 KiB
Python
89 lines
2.7 KiB
Python
from dataclasses import dataclass
|
|
from typing import Collection, Set
|
|
|
|
|
|
@dataclass
|
|
class UserMessageNotificationsData:
|
|
id: int
|
|
flags: Collection[str]
|
|
mentioned: bool
|
|
online_push_enabled: bool
|
|
stream_push_notify: bool
|
|
stream_email_notify: bool
|
|
wildcard_mention_notify: bool
|
|
sender_is_muted: bool
|
|
|
|
def __post_init__(self) -> None:
|
|
if self.mentioned:
|
|
assert "mentioned" in self.flags
|
|
if self.wildcard_mention_notify:
|
|
assert "wildcard_mentioned" in self.flags
|
|
|
|
@classmethod
|
|
def from_user_id_sets(
|
|
cls,
|
|
user_id: int,
|
|
flags: Collection[str],
|
|
online_push_user_ids: Set[int],
|
|
stream_push_user_ids: Set[int],
|
|
stream_email_user_ids: Set[int],
|
|
wildcard_mention_user_ids: Set[int],
|
|
muted_sender_user_ids: Set[int],
|
|
) -> "UserMessageNotificationsData":
|
|
wildcard_mention_notify = (
|
|
user_id in wildcard_mention_user_ids and "wildcard_mentioned" in flags
|
|
)
|
|
return cls(
|
|
id=user_id,
|
|
flags=flags,
|
|
mentioned=("mentioned" in flags),
|
|
online_push_enabled=(user_id in online_push_user_ids),
|
|
stream_push_notify=(user_id in stream_push_user_ids),
|
|
stream_email_notify=(user_id in stream_email_user_ids),
|
|
wildcard_mention_notify=wildcard_mention_notify,
|
|
sender_is_muted=(user_id in muted_sender_user_ids),
|
|
)
|
|
|
|
# TODO: The following functions should also look at the `enable_offline_push_notifications` and
|
|
# `enable_offline_email_notifications` settings (for PMs and mentions), but currently they
|
|
# don't.
|
|
|
|
def is_notifiable(self, private_message: bool, sender_id: int, idle: bool) -> bool:
|
|
return self.is_email_notifiable(
|
|
private_message, sender_id, idle
|
|
) or self.is_push_notifiable(private_message, sender_id, idle)
|
|
|
|
def is_push_notifiable(self, private_message: bool, sender_id: int, idle: bool) -> bool:
|
|
if not idle and not self.online_push_enabled:
|
|
return False
|
|
|
|
if self.id == sender_id:
|
|
return False
|
|
|
|
if self.sender_is_muted:
|
|
return False
|
|
|
|
return (
|
|
private_message
|
|
or self.mentioned
|
|
or self.wildcard_mention_notify
|
|
or self.stream_push_notify
|
|
)
|
|
|
|
def is_email_notifiable(self, private_message: bool, sender_id: int, idle: bool) -> bool:
|
|
if not idle:
|
|
return False
|
|
|
|
if self.id == sender_id:
|
|
return False
|
|
|
|
if self.sender_is_muted:
|
|
return False
|
|
|
|
return (
|
|
private_message
|
|
or self.mentioned
|
|
or self.wildcard_mention_notify
|
|
or self.stream_email_notify
|
|
)
|