15
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

DiscordAdvent Calendar 2018

Day 12

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

Last updated at Posted at 2019-04-11

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の書き方との変更点をコメントアウトして表示します。

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に移行したい!という方へ

こちらに、asyncとrewriteの変更点が一覧になっています。こちらで書き直すか、もう1度作ってください。

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

15
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?