diff options
author | Toshiaki Asai <toshi.alternative@gmail.com> | 2017-11-12 15:59:11 +0900 |
---|---|---|
committer | Toshiaki Asai <toshi.alternative@gmail.com> | 2017-11-12 15:59:11 +0900 |
commit | 486e92b27bf8a79f73eac595b34c71a157fc58e9 (patch) | |
tree | 4b33e9f5d4f47ed8516c139452d16d3b55a12e46 | |
parent | 01cebf42feec3b643bae22afd2b542600316a760 (diff) | |
download | mikutter-486e92b27bf8a79f73eac595b34c71a157fc58e9.tar.gz |
アカウント登録がない状態でも起動できるようにした
-rw-r--r-- | core/plugin/achievement/achievement.rb | 9 | ||||
-rw-r--r-- | core/plugin/change_account/change_account.rb | 137 | ||||
-rw-r--r-- | core/plugin/gtk/dialog_window.rb | 2 | ||||
-rw-r--r-- | core/plugin/streaming/filter.rb | 1 | ||||
-rw-r--r-- | core/plugin/twitter/builder.rb | 5 | ||||
-rw-r--r-- | core/plugin/world/world.rb | 6 |
6 files changed, 21 insertions, 139 deletions
diff --git a/core/plugin/achievement/achievement.rb b/core/plugin/achievement/achievement.rb index 54089c15..c6694e09 100644 --- a/core/plugin/achievement/achievement.rb +++ b/core/plugin/achievement/achievement.rb @@ -36,13 +36,16 @@ class Plugin::Achievement::Achievement self end # 依存してる実績の中で、解除されてない最初の一つを返す + # ==== Args + # [&filter] 実績フィルタ。この条件にマッチする実績の中から始めのものを返す # ==== Return # 見つかった実績(Plugin::Achievement::Achievement) # 依存している実績がなかった場合や、全て解除済みの場合は self を返す - def notachieved_parent + def notachieved_parent(&filter) + filter ||= ->_{true} unachievements = Plugin.filtering(:unachievements, {}).first if @options[:depends] - result = @options[:depends].map{ |slug| unachievements[slug] }.compact.first + result = @options[:depends].map{ |slug| unachievements[slug] }.compact.select(&filter).first if result result.notachieved_parent else @@ -159,7 +162,7 @@ Plugin.create :achievement do Delayer.new do unachievements = Plugin.filtering(:unachievements, {}).first.reject{ |k, v| v.hidden? } unless unachievements.empty? - not_achieved = unachievements.values.sample.notachieved_parent + not_achieved = unachievements.values.sample.notachieved_parent{|a|!a.hidden?} unless not_achieved.hidden? if Mopt.debug? activity :achievement, "#{not_achieved.hint}\n(slug: #{not_achieved.slug})" diff --git a/core/plugin/change_account/change_account.rb b/core/plugin/change_account/change_account.rb index b2242b1f..dfe0f8f2 100644 --- a/core/plugin/change_account/change_account.rb +++ b/core/plugin/change_account/change_account.rb @@ -102,140 +102,13 @@ Plugin.create :change_account do } end - ### 茶番 - - # 茶番オブジェクトを新しく作る - def sequence - # 茶番でしか使わないクラスなので、チュートリアル時だけロードする - require File.join(File.dirname(__FILE__), "interactive") - Plugin::ChangeAccount::Interactive.generate end - - @sequence = {} - - def defsequence(name, &content) - @sequence[name] = content end - - def jump_seq(name) - if defined? @sequence[name] - store(:tutorial_sequence, name) - if @sequence.has_key? name - @sequence[name].call - else - @sequence[:first].call - end end end - - def request_token(reset = false) - if !@request_token || reset - twitter = MikuTwitter.new - twitter.consumer_key = Environment::TWITTER_CONSUMER_KEY - twitter.consumer_secret = Environment::TWITTER_CONSUMER_SECRET - @request_token = twitter.request_oauth_token end - @request_token end - - defsequence :first do - sequence. - say(_('インストールお疲れ様!')). - say(_('はじめまして!私はマスコットキャラクターのみくったーちゃん。よろしくね。まずはTwitterアカウントを登録しようね。')). - next{ jump_seq :register_account } - end - - defsequence :register_account do - if not Service.to_a.empty? - jump_seq :achievement - next - end - - window = Plugin.filtering(:gui_get_gtk_widget, Plugin::GUI::Window.instance(:default)).first - shell = window.children.first.children.first.children[1] - eventbox = Gtk::EventBox.new - container = Gtk::HBox.new(false) - code_entry = Gtk::Entry.new - decide_button = Gtk::Button.new(_("確定")) - shell.add(eventbox. - add(container. - closeup(Gtk::Label.new(_("コードを入力→"))). - add(code_entry). - closeup(decide_button).center).show_all) - code_entry.ssc(:activate){ - decide_button.clicked if not decide_button.destroyed? - false } - decide_button.ssc(:clicked){ - eventbox.sensitive = false - Thread.new{ - access_token = request_token.get_access_token(oauth_token: request_token.token, - oauth_verifier: code_entry.text) - Service.add_service(access_token.token, access_token.secret) - }.next{ |service| - shell.remove(eventbox) - Thread.new{ - sleep 2 - sequence. - say(_('おっと。初めてアカウントを登録したから実績が解除されちゃったね。')).next{ jump_seq :achievement } } - }.trap{ |error| - error error - shell.remove(eventbox) - response = if error.is_a?(Net::HTTPResponse) - error - elsif error.is_a?(OAuth::Unauthorized) - error.request - end - if response - case response.code - when '401' - sequence.say(_("コードが間違ってるみたい。URLを再生成するから、もう一度アクセスしなおしてね。\n(%{code} %{message})") % {code: response.code, message: response.message}).next{ - jump_seq :register_account } - else - sequence.say(_("何かがおかしいよ。\n(%{code} %{message})") % {code: response.code, message: response.message}).next{ - jump_seq :register_account } - end - break - end - sequence.say(_("何かがおかしいよ。\n(%{error})") % {error: error.to_s}).next{ - jump_seq :register_account } - }.trap{ |error| - error error - } - false - } - sequence. - say(_("登録方法は、\n1. %{authorize_url} にアクセスする\n2. mikutterに登録したいTwitterアカウントでログイン\n3. 適当に進んでいって取得できる7桁のコードをこのウィンドウの一番上に入力\nだよ。") % {authorize_url: request_token(true).authorize_url}, nil) - end - - defsequence :achievement do - name = Service.primary.user_obj[:name] - sequence. - say(_('実績は、まだ %{name} さんが使ったことのない機能を、たまに教えてあげる機能だよ。') % {name: name}). - next{ jump_seq :final } - end - - defsequence :final do - sequence. - say(_('……ちょっと短いけど、今私が教えてあげることはこれくらいかな? Twitter をするために %{mikutter} をインストールしてくれたんだもんね。') % {mikutter: Environment::NAME}). - say(_('これから少しずつ使い方を教えてあげるからね。それじゃ、またねー。')). - next{ jump_seq :complete } - end - - achievement = nil - - defsequence :complete do - achievement.take! if achievement - end - defachievement(:tutorial, description: _("mikutterのチュートリアルを見た"), - hidden: true - ) do |ach| - seq = at(:tutorial_sequence) - if not(seq or Service.instances.empty?) + hint: 'Worldを登録してみよう(開発用超絶手抜き説明)' + ) do |ach| + on_world_create do |world| ach.take! - else - achievement = ach - request_token if Service.to_a.empty? - if seq - sequence. - say(_("前回の続きから説明するね")). - next{ jump_seq(seq) } - else - jump_seq(:first) end.terminate("error occurred!") end end + end + end end diff --git a/core/plugin/gtk/dialog_window.rb b/core/plugin/gtk/dialog_window.rb index b50af9c5..dcc10254 100644 --- a/core/plugin/gtk/dialog_window.rb +++ b/core/plugin/gtk/dialog_window.rb @@ -170,7 +170,7 @@ module Plugin::Gtk when STATE_INIT @fiber = Fiber.new do @result_of_proc = instance_eval(&@proc) - if @result_of_proc.is_a? Delayer::Deferred::Deferredable + if @result_of_proc.is_a? Delayer::Deferred::Deferredable::Awaitable @result_of_proc = await(@result_of_proc) end EXIT diff --git a/core/plugin/streaming/filter.rb b/core/plugin/streaming/filter.rb index 836405ff..4c3696ae 100644 --- a/core/plugin/streaming/filter.rb +++ b/core/plugin/streaming/filter.rb @@ -21,6 +21,7 @@ Plugin.create :streaming do def start service = Service.primary + return unless service @success_flag = false @fail = MikuTwitter::StreamingFailedActions.new("Filter Stream", self) Thread.new{ diff --git a/core/plugin/twitter/builder.rb b/core/plugin/twitter/builder.rb index 4090b120..a91870f7 100644 --- a/core/plugin/twitter/builder.rb +++ b/core/plugin/twitter/builder.rb @@ -26,8 +26,9 @@ module Plugin::Twitter def verify(verifier) Thread.new{ - access_token = request_token.get_access_token(oauth_token: request_token.token, - oauth_verifier: verifier) + request_token.get_access_token(oauth_token: request_token.token, + oauth_verifier: verifier) + }.next{|access_token| @twitter.a_token = access_token.token @twitter.a_secret = access_token.secret (@twitter/:account/:verify_credentials).user diff --git a/core/plugin/world/world.rb b/core/plugin/world/world.rb index 81e728f7..b03836dd 100644 --- a/core/plugin/world/world.rb +++ b/core/plugin/world/world.rb @@ -87,7 +87,11 @@ Plugin.create(:world) do # ==== Return # [Diva::Model] カレントアカウント def current_world - @current || self.current_world = worlds.first + if @current + @current + elsif worlds.first + self.current_world = worlds.first + end end # カレントアカウントを _new_ に変更する。 |