I am trying to create a Slack channel when a version is created. I created a script that that can create a slack channel from Jira. It works when executing it in the script console but not when I put it into a listener. The frustrating thing is that I am getting a 200 response in the listener logs. Nothing is changed between the console and listener scripts. The Slack bot is also that same. I am on Jira Datacenter.
What am I missing?
Script
import groovyx.net.http.ContentTypeimport groovyx.net.http.RESTClientimport groovyx.net.http.HttpResponseDecoratorimport groovyx.net.http.RESTClientfinal String URL = "https://slack.com/api/"def channelName = "pretend-channel-4"def channelPrivacy = "false" //true = private / false = publicdef data = [:] data.put("name", channelName)data.put("is_private", channelPrivacy)data.put("prety", "1")def postResponse = post(URL, "conversations.create?", data)def post(def hostUrl, def endpointAndQuery, def bodyJson) { //TOKEN FOR SLACK APP def SLACK_API_TOKEN = "<SLACK TOKEN>" def client = new RESTClient(hostUrl) client.setHeaders([ 'Authorization': "Bearer $SLACK_API_TOKEN" ]) client.handler.success = { HttpResponseDecorator response -> log.debug("POST Success: $response.") } client.handler.failure= { HttpResponseDecorator response -> log.error "POST Error: $response.status" } client.post( path: endpointAndQuery, contentType: ContentType.JSON, body: bodyJson ) }
Log screenshot
Thanks @PD Sheehan for your support.
Turns out that my script was correct. The problem was the channel name I was using. Slack has specific requirements for naming a channel. I was creating my name based off the version description. Because of this, I have to parse out all special characters, spaces and capitals. I also had to limit the string length to 80 characters.
Here is my updated code
import org.apache.log4j.Level//For Slack POSTimport groovyx.net.http.ContentTypeimport groovyx.net.http.RESTClientimport groovyx.net.http.HttpResponseDecoratorimport java.util.*import java.io.*/////////////// GET EVENT DETAILS /////////////////def fieldMap = [:]fieldMap["versionName"] = event.getVersion().getName()fieldMap["versionReleaseDate"] = event.getVersion().getReleaseDate()fieldMap["parsedReleaseDate"] = event.getVersion().getReleaseDate().toString().substring(0,10)fieldMap["versionStartDate"] = event.getVersion().getStartDate()fieldMap["versionDescription"] = event.getVersion().getDescription()/////////////// CREATE SLACK CHANNEL /////////////////def slackchannelName = fieldMap.versionDescription.toString()def slackchannelPrivacy = "false" //true = private / false = publicdef slackchannelNameModified = slackchannelName.toLowerCase().replaceAll("[^a-zA-Z0-9]","-")def slackchannelNameModified2 = slackchannelNameModified.replaceAll("\\s+","-")log.debug("slackchannelNameModified: " + slackchannelNameModified.length() + " = $slackchannelNameModified")Vector<Character> v = new Vector<>();for (int i = 0; i < slackchannelNameModified.length(); ++i){ def myChar = slackchannelNameModified.charAt(i) v.add(myChar); if (v.size() > 1 && myChar == "-"){ int sz = v.size(); // removing two consecutive duplicates if (v.get(sz - 1) == v.get(sz - 2)){ v.setSize(sz - 2); // Removing two characters from the string } }}//Puting the string back togetherdef endChannelName = ""for(n in v){ endChannelName = endChannelName + n}//endChannelName.take(80)log.debug("endChannelName: " + endChannelName.length() + " = $endChannelName")final String URL = "https://slack.com/api/"def data = [:] data.put("name", endChannelName) data.put("is_private", "false") //slackchannelPrivacy) data.put("prety", "1")def postResponse = post(URL, "conversations.create?", data)def post(def hostUrl, def endpointAndQuery, def bodyJson) { //TOKEN FOR SLACK APP def SLACK_API_TOKEN = "" def client = new RESTClient(hostUrl) client.encoder.charset = 'utf-8' client.setHeaders([ 'Authorization': "Bearer $SLACK_API_TOKEN" ]) client.handler.success = { HttpResponseDecorator response -> log.debug("POST Status: $response.") log.debug("POST Response: $response.entity.content.text") } client.handler.failure = { HttpResponseDecorator response -> log.error "POST Error: $response." } client.post( path: endpointAndQuery, contentType: ContentType.JSON, body: bodyJson )}
So, when executing in the listener, you get a log entry that shows the post request was successful but the corresponding slack channel isn't created?
It's possible for an API to respond with a success status code, but report a failure as part of the message.
Maybe you need to extract a bit more out of that response to get some clues.
import groovyx.net.http.ContentTypeimport groovyx.net.http.HttpResponseDecoratorimport groovyx.net.http.RESTClientfinal String URL = "https://slack.com/api/"def channelName = "pretend-channel-4"def channelPrivacy = "false" //true = private / false = publicdef data = [:]data.put("name", channelName)data.put("is_private", channelPrivacy)data.put("prety", "1")def postResponse = post(URL, "conversations.create?", data)def post(def hostUrl, def endpointAndQuery, def bodyJson) {//TOKEN FOR SLACK APP def SLACK_API_TOKEN = "<SLACK TOKEN>" def client = new RESTClient(hostUrl) client.setHeaders(['Authorization': "Bearer $SLACK_API_TOKEN" ]) client.handler.success = { HttpResponseDecorator response -> log.debug("POST Status: $response.") log.debug("POST Response: $response.entity.content.text")} client.handler.failure = { HttpResponseDecorator response -> log.error "POST Error: $response." } client.post(path: endpointAndQuery,contentType: ContentType.JSON,body: bodyJson )}
@PD Sheehan Thanks for the direction. It looks like it is doing exactly what you say. The request is successful but I am getting
POST Response: {"ok":false,"error":"invalid_name_specials","warning":"missing_charset","response_metadata":{"warnings":["missing_charset"]}}
do you know how to fix this? I have never had to define the ContentType other then what is currently in the script. From what I can tell it needs the Charset defined.
I don't think it'a content type error.
I haven't worked with Slack API before, but a quick google search revealed this:
https://api.slack.com/methods/conversations.create#errors
See the "invalid_name_specials" error. That means your channel name "pretend-channel-4" is apparently invalid.
And if you want to take care of the warning too... you can try adding something like this:
client.encoder.charset = 'utf-8'
But I'm not sure. I've never tried that. I just found it from the javadocs.
It looks like you're new here. Sign in or register to get started.