FazBrowse GitHub Viewer | Trending |
URL:
| Home
Tools: [Download Repo ZIP]   [Original HTTPS Page]

NMLibrary/cmd_line_bot: bot framework with some examples · GitHub

 
 

Latest commit

 

History

198 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

概要

主に discord を念頭に置いた bot framework.

frontend

ユーザーとのやりとりを取り扱う部分. 現状では discord を介するものと,terminal 上で完結するもの(test 用)がある. 例えば slack に対応させるのも容易なはず.

backend

bot の内部処理を行う部分. 現状では AtCoder バーチャルコンテストの AC 通知を行うものだけ. バチャコンそのものの開催ができる backend を開発中.

動作環境

  • OSは多分何でも大丈夫(Ubuntu上で開発)
  • python3.6 を推奨. 多分 3.7 でも動くはず. 3.5 では動作しない.

利用方法

botは

  • 各自でbot用のユーザーを作成する
  • botのプログラムは各自のPC上で動作する

という仕様となっているため,準備が少々面倒かも.

botユーザーの準備

  1. Discordデベロッパーページ でbot用のユーザーを作成する
  2. bot-tokenを取得(コピーしておく)
  3. botを自分のサーバーに追加する
  4. ~/.clb.d/config.yaml に以下の形のyamlデータを作成
discord:
    token: "上で取得したbot-token"
    servername: "あなたのサーバーの名前"

install python3 (and wkhtmltopdf)

Windows

  1. python3をインストールする. その際,デフォルトの設定のままインストールするのが望ましい(特にpipのインストールは必須). なお,async/awaitを使うために,バージョンは3.5以上が必要
  2. wkhtmltopdf から wkhtmltopdf をインストール.
    • これは入れなくても大半のコマンドは動作する.
    • インストール先は変えない方が望ましい. どうしても変えたいなら,ちゃんと PATH を通すこと.

Ubuntu

  1. sudo apt install python3 python3-pip wkhtmltopdf

install cmd_line_bot

setup.py があるディレクトリで

pip install .

を実行する.

  • ある程度新しいバージョンの 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.

設定項目一覧

`~/.clb.d/config.yaml`の例
discord:
    token: "上記参照"
    servername: "上記参照"
ipc_frontend:
    port: 12345

development

  • tutorial.md に簡単な tutorial が書いてあるので,参考にすると良いかも.
  • cmd_line_bot.svg に依存関係のグラフがある. (pydeps cmd_line_bot で生成した)

以下は古い情報です.

main.py

名前の通り.CmdLineBot, CLBFrontEnd, CLBBackEndの使い方はここを見ると良いかも.

cmd_line_bot.py

frontendとbackendの間のインターフェースを規定している.

  • CmdLineBot: bot本体
  • CLBFrontEnd: ユーザーとのインターフェースを与える.Abstract Classなので,継承して実装を与える必要がある. 主にdiscordを想定.テスト用に,通信を介さずlocalで完結するfrontendも用意するつもり.
  • CLBBackEnd: bot本体の処理を行う.こちらもAbstract Class.
  • CLBTask, CLBCmdLine: CLBFrontEndとCLBBackEndの間でデータのやりとりをするためのclass.

discord_frontend.py

discord用のCLBFrontEnd.

cmd_arg_backend.py

shellっぽい感じでbotを操作するCLBBackEnd. 実際の使い方についてはexample_backend.pyを見てほしい. コマンドラインのパースはparser.pyが担当.

trivial_ends.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

TODO

大事なやつ

  • 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 扱いになってしまう.
    • 例: ARC074D 3N Numbers
  • (新しい環境で)!dlする前に!showした際のエラーメッセージが不親切
    • FileNotFoundErrorがそのまま出てきてる
  • wkhtmltopdfがないときのエラーも不親切

About

bot framework with some examples

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages


Back | FazBrowse Home | New Git URL