     fetch("https://slack.com/api/#{endpoint}.history#{buildQueryString params}")
     .then (json) ->
       message = json.messages?[0]
-      return unless message? and message.type is "message"
+      throw "Cannot find message at timestamp provided" unless message? and message.type is "message"
       attachment = message.attachments?[0]
-      return unless attachment?.title_link?
+      throw "Message does not contain an attachment with a title link" unless attachment?.title_link?
       ticket = attachment.title_link.split "#{jiraUrl}/browse/"
-      return unless ticket and ticket.length is 2
-      ticket = ticket[1]
-
+      throw "Cannot find jira ticket" unless ticket and ticket.length is 2
+      return ticket[1]
+    .catch (error) ->
+      robot.logger.info error
+
+  handleReactionRemoved = (msg) ->
+    getTicketInChannelByTs(msg.item.channel, msg.item.ts)
+    .then (ticket) ->
+      switch msg.reaction
+        when "watch"
+          handleWatchRequest
+            message: room: msg.item.channel
+            match: [ "", ticket, robot.adapter.client.getUserByID(msg.user).name ]
+          , no, yes
+        when "raising_hand"
+          handleUnassignRequest
+            message:
+              room: msg.item.channel
+              user: id: msg.user
+            match: [ "", ticket]
+          , no
+
+  handleReactionAdded = (msg) ->
+    getTicketInChannelByTs(msg.item.channel, msg.item.ts)
+    .then (ticket) ->
       switch msg.reaction
         when "+1", "-1"
           handleRankRequest


  robot.adapter.client.on "raw_message", (msg) ->
    robot.emit "jira_ticket_created_message", msg if msg.type is "message" and msg.user is robot.adapter.self.id and msg.text is TICKET_CREATED_TEXT
    return unless msg.type is "reaction_added"
    return unless msg.item_user is robot.adapter.self.id
    return unless msg.user isnt robot.adapter.self.id

    switch msg.item.channel[0]
      when "G"
        endpoint = "groups"
      when "C"

    .catch (error) ->
      send msg, "An error has occured: #{error}"

  handleUnassignRequest = (msg, includeAttachment=yes) ->
    msg.finish?()
    [ __, ticket ] = msg.match
    fetch "#{jiraUrl}/rest/api/2/issue/#{ticket}",
      method: "PUT"
      body: JSON.stringify
        fields:
          assignee:
            name: null
    .then () ->
      fetch "#{jiraUrl}/rest/api/2/issue/#{ticket}"
    .then (json) ->
      send msg,
        text: "Unassigned <@#{msg.message.user.id}> from <#{jiraUrl}/browse/#{ticket}|#{ticket}>"
        attachments: [ buildJiraAttachment json, no ] if includeAttachment

  handleAssignRequest = (msg, includeAttachment=yes) ->
    msg.finish?()
    [ __, ticket, person ] = msg.match
