79 lines
1.8 KiB
Ruby
79 lines
1.8 KiB
Ruby
module ::PollPlugin
|
|
|
|
class Poll
|
|
def initialize(post)
|
|
@post = post
|
|
end
|
|
|
|
def is_poll?
|
|
if !@post.post_number.nil? and @post.post_number > 1
|
|
# Not a new post, and also not the first post.
|
|
return false
|
|
end
|
|
|
|
topic = @post.topic
|
|
|
|
# Topic is not set in a couple of cases in the Discourse test suite.
|
|
return false if topic.nil?
|
|
|
|
if @post.post_number.nil? and topic.highest_post_number > 0
|
|
# New post, but not the first post in the topic.
|
|
return false
|
|
end
|
|
|
|
topic.title =~ /^#{I18n.t('poll.prefix')}/i
|
|
end
|
|
|
|
def options
|
|
cooked = PrettyText.cook(@post.raw, topic_id: @post.topic_id)
|
|
parsed = Nokogiri::HTML(cooked)
|
|
poll_list = parsed.css(".poll-ui ul").first || parsed.css("ul").first
|
|
if poll_list
|
|
poll_list.css("li").map {|x| x.children.to_s.strip }.uniq
|
|
else
|
|
[]
|
|
end
|
|
end
|
|
|
|
def details
|
|
@details ||= ::PluginStore.get("poll", details_key)
|
|
end
|
|
|
|
def set_details!(new_details)
|
|
::PluginStore.set("poll", details_key, new_details)
|
|
@details = new_details
|
|
end
|
|
|
|
def get_vote(user)
|
|
user.nil? ? nil : ::PluginStore.get("poll", vote_key(user))
|
|
end
|
|
|
|
def set_vote!(user, option)
|
|
# Get the user's current vote.
|
|
vote = get_vote(user)
|
|
vote = nil unless details.keys.include? vote
|
|
|
|
new_details = details.dup
|
|
new_details[vote] -= 1 if vote
|
|
new_details[option] += 1
|
|
|
|
::PluginStore.set("poll", vote_key(user), option)
|
|
set_details! new_details
|
|
end
|
|
|
|
def serialize(user)
|
|
return nil if details.nil?
|
|
{options: details, selected: get_vote(user)}
|
|
end
|
|
|
|
private
|
|
def details_key
|
|
"poll_options_#{@post.id}"
|
|
end
|
|
|
|
def vote_key(user)
|
|
"poll_vote_#{@post.id}_#{user.id}"
|
|
end
|
|
end
|
|
end
|