{"id":689,"date":"2014-12-13T23:17:40","date_gmt":"2014-12-13T14:17:40","guid":{"rendered":"http:\/\/pasero.net\/~mako\/blog\/?p=689"},"modified":"2014-12-18T06:18:54","modified_gmt":"2014-12-17T21:18:54","slug":"hubot-slack-%e3%82%a2%e3%83%80%e3%83%97%e3%82%bf-v2-%e3%81%8b%e3%82%89-v3-%e3%81%b8","status":"publish","type":"post","link":"https:\/\/pasero.net\/~mako\/blog\/s\/689","title":{"rendered":"hubot-slack \u30a2\u30c0\u30d7\u30bf v2 \u304b\u3089 v3 \u3078"},"content":{"rendered":"<p>\u3082\u3046\u65e5\u3082\u5909\u308f\u308d\u3046\u3068\u3044\u3046\u6642\u9593\u306b\u306a\u3063\u3066\u3082 <a href=\"http:\/\/www.adventar.org\/calendars\/384\" >Hubot Advent Calendar 2014<\/a> \u306e13\u65e5\u76ee\u304c\u57cb\u307e\u3063\u3066\u3044\u306a\u3044\u3088\u3046\u306a\u306e\u3067\u6025\u907d\u98db\u3073\u8fbc\u3093\u3067\u307f\u307e\u3059\u3002\u3046\u30fc\u3093\u3001\u3061\u3063\u3068\u3082\u305d\u308c\u5411\u304d\u306e\u8a71\u3067\u306f\u306a\u3044\u304b\u3082\u3002<\/p>\r\n<p style=\"margin-top:2em;\"><a href=\"https:\/\/github.com\/slackhq\/hubot-slack\" >hubot \u306e Slack \u30a2\u30c0\u30d7\u30bf<\/a> \u304c\u30d0\u30fc\u30b8\u30e7\u30f3 2 \u304b\u3089 3 (\u3053\u308c\u3092\u66f8\u3044\u3066\u3044\u308b\u6642\u70b9\u3067\u306f 3.1.0)\u306b\u306a\u308a\u307e\u3057\u305f\u3002\u3053\u308c\u306b\u4f34\u3063\u3066 Slack \u5074\u306e Hubot Integration \u3082\u69d8\u5909\u308f\u308a\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\r\n<p>\u8a66\u3057\u306b\u89e6\u3063\u3066\u307f\u3066\u3001\u6c17\u3065\u3044\u305f\u70b9\u3092\u30e1\u30e2\u3057\u3066\u304a\u304d\u307e\u3059\u3002<\/p>\r\n<h3>\u5927\u304d\u304f\u5909\u308f\u3063\u305f\u3053\u3068<\/h3>\r\n<h4>Slack \u5074\u306e Hubot Integration<\/h4>\r\n<p>\u767a\u884c\u3055\u308c\u308b token \u306e\u5f62\u5f0f\u304c\u5909\u308f\u308a\u307e\u3057\u305f\u3002v2 \u304b\u3089 v3 \u306b\u5909\u66f4\u3059\u308b\u3068\u4ee5\u524d\u306e\u3082\u306e\u306f\u4f7f\u3048\u305a\u3001<a href=\"https:\/\/github.com\/slackhq\/hubot-slack#upgrading-from-earlier-versions-of-hubot\" >\u6539\u3081\u3066\u3082\u3046\u3072\u3068\u3064 Hubot \u306e integration \u3092\u8ffd\u52a0\u3059\u308b\u5fc5\u8981<\/a>\u304c\u3042\u308a\u307e\u3059(\u4ee5\u524d\u306e\u3082\u306e\u306f\u3042\u3068\u3067\u4e0d\u8981\u306b\u306a\u308c\u3070\u524a\u9664)\u3002<\/p>\r\n<p>hubot \u306e\u540d\u524d\u306f\u3053\u3053\u3067\u8a2d\u5b9a\u3057\u307e\u3059\u3002<\/p>\r\n<p>\u30c1\u30e3\u30f3\u30cd\u30eb\u306f\u3001\u306f\u3058\u3081\u306f <var>#general<\/var> \u306b\u306e\u307f\u53c2\u52a0\u3057\u3066\u3044\u308b\u72b6\u614b\u306b\u306a\u308a\u307e\u3059(\u5f8c\u8ff0)\u3002<\/p>\r\n<p>\u4ee5\u524d\u306b\u306f\u3042\u3063\u305f Hubot URL \u306e\u6b04\u306f\u306a\u304f\u306a\u308a\u307e\u3057\u305f\u3002<a href=\"http:\/\/odoruinu.net\/blog\/2014\/07\/08\/how-to-integrate-self-hosted-hubot-with-slack\/\" >\u81ea\u524d\u30db\u30b9\u30c8\u306e Hubot \u3068 Slack \u3092\u9023\u643a\u3055\u305b\u308b<\/a>\u5834\u5408\u306b\u3064\u307e\u3065\u304f\u70b9\u3060\u3063\u305f\u306e\u3067\u3059\u304c\u3001\u306a\u304f\u306a\u308a\u307e\u3057\u305f\u3002\u3068\u3044\u3046\u3053\u3068\u306f\u3001Hubot \u3092\u52d5\u304b\u3059\u30b5\u30fc\u30d0\u30fc\u306f\u305f\u3068\u3048 NAT \u8d8a\u3057\u306e LAN \u306e\u4e2d\u3067\u3082\u3088\u304f\u306a\u308a\u307e\u3057\u305f\u3002\u30c6\u30b9\u30c8\u306e\u3068\u304d\u4fbf\u5229\u3067\u3059\u3002<\/p>\r\n<h4>\u74b0\u5883\u5909\u6570\u306f\u3072\u3068\u3064<\/h4>\r\n<p>Hubot \u5074\u3067\u8a2d\u5b9a\u3059\u308b\u74b0\u5883\u5909\u6570\u306f\u3001\u4e0a\u8a18\u306e token \u306e <var>HUBOT_SLACK_TOKEN<\/var> \u306e\u307f\u306b\u306a\u308a\u307e\u3057\u305f\u3002<var>HUBOT_SLACK_TEAM<\/var> \u306f\u4e0d\u8981\u3068\u306a\u308a(\u305f\u3076\u3093 token \u306b\u305d\u306e\u60c5\u5831\u304c\u542b\u307e\u308c\u308b\u306e\u3067\u3057\u3087\u3046)\u3001<var>HUBOT_SLACK_BOTNAME<\/var> \u3082\u4e0d\u8981\u306b\u306a\u308a\u307e\u3057\u305f(\u4e0a\u8a18\u306e\u3088\u3046\u306b Slack \u5074\u3067\u8a2d\u5b9a)\u3002<\/p>\r\n<h4>\u540d\u7c3f\u306b\u73fe\u308c\u308b\u3088\u3046\u306b\u306a\u3063\u305f<\/h4>\r\n<p>\u4ee5\u524d\u306f\u540d\u7c3f\u306b\u73fe\u308c\u305a\u96a0\u308c\u30e1\u30f3\u30d0\u30fc\u306e\u3088\u3046\u306a\u3082\u306e\u3067\u3057\u305f\u304c\u3001v3 \u3067\u306f\u307e\u308b\u3067\u4e00\u822c\u30e1\u30f3\u30d0\u30fc\u3068\u540c\u7b49\u306e\u6271\u3044\u3067\u3059\u3002\u5f93\u3063\u3066\u305d\u306e\u540d\u524d\u3092\u3061\u3083\u3093\u3068\u8a2d\u5b9a\u3057\u3066\u304a\u304f\u5fc5\u8981\u304c\u3042\u308a\u3001\u305d\u308c\u304c Hubot Integration \u3067\u884c\u3046\u3082\u306e\u3067\u3059\u3002<\/p>\r\n<p>\u4e00\u822c\u30e1\u30f3\u30d0\u30fc\u306b\u5bfe\u3057\u3066\u884c\u3046\u3088\u3046\u306b\u3001\u30c0\u30a4\u30ec\u30af\u30c8\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u9001\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u540d\u7c3f\u3067 hubot \u306e\u540d\u524d\u3092\u30af\u30ea\u30c3\u30af\u3059\u308b\u3068\u305d\u306e\u753b\u9762\u306b\u306a\u308a\u307e\u3059\u304c\u3001\u3053\u3053\u3067\u306f\u3044\u3064\u3082\u306e\u3088\u3046\u306b <code>hubot ping<\/code> \u3068 bot \u540d\u3092\u524d\u7f6e<strong>\u305b\u305a<\/strong>\u3001\u5358\u306b <code>ping<\/code> \u3068\u5165\u529b\u3059\u308b\u3068\u3061\u3087\u3046\u3069\u3044\u3044\u3068\u3044\u3046\u5f62\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\r\n<h4>\u53c2\u52a0\u30c1\u30e3\u30f3\u30cd\u30eb<\/h4>\r\n<p>\u306f\u3058\u3081\u3001hubot \u306f <var>#general<\/var> \u306e\u307f\u306b\u53c2\u52a0\u3057\u3066\u3044\u308b\u72b6\u614b\u3067\u3059\u3002\u307b\u304b\u306e\u30c1\u30e3\u30f3\u30cd\u30eb\u306b\u62db\u5f85( <code>\/invite @hubot<\/code> )\u3059\u308c\u3070\u3001\u305d\u3053\u306b\u53c2\u52a0\u3055\u305b\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u30d7\u30e9\u30a4\u30d9\u30fc\u30c8\u30b0\u30eb\u30fc\u30d7\u306b\u3082\u53c2\u52a0\u3055\u305b\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\r\n<h3>\u3053\u308c\u307e\u3067\u4f7f\u3063\u3066\u3044\u305f\u30b9\u30af\u30ea\u30d7\u30c8\u304c\u52d5\u304b\u306a\u304f\u306a\u308b\u306a\u3069\u306e\u5f71\u97ff\u306b\u3064\u3044\u3066<\/h3>\r\n<p>\u4eca\u5f8c\u66f4\u65b0\u3055\u308c\u308b\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u306e\u3067\u3001\u3042\u304f\u307e\u3067\u3053\u308c\u3092\u66f8\u3044\u3066\u3044\u308b\u6642\u70b9\u306e\u554f\u984c\u3067\u3059\u3002<\/p>\r\n<ins datetime=\"2014-12-17T01:49:08+00:00\"><p>\u3010\u8ffd\u8a18\u30112014\u5e7412\u670817\u65e5\u73fe\u5728\u306e\u6700\u65b0\u7248 3.2.0 \u3067\u3001\u4e0b\u8a18\u306e\u30a2\u30c3\u30c8\u30de\u30fc\u30af\u554f\u984c\u3068URL\u554f\u984c\u306f\u89e3\u6c7a\u3055\u308c\u3066\u3044\u308b\u3088\u3046\u3067\u3059\u3002\u3057\u305f\u304c\u3063\u3066\u4ee5\u4e0b\u306e\u30d1\u30c3\u30c1\u306f\u4e0d\u8981\u3067\u3059\u3002\u3010\u8ffd\u8a18\u7d42\u308f\u308a\u3011<\/p><\/ins>\r\n<h4>robot.messageRoom \u3067\u306e room \u540d<\/h4>\r\n<p>\u3053\u308c\u307e\u3067\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u3067\u306f <a href=\"https:\/\/github.com\/slackhq\/hubot-slack\/blob\/v2\/README.md#message-to-a-specific-room\" >Readme<\/a> \u306b\u3082<\/p>\r\n<blockquote>\r\nSlack API uses channel ID&#8217;s by default, which uses computer-friendly alphanumeric ID. To use the pretty names, prefix it with a hash.\r\n<pre>\r\n  robot.respond \/hello$\/i, (msg) ->\r\n    robot.messageRoom '#general', 'hello there'\r\n<\/pre>\r\n<\/blockquote>\r\n<p style=\"text-indent:0em;\">\u3068\u66f8\u304b\u308c\u3066\u304a\u308a\u3001room \u540d\u306b\u30cf\u30c3\u30b7\u30e5(#)\u3092<strong>\u4ed8\u3051\u308b<\/strong>\u3053\u3068\u306b\u306a\u3063\u3066\u3044\u307e\u3057\u305f\u3002<\/p>\r\n<p>v3 \u3067\u306f\u3061\u3087\u3046\u3069\u9006\u306b\u306a\u3063\u3066\u3001\u30cf\u30c3\u30b7\u30e5(#)\u3092<strong>\u4ed8\u3051\u306a\u3044<\/strong>\u3088\u3046\u306b\u306a\u308a\u307e\u3057\u305f\u3002\u3053\u308c\u304c\u4ed8\u3044\u3066\u3044\u308b\u3068\u6b63\u3057\u304f\u52d5\u4f5c\u3057\u307e\u305b\u3093\u3002<\/p>\r\n<p>\u305f\u3068\u3048\u3070\u73fe\u6642\u70b9\u306e <a href=\"http:\/\/shokai.org\/blog\/archives\/9208\" >hubot-rss-reader<\/a> \u304c\u5f15\u3063\u304b\u304b\u308a\u307e\u3057\u305f\u3002<\/p>\r\n<h4>\u30a2\u30c3\u30c8\u30de\u30fc\u30af\u4ed8\u304dbot\u540d\u306b\u53cd\u5fdc\u3057\u306a\u3044<\/h4>\r\n<p>\u3053\u308c\u307e\u3067\u306f\u3001bot \u540d\u306e\u524d\u306b\u30a2\u30c3\u30c8\u30de\u30fc\u30af(@)\u304c\u3042\u3063\u3066\u3082\u306a\u304f\u3066\u3082\u3001\u307e\u305f\u5f8c\u308d\u306b\u30b3\u30ed\u30f3(:)\u307e\u305f\u306f\u30ab\u30f3\u30de(,)\u304c\u3042\u3063\u3066\u3082\u306a\u304f\u3066\u3082\u3088\u304b\u3063\u305f\u3001\u3064\u307e\u308a<\/p>\r\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nhubot ping\r\nhubot: ping\r\n@hubot ping\r\n@hubot: ping\r\n<\/pre>\r\n<p style=\"text-indent:0em;\">\u306f\u3044\u305a\u308c\u3082hubot\u3078\u306e\u547d\u4ee4\u3068\u3057\u3066\u6709\u52b9\u3060\u3063\u305f\u306e\u3067\u3059\u304c\u3001v3\u306b\u306a\u3063\u3066\u306a\u305c\u304b@\u4ed8\u304d\u304c\u7121\u52b9\u306b\u306a\u3063\u3066\u3044\u307e\u3059\u3002<a href=\"https:\/\/github.com\/slackhq\/hubot-slack\/issues\/106\" >\u4e0d\u5177\u5408<\/a>\u3060\u3068\u601d\u308f\u308c\u307e\u3059\u306e\u3067\u3001\u65e9\u6669\u89e3\u6c7a\u3059\u308b\u3067\u3057\u3087\u3046\u3002<\/p>\r\n<h5>\u5bfe\u7b56<\/h5>\r\n<p><a href=\"https:\/\/github.com\/slackhq\/hubot-slack\/pull\/115\" >\u30d7\u30eb\u30ea\u30af\u30a8\u30b9\u30c8<\/a>\u3055\u308c\u3066\u3044\u308b\u30d1\u30c3\u30c1\u306b\u3001\u3055\u3089\u306b\u30b3\u30ed\u30f3\u3068\u30ab\u30f3\u30de\u306e\u3068\u3053\u308d\u3092\u4fee\u6b63\u3057\u3066\u9069\u7528\u3057\u3066\u307f\u307e\u3057\u305f(\u4e0b\u8a18)\u3002<\/p>\r\n<h4>URL\u3092\u30d1\u30e9\u30e1\u30fc\u30bf\u30fc\u306b\u3059\u308b\u3068\u62ec\u5f27\u304c\u3064\u3044\u3066\u3057\u307e\u3046<\/h4>\r\n<p>\u305f\u3068\u3048\u3070 <a href=\"http:\/\/shokai.org\/blog\/archives\/9208\" >hubot-rss-reader<\/a> \u306f<\/p>\r\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nhubot add http:\/\/example.com\/index.rdf\r\n<\/pre>\r\n<p style=\"text-indent:0em;\">\u307f\u305f\u3044\u306b\u3057\u3066\u4f7f\u3046\u306e\u3067\u3059\u304c\u3001\u81ea\u52d5\u7684\u306b <code>hubot add &#x3008;http:\/\/example.com\/index.rdf&#x3009;<\/code> \u306e\u3088\u3046\u306b\u5c71\u62ec\u5f27( &#x3008; \u3068 &#x3009; )\u304c\u4ed8\u52a0\u3055\u308c\u305f\u3082\u306e\u304c bot \u306b\u6e21\u3055\u308c\u308b\u305f\u3081\u3001\u30b9\u30af\u30ea\u30d7\u30c8\u304c\u3053\u308c\u3092 URL \u3068\u8a8d\u8b58\u3057\u306a\u3044\u3001\u3068\u3044\u3046\u3053\u3068\u306b\u306a\u3063\u3066\u3057\u307e\u3044\u307e\u3059\u3002<\/p>\r\n<p>v2 \u306b\u306f\u3053\u308c\u306b\u5bfe\u3059\u308b\u51e6\u7406\u304c\u3042\u3063\u305f\u306e\u3067\u3059\u304c\u3001v3\u3067\u306f\u3059\u3063\u304b\u308a\u306a\u304f\u306a\u3063\u3066\u3044\u307e\u3059\u3002<a href=\"https:\/\/github.com\/slackhq\/hubot-slack\/issues\/109\" >\u4e0d\u5177\u5408<\/a>\u3060\u3068\u601d\u3046\u306e\u3067\u3059\u304c\u3001\u958b\u767a\u8005\u306f\u5272\u3068\u60a0\u9577\u306a\u69cb\u3048\u306b\u898b\u3048\u307e\u3059\u3002<\/p>\r\n<h5>\u5bfe\u7b56<\/h5>\r\n<p>v2 \u306b\u3042\u3063\u305f\u51e6\u7406\u3092\u6301\u3063\u3066\u304d\u3066\u9069\u7528\u3057\u3066\u307f\u307e\u3057\u305f\u3002\u306a\u306b\u304b\u4e0d\u90fd\u5408\u304c\u3042\u308b\u306e\u304b\u306a\u3042\u3002<\/p>\r\n<style>.gist table { margin-bottom: 0; }<\/style><div style=\"tab-size: 8\" id=\"gist17114488\" class=\"gist\">\n    <div class=\"gist-file\" translate=\"no\" data-color-mode=\"light\" data-light-theme=\"light\">\n      <div class=\"gist-data\">\n        \n<div class=\"js-gist-file-update-container js-task-list-container\">\n      <div id=\"file-atmark-patch\" class=\"file my-2\">\n    \n    <div itemprop=\"text\"\n      class=\"Box-body p-0 blob-wrapper data type-diff  \"\n      style=\"overflow: auto\" tabindex=\"0\" role=\"region\"\n      aria-label=\"atmark.patch content, created by mako09 on 01:29PM on December 13, 2014.\"\n    >\n\n        \n<div class=\"js-check-hidden-unicode js-blob-code-container blob-code-content\">\n\n  <template class=\"js-file-alert-template\">\n  <div data-view-component=\"true\" class=\"flash flash-warn flash-full d-flex flex-items-center\">\n  <svg aria-hidden=\"true\" height=\"16\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" data-view-component=\"true\" class=\"octicon octicon-alert\">\n    <path d=\"M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\"><\/path>\n<\/svg>\n    <span>\n      This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.\n      <a class=\"Link--inTextBlock\" href=\"https:\/\/github.co\/hiddenchars\" target=\"_blank\">Learn more about bidirectional Unicode characters<\/a>\n    <\/span>\n\n\n  <div data-view-component=\"true\" class=\"flash-action\">        <a href=\"{{ revealButtonHref }}\" data-view-component=\"true\" class=\"btn-sm btn\">    Show hidden characters\n<\/a>\n<\/div>\n<\/div><\/template>\n<template class=\"js-line-alert-template\">\n  <span aria-label=\"This line has hidden Unicode characters\" data-view-component=\"true\" class=\"line-alert tooltipped tooltipped-e\">\n    <svg aria-hidden=\"true\" height=\"16\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" data-view-component=\"true\" class=\"octicon octicon-alert\">\n    <path d=\"M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\"><\/path>\n<\/svg>\n<\/span><\/template>\n\n  <table data-hpc class=\"highlight tab-size js-file-line-container\" data-tab-size=\"4\" data-paste-markdown-skip data-tagsearch-path=\"atmark.patch\">\n        <tr>\n          <td id=\"file-atmark-patch-L1\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"1\"><\/td>\n          <td id=\"file-atmark-patch-LC1\" class=\"blob-code blob-code-inner js-file-line\">--- slack.coffee.orig\t2014-12-13 17:53:24.290393342 +0900<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-atmark-patch-L2\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"2\"><\/td>\n          <td id=\"file-atmark-patch-LC2\" class=\"blob-code blob-code-inner js-file-line\">+++ slack.coffee\t2014-12-13 19:42:08.788464223 +0900<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-atmark-patch-L3\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"3\"><\/td>\n          <td id=\"file-atmark-patch-LC3\" class=\"blob-code blob-code-inner js-file-line\">@@ -8,6 +8,7 @@<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-atmark-patch-L4\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"4\"><\/td>\n          <td id=\"file-atmark-patch-LC4\" class=\"blob-code blob-code-inner js-file-line\"> <\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-atmark-patch-L5\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"5\"><\/td>\n          <td id=\"file-atmark-patch-LC5\" class=\"blob-code blob-code-inner js-file-line\">   constructor: (robot) -&gt;<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-atmark-patch-L6\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"6\"><\/td>\n          <td id=\"file-atmark-patch-LC6\" class=\"blob-code blob-code-inner js-file-line\">     @robot = robot<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-atmark-patch-L7\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"7\"><\/td>\n          <td id=\"file-atmark-patch-LC7\" class=\"blob-code blob-code-inner js-file-line\">+    @botUserID = null<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-atmark-patch-L8\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"8\"><\/td>\n          <td id=\"file-atmark-patch-LC8\" class=\"blob-code blob-code-inner js-file-line\"> <\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-atmark-patch-L9\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"9\"><\/td>\n          <td id=\"file-atmark-patch-LC9\" class=\"blob-code blob-code-inner js-file-line\">   run: -&gt;<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-atmark-patch-L10\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"10\"><\/td>\n          <td id=\"file-atmark-patch-LC10\" class=\"blob-code blob-code-inner js-file-line\">     # Take our options from the environment, and set otherwise suitable defaults<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-atmark-patch-L11\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"11\"><\/td>\n          <td id=\"file-atmark-patch-LC11\" class=\"blob-code blob-code-inner js-file-line\">@@ -44,6 +45,13 @@<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-atmark-patch-L12\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"12\"><\/td>\n          <td id=\"file-atmark-patch-LC12\" class=\"blob-code blob-code-inner js-file-line\">   loggedIn: (self, team) =&gt;<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-atmark-patch-L13\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"13\"><\/td>\n          <td id=\"file-atmark-patch-LC13\" class=\"blob-code blob-code-inner js-file-line\">     @robot.logger.info &quot;Logged in as #{self.name} of #{team.name}, but not yet connected&quot;<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-atmark-patch-L14\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"14\"><\/td>\n          <td id=\"file-atmark-patch-LC14\" class=\"blob-code blob-code-inner js-file-line\"> <\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-atmark-patch-L15\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"15\"><\/td>\n          <td id=\"file-atmark-patch-LC15\" class=\"blob-code blob-code-inner js-file-line\">+    # Go through the list of known users and find the name that matches ours<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-atmark-patch-L16\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"16\"><\/td>\n          <td id=\"file-atmark-patch-LC16\" class=\"blob-code blob-code-inner js-file-line\">+    for id, user of @client.users<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-atmark-patch-L17\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"17\"><\/td>\n          <td id=\"file-atmark-patch-LC17\" class=\"blob-code blob-code-inner js-file-line\">+      if user.is_bot and user.name == self.name<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-atmark-patch-L18\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"18\"><\/td>\n          <td id=\"file-atmark-patch-LC18\" class=\"blob-code blob-code-inner js-file-line\">+        @botUserID = id<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-atmark-patch-L19\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"19\"><\/td>\n          <td id=\"file-atmark-patch-LC19\" class=\"blob-code blob-code-inner js-file-line\">+        break<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-atmark-patch-L20\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"20\"><\/td>\n          <td id=\"file-atmark-patch-LC20\" class=\"blob-code blob-code-inner js-file-line\">+    @robot.logger.info &quot;Bot&#39;s Slack user ID is #{@botUserID}&quot;<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-atmark-patch-L21\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"21\"><\/td>\n          <td id=\"file-atmark-patch-LC21\" class=\"blob-code blob-code-inner js-file-line\">+<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-atmark-patch-L22\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"22\"><\/td>\n          <td id=\"file-atmark-patch-LC22\" class=\"blob-code blob-code-inner js-file-line\">     # Provide our name to Hubot<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-atmark-patch-L23\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"23\"><\/td>\n          <td id=\"file-atmark-patch-LC23\" class=\"blob-code blob-code-inner js-file-line\">     @robot.name = self.name<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-atmark-patch-L24\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"24\"><\/td>\n          <td id=\"file-atmark-patch-LC24\" class=\"blob-code blob-code-inner js-file-line\"> <\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-atmark-patch-L25\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"25\"><\/td>\n          <td id=\"file-atmark-patch-LC25\" class=\"blob-code blob-code-inner js-file-line\">@@ -103,6 +111,11 @@<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-atmark-patch-L26\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"26\"><\/td>\n          <td id=\"file-atmark-patch-LC26\" class=\"blob-code blob-code-inner js-file-line\">       # If this is a DM, pretend it was addressed to us<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-atmark-patch-L27\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"27\"><\/td>\n          <td id=\"file-atmark-patch-LC27\" class=\"blob-code blob-code-inner js-file-line\">       if msg.getChannelType() == &#39;DM&#39;<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-atmark-patch-L28\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"28\"><\/td>\n          <td id=\"file-atmark-patch-LC28\" class=\"blob-code blob-code-inner js-file-line\">         txt = &quot;#{@robot.name} #{txt}&quot;<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-atmark-patch-L29\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"29\"><\/td>\n          <td id=\"file-atmark-patch-LC29\" class=\"blob-code blob-code-inner js-file-line\">+      # Or, if we were @-mentioned<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-atmark-patch-L30\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"30\"><\/td>\n          <td id=\"file-atmark-patch-LC30\" class=\"blob-code blob-code-inner js-file-line\">+      else if matches = txt.match(\/&lt;@([^&gt;]+)&gt;[:,]?\\s?(.*)\/)<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-atmark-patch-L31\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"31\"><\/td>\n          <td id=\"file-atmark-patch-LC31\" class=\"blob-code blob-code-inner js-file-line\">+        [userID, someText] = matches[1..2]<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-atmark-patch-L32\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"32\"><\/td>\n          <td id=\"file-atmark-patch-LC32\" class=\"blob-code blob-code-inner js-file-line\">+        if @botUserID and (userID == @botUserID)<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-atmark-patch-L33\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"33\"><\/td>\n          <td id=\"file-atmark-patch-LC33\" class=\"blob-code blob-code-inner js-file-line\">+          txt = &quot;#{@robot.name} #{someText}&quot;<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-atmark-patch-L34\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"34\"><\/td>\n          <td id=\"file-atmark-patch-LC34\" class=\"blob-code blob-code-inner js-file-line\"> <\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-atmark-patch-L35\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"35\"><\/td>\n          <td id=\"file-atmark-patch-LC35\" class=\"blob-code blob-code-inner js-file-line\">       @receive new TextMessage user, txt, msg.ts<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-atmark-patch-L36\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"36\"><\/td>\n          <td id=\"file-atmark-patch-LC36\" class=\"blob-code blob-code-inner js-file-line\"> <\/td>\n        <\/tr>\n  <\/table>\n<\/div>\n\n\n    <\/div>\n\n  <\/div>\n\n<\/div>\n\n      <\/div>\n      <div class=\"gist-meta\">\n        <a href=\"https:\/\/gist.github.com\/mako09\/6943959b08c3b26b001c\/raw\/73bf58ece7c80c2745f8db03c82a466bf954d7f1\/atmark.patch\" style=\"float:right\" class=\"Link--inTextBlock\">view raw<\/a>\n        <a href=\"https:\/\/gist.github.com\/mako09\/6943959b08c3b26b001c#file-atmark-patch\" class=\"Link--inTextBlock\">\n          atmark.patch\n        <\/a>\n        hosted with &#10084; by <a class=\"Link--inTextBlock\" href=\"https:\/\/github.com\">GitHub<\/a>\n      <\/div>\n    <\/div>\n    <div class=\"gist-file\" translate=\"no\" data-color-mode=\"light\" data-light-theme=\"light\">\n      <div class=\"gist-data\">\n        \n<div class=\"js-gist-file-update-container js-task-list-container\">\n      <div id=\"file-unescapehtml-patch\" class=\"file my-2\">\n    \n    <div itemprop=\"text\"\n      class=\"Box-body p-0 blob-wrapper data type-diff  \"\n      style=\"overflow: auto\" tabindex=\"0\" role=\"region\"\n      aria-label=\"unescapeHtml.patch content, created by mako09 on 01:29PM on December 13, 2014.\"\n    >\n\n        \n<div class=\"js-check-hidden-unicode js-blob-code-container blob-code-content\">\n\n  <template class=\"js-file-alert-template\">\n  <div data-view-component=\"true\" class=\"flash flash-warn flash-full d-flex flex-items-center\">\n  <svg aria-hidden=\"true\" height=\"16\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" data-view-component=\"true\" class=\"octicon octicon-alert\">\n    <path d=\"M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\"><\/path>\n<\/svg>\n    <span>\n      This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.\n      <a class=\"Link--inTextBlock\" href=\"https:\/\/github.co\/hiddenchars\" target=\"_blank\">Learn more about bidirectional Unicode characters<\/a>\n    <\/span>\n\n\n  <div data-view-component=\"true\" class=\"flash-action\">        <a href=\"{{ revealButtonHref }}\" data-view-component=\"true\" class=\"btn-sm btn\">    Show hidden characters\n<\/a>\n<\/div>\n<\/div><\/template>\n<template class=\"js-line-alert-template\">\n  <span aria-label=\"This line has hidden Unicode characters\" data-view-component=\"true\" class=\"line-alert tooltipped tooltipped-e\">\n    <svg aria-hidden=\"true\" height=\"16\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" data-view-component=\"true\" class=\"octicon octicon-alert\">\n    <path d=\"M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\"><\/path>\n<\/svg>\n<\/span><\/template>\n\n  <table data-hpc class=\"highlight tab-size js-file-line-container\" data-tab-size=\"4\" data-paste-markdown-skip data-tagsearch-path=\"unescapeHtml.patch\">\n        <tr>\n          <td id=\"file-unescapehtml-patch-L1\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"1\"><\/td>\n          <td id=\"file-unescapehtml-patch-LC1\" class=\"blob-code blob-code-inner js-file-line\">--- slack.coffee.orig\t2014-12-13 17:53:24.290393342 +0900<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-unescapehtml-patch-L2\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"2\"><\/td>\n          <td id=\"file-unescapehtml-patch-LC2\" class=\"blob-code blob-code-inner js-file-line\">+++ slack.coffee\t2014-12-13 17:53:51.421673532 +0900<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-unescapehtml-patch-L3\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"3\"><\/td>\n          <td id=\"file-unescapehtml-patch-LC3\" class=\"blob-code blob-code-inner js-file-line\">@@ -61,6 +61,24 @@<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-unescapehtml-patch-L4\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"4\"><\/td>\n          <td id=\"file-unescapehtml-patch-LC4\" class=\"blob-code blob-code-inner js-file-line\">     @client.removeListener &#39;close&#39;, @.close<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-unescapehtml-patch-L5\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"5\"><\/td>\n          <td id=\"file-unescapehtml-patch-LC5\" class=\"blob-code blob-code-inner js-file-line\">     @client.removeListener &#39;message&#39;, @.message<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-unescapehtml-patch-L6\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"6\"><\/td>\n          <td id=\"file-unescapehtml-patch-LC6\" class=\"blob-code blob-code-inner js-file-line\"> <\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-unescapehtml-patch-L7\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"7\"><\/td>\n          <td id=\"file-unescapehtml-patch-LC7\" class=\"blob-code blob-code-inner js-file-line\">+  ###################################################################<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-unescapehtml-patch-L8\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"8\"><\/td>\n          <td id=\"file-unescapehtml-patch-LC8\" class=\"blob-code blob-code-inner js-file-line\">+  # HTML helpers.<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-unescapehtml-patch-L9\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"9\"><\/td>\n          <td id=\"file-unescapehtml-patch-LC9\" class=\"blob-code blob-code-inner js-file-line\">+  ###################################################################<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-unescapehtml-patch-L10\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"10\"><\/td>\n          <td id=\"file-unescapehtml-patch-LC10\" class=\"blob-code blob-code-inner js-file-line\">+  unescapeHtml: (string) -&gt;<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-unescapehtml-patch-L11\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"11\"><\/td>\n          <td id=\"file-unescapehtml-patch-LC11\" class=\"blob-code blob-code-inner js-file-line\">+    try<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-unescapehtml-patch-L12\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"12\"><\/td>\n          <td id=\"file-unescapehtml-patch-LC12\" class=\"blob-code blob-code-inner js-file-line\">+      string<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-unescapehtml-patch-L13\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"13\"><\/td>\n          <td id=\"file-unescapehtml-patch-LC13\" class=\"blob-code blob-code-inner js-file-line\">+        # Unescape entities<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-unescapehtml-patch-L14\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"14\"><\/td>\n          <td id=\"file-unescapehtml-patch-LC14\" class=\"blob-code blob-code-inner js-file-line\">+        .replace(\/&amp;amp;\/g, &#39;&amp;&#39;)<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-unescapehtml-patch-L15\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"15\"><\/td>\n          <td id=\"file-unescapehtml-patch-LC15\" class=\"blob-code blob-code-inner js-file-line\">+        .replace(\/&amp;lt;\/g, &#39;&lt;&#39;)<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-unescapehtml-patch-L16\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"16\"><\/td>\n          <td id=\"file-unescapehtml-patch-LC16\" class=\"blob-code blob-code-inner js-file-line\">+        .replace(\/&amp;gt;\/g, &#39;&gt;&#39;)<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-unescapehtml-patch-L17\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"17\"><\/td>\n          <td id=\"file-unescapehtml-patch-LC17\" class=\"blob-code blob-code-inner js-file-line\">+<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-unescapehtml-patch-L18\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"18\"><\/td>\n          <td id=\"file-unescapehtml-patch-LC18\" class=\"blob-code blob-code-inner js-file-line\">+        # Convert markup into plain url string.<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-unescapehtml-patch-L19\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"19\"><\/td>\n          <td id=\"file-unescapehtml-patch-LC19\" class=\"blob-code blob-code-inner js-file-line\">+        .replace(\/&lt;((\\bhttps?)[^|]+)(\\|(.*))+&gt;\/g, &#39;$1&#39;)<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-unescapehtml-patch-L20\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"20\"><\/td>\n          <td id=\"file-unescapehtml-patch-LC20\" class=\"blob-code blob-code-inner js-file-line\">+        .replace(\/&lt;((\\bhttps?)(.*))?&gt;\/g, &#39;$1&#39;)<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-unescapehtml-patch-L21\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"21\"><\/td>\n          <td id=\"file-unescapehtml-patch-LC21\" class=\"blob-code blob-code-inner js-file-line\">+    catch e<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-unescapehtml-patch-L22\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"22\"><\/td>\n          <td id=\"file-unescapehtml-patch-LC22\" class=\"blob-code blob-code-inner js-file-line\">+      @robot.logger.error &quot;Failed to unescape HTML: #{e}&quot;<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-unescapehtml-patch-L23\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"23\"><\/td>\n          <td id=\"file-unescapehtml-patch-LC23\" class=\"blob-code blob-code-inner js-file-line\">+      return &#39;&#39;<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-unescapehtml-patch-L24\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"24\"><\/td>\n          <td id=\"file-unescapehtml-patch-LC24\" class=\"blob-code blob-code-inner js-file-line\">+<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-unescapehtml-patch-L25\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"25\"><\/td>\n          <td id=\"file-unescapehtml-patch-LC25\" class=\"blob-code blob-code-inner js-file-line\">   message: (msg) =&gt;<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-unescapehtml-patch-L26\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"26\"><\/td>\n          <td id=\"file-unescapehtml-patch-LC26\" class=\"blob-code blob-code-inner js-file-line\">     return if msg.hidden<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-unescapehtml-patch-L27\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"27\"><\/td>\n          <td id=\"file-unescapehtml-patch-LC27\" class=\"blob-code blob-code-inner js-file-line\">     return if not msg.text and not msg.attachments<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-unescapehtml-patch-L28\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"28\"><\/td>\n          <td id=\"file-unescapehtml-patch-LC28\" class=\"blob-code blob-code-inner js-file-line\">@@ -96,7 +114,7 @@<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-unescapehtml-patch-L29\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"29\"><\/td>\n          <td id=\"file-unescapehtml-patch-LC29\" class=\"blob-code blob-code-inner js-file-line\"> <\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-unescapehtml-patch-L30\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"30\"><\/td>\n          <td id=\"file-unescapehtml-patch-LC30\" class=\"blob-code blob-code-inner js-file-line\">     else<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-unescapehtml-patch-L31\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"31\"><\/td>\n          <td id=\"file-unescapehtml-patch-LC31\" class=\"blob-code blob-code-inner js-file-line\">       # Build message text to respond to, including all attachments<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-unescapehtml-patch-L32\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"32\"><\/td>\n          <td id=\"file-unescapehtml-patch-LC32\" class=\"blob-code blob-code-inner js-file-line\">-      txt = msg.getBody()<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-unescapehtml-patch-L33\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"33\"><\/td>\n          <td id=\"file-unescapehtml-patch-LC33\" class=\"blob-code blob-code-inner js-file-line\">+      txt = @unescapeHtml msg.getBody()<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-unescapehtml-patch-L34\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"34\"><\/td>\n          <td id=\"file-unescapehtml-patch-LC34\" class=\"blob-code blob-code-inner js-file-line\"> <\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-unescapehtml-patch-L35\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"35\"><\/td>\n          <td id=\"file-unescapehtml-patch-LC35\" class=\"blob-code blob-code-inner js-file-line\">       @robot.logger.debug &quot;Received message: &#39;#{txt}&#39; in channel: #{channel.name}, from: #{user.name}&quot;<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-unescapehtml-patch-L36\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"36\"><\/td>\n          <td id=\"file-unescapehtml-patch-LC36\" class=\"blob-code blob-code-inner js-file-line\"> <\/td>\n        <\/tr>\n  <\/table>\n<\/div>\n\n\n    <\/div>\n\n  <\/div>\n\n<\/div>\n\n      <\/div>\n      <div class=\"gist-meta\">\n        <a href=\"https:\/\/gist.github.com\/mako09\/6943959b08c3b26b001c\/raw\/73bf58ece7c80c2745f8db03c82a466bf954d7f1\/unescapeHtml.patch\" style=\"float:right\" class=\"Link--inTextBlock\">view raw<\/a>\n        <a href=\"https:\/\/gist.github.com\/mako09\/6943959b08c3b26b001c#file-unescapehtml-patch\" class=\"Link--inTextBlock\">\n          unescapeHtml.patch\n        <\/a>\n        hosted with &#10084; by <a class=\"Link--inTextBlock\" href=\"https:\/\/github.com\">GitHub<\/a>\n      <\/div>\n    <\/div>\n<\/div>\n\r\n<h4>attachment \u304c\u4f7f\u3048\u306a\u304f\u306a\u3063\u305f<\/h4>\r\n<p>\u3053\u306e\u6a5f\u80fd\u3092\u4f7f\u3063\u3066\u3044\u306a\u3044\u306e\u3067\u8a73\u3057\u3044\u3053\u3068\u306f\u8ff0\u3079\u307e\u305b\u3093\u3002\u3055\u3063\u305d\u304f\u5225\u306e\u30b9\u30af\u30ea\u30d7\u30c8 <a href=\"https:\/\/www.npmjs.com\/package\/hubot-slack-attachment\" >hubot-slack-attachment<\/a> \u304c\u3067\u304d\u3066\u3044\u308b\u3088\u3046\u3067\u3059\u3002<\/p>\r\n","protected":false},"excerpt":{"rendered":"\u3082\u3046\u65e5\u3082\u5909\u308f\u308d\u3046\u3068\u3044\u3046\u6642\u9593\u306b\u306a\u3063\u3066\u3082 Hubot Advent Calendar 2014 \u306e13\u65e5\u76ee\u304c\u57cb\u307e\u3063\u3066\u3044\u306a\u3044\u3088\u3046\u306a\u306e\u3067\u6025\u907d\u98db\u3073\u8fbc\u3093\u3067\u307f\u307e\u3059\u3002\u3046\u30fc\u3093\u3001\u3061\u3063\u3068\u3082\u305d\u308c\u5411\u304d\u306e\u8a71\u3067\u306f\u306a\u3044\u304b\u3082\u3002 hubot \u306e Slack&hellip; <a class=\"more-link\" href=\"https:\/\/pasero.net\/~mako\/blog\/s\/689\">\u7d9a\u304d\u3092\u8aad\u3080<span class=\"screen-reader-text\">: hubot-slack \u30a2\u30c0\u30d7\u30bf v2 \u304b\u3089 v3 \u3078<\/span> <span class=\"meta-nav\" aria-hidden=\"true\">&rarr;<\/span><\/a>","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"advanced_seo_description":"","jetpack_seo_html_title":"","jetpack_seo_noindex":false,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"blog: hubot-slack \u30a2\u30c0\u30d7\u30bf v2 \u304b\u3089 v3 \u3078","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[75],"tags":[72,73,7],"class_list":["post-689","post","type-post","status-publish","format-standard","hentry","category-software","tag-hubot","tag-slack","tag-software"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/pLxlV-b7","jetpack_sharing_enabled":true,"jetpack-related-posts":[{"id":679,"url":"https:\/\/pasero.net\/~mako\/blog\/s\/679","url_meta":{"origin":689,"position":0},"title":"Hubot ping \u306e\u65e5\u672c\u8a9e\u5316 &#8212; \u300c\u3044\u308b\u306e\u304b?\u300d\u306e\u6b63\u898f\u8868\u73fe","author":"Mako","date":"2014\u5e7411\u670827\u65e5(\u6728)","format":false,"excerpt":"Hubot \u306e ping \u30b3\u30de\u30f3\u30c9 Slack \u3068\u3044\u3046\u30b3\u30df\u30e5\u30cb\u30b1\u30fc\u30b7\u30e7\u30f3\u30c4\u30fc\u30eb\u3092\u5229\u7528\u3059\u308b\u3053\u3068\u306b\u306a\u3063\u3066\u2026","rel":"","context":"WordPress","block_context":{"text":"WordPress","link":"https:\/\/pasero.net\/~mako\/blog\/s\/category\/wordpress"},"img":{"alt_text":"hubot_wapuu","src":"https:\/\/i0.wp.com\/pasero.net\/~mako\/blog\/wp-content\/uploads\/2014\/11\/hubot_wapuu2.png?resize=350%2C200","width":350,"height":200},"classes":[]},{"id":2187,"url":"https:\/\/pasero.net\/~mako\/blog\/s\/2187","url_meta":{"origin":689,"position":1},"title":"\u74b0\u5883\u5909\u6570 CHROMIUM_FLAGS \u3068 Chromium \u306e\u30aa\u30d7\u30b7\u30e7\u30f3 --enable-remote-extensions","author":"Mako","date":"2017\u5e742\u67085\u65e5(\u65e5)","format":false,"excerpt":"\u81ea\u5206\u7528\u30e1\u30e2\u3002 \u307b\u304b\u306f\u3069\u3046\u304b\u77e5\u3089\u306a\u3044\u304c\u5c11\u306a\u304f\u3068\u3082\u3053\u308c\u3092\u66f8\u3044\u3066\u3044\u308b\u6642\u70b9\u306e Debian (Stretch\u2026","rel":"","context":"Debian","block_context":{"text":"Debian","link":"https:\/\/pasero.net\/~mako\/blog\/s\/category\/debian"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":46,"url":"https:\/\/pasero.net\/~mako\/blog\/s\/46","url_meta":{"origin":689,"position":2},"title":"subversion","author":"Mako","date":"2007\u5e741\u670828\u65e5(\u65e5)","format":false,"excerpt":"\u3088\u3046\u3084\u304f CVS\u304b\u3089subversion\u306b\u79fb\u884c\u3057\u305f\u3002\u81ea\u5206\u4e00\u4eba\u306e\u74b0\u5883\u3060\u3057\u3001\u6ec5\u591a\u306b\u30b3\u30fc\u30c9\u3082\u66f8\u304b\u306a\u3044\u306e\u3067\u4f55\u2026","rel":"","context":"\u30bd\u30d5\u30c8\u30a6\u30a7\u30a2","block_context":{"text":"\u30bd\u30d5\u30c8\u30a6\u30a7\u30a2","link":"https:\/\/pasero.net\/~mako\/blog\/s\/category\/software"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":2392,"url":"https:\/\/pasero.net\/~mako\/blog\/s\/2392","url_meta":{"origin":689,"position":3},"title":"Emacs \u98a8\u30ad\u30fc\u30d0\u30a4\u30f3\u30c9","author":"Mako","date":"2018\u5e7411\u670813\u65e5(\u706b)","format":false,"excerpt":"\u5148\u65e5\u3001\u4e45\u3057\u3076\u308a\u306b\u52c9\u5f37\u4f1a\u306e\u3088\u3046\u306a\u3068\u3053\u308d\u3078\u51fa\u304b\u3051\u3066\u307f\u307e\u3057\u305f\u3002\u305d\u3053\u3067\u4f1a\u306e\u4e3b\u8981\u306a\u30c6\u30fc\u30de\u3068\u306f\u76f4\u63a5\u95a2\u4fc2\u306e\u306a\u3044 M\u2026","rel":"","context":"\u30bd\u30d5\u30c8\u30a6\u30a7\u30a2","block_context":{"text":"\u30bd\u30d5\u30c8\u30a6\u30a7\u30a2","link":"https:\/\/pasero.net\/~mako\/blog\/s\/category\/software"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":284,"url":"https:\/\/pasero.net\/~mako\/blog\/s\/284","url_meta":{"origin":689,"position":4},"title":"\u30a4\u30f3\u30bf\u30fc\u30cd\u30c3\u30c8\u30e9\u30b8\u30aa\u3092 FM \u30e9\u30b8\u30aa\u3067\u8074\u304f","author":"Mako","date":"2011\u5e746\u67086\u65e5(\u6708)","format":false,"excerpt":"radiko \u3084 NHK \u306e\u30a4\u30f3\u30bf\u30fc\u30cd\u30c3\u30c8\u914d\u4fe1\u3068\u3061\u3087\u3046\u3069\u9006\u306e\u8a71\u3002 \u4ed5\u4e8b\u4e2d\u306b\u97f3\u697d\u3092\u8074\u304d\u305f\u3044\u3002\u3057\u304b\u3057\u76ee\u306e\u2026","rel":"","context":"Debian","block_context":{"text":"Debian","link":"https:\/\/pasero.net\/~mako\/blog\/s\/category\/debian"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":348,"url":"https:\/\/pasero.net\/~mako\/blog\/s\/348","url_meta":{"origin":689,"position":5},"title":"\u30d5\u30a9\u30f3\u30c8\u306e\u6307\u5b9a\u3092\u3084\u3081\u308b","author":"Mako","date":"2011\u5e7412\u670818\u65e5(\u65e5)","format":false,"excerpt":"\u4e45\u3005\u306b Windows \u3092\u4f7f\u3046\u6a5f\u4f1a\u304c\u3042\u3063\u3066\u3001\u3053\u306e\u81ea\u5206\u306e\u30da\u30fc\u30b8\u3092\u898b\u3066\u307f\u305f\u3002\u898b\u96e3\u3044\u3002\u919c\u3044\u3002\u660e\u671d\u4f53\u306e\u8868\u793a\u304c\u2026","rel":"","context":"WordPress","block_context":{"text":"WordPress","link":"https:\/\/pasero.net\/~mako\/blog\/s\/category\/wordpress"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"_links":{"self":[{"href":"https:\/\/pasero.net\/~mako\/blog\/wp-json\/wp\/v2\/posts\/689","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pasero.net\/~mako\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/pasero.net\/~mako\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/pasero.net\/~mako\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/pasero.net\/~mako\/blog\/wp-json\/wp\/v2\/comments?post=689"}],"version-history":[{"count":0,"href":"https:\/\/pasero.net\/~mako\/blog\/wp-json\/wp\/v2\/posts\/689\/revisions"}],"wp:attachment":[{"href":"https:\/\/pasero.net\/~mako\/blog\/wp-json\/wp\/v2\/media?parent=689"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/pasero.net\/~mako\/blog\/wp-json\/wp\/v2\/categories?post=689"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/pasero.net\/~mako\/blog\/wp-json\/wp\/v2\/tags?post=689"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}