aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorToshiaki Asai <toshi.alternative@gmail.com>2017-11-12 15:59:11 +0900
committerToshiaki Asai <toshi.alternative@gmail.com>2017-11-12 15:59:11 +0900
commit486e92b27bf8a79f73eac595b34c71a157fc58e9 (patch)
tree4b33e9f5d4f47ed8516c139452d16d3b55a12e46
parent01cebf42feec3b643bae22afd2b542600316a760 (diff)
downloadmikutter-486e92b27bf8a79f73eac595b34c71a157fc58e9.tar.gz
アカウント登録がない状態でも起動できるようにした
-rw-r--r--core/plugin/achievement/achievement.rb9
-rw-r--r--core/plugin/change_account/change_account.rb137
-rw-r--r--core/plugin/gtk/dialog_window.rb2
-rw-r--r--core/plugin/streaming/filter.rb1
-rw-r--r--core/plugin/twitter/builder.rb5
-rw-r--r--core/plugin/world/world.rb6
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_ に変更する。