aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTrygve Aaberge <trygveaa@gmail.com>2022-01-30 23:42:33 +0100
committerTrygve Aaberge <trygveaa@gmail.com>2022-09-18 16:36:55 +0200
commit962bbc527537091cd1abfb0b95eb8bcd7a006d46 (patch)
treea210bde70e7f796ea62f4cf83443804cf57f6301
parent43886892a3bd3e6be4e9cce81b49ca29a982f799 (diff)
downloadwee-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.
-rw-r--r--wee_slack.py43
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"):