Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Preparation for deprecating reactions' user metadata #1556

Merged
merged 9 commits into from
Dec 10, 2024
2 changes: 1 addition & 1 deletion tests/model/test_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -2832,7 +2832,7 @@ def _factory(msgs: MsgsType):
"user": {
"email": f"User email #{user_id}",
"full_name": f"User #{user_id}",
"user_id": user_id,
"id": user_id,
},
"reaction_type": type,
"emoji_code": code,
Expand Down
3 changes: 2 additions & 1 deletion zulipterminal/api_types.py
Original file line number Diff line number Diff line change
Expand Up @@ -408,7 +408,8 @@ class UpdateMessagesLocationEvent(BaseUpdateMessageEvent):
class ReactionEvent(TypedDict):
type: Literal["reaction"]
op: str
user: Dict[str, Any] # 'email', 'user_id', 'full_name'
user_id: NotRequired[int] # Added in Zulip v3.0, ZFL 2 replacing 'user'
user: NotRequired[Dict[str, Any]] # 'email', 'user_id', 'full_name'
reaction_type: EmojiType
emoji_code: str
emoji_name: str
Expand Down
42 changes: 25 additions & 17 deletions zulipterminal/model.py
Original file line number Diff line number Diff line change
Expand Up @@ -453,17 +453,11 @@ def _start_presence_updates(self) -> None:
def toggle_message_reaction(
self, message: Message, reaction_to_toggle: str
) -> None:
# Check if reaction_to_toggle is a valid original/alias
assert reaction_to_toggle in self.all_emoji_names

for emoji_name, emoji_data in self.active_emoji_data.items():
if (
reaction_to_toggle == emoji_name
or reaction_to_toggle in emoji_data["aliases"]
):
# Found the emoji to toggle. Store its code/type and dont check further
emoji_code = emoji_data["code"]
emoji_type = emoji_data["type"]
if reaction_to_toggle in (emoji_name, *emoji_data["aliases"]):
emoji_code, emoji_type = emoji_data["code"], emoji_data["type"]
break

reaction_to_toggle_spec = dict(
Expand Down Expand Up @@ -1838,25 +1832,39 @@ def _handle_reaction_event(self, event: Event) -> None:
"""
assert event["type"] == "reaction"
message_id = event["message_id"]
# If the message is indexed
if message_id in self.index["messages"]:
message = self.index["messages"][message_id]
if event["op"] == "add":
message["reactions"].append(
{
"user": event["user"],
"reaction_type": event["reaction_type"],
"emoji_code": event["emoji_code"],
"emoji_name": event["emoji_name"],
key: event.get(key)
for key in [
"user",
"reaction_type",
"emoji_code",
"emoji_name",
"user_id",
]
}
)
else:
emoji_code = event["emoji_code"]
for reaction in message["reactions"]:
# Since Who reacted is not displayed,
# remove the first one encountered
if reaction["emoji_code"] == emoji_code:
reaction_user_id = (
reaction["user"]["id"]
if "user" in reaction
else reaction["user_id"]
)
event_user_id = (
event["user"]["user_id"]
if event.get("user") and isinstance(event["user"], dict)
else event["user_id"]
)
if (
reaction["emoji_code"] == event["emoji_code"]
and reaction_user_id == event_user_id
):
message["reactions"].remove(reaction)
break
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Feature level 3.0 is old enough that we could drop support for it. But I guess this is OK.


self.index["messages"][message_id] = message
self._update_rendered_view(message_id)
Expand Down
9 changes: 4 additions & 5 deletions zulipterminal/ui_tools/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -241,11 +241,10 @@ def keypress(self, size: urwid_Size, key: str) -> Optional[str]:
elif is_command_key("REACTION_AGREEMENT", key) and self.focus is not None:
message = self.focus.original_widget.message
message_reactions = message["reactions"]
if len(message_reactions) > 0:
for reaction in message_reactions:
emoji = reaction["emoji_name"]
self.model.toggle_message_reaction(message, emoji)
break
if message_reactions:
self.model.toggle_message_reaction(
message, message_reactions[0]["emoji_name"]
)

key = super().keypress(size, key)
return key
Expand Down