File: guide.rb

package info (click to toggle)
mikutter 5.0.4%2Bdfsg1-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 9,700 kB
  • sloc: ruby: 21,307; sh: 181; makefile: 19
file content (158 lines) | stat: -rw-r--r-- 5,829 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
# -*- coding: utf-8 -*-

Plugin.create :guide do
  # 茶番オブジェクトを新しく作る
  def sequence
    # 茶番でしか使わないクラスなので、チュートリアル時だけロードする
    require_relative 'interactive'
    Plugin::Guide::Interactive.generate end

  @sequence = {}

  def defsequence(name, &content)
    @sequence[name] = content end

  def jump_seq(name)
    if defined? @sequence[name]
      store(:guide_sequence, name)
      if @sequence.has_key? name
        @sequence[name].call
      else
        @sequence[:first].call
      end end end

  def guide_start(ach)
    tab :guide, _('World ガイド') do
      set_icon Skin[:icon]
      timeline(:guide)
    end

    on_finish_guide do |world|
      ach.take!
    end

    seq = at(:guide_sequence)
    case seq
    when nil, :first
      jump_seq(:first)
    else
      sequence.
        say(_("前回の続きから説明するね")).
        next{ jump_seq(seq) }
    end
  end

  defsequence :first do
    sequence.say(_('おーい、こっちこっち。'))

    focus_observer = on_gui_child_activated do |i_pane, i_tab|
      i_tab != tab(:guide) and next
      detach(focus_observer)
      sequence.next { Thread.new { sleep 1 } }
        .prompt(_('そうそれ!'))
        .prompt(_('こんにちは。私はみくったーちゃん!チュートリアルしか出番がないマスコットキャラクターだよ!'))
        .prompt(_("あなたはmikutterは初めて?"),
                _('初めて(チュートリアルを見る)') => :guide_start,
                _('完全に理解してる(チュートリアルをスキップ)') => :skip).
        next &method(:jump_seq)
    end
  end

  defsequence :guide_start do
    world_dict, = Plugin.filtering(:world_setting_list, Hash.new)
    metaworlds = world_dict.values
    case metaworlds.size
    when 0
      sequence.
        prompt(_('さて、このmikutterには……World Pluginが入ってないね。')).
        prompt(_('(こんなことする人が初めてなわけがないし……。もしかして、からかわれてる?)'))
      # TODO
    when 1
      sequence.
        prompt(_('さて、「mikutter」っていうのはご存知の通り、%{world_name}クライアントだよ。') % {world_name: metaworlds.first.name}).
        prompt(_('だからまずは%{world_name}アカウントを登録しようね。') % {world_name: metaworlds.first.name}).
        next { jump_seq(:wizard) }
    when 2
      sequence.
        prompt(_('このmikutterには%{world_name1}と%{world_name2}のプラグインが入ってるね。') % {world_name1: metaworlds[0].name, world_name2: metaworlds[1].name}).
        next { jump_seq(:wizard) }
    else
      sequence.
        prompt(_('このmikutterには%{world_name1}と%{world_name2}と…結構プラグイン入ってるね。') % {world_name1: metaworlds[0].name, world_name2: metaworlds[1].name}).
        next { jump_seq(:wizard) }
    end
  end

  defsequence :wizard do
    world_dict, = Plugin.filtering(:world_setting_list, Hash.new)
    UserConfig[:postbox_visibility] = :always
    UserConfig[:world_shifter_visibility] = :always
    sequence.
      say(_('左上にある「+」みたいなマークをクリックして、「Worldを追加」を選んでね。'))
    world_wizard_open_observer = on_request_world_add do
      detach(world_wizard_open_observer)
      sequence.
        next{ Thread.new{ sleep 1 } }.
        say(
          world_dict.size == 1 ?
            _('%{world_name}アカウント追加ウィザードだよ。この画面はそのまま次に進んでね。') % {world_name: world_dict.values.first.name} :
            _('World追加ウィザードだよ。追加したいWorldを選んで、次に進んでね。')
        ).
        next{ Thread.new{ sleep 3 } }.
        say(_('そのあとは指示に従って認証情報とかを入れてね。私は見ないようにしておくから。')).next{
        world_created_observer = on_world_after_created do |world|
          detach(world_created_observer)
          jump_seq(:hello_world)
        end
      }.terminate("guide error")
    end
  end

  defsequence :hello_world do
    world = Plugin.collect(:worlds).first
    name =
      case
      when defined?(world.user.name)
        world.user.name
      when defined?(world.user_obj.name)
        world.user_obj.name
      end
    sequence.
      prompt(_('お疲れ様!登録できたよ。やっとmikutterを使えるね。')).
      prompt(_('私の出番はここまで。こんなふうに専用のタブであなたと会話するのはこれで最後。')).
      prompt(_('今後は、たまーにActivityにmikutterの便利な使い方を書いてあげるから、気づいたらやってみてね。')).
      prompt(name ?
               _('それじゃあ、またね。%{name}さん!') % {name: name} :
               _('それじゃあ、またね!')).
      next{ jump_seq :complete }
  end

  defsequence :skip do
    sequence.
      prompt(_('それじゃあ、またね。')).
      next{ jump_seq :complete }
  end

  defsequence :complete do
    Plugin.call(:finish_guide)
    sequence.
      prompt('(このタブは「閉じる」をクリックすると閉じることができます)',
          _('閉じる') => nil).
      next{
      tab(:guide).destroy
    }
  end

  defachievement(:tutorial,
                 description: _("mikutterのチュートリアルを見た"),
                 hint: _('← こんなアイコンのタブが右にあると思うので、クリックしてください'),
                 icon: Skin[:icon]
                ) do |ach|
    if Plugin.collect(:worlds).take(1).empty?
      guide_start(ach)
    else
      ach.take!
    end
  end
end