67
67
module Slack : Api .Slack = struct
68
68
let log = Log. from " slack"
69
69
70
- let slack_http_request ?headers ?body meth url read =
70
+ let query_error_msg url e = sprintf " error while querying %s: %s" url e
71
+
72
+ let slack_api_request ?headers ?body meth url read =
71
73
match % lwt http_request ?headers ?body meth url with
72
- | Error e -> Lwt. return @@ Error (sprintf " error while querying %s: %s " url e)
74
+ | Error e -> Lwt. return @@ Error (query_error_msg url e)
73
75
| Ok s -> Lwt. return @@ Slack_j. slack_response_of_string read s
74
76
75
77
let bearer_token_header access_token = sprintf " Authorization: Bearer %s" (Uri. pct_encode access_token)
@@ -79,7 +81,6 @@ module Slack : Api.Slack = struct
79
81
let send_notification ~(ctx : Context.t ) ~(msg : Slack_t.post_message_req ) =
80
82
log#info " sending to %s" msg.channel;
81
83
let build_error e = fmt_error " %s\n failed to send Slack notification" e in
82
- let build_query_error url e = build_error @@ sprintf " error while querying %s: %s" url e in
83
84
let secrets = Context. get_secrets_exn ctx in
84
85
let headers, url, webhook_mode =
85
86
match Context. hook_of_channel ctx msg.channel with
@@ -95,17 +96,16 @@ module Slack : Api.Slack = struct
95
96
let data = Slack_j. string_of_post_message_req msg in
96
97
let body = `Raw (" application/json" , data) in
97
98
log#info " data: %s" data;
98
- ( match % lwt http_request ~body ~headers `POST url with
99
- (* error detection in response : slack uses status codes for webhooks versus a 200 code w/ `error` field for web api * )
100
- | Ok s ->
101
- if webhook_mode then Lwt. return @@ Ok ()
102
- else (
103
- let res = Slack_j. post_message_res_of_string s in
104
- if res.ok then Lwt. return @@ Ok ()
105
- else Lwt. return @@ build_query_error url (Option. value ~default: " an unknown error occurred" res.error)
106
- )
107
- | Error e -> Lwt. return @@ build_query_error url e
108
- )
99
+ if webhook_mode then begin
100
+ match % lwt http_request ~body ~headers `POST url with
101
+ | Ok _res -> Lwt. return @@ Ok ()
102
+ | Error e -> Lwt. return @@ build_error (query_error_msg url e)
103
+ end
104
+ else begin
105
+ match % lwt slack_api_request ~body ~headers `POST url Slack_j. read_post_message_res with
106
+ | Ok _res -> Lwt. return @@ Ok ()
107
+ | Error e -> Lwt. return @@ build_error e
108
+ end
109
109
110
110
let send_chat_unfurl ~(ctx : Context.t ) req =
111
111
log#info " unfurling Slack links" ;
@@ -118,15 +118,9 @@ module Slack : Api.Slack = struct
118
118
let url = " https://slack.com/api/chat.unfurl" in
119
119
let headers = [ bearer_token_header access_token ] in
120
120
let body = `Raw (" application/json" , data) in
121
- ( match % lwt http_request ~body ~headers `POST url with
122
- | Ok s ->
123
- let res = Slack_j. chat_unfurl_res_of_string s in
124
- if res.ok then Lwt. return @@ Ok ()
125
- else (
126
- let msg = Option. value ~default: " an unknown error occurred" res.error in
127
- Lwt. return @@ fmt_error " %s\n failed to unfurl Slack links" msg
128
- )
129
- | Error e -> Lwt. return @@ fmt_error " error while querying %s: %s\n failed to unfurl Slack links" url e
121
+ ( match % lwt slack_api_request ~body ~headers `POST url Slack_j. read_chat_unfurl_res with
122
+ | Ok _res -> Lwt. return @@ Ok ()
123
+ | Error e -> Lwt. return @@ fmt_error " %s\n failed to unfurl Slack links" e
130
124
)
131
125
132
126
let send_auth_test ~(ctx : Context.t ) () =
@@ -137,8 +131,8 @@ module Slack : Api.Slack = struct
137
131
| Some access_token ->
138
132
let url = " https://slack.com/api/auth.test" in
139
133
let headers = [ bearer_token_header access_token ] in
140
- ( match % lwt slack_http_request ~headers `GET url Slack_j. read_auth_test_res with
134
+ ( match % lwt slack_api_request ~headers `GET url Slack_j. read_auth_test_res with
141
135
| Ok res -> Lwt. return @@ Ok res
142
- | Error e -> Lwt. return @@ Error (sprintf " %s\n failed to retrieve Slack auth info" e)
136
+ | Error e -> Lwt. return @@ fmt_error " %s\n failed to retrieve Slack auth info" e
143
137
)
144
138
end
0 commit comments