ログイン
編集不可のページディスカッション情報添付ファイル
kurubushi/mikutter_oauth

MMA

mikutterでOAuthをとりかえよう。

mikutterプラグインを書いてみようってやつ。

準備。

mikutter generate ctrloauth
mikutter spec $HOME/.mikutter/plugin/ctrloauth/

これで、プラグインのテンプレートとかが、$HOME/.mikutter/plugin/ctrloauthにできまする。

ノリ

とりあえず、使うのは、Serviceクラスです。
/opt/mikutter/core/service.rbに定義があります。
Service.primaryでインスタンスを取得して、postメソッドなどでついーとできるようです。
それっぽいメソッドがないかや、どういうデータを保存しているのかなどは、ドキュメントをみたり文献を調べるより、
ここを見たほうが速い!

ところで、OAuthですが、mikutterの場合、ConsumerKeyとConsumerSecretは、なんとハードコーディングされています。
(バカには見えないというコメントアウトが書かれていた……。)
AccessTokenについては、バイナリ化されて保存されているっぽくてよくわからないので、
Serviceクラスから貰いうけるメソッドをつくりましょう。
設定タブは、ほかのプラグインやコードを見て、まねてみましょう。Gtk::HBoxに打ち込んでいくっぽいです。

コード

Rubyは、ノリでちょちょっとコード書くときにはいいかんじっぽいですね。
ちなみに、クラスの判定として、strict制約みたいなのを関数定義内に書くこともできるぽいです。(mikutterのコードではよくやられていました。)
ちょちょっと書くわけじゃなくなったら、こいういうのが大切っぽい。

# -*- coding: utf-8 -*-

Plugin.create(:ctrloauth) do

class Service
  def get_oauth
    [@twitter.consumer_key,
     @twitter.consumer_secret,
     @twitter.a_token,
     @twitter.a_secret]
  end

  def set_oauth(oauth)
    @twitter.consumer_key = oauth[0]
    @twitter.consumer_secret = oauth[1]
    @twitter.a_token = oauth[2]
    @twitter.a_secret = oauth[3]
  end
end

def readOAuth(filepath)
  open(filepath).map{|line| line.strip}
end

service = Service.primary
defaultOAuth = service.get_oauth
myclientOAuth = readOAuth(Dir::pwd+"/plugin/ctrloauth/myclient.oauth")

settings _("OAuth") do
  hbox = Gtk::HBox.new
  bD = Gtk::Button.new("default")
  bD.signal_connect("clicked"){service.set_oauth(defaultOAuth)}
  hbox.pack_start(bD)
  bMy = Gtk::Button.new("myclient")
  bMy.signal_connect("clicked"){service.set_oauth(myclientOAuth)}
  hbox.pack_start(bMy)
  pack_start(hbox)
end

end

Rubyはくわしくないのですが、どうも、class Hoge(定義ずみクラス)で定義済みのクラスを拡張できるっぽいのです。
モンキーパッチと言われる技法だそうで、ちょっとあぶない。。。(このmoduleをrequireしたmoduleにも伝染していく……。)
ので、範囲を指定するRefなんちゃらかんちゃらもあるようですが、あんまり使われていないっぽい。
まあ、しょせんおもちゃプラグインなので、手軽にやってしまえ……。
(class ExtendService < Serviceしてもいいけど、primaryメソッドとかの書き換えがめんどい)

get_oauthメソッドを定義して、デフォルトのmikutterのOAuthを掃き出させ、これをdefaultOAuthとして保存しておきます。
また、$HOME/.mikutter/plugin/ctrloauth/myclient.oauthに、ConsumerKey,ConsumerSecret,AccessToken,AccessSecretの順に1行ずつ書き溜めておくとし、これをreadOAuth関数で読みにいき、set_oauthメソッドでセットしましょう。

じつは、set_token_secretメソッド(だっけな?)とかいうAccessTokenを貼り替えるメソッドはもともとあるのですが、
さすがに、ConsumerKeyまでは替えられなかったのじゃ……。

あとは、設定画面で、OAuthタブから、切り替えられるっぽいです!

ところで、なんで、

settings _("OAuth") do
  hbox = Gtk::HBox.new
  hbox.pack_start(Gtk::Button.new("default")
    .signal_connect("clicked"){service.set_oauth(defaultOAuth)})
  hbox.pack_start(Gtk::Button.new("myclient")
    .signal_connect("clicked"){service.set_oauth(myclientOAuth)})
  pack_start(hbox)

すると死ぬのかわからない……。signal_connectメソッドの返り値はselfじゃないのか……??

まとめ。

電気通信大学 からとか、
情報基盤センター から みたいなおあそびツイートができるように!

kurubushi/mikutter_oauth (最終更新日時 2016-03-02 17:59:37 更新者 kurubushi)