Git Product home page Git Product logo

mikutter_slack's Introduction

mikutter_slack

Slack for mikutter

これなん

mikutter で Slack が使えてしまうやつ(を目指してます)

インストール方法

  1. 以下のコマンドをターミナルで実行してください。

    $ mkdir -p ~/.mikutter/plugin
    $ cd ~/.mikutter/plugin
    $ git clone https://github.com/Na0ki/mikutter_slack.git slack
    
  2. Gemに依存しているので、mikutterのディレクトリにいき、以下のコマンドを実行してください。

    $ bundle install
    
  3. mikutterを再起動してください。

認証

  • 認証の方法(OAuth)
    1. mikutterの設定を開き、アカウント情報設定を開きます。
    2. 追加ボタンを押し、アカウント追加ウィザードを開始します。
    3. Worldの選択でSlackを選択し、OKを押します。
    4. ブラウザが開くので、認証するチームを選択の上、アクセスの許可をしてください。
    5. 認証が成功すると、ブラウザのタブを閉じmikutterに戻るよう指示するページが表示されます。
      指示に従いmikutterに戻って下さい。
    6. ウィザードを閉じ、引き続き抽出タブの設定に進んでください。

使い方

  1. 設定から「抽出タブ」を選択し、追加をクリックしてください。
  2. 適当な名前を入れ、「OK」をクリックしてください。
  3. 作った抽出タブを選択し、「編集」をクリックしてください。
  4. データソースの「slack」にチェックを入れ、閉じてください。
  5. 設定からslackの認証設定をしたらmikutterを再起動して完了です。

開発に関するWiki

そんなものなかった

システム要件

要件を満たしているなら動くとは言っていない
推奨バージョンはmikutterのgitリポジトリのtopic/981-worldブランチです。
topic/981-worldブランチ以外では動作しません。
mikutterのgitリポジトリURLはこちら -> git://toshia.dip.jp/mikutter.git

最低要件

name version
mikutter topic/981-worldブランチ
ruby 2.3.0

推奨要件

name version
mikutter topic/981-worldブランチ
ruby 2.4.1

ライセンス

このプラグインは MIT LICENSE によって浄化されています。

mikutter_slack's People

Contributors

katsyoshi avatar na0ki avatar rinsuki avatar toshia avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

mikutter_slack's Issues

Slackのライブラリを新たに探す

現在は slack-api を使っているが、2015年末からほとんどプルリクエストのマージなどがされていない。
最近コミットがあるように見えるが、いずれもライブラリが使用しているモジュールのアップデートやCIの修正にとどまっている。
以上の観点から、ライブラリの変更が必要であると考える。

新しくライブラリを探すにあたり、ひとまず以下のような要件を定めたい。

  • Slackの基本的なAPIをほぼサポートしていること
  • ライブラリの開発が活発かつドキュメントがそれなりにある
  • 単一ライブラリでEvent API及びRTM APIをサポートしてる必要はないが、単一で行えるのが好ましい

自分でAPIを直接叩くといったことはメンテナンスコストが非常に重くなるため避けたい。
また既存のslack-apiをフォークしてプルリクエストなどをチェリーピックするといったことも同様の理由で行わない。
さらに、複数のライブラリでEvent API及びRTM APIを実現する場合、ライブラリ間の整合性を保つのが面倒かもしれないといった理由でなるべくひとつになっていてほしい。(これはあくまでできれば程度の話)

achievementの扱いを考える

実績解除のために、 achievementプラグインを利用している。
しかしachievementプラグインがguiに依存しているため、今後も利用していくかを考える必要がある。
現在guiに依存しているコードはコレのみで、それがなければslackプラグイン単体での実行も可能になる。

extract_receive_messageを追加したら落ちるようになった

これ を追加したところ、落ちるようになった。
extract.rbmessage.retweet_sourcemethod not defined となる。
該当箇所

とりあえずよくわからなかったので、ここに書いた。

ログ

/Users/ahiru/mikutter/core/plugin/extract/extract.rb:314:in `block in append_message': undefined method `retweet_source' for "#<Mikutter::System::Message:0x007f96c2a529f8>":String
     from /Users/ahiru/mikutter/core/plugin/extract/extract.rb:314:in `map'
     from /Users/ahiru/mikutter/core/plugin/extract/extract.rb:314:in `append_message'
     from /Users/ahiru/mikutter/core/plugin/extract/extract.rb:207:in `block (2 levels) in <top (required)>'
     from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pluggaloid-1.1.1/lib/pluggaloid/listener.rb:25:in `call'
     from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pluggaloid-1.1.1/lib/pluggaloid/event.rb:97:in `block (2 levels) in call_all_listeners'
     from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pluggaloid-1.1.1/lib/pluggaloid/event.rb:96:in `each'
     from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pluggaloid-1.1.1/lib/pluggaloid/event.rb:96:in `block in call_all_listeners'
     from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pluggaloid-1.1.1/lib/pluggaloid/event.rb:95:in `catch'
     from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pluggaloid-1.1.1/lib/pluggaloid/event.rb:95:in `call_all_listeners'
     from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pluggaloid-1.1.1/lib/pluggaloid/event.rb:39:in `block in call'
     from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/delayer-0.0.2/lib/delayer/procedure.rb:24:in `run'
     from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/delayer-0.0.2/lib/delayer/extend.rb:58:in `run_once'
     from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/delayer-0.0.2/lib/delayer/extend.rb:30:in `run'
     from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/delayer-0.0.2/lib/delayer.rb:43:in `method_missing'
     from /Users/ahiru/mikutter/core/plugin/gtk/delayer.rb:10:in `block in boot'
     from /Users/ahiru/mikutter/core/plugin/gtk/mainloop.rb:10:in `main'
     from /Users/ahiru/mikutter/core/plugin/gtk/mainloop.rb:10:in `mainloop'
     from mikutter.rb:63:in `boot!'
     from mikutter.rb:92:in `<main>'
notice: mikutter.rb:69:in `rescue in boot!': catch exception `SystemExit'
notice: mikutter.rb:71:in `rescue in boot!': => `SystemExit'
notice: mikutter.rb:96:in `rescue in <main>': catch SystemExit
notice: mikutter.rb:80:in `error_handling!': catch NoMethodError
notice: {MIKUTTER_DIR}/core/configloader.rb:32:in `block in <module:ConfigLoader>': configloader: wrote 2 keys (UserConfig::extract_tabs, UserConfig::ui_tab_order)
/Users/ahiru/mikutter/core/plugin/extract/extract.rb:314:in `map': undefined method `retweet_source' for "#<Mikutter::System::Message:0x007f96c2a529f8>":String (NoMethodError)
    from /Users/ahiru/mikutter/core/plugin/extract/extract.rb:314:in `append_message'
    from /Users/ahiru/mikutter/core/plugin/extract/extract.rb:207:in `block (2 levels) in <top (required)>'
    from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pluggaloid-1.1.1/lib/pluggaloid/listener.rb:25:in `call'
    from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pluggaloid-1.1.1/lib/pluggaloid/event.rb:97:in `block (2 levels) in call_all_listeners'
    from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pluggaloid-1.1.1/lib/pluggaloid/event.rb:96:in `each'
    from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pluggaloid-1.1.1/lib/pluggaloid/event.rb:96:in `block in call_all_listeners'
    from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pluggaloid-1.1.1/lib/pluggaloid/event.rb:95:in `catch'
    from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pluggaloid-1.1.1/lib/pluggaloid/event.rb:95:in `call_all_listeners'
    from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pluggaloid-1.1.1/lib/pluggaloid/event.rb:39:in `block in call'
    from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/delayer-0.0.2/lib/delayer/procedure.rb:24:in `run'
    from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/delayer-0.0.2/lib/delayer/extend.rb:58:in `run_once'
    from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/delayer-0.0.2/lib/delayer/extend.rb:30:in `run'
    from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/delayer-0.0.2/lib/delayer.rb:43:in `method_missing'
    from /Users/ahiru/mikutter/core/plugin/gtk/delayer.rb:10:in `block in boot'
    from /Users/ahiru/mikutter/core/plugin/gtk/mainloop.rb:10:in `main'
    from /Users/ahiru/mikutter/core/plugin/gtk/mainloop.rb:10:in `mainloop'
    from mikutter.rb:63:in `boot!'
    from mikutter.rb:92:in `<main>'

記述が汚い

ここここTime.at(Float(data['ts']).to_i) がもう少し綺麗にできないか

data['ts'] は unixtime を浮動小数点付きで返すため、整数に丸めて Time 型にしている

display_requirementを入れていない状態でメッセージの投稿時間を押すと落ちる

タイトルの通り。
これは詳しく追ってないが、slack_guiの実装が足りていないか、それ以外の要因の可能性もある。

/Users/ahiru/mikutter/source/core/plugin/display_requirements/display_requirements.rb:182:in `clicked': undefined method `id' for #<Plugin::Slack::Message:0x007fbd206d24c0>
         from /Users/ahiru/mikutter/source/core/mui/cairo_cell_renderer_message.rb:160:in `block in event_hooks'
         from /Users/ahiru/mikutter/source/core/mui/gtk_extension.rb:33:in `block in safety_signal_connect'
         from /Users/ahiru/mikutter/source/core/mui/cairo_cell_renderer_message.rb:97:in `signal_emit'
         from /Users/ahiru/mikutter/source/core/mui/cairo_cell_renderer_message.rb:97:in `block in tree='
         from /Users/ahiru/mikutter/source/core/mui/gtk_extension.rb:33:in `block in safety_signal_connect'
         from /Users/ahiru/mikutter/source/core/plugin/gtk/mainloop.rb:10:in `main'
         from /Users/ahiru/mikutter/source/core/plugin/gtk/mainloop.rb:10:in `mainloop'
         from /Users/ahiru/mikutter/source/mikutter.rb:66:in `boot!'
         from /Users/ahiru/mikutter/source/mikutter.rb:95:in `<main>'

接続通知をActivityによって行う

今はSystem Messageで接続通知を行っているが、Activityプラグインと連携して、各種通知をActivityにまとめよう

(pull-req送ります)

接続切断時の動作

Slackとのコネクションが切断された後に、再接続するように実装されていないので要実装

MessageEntityの正規表現を厳密にする

@here @ahiru #mikutter_slack といった投稿をすると表示がおかしくなる。
これは正規表現のマッチングがゆるいため起こっているため、よりマッチする範囲を小さくする必要がある。
具体的にはおそらく <> 部分がかなり適当にしてしまっているので、その辺を改善すればよさそう。

OAuthを通した数だけヒストリが反映される

OAuthを行なった回数だけ、ヒストリの取得が行われてしまう。
これ自体は問題ないように見えるが、同じアカウントで複数回認証すると回数分だけヒストリが表示されてしまう。
これを解消する必要がある。
2017-01-08 15 21 49

mikutterを最新のdevelopにしたらプラグインが正常に動かなくなった

develop: d1871d236540afa40b4b9ba4204d9c5cd468199f
mikutter_slack: e80b232

下記にログを載せる(個人情報が入っていたので全てhogeに置換)
そのうち追う

warning: {MIKUTTER_DIR}/core/lib/retriever/model.rb:378:in `rescue in block in validate': #<Plugin::Slack::User:0x007fb06d565548 @value={:id=>"hoge", :team_id=>"hoge", :name=>"hoge", :deleted=>false, :status=>nil, :color=>"e7392d", :real_name=>"hoge", :tz=>"Asia/Tokyo", :tz_label=>"Japan Standard Time", :tz_offset=>32400, :profile=>{:first_name=>"hoge", :last_name=>"hoge", :avatar_hash=>"g74476e142a7", :real_name=>"Ouchi Akira", :real_name_normalized=>"hoge", :email=>"hoge", :image_24=>"hoge", :image_32=>"hoge", :image_48=>"hoge", :image_72=>"hoge", :image_192=>"hoge", :image_512=>"hoge"}, :is_admin=>false, :is_owner=>false, :is_primary_owner=>false, :is_restricted=>false, :is_ultra_restricted=>false, :is_bot=>false}, @path="/hoge", @_memoized_hash=-3039374064944316451> is not int
from {MIKUTTER_DIR}/core/lib/retriever/model.rb:380:in `rescue in block in validate'
from {MIKUTTER_DIR}/core/lib/retriever/model.rb:374:in `block in validate'
from {MIKUTTER_DIR}/core/lib/retriever/model.rb:372:in `each'
from {MIKUTTER_DIR}/core/lib/retriever/model.rb:372:in `validate'
from {MIKUTTER_DIR}/core/lib/retriever/model.rb:270:in `initialize'
from /Users/ahiru/.mikutter/plugin/slack/api.rb:75:in `new'
from /Users/ahiru/.mikutter/plugin/slack/api.rb:75:in `block (2 levels) in channel_history'
from /Users/ahiru/.mikutter/plugin/slack/api.rb:74:in `map'
from /Users/ahiru/.mikutter/plugin/slack/api.rb:74:in `block in channel_history'
from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/delayer-deferred-1.0.4/lib/delayer/deferred/deferredable.rb:77:in `_execute'
from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/delayer-deferred-1.0.4/lib/delayer/deferred/deferredable.rb:60:in `block (2 levels) in _call'
from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/delayer-deferred-1.0.4/lib/delayer/deferred/deferredable.rb:59:in `catch'
from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/delayer-deferred-1.0.4/lib/delayer/deferred/deferredable.rb:59:in `block in _call'
from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/delayer-deferred-1.0.4/lib/delayer/deferred/deferredable.rb:58:in `catch'
from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/delayer-deferred-1.0.4/lib/delayer/deferred/deferredable.rb:58:in `_call'
from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/delayer-deferred-1.0.4/lib/delayer/deferred/deferredable.rb:25:in `call'
from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/delayer-deferred-1.0.4/lib/delayer/deferred/deferredable.rb:63:in `block (3 levels) in _call'
from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/delayer-deferred-1.0.4/lib/delayer/deferred/deferredable.rb:77:in `_execute'
from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/delayer-deferred-1.0.4/lib/delayer/deferred/deferredable.rb:60:in `block (2 levels) in _call'
from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/delayer-deferred-1.0.4/lib/delayer/deferred/deferredable.rb:59:in `catch'
from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/delayer-deferred-1.0.4/lib/delayer/deferred/deferredable.rb:59:in `block in _call'
from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/delayer-deferred-1.0.4/lib/delayer/deferred/deferredable.rb:58:in `catch'
from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/delayer-deferred-1.0.4/lib/delayer/deferred/deferredable.rb:58:in `_call'
from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/delayer-deferred-1.0.4/lib/delayer/deferred/deferredable.rb:25:in `call'
from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/delayer-deferred-1.0.4/lib/delayer/deferred/deferredable.rb:84:in `_post'
from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/delayer-deferred-1.0.4/lib/delayer/deferred/deferredable.rb:14:in `next'
from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/delayer-deferred-1.0.4/lib/delayer/deferred/deferredable.rb:62:in `block (2 levels) in _call'
from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/delayer-deferred-1.0.4/lib/delayer/deferred/deferredable.rb:59:in `catch'
from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/delayer-deferred-1.0.4/lib/delayer/deferred/deferredable.rb:59:in `block in _call'
from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/delayer-deferred-1.0.4/lib/delayer/deferred/deferredable.rb:58:in `catch'
from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/delayer-deferred-1.0.4/lib/delayer/deferred/deferredable.rb:58:in `_call'
from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/delayer-deferred-1.0.4/lib/delayer/deferred/deferredable.rb:25:in `call'
from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/delayer-deferred-1.0.4/lib/delayer/deferred/deferredable.rb:68:in `block (3 levels) in _call'
from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/delayer-0.0.2/lib/delayer/procedure.rb:24:in `run'
from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/delayer-0.0.2/lib/delayer/extend.rb:58:in `run_once'
from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/delayer-0.0.2/lib/delayer/extend.rb:30:in `run'
from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/delayer-0.0.2/lib/delayer.rb:43:in `method_missing'
from {MIKUTTER_DIR}/core/plugin/gtk/delayer.rb:10:in `block in boot'
from {MIKUTTER_DIR}/core/plugin/gtk/mainloop.rb:10:in `main'
from {MIKUTTER_DIR}/core/plugin/gtk/mainloop.rb:10:in `mainloop'
from {MIKUTTER_DIR}/mikutter.rb:63:in `boot!'
from {MIKUTTER_DIR}/mikutter.rb:92:in `<main>'

ヒストリの取得に失敗する

ヒストリ一覧取得が失敗する
処理追えばいけそうだけど、しばらく手をつけられない。
この辺が怪しそう -> implHistory

from /Users/ahiru/.mikutter/plugin/mikutter_slack/slack_api.rb:47:in `[]'
from /Users/ahiru/.mikutter/plugin/mikutter_slack/slack_api.rb:47:in `channel_history'
from /Users/ahiru/.mikutter/plugin/mikutter_slack/mikutter_slack.rb:37:in `block (3 levels) in <top (required)>'
from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/delayer-deferred-1.0.4/lib/delayer/deferred/deferredable.rb:77:in `_execute'
from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/delayer-deferred-1.0.4/lib/delayer/deferred/deferredable.rb:60:in `block (2 levels) in _call'
from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/delayer-deferred-1.0.4/lib/delayer/deferred/deferredable.rb:59:in `catch'
from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/delayer-deferred-1.0.4/lib/delayer/deferred/deferredable.rb:59:in `block in _call'
from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/delayer-deferred-1.0.4/lib/delayer/deferred/deferredable.rb:58:in `catch'
from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/delayer-deferred-1.0.4/lib/delayer/deferred/deferredable.rb:58:in `_call'
from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/delayer-deferred-1.0.4/lib/delayer/deferred/deferredable.rb:25:in `call'
from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/delayer-deferred-1.0.4/lib/delayer/deferred/deferredable.rb:68:in `block (3 levels) in _call'
from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/delayer-0.0.2/lib/delayer/procedure.rb:24:in `run'
from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/delayer-0.0.2/lib/delayer/extend.rb:58:in `run_once'
from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/delayer-0.0.2/lib/delayer/extend.rb:30:in `run'
from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/delayer-0.0.2/lib/delayer.rb:43:in `method_missing'
from {MIKUTTER_DIR}/core/plugin/gtk/delayer.rb:10:in `block in boot'
from {MIKUTTER_DIR}/core/plugin/gtk/mainloop.rb:10:in `main'
from {MIKUTTER_DIR}/core/plugin/gtk/mainloop.rb:10:in `mainloop'
from mikutter.rb:63:in `boot!'
from mikutter.rb:92:in `<main>'
notice: {MIKUTTER_DIR}/core/configloader.rb:32:in `block in <module:ConfigLoader>': configloader: wrote 3 keys (Plugin::saved_search_last_saved_search_state, UserConfig::extract_tabs, UserConfig::ui_tab_order)

Realtime APIの受信を別のところで行う

mikutter_slack.rbで、 RTM , EVENTS という定数をトップレベル定義していて衝突の危険性がある。Plugin::Slackに定義して衝突を回避したほうが良い。

でもRTMを使っている部分を見ると、Pluginのインスタンスを特に利用している様子がなく、無理にPluginブロックの中に書く必要はない。将来的に複数のSlackチームをサポートしたいということだし、それも視野に入れてそういうクラスを作ったほうが良さそう。 slack_api.rb とかにそういう機能を持たせるのが自然なんだろうか

Plugin slugを slack に変更してはどうか

今はmikutter_slackというPlugin slugだが、単に「slack」としたら良いと思う。

リポジトリ名は「mikutter_」prefixをつけているとmikutterプラグインだということが分かって意味があるが(これを禁止すると、例えばsystemdと連携する変なプラグインを書いた場合、systemdという超凶悪な名前のリポジトリができる)、Plugin slugはmikutterの中でプラグイン同士を識別するものなので、もうmikutterプラグインであることはわかっている。だから「mikutter_」というprefixを付ける意味は薄い。

ちなみに俺が過去に送ったpull-reqで、Plugin::Slack というmoduleを作ったが、これは申し訳ないことに間違っていて、slugをCamelCaseにしたものにしなきゃいけないので Plugin::MikutterSlack にしなければいけない。slugを「slack」にすれば、moduleの名前は変更しなくてよい。

当然これをやると、現在このプラグインを使っている人はディレクトリ名をリネームする必要があるが、だからこそ変更するなら今のうちだと思う。
そうする場合、今後利用しようとするユーザのために、適切なディレクトリ名でcloneするためのコマンドをREADMEに書いておくと親切。

png画像が画像ビュアーでひらけない

外部ブラウザでは正常に見えるが、画像ビュアーで見ようとすると以下のエラーを吐いて落ちる

/Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/gobject-introspection-3.1.0/lib/gobject-introspection/loader.rb:519:in `invoke': 認識できない画像ファイルの形式
         from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/gobject-introspection-3.1.0/lib/gobject-introspection/loader.rb:519:in `block in define_method'
         from /Users/ahiru/mikutter/source/core/plugin/openimg/openimg.rb:53:in `block (4 levels) in <top (required)>'
         from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/delayer-0.0.2/lib/delayer/procedure.rb:24:in `run'
         from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/delayer-0.0.2/lib/delayer/extend.rb:58:in `run_once'
         from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/delayer-0.0.2/lib/delayer/extend.rb:30:in `run'
         from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/delayer-0.0.2/lib/delayer.rb:43:in `method_missing'
         from /Users/ahiru/mikutter/source/core/plugin/gtk/delayer.rb:10:in `block in boot'
         from /Users/ahiru/mikutter/source/core/plugin/gtk/mainloop.rb:10:in `main'
         from /Users/ahiru/mikutter/source/core/plugin/gtk/mainloop.rb:10:in `mainloop'
         from mikutter.rb:65:in `boot!'
         from mikutter.rb:94:in `<main>'

mikutter起動時にチャンネル履歴取得出来ていない?

環境

  • mikutter_slack ac544bb
  • mikutter : develop (01a1d0d5b04e26a30c5aede548649d49adfe4614)
  • 抽出タブでデータソースにslack指定、現状選択出来る全チャンネルを選択済み

現象

mikutter起動時に過去のslackの会話が表示されず、新規のもの(mikutter起動中にslackに投稿されたもの)は表示される

--debug した時に出てきたそれっぽいログ

notice: /Users/whywaita/.mikutter/plugin/slack/slack.rb:24:in `block (3 levels) in <top (required)>':
        ===== 認証成功 =====
        チーム: whywaita
        ユーザー: whywaita
error: /Users/whywaita/.mikutter/plugin/slack/slack.rb:53:in `block (4 levels) in <top (required)>': undefined method `[]' for nil:NilClass
from /Users/whywaita/.mikutter/plugin/slack/api.rb:60:in `block in channel_history'
from {MIKUTTER_DIR}/vendor/bundle/ruby/2.3.0/gems/delayer-deferred-1.0.4/lib/delayer/deferred/thread.rb:28:in `block (3 levels) in _deferredable_trap_proc'
from {MIKUTTER_DIR}/vendor/bundle/ruby/2.3.0/gems/delayer-deferred-1.0.4/lib/delayer/deferred/thread.rb:26:in `catch'
from {MIKUTTER_DIR}/vendor/bundle/ruby/2.3.0/gems/delayer-deferred-1.0.4/lib/delayer/deferred/thread.rb:26:in `block (2 levels) in _deferredable_trap_proc'
from {MIKUTTER_DIR}/vendor/bundle/ruby/2.3.0/gems/delayer-deferred-1.0.4/lib/delayer/deferred/thread.rb:25:in `catch'
from {MIKUTTER_DIR}/vendor/bundle/ruby/2.3.0/gems/delayer-deferred-1.0.4/lib/delayer/deferred/thread.rb:25:in `block in _deferredable_trap_proc'

複数のデータソースの登録に失敗している

implDS で試しに実装してみたが、うまく動いていない模様。
設定画面の抽出タブの編集を押すと下記エラーを吐いて落ちる

/Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pluggaloid-1.1.1/lib/pluggaloid/filter.rb:29:in `filtering': undefined method `size' for #<#<Class:0x007fc8d1ebf450>: 70250276342520 stat:nil value:nil>
     from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pluggaloid-1.1.1/lib/pluggaloid/event.rb:59:in `block (2 levels) in filtering'
     from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pluggaloid-1.1.1/lib/pluggaloid/event.rb:58:in `each'
     from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pluggaloid-1.1.1/lib/pluggaloid/event.rb:58:in `reduce'
     from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pluggaloid-1.1.1/lib/pluggaloid/event.rb:58:in `block in filtering'
     from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pluggaloid-1.1.1/lib/pluggaloid/event.rb:57:in `catch'
     from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pluggaloid-1.1.1/lib/pluggaloid/event.rb:57:in `filtering'
     from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pluggaloid-1.1.1/lib/pluggaloid/plugin.rb:63:in `filtering'
     from /Users/ahiru/mikutter/source/core/plugin/extract/edit_window.rb:83:in `source_widget'
     from /Users/ahiru/mikutter/source/core/plugin/extract/edit_window.rb:16:in `initialize'
     from /Users/ahiru/mikutter/source/core/plugin/extract/extract.rb:187:in `new'
     from /Users/ahiru/mikutter/source/core/plugin/extract/extract.rb:187:in `block (2 levels) in <top (required)>'
     from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pluggaloid-1.1.1/lib/pluggaloid/listener.rb:25:in `call'
     from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pluggaloid-1.1.1/lib/pluggaloid/event.rb:97:in `block (2 levels) in call_all_listeners'
     from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pluggaloid-1.1.1/lib/pluggaloid/event.rb:96:in `each'
     from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pluggaloid-1.1.1/lib/pluggaloid/event.rb:96:in `block in call_all_listeners'
     from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pluggaloid-1.1.1/lib/pluggaloid/event.rb:95:in `catch'
     from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pluggaloid-1.1.1/lib/pluggaloid/event.rb:95:in `call_all_listeners'
     from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pluggaloid-1.1.1/lib/pluggaloid/event.rb:39:in `block in call'
     from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/delayer-0.0.2/lib/delayer/procedure.rb:24:in `run'
     from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/delayer-0.0.2/lib/delayer/extend.rb:58:in `run_once'
     from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/delayer-0.0.2/lib/delayer/extend.rb:30:in `run'
     from /Users/ahiru/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/delayer-0.0.2/lib/delayer.rb:43:in `method_missing'
     from /Users/ahiru/mikutter/source/core/plugin/gtk/delayer.rb:10:in `block in boot'
     from /Users/ahiru/mikutter/source/core/plugin/gtk/mainloop.rb:10:in `main'
     from /Users/ahiru/mikutter/source/core/plugin/gtk/mainloop.rb:10:in `mainloop'
     from mikutter.rb:63:in `boot!'
     from mikutter.rb:92:in `<main>'
notice: mikutter.rb:69:in `rescue in boot!': catch exception `SystemExit'
notice: mikutter.rb:71:in `rescue in boot!': => `SystemExit'
notice: mikutter.rb:96:in `rescue in <main>': catch SystemExit
notice: mikutter.rb:80:in `error_handling!': catch NoMethodError

ユーザー名が error(ユーザーID) になる

2017-01-23 11 25 01

上記の画像のように、ユーザが何らかの行動をした際のログが error(ユーザーIDっぽいもの) のように表示されてしまう

  • join/left
  • ファイルアップロード

で確認

今後の予定

mikutter_slackの短期〜中期的目標を備忘録的に書いていきます. (順不同)

  • omniauth-slackを用いたOAuth認証にする (なんか他にいいのあれば教えてください)
    WebRickとHTTPClientで実装しました
  • mikutterにSlack専用のタブを作る
  • 任意の一つのチャンネルを上記タブに表示する機能を作る
  • Emoji対応 (APIレファレンス)
  • 認証用やチャンネルの指定のためにmikutterの設定画面に設定項目を作成する

まずはこんな感じを予定してます.
以上.

Privateなチャンネルの発言が取得出来てない

  • 自分のアカウントでOAuth認証済み
  • 自分が参加しているプライベートなチャンネルの発言が取得出来てない
  • 公式のクライアントからだと見られるチャンネル
  • そもそもデータソースとして(プライベートチャンネルが)出てきてない?

Plugin#defined_time を使う

現在、プラグインのロード時のタイムスタンプを取っているが

@defined_time = Time.new.freeze

実は Plugin#defined_time というメソッドが、そのプラグインをロードした時刻(Time)を返すようになっているので、それを使うと、上のような行は消せる

channelとgroupをまとめる親クラスを作る

現状、channelとgroupのコードはほぼ同じであるため、コードの再利用ができるようにしたい。
また、親クラスによってchannelとgroupをまとめたリストを取得できるようになると、実装が色々捗りそう

認証時に田代砲を打っている

ログを添付するが、認証時にユーザー一覧取得を何回もリクエストしている。
そのため、起動時に毎回 please relax とSlackになだめられるといった問題が発生してしまっている。
/Users/ahiru/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/slack-api-1.3.0/lib/slack/request.rb の10行目に以下のコードを書いて確認して見た。

p "request, #{path}, #{options}"

tashiro.txt

botの投稿に対応

botはユーザー一覧で取得できないようなので、現状bot(カスタムインテグレーション)の投稿は以下のエラーにより表示されない

warning: {MIKUTTER_DIR}/core/lib/retriever/model.rb:375:in `rescue in block in validate': {:channel=>"mikutter_slack", :user=>nil, :text=>"", :created=>2016-10-07 09:17:19 +0900, :team=>"mikutter"}
error: /Users/ahiru/.mikutter/plugin/slack/slack.rb:53:in `block (4 levels) in <top (required)>': it is required value[nil, User, true]
in nil of user

これの影響範囲としては、今の実装だとnilユーザーが来た場合にその先のヒストリの取得が止まってしまうこと

slackの画像展開

slackの添付画像は、画像のURLっぽいくせに実際にはHTMLになってるので、mikutterのイメージビューアで開くとエラーになる。
twitpicとかd250g2.comとかと同じように、一種の画像サービスとしてslackの画像URLを登録してやれば、イメージビューアで開くことができるようになる

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.