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