Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 13 additions & 13 deletions tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -1021,25 +1021,25 @@ def user_dict(logged_on_user: Dict[str, Any]) -> Dict[str, Dict[str, Any]]:
"[email protected]": {
"email": "[email protected]",
"full_name": "Email Gateway",
"status": "inactive",
"status": "bot",
"user_id": 6,
},
"[email protected]": {
"email": "[email protected]",
"full_name": "Zulip Feedback Bot",
"status": "inactive",
"status": "bot",
"user_id": 1,
},
"[email protected]": {
"email": "[email protected]",
"full_name": "Notification Bot",
"status": "inactive",
"status": "bot",
"user_id": 5,
},
"[email protected]": {
"email": "[email protected]",
"full_name": "Welcome Bot",
"status": "inactive",
"status": "bot",
"user_id": 4,
},
}
Expand Down Expand Up @@ -1075,12 +1075,6 @@ def user_list(logged_on_user: Dict[str, Any]) -> List[Dict[str, Any]]:
"status": "active",
"user_id": logged_on_user["user_id"],
},
{
"email": "[email protected]",
"full_name": "Email Gateway",
"status": "inactive",
"user_id": 6,
},
{
"full_name": "Human 1",
"email": "[email protected]",
Expand All @@ -1105,22 +1099,28 @@ def user_list(logged_on_user: Dict[str, Any]) -> List[Dict[str, Any]]:
"user_id": 14,
"status": "inactive",
},
{
"email": "[email protected]",
"full_name": "Email Gateway",
"status": "bot",
"user_id": 6,
},
{
"email": "[email protected]",
"full_name": "Notification Bot",
"status": "inactive",
"status": "bot",
"user_id": 5,
},
{
"email": "[email protected]",
"full_name": "Welcome Bot",
"status": "inactive",
"status": "bot",
"user_id": 4,
},
{
"email": "[email protected]",
"full_name": "Zulip Feedback Bot",
"status": "inactive",
"status": "bot",
"user_id": 1,
},
]
Expand Down
1 change: 1 addition & 0 deletions zulipterminal/config/symbols.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,5 +23,6 @@
STATUS_IDLE = "◒"
STATUS_OFFLINE = "○"
STATUS_INACTIVE = "•"
BOT_MARKER = "♟"
AUTOHIDE_TAB_LEFT_ARROW = "❰"
AUTOHIDE_TAB_RIGHT_ARROW = "❱"
1 change: 1 addition & 0 deletions zulipterminal/config/themes.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
'user_idle' : '',
'user_offline' : '',
'user_inactive' : '',
'user_bot' : '',
'title' : 'bold',
'column_title' : 'bold',
'time' : '',
Expand Down
7 changes: 6 additions & 1 deletion zulipterminal/config/ui_mappings.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

from zulipterminal.api_types import EditPropagateMode
from zulipterminal.config.symbols import (
BOT_MARKER,
STATUS_ACTIVE,
STATUS_IDLE,
STATUS_INACTIVE,
Expand All @@ -25,12 +26,16 @@
}


UserStatus = Literal["active", "idle", "offline", "inactive", "bot"]

# Mapping that binds user activity status to corresponding markers.
STATE_ICON = {
# NOTE: Ordering of keys affects display order
STATE_ICON: Dict[UserStatus, str] = {
"active": STATUS_ACTIVE,
"idle": STATUS_IDLE,
"offline": STATUS_OFFLINE,
"inactive": STATUS_INACTIVE,
"bot": BOT_MARKER,
}


Expand Down
58 changes: 28 additions & 30 deletions zulipterminal/model.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
Defines the `Model`, fetching and storing data retrieved from the Zulip server
"""

import itertools
import json
import time
from collections import defaultdict
Expand Down Expand Up @@ -46,6 +47,7 @@
from zulipterminal.config.ui_mappings import (
EDIT_TOPIC_POLICY,
ROLE_BY_ID,
STATE_ICON,
StreamAccessType,
)
from zulipterminal.helper import (
Expand Down Expand Up @@ -1033,7 +1035,10 @@ def get_all_users(self) -> List[Dict[str, Any]]:
}
continue
email = user["email"]
if email in presences: # presences currently subset of all users
if user["is_bot"]:
# Bot has no dynamic status, so avoid presence lookup
status = "bot"
elif email in presences: # presences currently subset of all users
"""
* Aggregate our information on a user's presence across their
* clients.
Expand Down Expand Up @@ -1084,6 +1089,7 @@ def get_all_users(self) -> List[Dict[str, Any]]:
"user_id": user["user_id"],
"status": status,
}

self._all_users_by_id[user["user_id"]] = user
self.user_id_email_dict[user["user_id"]] = email

Expand All @@ -1094,41 +1100,33 @@ def get_all_users(self) -> List[Dict[str, Any]]:
"full_name": bot["full_name"],
"email": email,
"user_id": bot["user_id"],
"status": "inactive",
"status": "bot",
}
self._cross_realm_bots_by_id[bot["user_id"]] = bot
self._all_users_by_id[bot["user_id"]] = bot
self.user_id_email_dict[bot["user_id"]] = email

# Generate filtered lists for active & idle users
active = [
properties
for properties in self.user_dict.values()
if properties["status"] == "active"
]
idle = [
properties
for properties in self.user_dict.values()
if properties["status"] == "idle"
]
offline = [
properties
for properties in self.user_dict.values()
if properties["status"] == "offline"
]
inactive = [
properties
for properties in self.user_dict.values()
if properties["status"] == "inactive"
]
# Generate filtered lists for each status
ordered_statuses = list(STATE_ICON.keys())
presences_by_status = {
status: sorted(
[
properties
for properties in self.user_dict.values()
if properties["status"] == status
],
key=lambda user: user["full_name"].casefold(),
)
for status in ordered_statuses
}
user_list = list(
itertools.chain.from_iterable(
presences_by_status[status] for status in ordered_statuses
)
)
user_list.insert(0, current_user) # Add current user to the top of the list

# Construct user_list from sorted components of each list
user_list = sorted(active, key=lambda u: u["full_name"].casefold())
user_list += sorted(idle, key=lambda u: u["full_name"].casefold())
user_list += sorted(offline, key=lambda u: u["full_name"].casefold())
user_list += sorted(inactive, key=lambda u: u["full_name"].casefold())
# Add current user to the top of the list
user_list.insert(0, current_user)
# NOTE: Do this after generating user_list to avoid current_user duplication
self.user_dict[current_user["email"]] = current_user
self.user_id_email_dict[self.user_id] = current_user["email"]

Expand Down
1 change: 1 addition & 0 deletions zulipterminal/themes/gruvbox_dark.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
'user_idle' : (Color.NEUTRAL_YELLOW, Color.DARK0_HARD),
'user_offline' : (Color.LIGHT2, Color.DARK0_HARD),
'user_inactive' : (Color.LIGHT2, Color.DARK0_HARD),
'user_bot' : (Color.LIGHT2, Color.DARK0_HARD),
'title' : (Color.LIGHT2__BOLD, Color.DARK0_HARD),
'column_title' : (Color.LIGHT2__BOLD, Color.DARK0_HARD),
'time' : (Color.BRIGHT_BLUE, Color.DARK0_HARD),
Expand Down
1 change: 1 addition & 0 deletions zulipterminal/themes/gruvbox_light.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
'user_idle' : (Color.NEUTRAL_YELLOW, Color.LIGHT0_HARD),
'user_offline' : (Color.DARK2, Color.LIGHT0_HARD),
'user_inactive' : (Color.DARK2, Color.LIGHT0_HARD),
'user_bot' : (Color.DARK2, Color.LIGHT0_HARD),
'title' : (Color.DARK2__BOLD, Color.LIGHT0_HARD),
'column_title' : (Color.DARK2__BOLD, Color.LIGHT0_HARD),
'time' : (Color.FADED_BLUE, Color.LIGHT0_HARD),
Expand Down
1 change: 1 addition & 0 deletions zulipterminal/themes/zt_blue.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
'user_idle' : (Color.DARK_GRAY, Color.LIGHT_BLUE),
'user_offline' : (Color.BLACK, Color.LIGHT_BLUE),
'user_inactive' : (Color.BLACK, Color.LIGHT_BLUE),
'user_bot' : (Color.BLACK, Color.LIGHT_BLUE),
'title' : (Color.WHITE__BOLD, Color.DARK_BLUE),
'column_title' : (Color.BLACK__BOLD, Color.LIGHT_BLUE),
'time' : (Color.DARK_BLUE, Color.LIGHT_BLUE),
Expand Down
1 change: 1 addition & 0 deletions zulipterminal/themes/zt_dark.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
'user_idle' : (Color.YELLOW, Color.BLACK),
'user_offline' : (Color.WHITE, Color.BLACK),
'user_inactive' : (Color.WHITE, Color.BLACK),
'user_bot' : (Color.WHITE, Color.BLACK),
'title' : (Color.WHITE__BOLD, Color.BLACK),
'column_title' : (Color.WHITE__BOLD, Color.BLACK),
'time' : (Color.LIGHT_BLUE, Color.BLACK),
Expand Down
1 change: 1 addition & 0 deletions zulipterminal/themes/zt_light.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
'user_idle' : (Color.DARK_BLUE, Color.WHITE),
'user_offline' : (Color.BLACK, Color.WHITE),
'user_inactive' : (Color.BLACK, Color.WHITE),
'user_bot' : (Color.BLACK, Color.WHITE),
'title' : (Color.WHITE__BOLD, Color.DARK_GRAY),
'column_title' : (Color.BLACK__BOLD, Color.WHITE),
'time' : (Color.DARK_BLUE, Color.WHITE),
Expand Down