With the help of this Telegram bot you can test your knowledge of JavaScript basics.
We use questions from 29 topics of our course on JavaScript basics. More details about us can be found in the previous publication. As a result of answering all the questions, an assessment of your level of knowledge awaits you.
Telegraph.js
Our bot is implemented on the framework Telegraph.js
OpenSource
The source code of the project is available on GitHub, so you can participate in its development.
require('dotenv').config()
const { Telegraf, session, Stage, BaseScene } = require('telegraf')
const TelegrafI18n = require('telegraf-i18n')
const { level, getSticker, MyContext } = require('./helpers')
const { en, ru } = require('./quiz')
const path = require('path')
const i18n = new TelegrafI18n({
defaultLanguage: 'en',
directory: path.resolve(__dirname, 'locales')
})
let BOT_TOKEN
if (process.env.NODE_ENV === 'production') {
BOT_TOKEN = process.env.BOT_TOKEN
} else {
BOT_TOKEN = process.env.BOT_TOKEN_TEST
}
const bot = new Telegraf(BOT_TOKEN, { contextType: MyContext })
bot.use(i18n.middleware())
const jsRoom = new BaseScene('js-room')
let getQuiz = ctx => (ctx.i18n.locale() === 'en' ? en : ru)
let questions
jsRoom.enter(ctx => {
questions = getQuiz(ctx)
const questionIndex = 0
const counter = 0
ctx.session.counter = counter
ctx.session.questionIndex = questionIndex
const { title, random, correct_option_id } = questions[questionIndex]
ctx.replyWithQuiz(`${ctx.i18n.t('Question')}: 1 ${ctx.i18n.t('from')} ${questions.length}\n${title}`, random, {
correct_option_id,
is_anonymous: false
})
ctx.reply(`${ctx.i18n.t('course')}: www.jscamp.app`)
})
jsRoom.on('poll_answer', ctx => {
const questionIndex = ++ctx.session.questionIndex
const result = questions[questionIndex - 1].correct_option_id === ctx.pollAnswer.option_ids[0]
result && ++ctx.session.counter
if (questionIndex !== questions.length) {
const { title, random, correct_option_id } = questions[questionIndex]
ctx.replyWithQuiz(
`${ctx.i18n.t('Question')}: ${questionIndex + 1} ${ctx.i18n.t('from')} ${
questions.length
}\n${title}\n${ctx.i18n.t('score')} ${ctx.session.counter}`,
random,
{
correct_option_id,
is_anonymous: false
}
)
} else {
ctx.reply(
`${ctx.i18n.t('score')} ${ctx.session.counter}. ${ctx.i18n.t('level')}: ${level(
ctx.session.counter
)} ${getSticker(ctx.session.counter)}`
)
ctx.reply(`${ctx.i18n.t('course')}: www.jscamp.app`)
}
ctx.scene.current.leave()
})
const stage = new Stage([jsRoom])
bot.context.questions = questions
bot.use(session())
bot.use((ctx, next) => next())
bot.use(stage.middleware())
bot.command('start', ctx => ctx.scene.enter('js-room'))
bot.launch()
Internationalization (i18n)
Bot Now communicates in English and Russian, but you can send a pull request in your native language.
What's next?
Next, we plan to implement testing on TypeScript, React Native, AWS Amplify, so subscribe to our Twitter to stay tuned.
The bot is free, but you can support our startup via Patreon