hubot-trivia-game-french
Version:
French translation of the original hubot-trivia-game from Michael Yin
177 lines (158 loc) • 6.22 kB
text/coffeescript
# Description:
# Play trivia! Doesn't include questions. Questions should be in the following JSON format:
# {
# "answer": "Pizza",
# "category": "FOOD",
# "question": "Crust, sauce, and toppings!",
# "value": "$400"
# },
#
# Dependencies:
# cheerio - for questions with hyperlinks
#
# Configuration:
# None
#
# Commands:
# !trivia - ask a question
# !skip - skip the current question
# !answer <answer> or !a <answer> - provide an answer
# !hint or !h - take a hint
# !score <player> - check the score of the player
# !scores or !score all - check the score of all players
# !reset - reset score of every player
#
# Author:
# yincrash - edited by LucasAdam
Fs = require 'fs'
Path = require 'path'
Cheerio = require 'cheerio'
class Game
= null
= null
= null
constructor: () ->
buffer = Fs.readFileSync(Path.resolve('./res', 'questions.json'))
= JSON.parse buffer
.logger.debug "Initiated trivia game script."
= 0
askQuestion: (resp) ->
unless # set current question
index = Math.floor(Math.random() * .length)
= [index]
= 1
.logger.debug "La réponse est #{@currentQ.answer}"
# remove optional portions of answer that are in parens
.validAnswer = .answer.replace /\(.*\)/, ""
$question = Cheerio.load ("<span>" + .question + "</span>")
link = $question('a').attr('href')
text = $question('span').text()
resp.send "Pour #{@currentQ.value} dans la catégorie #{@currentQ.category}:\n" +
"*#{text}*" +
if link then " #{link}" else ""
skipQuestion: (resp) ->
if
today = new Date
timeToWait = + 120000
if today.getTime() > timeToWait
resp.send "La réponse était #{@currentQ.answer}."
= null
= null
= today.getTime()
(resp)
else
remainingTime = today.getTime() -
remainingTime = remainingTime / 1000
remainingTime = 120 - remainingTime
resp.send "Cherche encore, la commande !skip sera de nouveau disponible dans #{remainingTime.toFixed(0)} secondes :seriouslygay:"
else
resp.send "Il n'y a pas de question en cours!"
answerQuestion: (resp, guess) ->
if
if /^[0-9]*$/gm.test(.validAnswer)
checkGuess = guess.replace /&.{0,}?;/, ""
if checkGuess.indexOf(.validAnswer) >= 0
resp.reply "Bravo !!! La réponse était #{@currentQ.answer}"
name = resp.envelope.user.name.toLowerCase().trim()
value = .value.replace /[^0-9.-]+/g, ""
.logger.debug "#{name} a donné la bonne réponse."
user = resp.envelope.user
user.triviaScore = user.triviaScore or 0
user.triviaScore += parseInt value
resp.reply "Score: #{user.triviaScore}"
.brain.save()
= null
= null
(resp)
else
resp.send "#{guess} n'est pas la bonne réponse."
else
checkGuess = guess.toLowerCase()
# remove html entities (slack's adapter sends & as & now)
checkGuess = checkGuess.replace /&.{0,}?;/, ""
# remove all punctuation and spaces, and see if the answer is in the guess.
checkGuess = checkGuess.replace /[\\'"\.,-\/#!$%\^&\*;:{}=\-_`~()\s]/g, ""
checkAnswer = .validAnswer.toLowerCase().replace /[\\'"\.,-\/#!$%\^&\*;:{}=\-_`~()\s]/g, ""
checkAnswer = checkAnswer.replace /^(un(e?)|le|la)/g, ""
if checkGuess.indexOf(checkAnswer) >= 0
resp.reply "Bravo !!! La réponse était #{@currentQ.answer}"
name = resp.envelope.user.name.toLowerCase().trim()
value = .value.replace /[^0-9.-]+/g, ""
.logger.debug "#{name} a donné la bonne réponse."
user = resp.envelope.user
user.triviaScore = user.triviaScore or 0
user.triviaScore += parseInt value
resp.reply "Score: #{user.triviaScore}"
.brain.save()
= null
= null
(resp)
else
resp.send "#{guess} n'est pas la bonne réponse."
else
resp.send "Il n'y a pas de question en cours!"
hint: (resp) ->
if
answer = .validAnswer
hint = answer.substr(0,) + answer.substr(,(answer.length + )).replace(/./g, ".")
if <= answer.length
+= 1
resp.send hint
else
resp.send "Il n'y a pas de question en cours!"
checkScore: (resp, name) ->
if name == "all"
for user in .brain.usersForFuzzyName ""
user.triviaScore = user.triviaScore or 0
resp.send "#{user.name} - $#{user.triviaScore}"
else
user = .brain.userForName name
unless user
resp.send "Il n'y a pas de score pour #{name}"
else
user.triviaScore = user.triviaScore or 0
resp.send "#{user.name} - $#{user.triviaScore}"
resetScores: (resp) ->
name = resp.envelope.user.name.toLowerCase().trim()
if name == "lucas"
for user in .brain.usersForFuzzyName ""
user.triviaScore = 0
resp.send "Les scores ont été remis à zero."
else
resp.send "Seul l'utilisateur @lucas est autorisé à utiliser cette commande."
module.exports = (robot) ->
game = new Game(robot)
robot.hear /^!trivia/, (resp) ->
game.askQuestion(resp)
robot.hear /^!skip/, (resp) ->
game.skipQuestion(resp)
robot.hear /^!a(nswer)? (.*)/, (resp) ->
game.answerQuestion(resp, resp.match[2])
robot.hear /^!score (.*)/i, (resp) ->
game.checkScore(resp, resp.match[1].toLowerCase().trim())
robot.hear /^!scores/i, (resp) ->
game.checkScore(resp, "all")
robot.hear /^!reset/, (resp) ->
game.resetScores(resp)
robot.hear /^!h(int)?/, (resp) ->
game.hint(resp)