Discord.pyのrewrite版が正式にリリースされました

# discord.pyのrewrite版（新公式版）とasync版（旧公式版）の違いとは？

## そもそもrewrite版とは？
2019/04/09に公式に公開された、discord.py(discord apiのpython版wrapper)のブランチ名です。
今までdiscord.pyにはasync版と呼ばれる旧公式版がありました。しかしasync版には、様々な問題点がありました。
それを克服し、使いやすく書き換えたものがrewrite版です。

### async版の問題点
- `python3.7`以降で名前関係のエラーが発生し、使用できなくなる
- カテゴリーの操作ができない
- Webhook非対応

などの不備がありました。
### rewrite版の利点
なんでv1.0?
- ドキュメントすげえ
- いつでもContextが渡されるよ
- ctxのショートカット
- WebSocketの再接続はきっちり
- モデルベースのOOP
- サブコマンドは親を実行させないようにできるよ
- 非同期のチェックとイベント
- 大文字小文字気にしないコマンド名対応
- NSFWチャンネルか確認
- カテゴリチャンネル
- GIFアニメ絵文字対応
- 鯖の管理ログ
- `Webhook`
- `Activity`の改善
- メモリとパフォーマンス改善
- 生のイベントや関数
- `Python 3.7`
- ジャンプ・リンク
- `Guild.get_role`
- 新しいコンバータ(`Union Optional Greedy`)
- 新しいCogの新しいメソッド、Cog名とCog側属性の設定

などです。
(apple502j さんによる翻訳)

# rewriteのbotの書き方
基本的にはasync版と同じですが、たくさんの変更点があります。asyncの書き方との変更点をコメントアウトして表示します。

```python
import discord
import asyncio


client = discord.Client()


def convert_times(time_strings):
    """
    1d, 5hなどを秒に変換
    :param time_strings: 秒、時間などの文字列のリスト
    :return: int
    """
    result = 0
    for time in time_strings:
        if 'd' in time:
            # 日 1dなどだった場合
            result += int(time.replace('d', '')) * 86400
        elif 'h' in time:
            # 時 1hなどだった場合
            result += int(time.replace('h', '')) * 3600
        elif 'm' in time:
            # 分 1mなどだった場合
            result += int(time.replace('m', '')) * 60
        elif 's' in time:
            # 秒 1sなどだった場合
            result += int(time.replace('s', ''))
        else:
            # それ以外
            return False
    return result


@client.event
async def on_ready():
    print('---')
    print(client.user.id)
    print(client.user.name)
    print('---')


@client.event
async def on_message(message):
    if message.content == '山':
        # client.send_message(message.channel, '川')
        await message.channel.send('川')
    elif message.content == '!reply':
        # !reply
        # client.send_message(message.channel, '言って欲しい言葉を言ってください。')
        await message.channel.send('言って欲しい言葉を言ってください。')

        def check(m):
            return m.author == message.author

        # wait_message = await client.wait_for_message(author=message.author)
        wait_message = await client.wait_for('message', check=check)
        # await client.send_message(message.channel, wait_message.content.replace('@', '＠'))
        await message.channel.send(wait_message.content.replace('@', '＠'))
    elif message.content == '!remind':
        # !remind [hours, days, minutes], [メッセージ]
        #
        all_time_string, content = message.content.split(',')[0], message.content.split(',')[1]
        time_strings = all_time_string.split()
        del time_strings[0]
        result = convert_times(time_strings)
        if not result:  
            # await client.send_message(message.channel, "時間指定がうまくなされていないか、0分になっています。")
            await message.channel.send("時間指定がうまくなされていないか、0分になっています。")
            return
        # await client.send_message(message.channel, '了解しました。{}後にDMで{}とおしらせします。'.format(all_time_string, content))
        await message.channel.send('了解しました。{}後にDMで{}とおしらせします。'.format(all_time_string, content))
        await asyncio.sleep(result)
        # await client.send_message(message.author, content)
        await message.author.send(content)

client.run("トークン")
```

# これからbotを作ってみたい！という方へ
discord.py公式に、日本語チャンネルがあります。こちらは製作者さん（Dannyさん）も答えてくださることがあります。
 https://discord.gg/nXzj3dg

python.jpの公式ギルドです。こちらにはdiscordbotの作成に関する質問チャンネルがあります。
https://www.python.jp/pages/pythonjp_discord.html

日本のdiscord.py 非公式です。
https://discord.gg/KPp2Wsu 

# いまasync版を使っていて、rewriteに移行したい！という方へ

[こちら](https://discordpy.readthedocs.io/ja/latest/migrating.html)に、asyncとrewriteの変更点が一覧になっています。こちらで書き直すか、もう１度作ってください。

# rewriteの記事・動画一覧（随時更新）
こちらにはrewrite版について書かれた記事や動画のリンクを載せておきます。随時更新なので新しい記事を書いた方や動画を投稿した方、見つけた方はコメントをお願いいたします。

**discord.pyのasync/rewriteとは何なのか**
1ntegrale9さんによる、asyncとrewiteの違いについてとてもわかりやすくまとめられた記事です。
https://qiita.com/1ntegrale9/items/f4c47a6a69ecf23fc5db

**discord.py(v1/rewrite) を pipenv で利用する**
こちらも1ntegrale9さんによる、pipenvでdiscord.pyを利用したい場合のチュートリアルです。
https://qiita.com/1ntegrale9/items/7917ff81165e0161b4af

**PythonでDiscordのボットサンプルを作成（rewrite版）**
Karafさんによるrewrite版のサンプルコードです。botの登録の仕方なども詳しく載っています。
https://qiita.com/Karaf/items/f1032ef9806a10ba161e

**discord.pyのBot Commands Frameworkを用いたBot開発**
discordに標準で入っている、commandsフレームワークのとてもわかりやすい説明です。
https://qiita.com/Episword/items/81f1430d9cd57fbd82fb

# rewriteをネットでコードを見て勉強する際の注意点
今はasync版を使って作成された記事・ブログが多く存在しており、そのようなサイトを参照してしまうと動かなくなってしまいます。
async版は`send_message`などが多用されているので、見分けることをお勧めします。

# あとがき
rewriteはasyncに比べてわかりやすく書かれています。皆さんもこの機会にdiscord.pyを使ってみませんか。
Dannyさんお疲れ様でした。これからも頑張ってください。応援しています。

sizumita