Save 37% off PRO during our Black Friday Sale! »

Go製の拡張可能なSlack bot

42a3fcdaaa492f3e1cf0fe7e6bbf4251?s=47 kyokomi
June 21, 2015

Go製の拡張可能なSlack bot

footer: @k_yokomi, 2015/06/21 「Go Conference 2015 summer」
slidenumbers: true

# Go製の拡張可能なSlack bot
### Go Conference 2015 summer

---

![right autoplay 300% mute icont19.png](https://qiita-image-store.s3.amazonaws.com/0/40887/42180ccd-23f8-cdb3-0dc2-531c9681dfc4.png)

# 自己紹介

- Twitter: @k_yokomi (きょこみ)[^※1]
- 仕事はGoでバックエンド書いてます
- 個人でCocos2d-xでゲーム作ったりもしてます(今年こそリリースする...)
- GoでWebサービス作ってリリースもしました([MeetApp](http://kyokomi.hatenablog.com/entry/2015/05/18/233657))

[^※1]: アイコンは月姫の琥珀さんです。([眠りの園](http://nemurinosono.jorougumo.com/index.html)様 提供)

---

# [https://github.com/kyokomi/slackbot](https://github.com/kyokomi/slackbot)

- SlackのWebSocket版(RTM)のbot
- もちろんGoで実装した
- [x/net/context]()ベースで機能拡張が簡単
- プラグインつくってmainでimportするだけでOK

---

# デモ

---

# 他にも作ったプラグインを紹介
## (デモで見せたものも混ざってます)

---

# いまのところあるプラグイン(その1)

- [github.com/kyokomi/slackbot/plugins/echo](github.com/kyokomi/slackbot/tree/master/plugins/echo)
- すべての会話をechoします
- [github.com/kyokomi/slackbot/plugins/cron](https://github.com/kyokomi/slackbot/tree/master/plugins/cron)
- cron形式でタスク設定できる( [cron add 30 * * * * * ふむ]() )
- [github.com/kyokomi/slackbot/plugins/lgtm](https://github.com/kyokomi/slackbot/tree/master/plugins/lgtm)
- LGTM画像をランダムで表示する

---

# いまのところあるプラグイン(その2)

- [github.com/kyokomi/slackbot/plugins/naruhodo](https://github.com/kyokomi/slackbot/tree/master/plugins/naruhodo)
- 「なるほど」キーワードに反応して「なるほどですぞ!」
- [github.com/kyokomi/slackbot/plugins/suddendeath](https://github.com/kyokomi/slackbot/tree/master/plugins/suddendeath)
- みんな大好きな突然死のやつ(> 」]()で雑談する(docomo雑談API)
- [「 おしえて 」]()で答えてくれる
(docomo知識Q&A API)
- [1/5くらいの確率]()で会話に強引に割り込んでくる
- [「 静かに」]()キーワードで5分黙る

---

# プラグイン開発しやすいように
## ツール作りました

---

# slackbotcmd

### インストール
### [go get github.com/kyokomi/slackbot/cmd/slackbotcmd]()
### 実行
### [$ slackbotcmd new ]()

---

![fit slackbotcmd_sample.png](https://qiita-image-store.s3.amazonaws.com/0/40887/58c9159b-f35a-3fc0-cdd5-331802ee0bca.png "slackbotcmd_sample.png")

---

## あとはTODO: のところを実装するだけ
## 簡単!!

![fit slackbotcmd_sample.png](https://qiita-image-store.s3.amazonaws.com/0/40887/58c9159b-f35a-3fc0-cdd5-331802ee0bca.png "slackbotcmd_sample.png")

---

![fit main_example.png](https://qiita-image-store.s3.amazonaws.com/0/40887/14ae482c-a3f8-5da4-2af6-6825d9cc171b.png "main_example.png")

---

## _ importしたらinit()が呼ばれて
## plugin追加される

![fit main_example.png](https://qiita-image-store.s3.amazonaws.com/0/40887/14ae482c-a3f8-5da4-2af6-6825d9cc171b.png "main_example.png")

---

# 開発で利用したライブラリ

- [github.com/nlopes/slack](https://github.com/nlopes/slack)
- slackライブラリ(公式ではないけどかなりサポートしてる)
- [github.com/robfig/cron](https://github.com/robfig/cron)
- cronライブラリ(StopとStartの制御は注意)
- [github.com/kyokomi/go-docomo/docomo](https://github.com/kyokomi/go-docomo/tree/master/docomo)
- docomoのAPIライブラリ(雑談、知識Q&Aとか対応)

---

# おわり

42a3fcdaaa492f3e1cf0fe7e6bbf4251?s=128

kyokomi

June 21, 2015
Tweet

Transcript

  1. Go੡ͷ֦ுՄೳͳSlack(bot Go#Conference#2015#summer @k_yokomi,)2015/06/21)ʮGo)Conference)2015)summerʯ 1

  2. ࣗݾ঺հ • Twi%er:)@k_yokomi)ʢ͖ΐ͜Έʣ※1 • ࢓ࣄ͸GoͰόοΫΤϯυॻ͍ͯ·͢ • ݸਓͰCocos2d7xͰήʔϜ࡞ͬͨΓ΋͠ ͯ·͢ʢࠓ೥ͦ͜ϦϦʔε͢Δ...ʣ • GoͰWebαʔϏε࡞ͬͯϦϦʔε΋͠

    ·ͨ͠ʢMeetAppʣ ※1"ΞΠίϯ͸݄ඣͷᘡᘚ͞ΜͰ͢ɻʢ຾ΓͷԂ༷"ఏڙʣ @k_yokomi,)2015/06/21)ʮGo)Conference)2015)summerʯ 2
  3. h"ps:/ /github.com/kyokomi/slackbot • SlackͷWebSocket൛ʢRTMʣͷbot • ΋ͪΖΜGoͰ࣮૷ͨ͠ • x/net/contextϕʔεͰػೳ֦ு͕؆୯ • ϓϥάΠϯͭͬͯ͘mainͰimport͢Δ͚ͩͰOK

    @k_yokomi,)2015/06/21)ʮGo)Conference)2015)summerʯ 3
  4. σϞ @k_yokomi,)2015/06/21)ʮGo)Conference)2015)summerʯ 4

  5. @k_yokomi,)2015/06/21)ʮGo)Conference)2015)summerʯ 5

  6. ଞʹ΋࡞ͬͨϓϥάΠϯΛ঺հ ʢσϞͰݟͤͨ΋ͷ΋ࠞͬͯ͟·͢ʣ @k_yokomi,)2015/06/21)ʮGo)Conference)2015)summerʯ 6

  7. ͍·ͷͱ͜Ζ͋ΔϓϥάΠϯʢͦͷ̍ʣ • github.com/kyokomi/slackbot/plugins/echo • ͢΂ͯͷձ࿩Λecho͠·͢ • github.com/kyokomi/slackbot/plugins/cron • cronܗࣜͰλεΫઃఆͰ͖Δ(7cron7add7307*7*7*7*7*7;Ή7) •

    github.com/kyokomi/slackbot/plugins/lgtm • LGTMը૾ΛϥϯμϜͰදࣔ͢Δ @k_yokomi,)2015/06/21)ʮGo)Conference)2015)summerʯ 7
  8. ͍·ͷͱ͜Ζ͋ΔϓϥάΠϯʢͦͷ̎ʣ • github.com/kyokomi/slackbot/plugins/naruhodo • ʮͳΔ΄ͲʯΩʔϫʔυʹ൓Ԡͯ͠ʮͳΔ΄ͲͰͧ͢ʂʯ • github.com/kyokomi/slackbot/plugins/suddendeath • ΈΜͳେ޷͖ͳಥવࢮͷ΍ͭʢ><ʣ •

    github.com/kyokomi/nepu9bot/plugins/twi;er • Twi;er=Search=APIͰωϓςϡʔψͷը૾Λద౰ʹ୳͢ @k_yokomi,)2015/06/21)ʮGo)Conference)2015)summerʯ 8
  9. ͍·ͷͱ͜Ζ͋ΔϓϥάΠϯʢͦͷ̏ʣ • github.com/kyokomi/nepu2bot/plugins/nepubot • ʮ<bot໊>7<ձ࿩>ʯͰࡶஊ͢ΔʢdocomoࡶஊAPIʣ • ʮ<bot໊>7͓͑ͯ͠7<࣭໰>ʯͰ౴͑ͯ͘ΕΔ ʢdocomo஌ࣝQ&A7APIʣ • 1/5͘Β͍ͷ֬཰Ͱձ࿩ʹڧҾʹׂΓࠐΜͰ͘Δ

    • ʮ<bot໊>7੩͔ʹʯΩʔϫʔυͰ5෼໧Δ @k_yokomi,)2015/06/21)ʮGo)Conference)2015)summerʯ 9
  10. ϓϥάΠϯ։ൃ͠΍͍͢Α͏ʹ πʔϧ࡞Γ·ͨ͠ @k_yokomi,)2015/06/21)ʮGo)Conference)2015)summerʯ 10

  11. slackbotcmd Πϯετʔϧ go#get#github.com/kyokomi/slackbot/cmd/slackbotcmd ࣮ߦ $"slackbotcmd"new"<plugin"name> @k_yokomi,)2015/06/21)ʮGo)Conference)2015)summerʯ 11

  12. @k_yokomi,)2015/06/21)ʮGo)Conference)2015)summerʯ 12

  13. ͋ͱ͸TODO:%ͷͱ͜ΖΛ࣮૷͢Δ͚ͩ ؆୯!! @k_yokomi,)2015/06/21)ʮGo)Conference)2015)summerʯ 13

  14. @k_yokomi,)2015/06/21)ʮGo)Conference)2015)summerʯ 14

  15. _"importͨ͠Βinit()͕ݺ͹Εͯ plugin௥Ճ͞ΕΔ @k_yokomi,)2015/06/21)ʮGo)Conference)2015)summerʯ 15

  16. ։ൃͰར༻ͨ͠ϥΠϒϥϦ • github.com/nlopes/slack • slackϥΠϒϥϦʢެࣜͰ͸ͳ͍͚Ͳ͔ͳΓαϙʔτͯ͠Δʣ • github.com/robfig/cron • cronϥΠϒϥϦʢStopͱStartͷ੍ޚ͸஫ҙʣ •

    github.com/kyokomi/go8docomo/docomo • docomoͷAPIϥΠϒϥϦʢࡶஊɺ஌ࣝQ&Aͱ͔ରԠʣ @k_yokomi,)2015/06/21)ʮGo)Conference)2015)summerʯ 16
  17. ͓ΘΓ @k_yokomi,)2015/06/21)ʮGo)Conference)2015)summerʯ 17