11from flask import Flask , request , make_response
22import json
3+ import platform
4+ import sys
5+ from .version import __version__
36
47
58class SlackServer (Flask ):
6- def __init__ (self , verification_token , endpoint , emitter ):
7- Flask .__init__ (self , __name__ )
9+ def __init__ (self , verification_token , endpoint , emitter , server ):
810 self .verification_token = verification_token
11+ self .emitter = emitter
12+ self .endpoint = endpoint
13+ self .package_info = self .get_package_info ()
914
10- @self .route (endpoint , methods = ['GET' , 'POST' ])
15+ # If a server is passed in, bind the event handler routes to it,
16+ # otherwise create a new Flask instance.
17+ if server :
18+ if isinstance (server , Flask ):
19+ self .bind_route (server )
20+ else :
21+ raise TypeError ("Server must be an instance of Flask" )
22+ else :
23+ Flask .__init__ (self , __name__ )
24+ self .bind_route (self )
25+
26+ def get_package_info (self ):
27+ client_name = __name__ .split ('.' )[0 ]
28+ client_version = __version__ # Version is returned from version.py
29+
30+ # Collect the package info, Python version and OS version.
31+ package_info = {
32+ "client" : "{0}/{1}" .format (client_name , client_version ),
33+ "python" : "Python/{v.major}.{v.minor}.{v.micro}" .format (v = sys .version_info ),
34+ "system" : "{0}/{1}" .format (platform .system (), platform .release ())
35+ }
36+
37+ # Concatenate and format the user-agent string to be passed into request headers
38+ ua_string = []
39+ for key , val in package_info .items ():
40+ ua_string .append (val )
41+
42+ return " " .join (ua_string )
43+
44+ def bind_route (self , server ):
45+ @server .route (self .endpoint , methods = ['GET' , 'POST' ])
1146 def event ():
1247 # If a GET request is made, return 404.
1348 if request .method == 'GET' :
@@ -25,11 +60,13 @@ def event():
2560 # Verify the request token
2661 request_token = event_data .get ("token" )
2762 if self .verification_token != request_token :
28- emitter .emit ('error' , 'invalid verification token' )
63+ self . emitter .emit ('error' , 'invalid verification token' )
2964 return make_response ("Request contains invalid Slack verification token" , 403 )
3065
3166 # Parse the Event payload and emit the event to the event listener
3267 if "event" in event_data :
3368 event_type = event_data ["event" ]["type" ]
34- emitter .emit (event_type , event_data )
35- return make_response ("" , 200 )
69+ self .emitter .emit (event_type , event_data )
70+ response = make_response ("" , 200 )
71+ response .headers ['X-Slack-Powered-By' ] = self .package_info
72+ return response
0 commit comments