Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
PTriviaBot - TriviaBot.rb

TriviaBot.rb

Caricato da: Piero Tofy
Scarica il programma completo

  1. # Triviabot class. This object implements the Trivia functionalities of a bot
  2.  
  3. require './Bot'
  4.  
  5.  
  6. module PTriviaBot
  7.  
  8. class TriviaBot < Bot
  9.   def initialize(name, questionsFile, scoreFile, adminpassword, secsbetweenquestions, secstoanswer)
  10.     super(name, adminpassword)
  11.  
  12.     @questionsFile = questionsFile
  13.     @scoreFile = scoreFile
  14.  
  15.     # Init quiz engine
  16.     @quizengine = QuizEngine.new(@questionsFile,@scoreFile,self,secsbetweenquestions,secstoanswer)
  17.  
  18.     # Verification queue
  19.     @verificationqueue = {}
  20.   end
  21.  
  22.   def privatemessagereceived(sender, msg)
  23.     super(sender, msg)
  24.     if msg == "START"
  25.       if @users[sender].is_admin
  26.         @quizengine.startquiz
  27.       else
  28.         @sock.sendnotice(sender, t(:access_denied))
  29.       end
  30.     end
  31.  
  32.     if msg == "STOP"
  33.       if @users[sender].is_admin
  34.         @quizengine.stopquiz
  35.       else
  36.         @sock.sendnotice(sender, t(:access_denied))
  37.       end
  38.     end
  39.  
  40.     if msg == "STATS"
  41.       if @quizengine.scores.has_key?(sender)
  42.         score = @quizengine.scores[sender]
  43.        
  44.         # Calculate rank
  45.         scores = []
  46.         @quizengine.scores.each_pair do |nick, s|
  47.           scores.push(s)
  48.         end
  49.  
  50.         scores = scores.sort {|x,y| y <=> x } # Decreasing
  51.         rank = scores.index(score) + 1
  52.        
  53.         total = @quizengine.scores.length
  54.  
  55.         @sock.sendnotice(sender, t(:your_current_score_is, score))
  56.         @sock.sendnotice(sender, t(:your_rank_is_out_of,rank,total))
  57.       else
  58.         @sock.sendnotice(sender, t(:theres_no_record_available_for_user,sender))
  59.       end
  60.     end
  61.  
  62.  
  63.     if msg == "HELP"
  64.       @sock.sendnotice(sender, t(:name_is_a_triviabot_and_supports_the_following_commands,@name))
  65.       @sock.sendnotice(sender, "  ")
  66.       @sock.sendnotice(sender, "<b>!question</b> " + t(:give_a_single_trivia_question_to_the_users))
  67.       @sock.sendnotice(sender, "  ")
  68.       @sock.sendnotice(sender, "<b>/msg #{@name} <u>"+t(:command)+"</u></b>")
  69.       @sock.sendnotice(sender, "STATS " + t(:retrieves_your_current_score_statistics))
  70.       @sock.sendnotice(sender, "AUTH " + t(:password_authenticate_to_acquire_administrative_privileges))
  71.       @sock.sendnotice(sender, "START " + t(:begin_a_new_round_of_quizzes))
  72.       @sock.sendnotice(sender, "STOP " + t(:terminate_the_current_round_of_quizzes))
  73.     end
  74.   end
  75.  
  76.   def channelmessagereceived(sender, msg)
  77.     super(sender, msg)
  78.  
  79.     # Single question requested?
  80.     if msg.upcase == "!QUESTION"
  81.       @quizengine.askquestion
  82.     end
  83.   end
  84.  
  85.   def parseincomingmessage(incoming)
  86.     super(incoming)
  87.  
  88.     #Answer message?
  89.     if result = /:([^!]+)![^ ]+ PRIVMSG #{@channel} :([A-Za-z])[\s]*$/.match(incoming)
  90.       sender = result[1]
  91.       answer = result[2].chomp.upcase
  92.       puts t(:answer_message_from,sender,answer)
  93.  
  94.       if @quizengine.quizrunning
  95.         if @users.has_key?(sender) and @users[sender].registered
  96.           # We can answer it!
  97.           @quizengine.giveanswer(sender, answer)
  98.           puts t(:valid_user_recording_answer,sender)
  99.         else
  100.  
  101.           # Do we already have the user in the verification queue?
  102.           if !@verificationqueue.has_key?(sender)
  103.             puts t(:invalid_user_discarding_querying_nickserv_again_and_sending_notice,sender)
  104.  
  105.             # Add to verification queue the answer
  106.             @verificationqueue[sender] = answer
  107.  
  108.             @sock.sendnotice(sender, t(:you_must_register_to_nickserv_before_you_can_answer_a_question))
  109.             @sock.sendnotice(sender, "<b>/msg NickServ REGISTER " + t(:password_email) + "</b>")
  110.             @sock.sendnotice(sender, "<b>/msg NickServ IDENTIFY " + t(:password) + "</b>")
  111.           else
  112.             puts t(:answered_but_were_waiting_for_him_to_authenticate,sender)
  113.             @sock.retrieveuserinfo(sender)
  114.             @verificationqueue[sender] = answer
  115.           end
  116.  
  117.         end
  118.       end
  119.     end
  120.   end
  121.  
  122.   def userregistered(nick)
  123.     super(nick)
  124.  
  125.     # Do we have the user waiting in the verification queue?
  126.     if @quizengine.quizrunning and @verificationqueue.has_key?(nick)
  127.       puts t(:registered_add_his_previous_answer, nick)
  128.       @quizengine.giveanswer(nick, @verificationqueue[nick])
  129.       @verificationqueue.delete(nick)
  130.     end
  131.   end
  132.  
  133.   # Delegate methods for the Quiz Engine
  134.   def sendmessagetoall(message)
  135.     @sock.sendmessage(@channel,message)
  136.   end
  137. end
  138. end