discourse/plugins/poll/poll.rb

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