public channel を private group にした場合の落とし穴

# 前書き
エンジニアもすなる Qiita といふものを、私もしてみむとて、するなり。
という感じで、憧れの Qiita に初投稿です。

途中で出てくるコードは https://rubygems.org/gems/slack-api/ を使用して実行しています。

## Slack の部屋の種類

Slack には public channel と private channel があり、部屋を作成する際に選ぶことができます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/327835/7b06899a-68f0-01f3-6396-5d775bad966a.png)
作成した部屋を API から取得してみます。
public と private で取得方法が変わります。

public の場合は channels.list です。
https://api.slack.com/methods/channels.list

```json
{
    "ok": true,
    "channels": [
        {
            "id": "C0G9QF9GW",
            "name": "random",
            "is_channel": true,
            "created": 1449709280,
            "creator": "U0G9QF9C6",
            "is_archived": false,
            "is_general": false,
            "name_normalized": "random",
            "is_shared": false,
            "is_org_shared": false,
            "is_member": true,
            "is_private": false,
            "is_mpim": false,
            "members": [
                "U0G9QF9C6",
                "U0G9WFXNZ"
            ],
            "topic": {
                "value": "Other stuff",
                "creator": "U0G9QF9C6",
                "last_set": 1449709352
            },
            "purpose": {
                "value": "A place for non-work-related flimflam, faffing, hodge-podge or jibber-jabber you'd prefer to keep out of more focused work-related channels.",
                "creator": "",
                "last_set": 0
            },
            "previous_names": [],
            "num_members": 2
        }
    ]
}
```

private の場合は groups.list になります。(作成する時には private channel と表記してるクセに！)
https://api.slack.com/methods/groups.list

```json
{
    "ok": true,
    "groups": [
        {
            "id": "G024BE91L",
            "name": "secretplans",
            "created": 1360782804,
            "creator": "U024BE7LH",
            "is_archived": false,
            "members": [
                "U024BE7LH"
            ],
            "topic": {
                "value": "Secret plans on hold",
                "creator": "U024BE7LV",
                "last_set": 1369677212
            },
            "purpose": {
                "value": "Discuss secret plans that no-one else should know",
                "creator": "U024BE7LH",
                "last_set": 1360782804
            }
        }
    ]
}
```

id はどうやら、public channel の場合は `C` からスタートし、private group の場合は `G` からスタートするようですね。
(今回は関係ありませんが、 user id も `U` からスタートするようです)

# 本題
Slack には public channel を private group へと後から変更する機能があります。
さて、これにより変換されてしまったチャンネルの ID は果たして `C` スタートのままなのか、 `G` スタートに置き換えられるのか、試してみることにしました。

まずは slack のここから変更してみまして。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/327835/90444cd0-87a9-d70c-011f-a1081051f46d.png)

groups.list を叩いてみると

```ruby
Slack.client.groups_list
=> {"ok"=>true, "groups"=>[]}
```

？！！
private group 内に存在しません。


念の為 channel.list を見ても、存在していないようです。

```ruby
Slack.client.channels_list
=> {"ok"=>true,
 "channels"=>
  [{"id"=>"C2W9TBV8W",
    "name"=>"general",
...省略...
    "num_members"=>1},
   {"id"=>"C2W8A2RNF",
    "name"=>"random",
...省略...
    "num_members"=>1}]}
```

部屋の ID は URL からも調べることができるので、メッセージのリンクを取得して調べてみると、C スタートのようでした。

部屋の ID が分かれば他の API も叩けるので、いくつか試して見ました。


https://api.slack.com/methods/groups.info
見つからず

```ruby
Slack.client.groups_info(channel: "CEV6FGT6G")
=> {"ok"=>false, "error"=>"channel_not_found"}
```

https://api.slack.com/methods/groups.history
見つからず

```ruby
Slack.client.groups_history(channel: "CEV6FGT6G")
=> {"ok"=>false, "error"=>"channel_not_found"}
```

https://api.slack.com/methods/groups.archive
true で返ってきます、が、実際には archive されていません。(この記事内で一番ヤバい挙動)

```ruby
Slack.client.groups_archive(channel: "CEV6FGT6G")
=> {"ok"=>true}
```

https://api.slack.com/methods/groups.unarchive
archive されていない状態での unarchive では、 channel_not_found ではなく not_archived

```ruby
Slack.client.groups_unarchive(channel: "CEV6FGT6G")
=> {"ok"=>false, "error"=>"not_archived"}
```
archive された状態での unarchive では、 true で返ってきますが実際には unarchive されていません。

```ruby
Slack.client.groups_unarchive(channel: "CEV6FGT6G")
=> {"ok"=>true}
```

https://api.slack.com/methods/chat.postMessage
メッセージの投稿は普通に通りました。

```ruby
Slack.chat_postMessage(text: "test", channel: "CEV6FGT6G")
=> {"ok"=>true, "channel"=>"CEV6FGT6G", "ts"=>"1545028789.000600", "message"=>{"type"=>"message", "subtype"=>"bot_message", "text"=>"test", "ts"=>"1545028789.000600", "username"=>"Slack API Tester", "bot_id"=>"BEWCY01E3"}}
```

----

private 化したチャンネルを public に戻せば正常な状態に戻ってくれないかなと思ったのですが、残念ながら public => private は一方通行で戻せないようです (登録画面に注意書きもありました)
皆様もどうかお気を付け下さい。