mirror of
https://github.com/discourse/discourse.git
synced 2025-05-22 07:53:49 +08:00
FEATURE: Allow tutorials to declare prerequisite before it starts.
This commit is contained in:
@ -74,7 +74,7 @@ module DiscourseNarrativeBot
|
|||||||
action: :reply_to_topic_notification_level_changed
|
action: :reply_to_topic_notification_level_changed
|
||||||
},
|
},
|
||||||
reply: {
|
reply: {
|
||||||
next_state: :tutorial_notification_level,
|
next_state: :tutorial_change_topic_notification_level,
|
||||||
action: :missing_topic_notification_level_change
|
action: :missing_topic_notification_level_change
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -19,6 +19,21 @@ module DiscourseNarrativeBot
|
|||||||
|
|
||||||
begin
|
begin
|
||||||
opts = transition
|
opts = transition
|
||||||
|
|
||||||
|
loop do
|
||||||
|
next_state = opts[:next_state]
|
||||||
|
|
||||||
|
break if next_state == :end
|
||||||
|
|
||||||
|
next_opts = self.class::TRANSITION_TABLE.fetch(next_state)
|
||||||
|
prerequisite = next_opts[:prerequisite]
|
||||||
|
|
||||||
|
break if !prerequisite || instance_eval(&prerequisite)
|
||||||
|
|
||||||
|
[:next_state, :next_instructions].each do |key|
|
||||||
|
opts[key] = next_opts[key]
|
||||||
|
end
|
||||||
|
end
|
||||||
rescue InvalidTransitionError
|
rescue InvalidTransitionError
|
||||||
# For given input, no transition for current state
|
# For given input, no transition for current state
|
||||||
return
|
return
|
||||||
|
@ -38,6 +38,7 @@ module DiscourseNarrativeBot
|
|||||||
},
|
},
|
||||||
|
|
||||||
tutorial_emoji: {
|
tutorial_emoji: {
|
||||||
|
prerequisite: Proc.new { SiteSetting.enable_emoji },
|
||||||
next_state: :tutorial_mention,
|
next_state: :tutorial_mention,
|
||||||
next_instructions: Proc.new {
|
next_instructions: Proc.new {
|
||||||
I18n.t("#{I18N_KEY}.mention.instructions",
|
I18n.t("#{I18N_KEY}.mention.instructions",
|
||||||
|
@ -302,23 +302,47 @@ describe DiscourseNarrativeBot::NewUserNarrative do
|
|||||||
expect(narrative.get_data(user)[:state].to_sym).to eq(:tutorial_emoji)
|
expect(narrative.get_data(user)[:state].to_sym).to eq(:tutorial_emoji)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
|
||||||
|
|
||||||
it 'should create the right reply' do
|
describe 'when emoji is disabled' do
|
||||||
post.update!(raw: 'https://en.wikipedia.org/wiki/ROT13')
|
before do
|
||||||
|
SiteSetting.enable_emoji = false
|
||||||
|
end
|
||||||
|
|
||||||
narrative.expects(:enqueue_timeout_job).with(user)
|
it 'should create the right reply' do
|
||||||
narrative.input(:reply, user, post: post)
|
post.update!(raw: 'https://en.wikipedia.org/wiki/ROT13')
|
||||||
new_post = Post.last
|
|
||||||
|
|
||||||
expected_raw = <<~RAW
|
narrative.input(:reply, user, post: post)
|
||||||
#{I18n.t('discourse_narrative_bot.new_user_narrative.onebox.reply', base_uri: '')}
|
new_post = Post.last
|
||||||
|
|
||||||
#{I18n.t('discourse_narrative_bot.new_user_narrative.emoji.instructions', base_uri: '')}
|
expected_raw = <<~RAW
|
||||||
RAW
|
#{I18n.t('discourse_narrative_bot.new_user_narrative.onebox.reply', base_uri: '')}
|
||||||
|
|
||||||
expect(new_post.raw).to eq(expected_raw.chomp)
|
#{I18n.t('discourse_narrative_bot.new_user_narrative.mention.instructions',
|
||||||
expect(narrative.get_data(user)[:state].to_sym).to eq(:tutorial_emoji)
|
discobot_username: discobot_user.username, base_uri: ''
|
||||||
|
)}
|
||||||
|
RAW
|
||||||
|
|
||||||
|
expect(new_post.raw).to eq(expected_raw.chomp)
|
||||||
|
expect(narrative.get_data(user)[:state].to_sym).to eq(:tutorial_mention)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'should create the right reply' do
|
||||||
|
post.update!(raw: 'https://en.wikipedia.org/wiki/ROT13')
|
||||||
|
|
||||||
|
narrative.expects(:enqueue_timeout_job).with(user)
|
||||||
|
narrative.input(:reply, user, post: post)
|
||||||
|
new_post = Post.last
|
||||||
|
|
||||||
|
expected_raw = <<~RAW
|
||||||
|
#{I18n.t('discourse_narrative_bot.new_user_narrative.onebox.reply', base_uri: '')}
|
||||||
|
|
||||||
|
#{I18n.t('discourse_narrative_bot.new_user_narrative.emoji.instructions', base_uri: '')}
|
||||||
|
RAW
|
||||||
|
|
||||||
|
expect(new_post.raw).to eq(expected_raw.chomp)
|
||||||
|
expect(narrative.get_data(user)[:state].to_sym).to eq(:tutorial_emoji)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -585,25 +609,25 @@ describe DiscourseNarrativeBot::NewUserNarrative do
|
|||||||
expect(new_post.raw).to include("/forum/images")
|
expect(new_post.raw).to include("/forum/images")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
|
||||||
|
|
||||||
it 'should create the right reply' do
|
it 'should create the right reply' do
|
||||||
post.update!(
|
post.update!(
|
||||||
raw: '[quote="#{post.user}, post:#{post.post_number}, topic:#{topic.id}"]\n:monkey: :fries:\n[/quote]'
|
raw: '[quote="#{post.user}, post:#{post.post_number}, topic:#{topic.id}"]\n:monkey: :fries:\n[/quote]'
|
||||||
)
|
)
|
||||||
|
|
||||||
narrative.expects(:enqueue_timeout_job).with(user)
|
narrative.expects(:enqueue_timeout_job).with(user)
|
||||||
narrative.input(:reply, user, post: post)
|
narrative.input(:reply, user, post: post)
|
||||||
new_post = Post.last
|
new_post = Post.last
|
||||||
|
|
||||||
expected_raw = <<~RAW
|
expected_raw = <<~RAW
|
||||||
#{I18n.t('discourse_narrative_bot.new_user_narrative.quoting.reply', base_uri: '')}
|
#{I18n.t('discourse_narrative_bot.new_user_narrative.quoting.reply', base_uri: '')}
|
||||||
|
|
||||||
#{I18n.t('discourse_narrative_bot.new_user_narrative.images.instructions', base_uri: '')}
|
#{I18n.t('discourse_narrative_bot.new_user_narrative.images.instructions', base_uri: '')}
|
||||||
RAW
|
RAW
|
||||||
|
|
||||||
expect(new_post.raw).to eq(expected_raw.chomp)
|
expect(new_post.raw).to eq(expected_raw.chomp)
|
||||||
expect(narrative.get_data(user)[:state].to_sym).to eq(:tutorial_images)
|
expect(narrative.get_data(user)[:state].to_sym).to eq(:tutorial_images)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user