diff options
author | Trygve Aaberge <trygveaa@gmail.com> | 2022-01-30 23:42:33 +0100 |
---|---|---|
committer | Trygve Aaberge <trygveaa@gmail.com> | 2022-09-18 16:36:55 +0200 |
commit | 962bbc527537091cd1abfb0b95eb8bcd7a006d46 (patch) | |
tree | a210bde70e7f796ea62f4cf83443804cf57f6301 /wee_slack.py | |
parent | 43886892a3bd3e6be4e9cce81b49ca29a982f799 (diff) | |
download | wee-slack-962bbc527537091cd1abfb0b95eb8bcd7a006d46.tar.gz |
Don't open all DMs and MPDMs on start
Instead open only unread DMs and MPDMs. Unfortunately it doesn't seem to
be possible to know which DMs or MPDMs are open from the last run or in
the official client (without using internal APIs). We could explore
alternatives like opening the ones with recent messages, or storing
which are open, but this will have to do for now.
Diffstat (limited to 'wee_slack.py')
-rw-r--r-- | wee_slack.py | 43 |
1 files changed, 32 insertions, 11 deletions
diff --git a/wee_slack.py b/wee_slack.py index 77114b2..6c7a80a 100644 --- a/wee_slack.py +++ b/wee_slack.py @@ -2288,13 +2288,15 @@ class SlackChannel(SlackChannelCommon): self.create_buffer() return - # Only check is_member if is_open is not set, because in some cases - # (e.g. group DMs), is_member should be ignored in favor of is_open. - is_open = self.is_open if hasattr(self, "is_open") else self.is_member - if is_open or self.unread_count_display: + if ( + getattr(self, "is_open", False) + or self.unread_count_display + or self.type not in ["im", "mpim"] + and getattr(self, "is_member", False) + ): self.create_buffer() - elif self.type == "im": - # If it is an IM, we still might want to open it if there are unread messages. + elif self.type in ["im", "mpim"]: + # If it is an IM or MPIM, we still might want to open it if there are unread messages. info_method = self.team.slack_api_translator[self.type].get("info") if info_method: s = SlackRequest( @@ -3745,14 +3747,25 @@ def handle_conversationsinfo(channel_json, eventrouter, team, channel, metadata) channel_info = channel_json["channel"] if "unread_count_display" in channel_info: unread_count = channel_info["unread_count_display"] - if channel_info["is_im"] and unread_count: - channel.check_should_open(True) + if unread_count and channel.channel_buffer is None: + channel.create_buffer() channel.set_unread_count_display(unread_count) if "last_read" in channel_info: channel.last_read = SlackTS(channel_info["last_read"]) if "members" in channel_info: channel.set_members(channel_info["members"]) + # MPIMs don't have unread_count_display so we have to request the history to check if there are unread messages + if channel.type == "mpim" and not channel.channel_buffer: + s = SlackRequest( + team, + "conversations.history", + {"channel": channel.identifier, "limit": 1}, + channel=channel, + metadata={"only_set_unread": True}, + ) + eventrouter.receive(s) + def handle_conversationsopen( conversation_json, eventrouter, team, channel, metadata, object_name="channel" @@ -3776,6 +3789,16 @@ def handle_mpimopen( def handle_history( message_json, eventrouter, team, channel, metadata, includes_threads=True ): + if metadata.get("only_set_unread"): + if message_json["messages"]: + latest = message_json["messages"][0] + latest_ts = SlackTS(latest["ts"]) + if latest_ts > channel.last_read: + if not channel.channel_buffer: + channel.create_buffer() + channel.set_unread_count_display(1) + return + channel.got_history = True channel.history_needs_update = False for message in reversed(message_json["messages"]): @@ -6869,9 +6892,7 @@ def create_team(token, initial_data): channels = {} for channel in initial_data["channels"]: if channel.get("is_im"): - channel_instance = SlackDMChannel( - eventrouter, users, is_member=True, **channel - ) + channel_instance = SlackDMChannel(eventrouter, users, **channel) elif channel.get("is_shared"): channel_instance = SlackSharedChannel(eventrouter, **channel) elif channel.get("is_mpim"): |