<?php
use Google\Cloud\Samples\Speech\TranscribeCommand;
include "BayaImage.php";
class QuizMaker {
private $TranslateService;
private $mainChannel;
function __construct(TranslateService $TranslateService){
$this->TranslateService = $TranslateService;
$this->mainChannel = "@razazmoon";
// $this->mainChannel = "@testbot2000";
}
function getTS(): TranslateService {
return $this->TranslateService;
}
public function sendSticker(){
$this->TranslateService->apiRequest ( "sendSticker", array (
'chat_id' => $this->mainChannel,
'sticker' => 'CAADBAADqVkAAj8SMwV0_OccQRxVGwI'
) );
}
public function createAndPostTranslateTest(){
$quizID = $this->createTranslateTest();
$this->postTest($quizID);
}
public function createAndPostArtikelTest(){
echo $quizID = $this->createArticleTest();
$this->postTest($quizID);
}
public function createAndPostImageTest(){
echo $quizID = $this->createImageTest();
$this->postTest($quizID);
}
public function createImageTest(){
$userId = $this->TranslateService->user['id'];
$channelName = $this->TranslateService->message['text'];
if(empty($userId) ||empty($channelName) ){
$userId = 0000;
$channelName = $this->mainChannel;
}
$quizDb = new QuizDatabaseHandler();
$quizName = $this->generateRandomName();
$quizID = $quizDb->insertQuiz($quizName,$userId,$channelName );
$wordArray = $quizDb->getSomeWords(15);
$questionID = $this->insertImageQuestionsAndAnswers($wordArray, $quizID);
return $quizID;
}
public function createArticleTest(){
$userId = $this->TranslateService->user['id'];
$channelName = $this->TranslateService->message['text'];
if(empty($userId) ||empty($channelName) ){
$userId = 0000;
$channelName = $this->mainChannel;
}
$quizDb = new QuizDatabaseHandler();
$quizName = $this->generateRandomName();
$quizID = $quizDb->insertQuiz($quizName,$userId,$channelName );
$nounArray = $quizDb->getSomeNouns();
$questionID = $this->insertQuestionsAndAnswers($nounArray, $quizID);
return $quizID;
}
public function createTranslateTest(){
$userId = $this->TranslateService->user['id'];
$channelName = $this->TranslateService->message['text'];
if(empty($userId) ||empty($channelName) ){
$userId = 0000;
$channelName = $this->mainChannel;
}
$quizDb = new QuizDatabaseHandler();
$quizName = $this->generateRandomName();
$quizID = $quizDb->insertQuiz($quizName,$userId,$channelName );
$wordArray = $quizDb->getSomeWords();
$questionID = $this->insertTranslationQuestionsAndAnswers($wordArray, $quizID);
return $quizID;
}
public function quizProcess($TranslateService, $userStep){
// $TranslateService = new TranslateService($botUsername, $botToken, $webhookUrl, $sign);
if($userStep== EnumAdmins::ADMIN_WRITES_QUIZ_NAME){
$dictionary = new DictionaryDatabaseHandler($this->getTS());
// $memberStatus = $this->getChannelStatus($TranslateService, $TranslateService->message['text'],$TranslateService->user['id'] );
$memberStatus = $this->getChannelStatus($this->TranslateService, $TranslateService->message['text'],$TranslateService->user['id'] );
if($memberStatus){
$dictionary->setUserStep($TranslateService->chat_id, "");
$this->createArticleTest();
$answerArray [] = ['text'=>"لیست آزمون ها", 'id'=>"quiz:home"];
$questionText = "آزمون به لیست اضافه شد";
$TranslateService->askMultipleChoiceQuestion($questionText, $answerArray);
}
else
$TranslateService->sendMessage("لطفا آدی ربات را به عنوان ادمین کانال خود اضافه کنید @TranslateGerman_bot");
}
else
$this->quizWizard($TranslateService);
}
public function getChannelStatus($channelName, $userid){
$memberObject = $this->TranslateService->apiRequest ( "getChatMember", array (
'chat_id' => $channelName,
'user_id' => $userid
) );
return $memberObject;
}
public function quizListener($TranslateService, $callBackData, $update){
// $TranslateService = new TranslateService($botUsername, $botToken, $webhookUrl, $sign);
$userId = $update['callback_query']['from']['id'];
$quizDb = new QuizDatabaseHandler();
if($callBackData[2]=="id"){
$quizId = $callBackData[3];
$answerArray [] = ['text'=>"ارسال شود", 'id'=>"quiz:post:".$quizId];
$TranslateService->askMultipleChoiceQuestion("این تست آماده قرارگرفتن روی کانال می باشد", $answerArray);
}
if($callBackData[2]=="home"){
$this->quizWizard($TranslateService);
}
if($callBackData[2]=="result"){
$quizId = $callBackData[3];
$score = $quizDb->getScore($userId, $quizId );
$particpantsNumber = $quizDb->getParticipants($quizId );
// $participants = $quizDb->getParticipants($quizId);
$resultBtnText = "مشاهده نتیجه";
$scoreArray [] = ['text'=>$resultBtnText, 'id'=>"quiz:result:$quizId"];
$referenceText = "برای مشاهده امتیازتون توی این آزمون روی دکمه زیر کلیک کنید";
$referenceText .= PHP_EOL;
$referenceText .= "تهیه شده توسط لغتنامه آلمانی ";
$referenceText .= PHP_EOL;
$referenceText .= "@TranslateGerman_bot";
$referenceText .= PHP_EOL.PHP_EOL;
$referenceText .= " تعداد شرکت کنندگان ";
$referenceText .= $particpantsNumber;
$referenceText .= " نفر تا این لحظه ";
$this->TranslateService->editAskMultipleChoiceQuestion($referenceText,$scoreArray);
if(!$score)
$score = 0;
$notification = " امتیاز شما در این آزمون ";
$notification .= $score;
$notification .= " می باشد ";
// $notification .= "$particpantsNumber شرکت کنندگان ";
// $notification .= " تعداد شرکت کنندگان تا این لحظه ";
// $notification .= $particpants;
// $memberStatus = $this->getChannelStatus($this->mainChannel, userId);
return $notification;
}
if($callBackData[2]=="ans"){
$answerId = $callBackData[3];
$questionId = $quizDb->getQuestionId($answerId);
$quizDb->isAnsweredByUser($userId,$questionId['questionID']);
if($quizDb->isAnsweredByUser($userId,$questionId['questionID'])){
$answer = $quizDb->getAnswerById($answerId);
if($answer['isRight'] == 1){
$notification =" ✔ صحیح ";
}
else
$notification =" ✘ غلط ";
$notification .= "به این سوال قبلا جواب داده اید";
}
else {
$quizDb->insertQuizUser($userId, $userName, $name, $lastname);
$quizId = $quizDb->getQuizId($answerId);
$answer = $quizDb->getAnswerById($answerId);
$quizDb->insertUserAnswer($userId,$questionId['questionID'], $answerId);
if($answer['isRight'] == 1){
$quizDb->incScore($quizId['quizID'], $userId);
$rightNotification []= "آفرین، جواب درست بود";
$rightNotification []= "هوررا درست بود";
$rightNotification []= "خیلی خوبه، درست بود";
$rightNotification []= "ماشالا ماشالا درسته";
$rightNotification []= "عالی بود جواب درسته";
$rand_keys = array_rand($rightNotification, 1);
$notification= $rightNotification[$rand_keys];
}
else {
$wrongNotification []= "جواب غلط بود";
$wrongNotification []= "اوه متاسفم، اشتباه جواب دادی";
$wrongNotification []= "باید بیشتر تمرین کنی، اشتباه بود";
$wrongNotification []= "خب اگه به نظر لغت سختی بود، انتخابت درست نبود";
$wrongNotification []= "وای اشتباه جواب دادی";
$rand_keys = array_rand($wrongNotification, 1);
$notification= $wrongNotification[$rand_keys];
}
}
return $notification;
}
if($callBackData[2]=="post"){
$quizId = $callBackData[3];
$this->postTest($quizId);
}
if($callBackData[2]=="make"){
$dictionary = new DictionaryDatabaseHandler($this->getTS());
$dictionary->setUserStep($TranslateService->chat_id,EnumAdmins::ADMIN_WRITES_QUIZ_NAME);
$answerArray [] = ['text'=>"بازگشت", 'id'=>"quiz:home"];
$questionText = "لطفا آی دی کانالی که برای آن آزمون را می سازید وارد کنید";
$TranslateService->askMultipleChoiceQuestion($questionText, $answerArray);
}
}
public function postTest($quizId){
$this->sendSticker();
$quizDb = new QuizDatabaseHandler("main_Quiz");
$destId = $quizDb->getQuizChannel($quizId);
$questions = $quizDb->getQuestions($quizId);
foreach ($questions as $question){
unset($answerArray);
$answerArray = array();
if(empty($question))
continue;
$answers = $quizDb->getAnswers($question['id']);
foreach ($answers as $answer){
$answerId = $answer['id'];
if(!empty($answer))
$answerArray [] = ['text'=>$answer['answer'], 'id'=>"quiz:ans:".$answerId];
}
$this->postQuestion($question, $answerArray, $destId);
}
$scoreArray [] = ['text'=>"مشاهده نتیجه", 'id'=>"quiz:result:$quizId"];
$referenceText = "برای مشاهده امتیازتون توی این آزمون روی دکمه زیر کلیک کنید";
$referenceText .= PHP_EOL;
$referenceText .= "تهیه شده توسط لغتنامه آلمانی ";
$referenceText .= PHP_EOL;
$referenceText .= "@TranslateGerman_bot";
$this->TranslateService->askMultipleChoiceQuestion($referenceText,$scoreArray, $destId );
}
public function postQuestion($question, $answerArray, $destId){
if(empty($question['imageUrl']))
$this->TranslateService->askMultipleChoiceQuestion($question['question'], $answerArray, $destId);
else
$this->TranslateService->askMultipleChoiceImageQuestion($question['question'], $answerArray, $destId,$question['imageUrl']);
}
public function quizWizard($TranslateService){
// $TranslateService = new TranslateService($botUsername, $botToken, $webhookUrl, $sign);
$dictionary= new DictionaryDatabaseHandler($this->getTS());
$dictionary->setUserStep($userId, '');
$quizDb = new QuizDatabaseHandler();
$quizzes = $quizDb->getMyQuizzes($TranslateService->chat_id);
foreach ($quizzes as $quiz){
$quizID = $quiz['id'];
if(!empty($quiz))
$answerArray [] = ['text'=>$quiz['name'], 'id'=>"quiz:id:".$quizID];
}
$questionText = "کدام آزمون را انتخاب می کنید؟";
// $TranslateService->askMultipleChoiceQuestion($questionText, $answerArray);
$answerArray [] = ['text'=>"ایجاد آزمون جدید", 'id'=>"quiz:make"];
$TranslateService->askMultipleChoiceQuestion($questionText, $answerArray);
}
public function insertQuestionsAndAnswers($nounArray, $quizID){
$quizDb = new QuizDatabaseHandler();
$iRowCounter = 0;
foreach ($nounArray as $noun){
$iRowCounter++;
if(!empty($noun)){
$qText = $iRowCounter. " - ";
$qText .= "کدام یک آرتیکل صحیح لغت ";
$qText .= $noun['word']." ";
$qText .= " : ";
$qText .= $noun['translation']." ";
$qText .= "می باشد";
$questionID = $quizDb->insertQuestion($qText, $quizID);
$artikelArray = $this->createArtikelArray($noun);
foreach ($artikelArray as $artikel){
// if(!empty($artikel['isRight']))
$quizDb->insertAnswer( $questionID, $artikel['name'], $artikel['isRight']);
}
}
}
}
public function insertTranslationQuestionsAndAnswers($wordArray, $quizID){
$quizDb = new QuizDatabaseHandler();
$iRowCounter = 0;
foreach ($wordArray as $word){
$iRowCounter++;
if(!empty($word)){
$qText = $iRowCounter. " - ";
$qText .= "کدام یک معنی صحیح لغت ";
$qText .= $word['word']." ";
$qText .= "می باشد";
$questionID = $quizDb->insertQuestion($qText, $quizID);
$rightAnswer = $word['translation'];
$wrongAnswers = $quizDb->getSomeWrongTranslations($word);
$answerArray = $this->createAnswerArray($word,$rightAnswer,$wrongAnswers);
foreach ($answerArray as $answer){
$quizDb->insertAnswer( $questionID, $answer['answer'], $answer['isRight']);
}
}
}
}
public function insertImageQuestionsAndAnswers($wordArray, $quizID){
$quizDb = new QuizDatabaseHandler();
$iRowCounter = 0;
$createdQuestionsNumber = 0;
foreach ($wordArray as $word){
if(!empty($word)){
$relatedImages = $this->getRelatedImages($word['word'], 6);
if(is_array($relatedImages) && createdQuestionsNumber < 6){
$createdQuestionsNumber++;
$qText = $createdQuestionsNumber. " - ";
$qText .= "کدام لغت با تصاویر بالا ارتباط بیشتری دارد ";
$bayaImage = new BayaImage();
$collageImageName = $bayaImage->createCollage($relatedImages);
$collageImageUrl = "https://www.towist.com/autopost/classes/quiz/images/".$collageImageName;
$questionID = $quizDb->insertQuestion($qText, $quizID, $collageImageUrl);
$rightAnswer = $word['word'];
$wrongAnswers = $quizDb->getSomeWrongWords($word);
$answerArray = $this->createImageAnswerArray($word,$rightAnswer,$wrongAnswers);
foreach ($answerArray as $answer){
$quizDb->insertAnswer( $questionID, $answer['answer'], $answer['isRight']);
}
}
}
}
}
public function getRelatedImages($word, $imageNumbers){
$encodedWord = urlencode($word);
echo $apiUrl = "https://pixabay.com/api/?key=5036581-ebd149dc8e0a90596c0baec76&q=$encodedWord&lang=de&image_type=photo&pretty=false";
$jsonImageResult = json_decode(file_get_contents($apiUrl), TRUE);
if(sizeof($jsonImageResult['hits']) < $imageNumbers )
return false;
for($i= 0; $i<$imageNumbers ; $i++ ){
$relatedImages[] = $jsonImageResult['hits'][$i]['webformatURL'];
}
return $relatedImages;
}
public function createArtikelArray($noun){
switch($noun['artikel']){
case "n":
$artikel['name'] = "Das";
$artikel['isRight'] = 1;
$artikelArray [] = $artikel;
$artikel['name'] = "Der";
$artikel['isRight'] = 0;
$artikelArray [] = $artikel;
$artikel['name'] = "Die";
$artikel['isRight'] = 0;
$artikelArray [] = $artikel;
break;
case "m":
$artikel['name'] = "Das";
$artikel['isRight'] = 0;
$artikelArray [] = $artikel;
$artikel['name'] = "Der";
$artikel['isRight'] = 1;
$artikelArray [] = $artikel;
$artikel['name'] = "Die";
$artikel['isRight'] = 0;
$artikelArray [] = $artikel;
break;
case "f":
$artikel['name'] = "Das";
$artikel['isRight'] = 0;
$artikelArray [] = $artikel;
$artikel['name'] = "Der";
$artikel['isRight'] = 0;
$artikelArray [] = $artikel;
$artikel['name'] = "Die";
$artikel['isRight'] = 1;
$artikelArray [] = $artikel;
break;
}
// shuffle($artikelArray);
return $artikelArray;
}
public function createAnswerArray($word, $rightAnswer,$worngAnswers){
$randAnswerPosition = rand(1,3);
if($randAnswerPosition == 1 ){
$word['answer'] = $worngAnswers[0]['translation'];
$word['isRight']= 0;
$answerArray[] = $word;
$word['answer']= $rightAnswer;
$word['isRight']= 1;
$answerArray[] = $word;
$word['answer'] = $worngAnswers[1]['translation'];
$word['isRight']= 0;
$answerArray[] = $word;
}
else if($randAnswerPosition == 2 ){
$word['answer'] = $worngAnswers[0]['translation'];
$word['isRight']= 0;
$answerArray[] = $word;
$word['answer']= $rightAnswer;
$word['isRight']= 1;
$answerArray[] = $word;
$word['answer'] = $worngAnswers[1]['translation'];
$word['isRight']= 0;
$answerArray[] = $word;
}
else if($randAnswerPosition == 3 ){
$word['answer'] = $worngAnswers[0]['translation'];
$word['isRight']= 0;
$answerArray[] = $word;
$word['answer'] = $worngAnswers[1]['translation'];
$word['isRight']= 0;
$answerArray[] = $word;
$word['answer']= $rightAnswer;
$word['isRight']= 1;
$answerArray[] = $word;
}
// shuffle($answerArray);
return $answerArray;
}
public function createImageAnswerArray($word, $rightAnswer,$worngAnswers){
// print_r($worngAnswers[0]);
$randAnswerPosition = rand(1,3);
if($randAnswerPosition == 1 ){
$word['answer']= $rightAnswer;
$word['isRight']= 1;
$answerArray[] = $word;
$word['answer'] = $worngAnswers[0]['word'];
$word['isRight']= 0;
$answerArray[] = $word;
$word['answer'] = $worngAnswers[1]['word'];
$word['isRight']= 0;
$answerArray[] = $word;
}
else if($randAnswerPosition == 2){
$word['answer'] = $worngAnswers[0]['word'];
$word['isRight']= 0;
$answerArray[] = $word;
$word['answer']= $rightAnswer;
$word['isRight']= 1;
$answerArray[] = $word;
$word['answer'] = $worngAnswers[1]['word'];
$word['isRight']= 0;
$answerArray[] = $word;
}
else if($randAnswerPosition == 3){
$word['answer'] = $worngAnswers[0]['word'];
$word['isRight']= 0;
$answerArray[] = $word;
$word['answer'] = $worngAnswers[1]['word'];
$word['isRight']= 0;
$answerArray[] = $word;
$word['answer']= $rightAnswer;
$word['isRight']= 1;
$answerArray[] = $word;
}
// shuffle($answerArray);
return $answerArray;
}
public function generateRandomName($length = 10) {
return substr(str_shuffle(str_repeat($x='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', ceil($length/strlen($x)) )),1,$length);
}
}