# Triviabot class. This object implements the Trivia functionalities of a bot
require './Bot'
module PTriviaBot
class TriviaBot < Bot
def initialize(name, questionsFile, scoreFile, adminpassword, secsbetweenquestions, secstoanswer)
super(name, adminpassword)
@questionsFile = questionsFile
@scoreFile = scoreFile
# Init quiz engine
@quizengine = QuizEngine.new(@questionsFile,@scoreFile,self,secsbetweenquestions,secstoanswer)
# Verification queue
@verificationqueue = {}
end
def privatemessagereceived(sender, msg)
super(sender, msg)
if msg == "START"
if @users[sender].is_admin
@quizengine.startquiz
else
@sock.sendnotice(sender, t(:access_denied))
end
end
if msg == "STOP"
if @users[sender].is_admin
@quizengine.stopquiz
else
@sock.sendnotice(sender, t(:access_denied))
end
end
if msg == "STATS"
if @quizengine.scores.has_key?(sender)
score = @quizengine.scores[sender]
# Calculate rank
scores = []
@quizengine.scores.each_pair do |nick, s|
scores.push(s)
end
scores = scores.sort {|x,y| y <=> x } # Decreasing
rank = scores.index(score) + 1
total = @quizengine.scores.length
@sock.sendnotice(sender, t(:your_current_score_is, score))
@sock.sendnotice(sender, t(:your_rank_is_out_of,rank,total))
else
@sock.sendnotice(sender, t(:theres_no_record_available_for_user,sender))
end
end
if msg == "HELP"
@sock.sendnotice(sender, t(:name_is_a_triviabot_and_supports_the_following_commands,@name))
@sock.sendnotice(sender, " ")
@sock.sendnotice(sender, "<b>!question</b> " + t(:give_a_single_trivia_question_to_the_users))
@sock.sendnotice(sender, " ")
@sock.sendnotice(sender, "<b>/msg #{@name} <u>"+t(:command)+"</u></b>")
@sock.sendnotice(sender, "STATS " + t(:retrieves_your_current_score_statistics))
@sock.sendnotice(sender, "AUTH " + t(:password_authenticate_to_acquire_administrative_privileges))
@sock.sendnotice(sender, "START " + t(:begin_a_new_round_of_quizzes))
@sock.sendnotice(sender, "STOP " + t(:terminate_the_current_round_of_quizzes))
end
end
def channelmessagereceived(sender, msg)
super(sender, msg)
# Single question requested?
if msg.upcase == "!QUESTION"
@quizengine.askquestion
end
end
def parseincomingmessage(incoming)
super(incoming)
#Answer message?
if result = /:([^!]+)![^ ]+ PRIVMSG #{@channel} :([A-Za-z])[\s]*$/.match(incoming)
sender = result[1]
answer = result[2].chomp.upcase
puts t(:answer_message_from,sender,answer)
if @quizengine.quizrunning
if @users.has_key?(sender) and @users[sender].registered
# We can answer it!
@quizengine.giveanswer(sender, answer)
puts t(:valid_user_recording_answer,sender)
else
# Do we already have the user in the verification queue?
if !@verificationqueue.has_key?(sender)
puts t(:invalid_user_discarding_querying_nickserv_again_and_sending_notice,sender)
# Add to verification queue the answer
@verificationqueue[sender] = answer
@sock.sendnotice(sender, t(:you_must_register_to_nickserv_before_you_can_answer_a_question))
@sock.sendnotice(sender, "<b>/msg NickServ REGISTER " + t(:password_email) + "</b>")
@sock.sendnotice(sender, "<b>/msg NickServ IDENTIFY " + t(:password) + "</b>")
else
puts t(:answered_but_were_waiting_for_him_to_authenticate,sender)
@sock.retrieveuserinfo(sender)
@verificationqueue[sender] = answer
end
end
end
end
end
def userregistered(nick)
super(nick)
# Do we have the user waiting in the verification queue?
if @quizengine.quizrunning and @verificationqueue.has_key?(nick)
puts t(:registered_add_his_previous_answer, nick)
@quizengine.giveanswer(nick, @verificationqueue[nick])
@verificationqueue.delete(nick)
end
end
# Delegate methods for the Quiz Engine
def sendmessagetoall(message)
@sock.sendmessage(@channel,message)
end
end
end