Skip to content

Commit 6d1ed48

Browse files
Show list starred users and channels
1 parent ca6eddb commit 6d1ed48

File tree

3 files changed

+71
-12
lines changed

3 files changed

+71
-12
lines changed

app.py

Lines changed: 54 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -136,34 +136,71 @@ def mount_sidebar(self, executor):
136136
yield from asyncio.gather(
137137
loop.run_in_executor(executor, self.store.load_auth),
138138
loop.run_in_executor(executor, self.store.load_channels),
139+
loop.run_in_executor(executor, self.store.load_stars),
139140
loop.run_in_executor(executor, self.store.load_groups),
140141
loop.run_in_executor(executor, self.store.load_users),
141142
loop.run_in_executor(executor, self.store.load_user_dnd),
142143
)
143144
profile = Profile(name=self.store.state.auth['user'], is_snoozed=self.store.state.is_snoozed)
144-
channels = [
145-
Channel(
145+
146+
channels = []
147+
dms = []
148+
stars = []
149+
star_user_tmp = [] # To contain user, channel should be on top of list
150+
stars_user_id = [] # To ignore item in DMs list
151+
stars_channel_id = [] # To ignore item in channels list
152+
max_users_sidebar = self.store.config['sidebar']['max_users']
153+
154+
# Prepare list of Star users and channels
155+
for dm in self.store.state.stars:
156+
# Group chat is not supported, prefer to https://github.com/haskellcamargo/sclack/issues/67
157+
if self.store.is_dm(dm['channel']):
158+
detail = self.store.get_channel_info(dm['channel'])
159+
user = self.store.find_user_by_id(detail['user'])
160+
if user:
161+
stars_user_id.append(user['id'])
162+
star_user_tmp.append(Dm(
163+
dm['channel'],
164+
name=self.store.get_user_display_name(user),
165+
user=dm['channel'],
166+
you=False
167+
))
168+
elif self.store.is_channel(dm['channel']):
169+
channel = self.store.get_channel_info(dm['channel'])
170+
if channel:
171+
stars_channel_id.append(channel['id'])
172+
stars.append(Channel(
173+
id=channel['id'],
174+
name=channel['name'],
175+
is_private=channel['is_private']
176+
))
177+
stars.extend(star_user_tmp)
178+
179+
# Prepare list of Channels
180+
for channel in self.store.state.channels:
181+
if channel['id'] in stars_channel_id:
182+
continue
183+
channels.append(Channel(
146184
id=channel['id'],
147185
name=channel['name'],
148186
is_private=channel['is_private']
149-
)
150-
for channel in self.store.state.channels
151-
]
152-
dms = []
153-
max_users_sidebar = self.store.config['sidebar']['max_users']
154-
dm_users = self.store.state.dms[:max_users_sidebar]
187+
))
155188

189+
# Prepare list of DM
190+
dm_users = self.store.state.dms[:max_users_sidebar]
156191
for dm in dm_users:
192+
if dm['user'] in stars_user_id:
193+
continue
157194
user = self.store.find_user_by_id(dm['user'])
158195
if user:
159196
dms.append(Dm(
160197
dm['id'],
161-
name=user.get('display_name') or user.get('real_name') or user['name'],
198+
name=self.store.get_user_display_name(user),
162199
user=dm['user'],
163200
you=user['id'] == self.store.state.auth['user_id']
164201
))
165202

166-
self.sidebar = SideBar(profile, channels, dms, title=self.store.state.auth['team'])
203+
self.sidebar = SideBar(profile, channels, dms, stars=stars, title=self.store.state.auth['team'])
167204
urwid.connect_signal(self.sidebar, 'go_to_channel', self.go_to_channel)
168205
loop.create_task(self.get_channels_info(executor, channels))
169206
loop.create_task(self.get_presences(executor, dms))
@@ -716,8 +753,10 @@ def go_to_sidebar(self):
716753
if len(self.columns.contents) > 2:
717754
self.columns.contents.pop()
718755
self.columns.focus_position = 0
756+
719757
if self.store.state.editing_widget:
720758
self.leave_edit_mode()
759+
721760
if self.quick_switcher:
722761
urwid.disconnect_signal(self.quick_switcher, 'go_to_channel', self.go_to_channel)
723762
self.urwid_loop.widget = self._body
@@ -743,6 +782,11 @@ def go_to_last_message(self):
743782
self.chatbox.body.go_to_last_message()
744783

745784
def unhandled_input(self, key):
785+
"""
786+
Handle shortcut key press
787+
:param key:
788+
:return:
789+
"""
746790
keymap = self.store.config['keymap']
747791

748792
if key == keymap['go_to_chatbox'] or key == keymap['cursor_right'] and self.message_box:

sclack/components.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -739,9 +739,10 @@ class SideBar(urwid.Frame):
739739
__metaclass__ = urwid.MetaSignals
740740
signals = ['go_to_channel']
741741

742-
def __init__(self, profile, channels=(), dms=(), title=''):
742+
def __init__(self, profile, channels=(), dms=(), stars=(), title=''):
743743
self.profile = profile
744744
self.channels = channels
745+
self.stars = stars
745746
self.dms = dms
746747

747748
# Subscribe to receive message from channels to select them
@@ -751,8 +752,10 @@ def __init__(self, profile, channels=(), dms=(), title=''):
751752
footer = urwid.Divider('─')
752753
stack = [
753754
profile,
754-
TextDivider('Channels')
755+
TextDivider('Starred')
755756
]
757+
stack.extend(stars)
758+
stack.append(TextDivider('Channels'))
756759
stack.extend(self.channels)
757760
stack.append(TextDivider('Direct Messages'))
758761
stack.extend(dms)

sclack/store.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
from slackclient import SlackClient
22

3+
34
class State:
45
def __init__(self):
56
self.channels = []
67
self.dms = []
78
self.groups = []
9+
self.stars = []
810
self.messages = []
911
self.users = []
1012
self.pin_count = 0
@@ -154,6 +156,16 @@ def load_channels(self):
154156
def load_groups(self):
155157
self.state.groups = self.slack.api_call('mpim.list')['groups']
156158

159+
def load_stars(self):
160+
"""
161+
Load stars
162+
:return:
163+
"""
164+
self.state.stars = list(filter(
165+
lambda star: star.get('type', '') in ('channel', 'im', 'group', ),
166+
self.slack.api_call('stars.list')['items']
167+
))
168+
157169
def load_users(self):
158170
self.state.users = list(filter(
159171
lambda user: not user.get('deleted', False),

0 commit comments

Comments
 (0)