VimでSlackをしよう

こんにちは。
Qiitaへの投稿がめちゃくちゃ久しぶりなひがしです。

この記事は[Vim Advent Calendar 2019](https://qiita.com/advent-calendar/2019/vim)の10日目の記事です。

# VimでSlack
本題です
この記事ではVimでSlackをしていきたいと思います
ちなみに私はVimでSlackをするためのプラグインとして
https://github.com/higashi000/sarahck.vim
を作っています
良ければ使ってみてください

# どうやってやるのか
## 必要なもの編
上記のsarahck.vimでは、
- Slack Legacy token
- Slack API
- [vim-jp/vital.vim](https://github.com/vim-jp/vital.vim)
を使っています。
この記事では上記の3つに加え、mattnさんが作成されている、[webapi-vim](https://github.com/mattn/webapi-vim)を使っていきます。
tokenは他人に知られるとアカウントを乗っ取られてしまうので注意して使ってください

## vital.vimの下準備
これから紹介するvital.vimを使ったサンプルではvitalizeがすでにされている前提で話が進んでいます。
というわけでvitalizeの手順を説明しておきます。
まずVimを起動して以下のコマンドを実行します。

```
:Vitalize --name=作成しているプラグイン名 . +Web.HTTP +Web.JSON
```

終わりです。
サンプルコードの`higashi000`の部分を`作成しているプラグイン名`に置き換えてください。
こちらの記事ではvital.vimのWeb.HTTPとWeb.JSONを主に使用します。

## チャンネルリストを取得しよう
チャンネルを取得する際は[channels.list](https://slack.com/api/channels.list
)を使用します
tokenをつけてHTTP Requestsを送ると全チャンネルのリストが取得できます。

sample(vital.vim)

```vimscript
let token = 'トークン'
let s:V = vital#higashi000#new()
let s:H = s:V.import('Web.HTTP')
let s:J = s:V.import('Web.JSON')

let slackRes = s:H.get('https://slack.com/api/channels.list', {'token': token})

let res = s:J.decode(slackRes.content)

if res.ok != 1
  return
endif

execute ":redir!>" . "channel.txt"
  for i in res.channels
    :silent! echon i.name . "\n"
    :silent! echon i.id . "\n"
    :silent! echon "\n"
  endfor
:redir END
```

sample(webapi-vim)

```vimscript
let token = 'トークン'

let slackRes = webapi#http#get('https://slack.com/api/channels.list', {'token': token})

let res = webapi#json#decode(slackRes.content)

if res.ok != 1
  return
endif

execute ":redir!>" . "channel.txt"
  for i in res.channels
    :silent! echon i.name . "\n"
    :silent! echon i.id . "\n"
    :silent! echon "\n"
  endfor
:redir END
```

今後のチャンネルを指定するパラメータはここで入手したidを使用します
nameではないです

## Slackにメッセージを送信してみよう
メッセージを送信する際には[chat.postMessage](https://api.slack.com/methods/chat.postMessage)というAPIを使います。

このAPIは要素としてtoken、channel ID、textが必須で、更にas_userをtrueにしないと自分ではなく、Slack API Testerが喋ってしまいます
sample(vital.vim)

```vimscript
let channelID = '投稿したいchannelのID'
let text = '投稿したい内容'
let token = 'token'
let s:V = vital#higashi000#new()
let s:H = s:V.import('Web.HTTP')
let s:J = s:V.import('Web.JSON')

let slackRes = s:H.post('https://slack.com/api/chat.postMessage',
    \ {'token': token,
    \ 'channel': channelID,
    \ 'text': text,
    \ 'as_user': 'true'})

let res = s:J.decode(slackRes.content)

if res.ok == 1
  echo 'complete'
else
  echo 'failure'
endif
```

sample(webapi-vim)

```vimscript
let channelID = '投稿したいchannelのID'
let text = '投稿したい内容'
let token = 'token'

let slackRes = webapi#http#post('https://slack.com/api/chat.postMessage',
    \ {'token': token,
    \ 'channel': channelID,
    \ 'text': text,
    \ 'as_user': 'true'})

let res = webapi#json#decode(slackRes.content)

if res.ok == 1
  echo 'complete'
else
  echo 'failure'
endif
```

ほとんど変わりませんがどちらでもメッセージの送信ができます、優勝

## Slackのメッセージを確認しよう
メッセージを確認するなら[channels.history](https://api.slack.com/methods/channels.history)を使います
APIのオプションにtoken、channelをつけてrequestsを送るとメッセージが取れます。

sample(vital.vim)

```vimscript
let token = 'トークン'
let channelID = '対象チャンネルID'

let s:V = vital#sarahck#new()
let s:H = s:V.import('Web.HTTP')
let s:J = s:V.import('Web.JSON')

let historyAPI = 'https://slack.com/api/channels.history'
let slackRes = s:H.get(historyAPI, {'token': token, 'channel': channelID})
let res = s:J.decode(slackRes.content)

execute ":redir!>" . "channelHistory.txt"
  for i in res.messages
    :silent! echon i.text . "\n"
  endfor
:redir END
```

sample(webapi-vim)

```vimscript
let token = 'トークン'
let channelID = '対象チャンネルID'
let historyAPI = 'https://slack.com/api/channels.history'

let slackRes = webapi#http#get(historyAPI, {'token': token, 'channel': channelID})
let res = webapi#json#decode(slackRes.content)

execute ":redir!>" . "channelHistory.txt"
  for i in res.messages
    :silent! echon i.text . "\n"
  endfor
:redir END
```

## まとめ
vital.vimやwebapi-vimを使えば簡単にHTTP Requestsを送ることができるようになり、Slack APIが使えるようになります。
開発者の方にこの場を借りてお礼を申し上げます。
ありがとうございます

いつかはvital.vimやwebapi-vimの開発に携われるようになりたいと思います。

ここまで読んでくださりありがとうございました。