1+ import logging
12import re
23import requests
34from requests .auth import AuthBase
45
5- from django .conf import settings
6+
7+ logger = logging .getLogger (__name__ )
8+ logger .setLevel (logging .INFO )
69
710
811class AuthBearer (AuthBase ):
@@ -25,12 +28,16 @@ class CustomSlackClient():
2528 user_detail_url = 'https://slack.com/api/users.info'
2629 create_conversation_url = 'https://slack.com/api/conversations.create'
2730 invite_conversation_url = 'https://slack.com/api/conversations.invite'
31+ leave_conversation_url = 'https://slack.com/api/conversations.leave'
2832
2933 def __init__ (self , token ):
3034 self .token = token
3135
3236 def _make_slack_get_request (self , url , params = None ):
3337 resp = requests .get (url , auth = AuthBearer (self .token ), params = params )
38+ if resp .status_code != 200 :
39+ raise SlackException (resp .get ("error" ))
40+
3441 resp = resp .json ()
3542
3643 if not resp .get ('ok' ):
@@ -40,31 +47,60 @@ def _make_slack_get_request(self, url, params=None):
4047
4148 def _make_slack_post_request (self , url , data ):
4249 resp = requests .post (url , auth = AuthBearer (self .token ), data = data )
43- resp = resp . json ()
44-
45- if not resp . get ( 'ok' ):
46- raise SlackException ( resp .get ("error" ) )
47-
48- return resp
50+ if resp . status_code != 200 :
51+ return {
52+ 'ok' : False ,
53+ 'error' : resp .get ("error" )
54+ }
55+ return resp . json ()
4956
5057 def get_identity (self ):
5158 return self ._make_slack_get_request (self .identity_url )
5259
60+ def leave_channel (self , channel ):
61+ data = {
62+ 'channel' : channel
63+ }
64+ leave_channel = self ._make_slack_post_request (
65+ self .leave_conversation_url , data = data )
66+
67+ if not leave_channel .get ('ok' ):
68+ print (('An error occurred adding users to the Private Slack Channel. '
69+ f'Error code: { leave_channel .get ("error" )} ' ))
70+
71+ return leave_channel
72+
5373 def get_user_info (self , userid ):
5474 params = {"user" : userid }
5575 response = self ._make_slack_get_request (self .user_detail_url ,
5676 params = params )
5777 return response .get ('user' , {})
5878
59- def create_slack_channel (self , channel_name , is_private = True ):
79+ def create_slack_channel (self , channel_name , team_id , is_private = True ):
6080 data = {
81+ "team_id" : team_id ,
6182 "name" : channel_name ,
6283 "is_private" : is_private ,
63- "team_id" : settings .SLACK_TEAM_ID ,
6484 }
6585 new_channel = self ._make_slack_post_request (
6686 self .create_conversation_url , data = data )
67- return new_channel .get ('channel' , {})
87+
88+ if not new_channel .get ('ok' ):
89+ if new_channel .get ('error' ) == 'name_taken' :
90+ error_msg = (f'An error occurred creating the Private Slack Channel. '
91+ f'A channel with the name "{ channel_name } " already '
92+ f'exists. Please change your team name and try again '
93+ f'or contact an administrator' )
94+ else :
95+ error_msg = (f'An error occurred creating the Private Slack Channel. '
96+ f'Error code: { new_channel .get ("error" )} ' )
97+ return {
98+ 'ok' : False ,
99+ 'error' : error_msg
100+ }
101+
102+ logger .info (f"Successfully created { channel_name } ({ new_channel .get ('channel' , {}).get ('id' )} )." )
103+ return new_channel
68104
69105 def _extract_userid_from_username (self , username ):
70106 """ Extracts the Slack userid from a hackathon platform userid
@@ -74,11 +110,36 @@ def _extract_userid_from_username(self, username):
74110 raise SlackException ('Error adding user to channel' )
75111 return username .split ('_' )[0 ]
76112
77- def add_user_to_slack_channel (self , username , channel_id ):
113+ def invite_users_to_slack_channel (self , users , channel ):
114+ data = {
115+ "users" : users ,
116+ "channel" : channel ,
117+ }
118+ user_added = self ._make_slack_post_request (
119+ self .invite_conversation_url , data = data )
120+
121+ if not user_added .get ('ok' ):
122+ return {
123+ 'ok' : False ,
124+ 'error' : ('An error occurred adding users to Private Slack Channel {channel}. '
125+ f'Error code: { user_added .get ("error" )} ' )
126+ }
127+
128+ return user_added
129+
130+ def kick_user_from_slack_channel (self , user , channel ):
78131 data = {
79- "user" : self . _extract_userid_from_username ( username ) ,
80- "channel" : channel_id ,
132+ "user" : user ,
133+ "channel" : channel ,
81134 }
82135 user_added = self ._make_slack_post_request (
83136 self .invite_conversation_url , data = data )
137+
138+ if not user_added .get ('ok' ):
139+ return {
140+ 'ok' : False ,
141+ 'error' : (f'An error occurred kicking user { user } from Private Slack Channel { channel } . '
142+ f'Error code: { user_added .get ("error" )} ' )
143+ }
144+
84145 return user_added
0 commit comments