主に discord を念頭に置いた bot framework.
ユーザーとのやりとりを取り扱う部分.
現状では discord を介するものと,terminal 上で完結するもの(test 用)がある.
例えば slack に対応させるのも容易なはず.
bot の内部処理を行う部分.
現状では AtCoder バーチャルコンテストの AC 通知を行うものだけ.
バチャコンそのものの開催ができる backend を開発中.
- OSは多分何でも大丈夫(Ubuntu上で開発)
- python3.6 を推奨.
多分 3.7 でも動くはず. 3.5 では動作しない.
botは
- 各自でbot用のユーザーを作成する
- botのプログラムは各自のPC上で動作する
という仕様となっているため,準備が少々面倒かも.
- Discordデベロッパーページ
でbot用のユーザーを作成する
- bot-tokenを取得(コピーしておく)
- botを自分のサーバーに追加する
- ~/.clb.d/config.yaml に以下の形のyamlデータを作成
discord:
token: "上で取得したbot-token"
servername: "あなたのサーバーの名前"
install python3 (and wkhtmltopdf)
- python3をインストールする.
その際,デフォルトの設定のままインストールするのが望ましい(特にpipのインストールは必須).
なお,async/awaitを使うために,バージョンは3.5以上が必要
- wkhtmltopdf から wkhtmltopdf をインストール.
- これは入れなくても大半のコマンドは動作する.
- インストール先は変えない方が望ましい.
どうしても変えたいなら,ちゃんと PATH を通すこと.
- sudo apt install python3 python3-pip wkhtmltopdf
setup.py があるディレクトリで
を実行する.
- ある程度新しいバージョンの pip が必要なので,予め pip install -U pip しておく.
- 権限で怒られるなら sudo pip install . か pip install --user .
- python のバージョンが複数あったりする場合は python3.6 -m pip install . みたいな感じで.
- 以下の warning が出るかもしれないけど,気にしない
discord-py 0.16.12 has requirement aiohttp<1.1.0,>=1.0.0, but you'll have aiohttp 3.5.4 which is incompatible.
discord-py 0.16.12 has requirement websockets<4.0,>=3.1, but you'll have websockets 7.0 which is incompatible.
discord:
token: "上記参照"
servername: "上記参照"
ipc_frontend:
port: 12345
以下は古い情報です.
名前の通り.CmdLineBot, CLBFrontEnd, CLBBackEndの使い方はここを見ると良いかも.
frontendとbackendの間のインターフェースを規定している.
- CmdLineBot: bot本体
- CLBFrontEnd: ユーザーとのインターフェースを与える.Abstract Classなので,継承して実装を与える必要がある.
主にdiscordを想定.テスト用に,通信を介さずlocalで完結するfrontendも用意するつもり.
- CLBBackEnd: bot本体の処理を行う.こちらもAbstract Class.
- CLBTask, CLBCmdLine: CLBFrontEndとCLBBackEndの間でデータのやりとりをするためのclass.
discord用のCLBFrontEnd.
shellっぽい感じでbotを操作するCLBBackEnd.
実際の使い方についてはexample_backend.pyを見てほしい.
コマンドラインのパースはparser.pyが担当.
暫定的にテキトーに作っただけなので,多分そのうち消す.
- python3 (3.6 >= version >= 3.5)
- 一時 typing.Coroutine を使っていたので,3.6 以上のバージョンが必要だった
- Ubuntu 16.04にpython 3.6を(ソースからビルドして)インストールする際に,
make testでtest_urllib2netに失敗した.
これは,sudo apt install libssl-devすることで解決した.
参考: Import Error: No module named _ssl
- 3.7だとimport discord中に謎のSyntaxErrorが起きる
- 以下のpythonライブラリが必要.環境によってはsudoが必要(sudo -Hの方が良い場合も?)
- discord (python3 -m pip install -U discord.py)
(discord.py公式で-Uって書いてあったからつけてるけど,本当に必要?)
- pytypes, pyyaml, imgkit, pyquery, pygments
(python3 -m pip install pytypes pyyaml imgkit pyquery pygments)
- python3.7でも色々とアップデートすれば使えるっぽい
- python3 -m pip install -U git+https://github.com/Rapptz/discord.py websockets aiohttp pytypes
- CLBTaskにcmdlineを設定していない状態でsend()中にエラーが起きると,エラーを吐いてbotが死ぬ.
- botが死ぬのは絶対に避けたいから,whileループの中身全体をtry:で囲っておく?
- task.cmdlineは必須属性にする?その場合はデフォルトのcmdlineみたいのがあった方が良いかも?
- 少なくとも,task.cmdlineにNoneを代入するよりはCLBTask_None()みたいなのを代入した方が色々と良さそう?
- CLBDataが利用するファイルにて,衝突が起きないようにする
- 「ユーザー用の設定ファイル」(ReadOnly)と「botが利用する記録ファイル」を分ける
- singleton にする
- ファイルのロックとかの機構
- テスト用のフロントエンドへ機能追加
- authorを指定したり,DMに切り替えたりする機能
- !init したときにbackendがエラーを吐くのを修正
- initした際はバックエンドには渡さない方が良いかも?
- バックエンドに渡している場合は,「フロントエンドのinitコマンド」をバックエンドが認識している必要があって,
疎結合性に反する.
- そもそも!initは不要では?(servernameの設定もconfig.jsonで行うようにした)
- コマンドのエラーメッセージの調整
(ルートコマンドなのに「サブコマンド名が不正」と出る)
- jsonから読みとったデータを利用する際は,(特に実行時の)型チェックに気を使った方が良さそう.
→@typecheckedを利用する?
- isinstanceはなるべく排除し,@typecheckedを利用する.
- CmdLineBot.run()でsleep(10)してるの,もうちょっとどうにかならない?
- send_msg, send_dmあたりのコードの整理
- 複数のmsg,dmの並列送信
- CLBCmdで引数の個数を自動チェックする機構をつくる
- とりあえずできた
- せっかくだからget_usageにも反映させる (subcmdを取るかどうかも反映させる)
- AC 通知の際に,部分点のみの取得でも AC 扱いになってしまう.
- (新しい環境で)!dlする前に!showした際のエラーメッセージが不親切
- FileNotFoundErrorがそのまま出てきてる
- wkhtmltopdfがないときのエラーも不親切