ট্রিভিয়া গেমগুলি একটি আকর্ষক এবং শিক্ষামূলক অভিজ্ঞতা প্রদান করে যেখানে আপনি নতুন তথ্য শিখতে পারেন এবং বিভিন্ন বিষয়ে আপনার জ্ঞান প্রসারিত করতে পারেন। আজকাল, ট্রিভিয়া কুইজ মোবাইল এবং ওয়েব অ্যাপ্লিকেশানগুলি এই ধরনের কার্যকলাপের জন্য সবচেয়ে সাধারণ গো-টু এলাকা। হোয়াটসঅ্যাপে একটি ট্রিভিয়া গেম খেললে কেমন হয়?
এই টিউটোরিয়াল গাইডে, আপনি শিখবেন কিভাবে হোয়াটসঅ্যাপ, ASP.NET কোর এবং এর জন্য Twilio ব্যবহার করে একটি ট্রিভিয়া কুইজ অ্যাপ্লিকেশন তৈরি করবেন
এই প্রশ্নগুলি আনার জন্য, আপনি ট্রিভিয়া API, একটি REST API ব্যবহার করবেন, যা ডেভেলপারদের জন্য একাধিক পছন্দের ট্রিভিয়া প্রশ্ন প্রদান করে কুইজ অ্যাপ তৈরি করা সহজ করে তোলে। Trivia API সম্পর্কে আরও জানতে, অনুগ্রহ করে __ Trivia API ডকুমেন্টেশন __ দেখুন।
এই টিউটোরিয়ালটি সম্পূর্ণ করতে আপনার প্রয়োজন হবে:
শুরু করতে, একটি পছন্দের কাজের ডিরেক্টরিতে আপনার শেল টার্মিনাল ব্যবহার করে, একটি নতুন ওয়েব API প্রকল্প তৈরি করতে নিম্নলিখিত কমান্ডগুলি চালান:
dotnet new webapi -n TwilioWhatsAppTriviaApp --no-openapi
উপরের স্নিপেটে দ্বিতীয় কমান্ডটি একটি নতুন ওয়েব API প্রকল্প তৈরি করবে নির্দিষ্ট নামের সাথে এবং OpenAPI (Swagger) সমর্থন ছাড়াই। আপনি যদি প্রকল্পে Swagger ব্যবহার করতে চান তবে উপরের কমান্ডে --no-openapi
বাদ দিন।
এই কমান্ডটি চালিয়ে প্রকল্প ডিরেক্টরিতে পরিবর্তন করুন:
cd TwilioWhatsAppTriviaApp
ইনস্টল করুন
dotnet add package Twilio.AspNet.Core
এই লাইব্রেরিটি একটি ASP.NET কোর অ্যাপ্লিকেশনে Twilio ওয়েবহুক এবং API-এর সাথে কাজ করা সহজ করে।
আপনার পছন্দের IDE ব্যবহার করে প্রকল্পটি খুলুন। কন্ট্রোলার ফোল্ডারে, বয়লারপ্লেট টেমপ্লেট কন্ট্রোলার ফাইল, WeatherForecastController.cs মুছে ফেলুন এবং প্রকল্প ডিরেক্টরিতে WeatherForcast.cs সরিয়ে দিন।
নিম্নলিখিত কমান্ডগুলি ব্যবহার করে আপনি এখনও পর্যন্ত যা করেছেন তা ভালভাবে কাজ করে তা নিশ্চিত করতে আপনার প্রকল্প তৈরি করুন এবং চালান:
dotnet build dotnet run
সফলভাবে প্রজেক্ট চালানোর পরে, ডিবাগিং কনসোলে প্রদর্শিত যেকোনও লোকালহোস্ট ইউআরএলের নোট নিন। আপনি ngrok ব্যবহার করে একটি সর্বজনীনভাবে অ্যাক্সেসযোগ্য স্থানীয় ওয়েব সার্ভার সেট আপ করতে এই URLগুলির যেকোনো একটি ব্যবহার করতে পারেন।
সেশন হল একটি ASP.NET কোর অ্যাপ্লিকেশনে ব্যবহারকারীর ডেটা সংরক্ষণ করার বিভিন্ন উপায়গুলির মধ্যে একটি। আপনি যখন অনুরোধগুলির মধ্যে ব্যবহারকারীর ডেটা ধরে রাখতে চান তখন এটি অপরিহার্য কারণ ডিফল্টরূপে, HTTP প্রোটোকল স্টেটলেস - এর মানে ডেটা সংরক্ষণ করা হয় না।
নিম্নলিখিত কোডে দেখানো Program.cs পরিবর্তন করে ইন-মেমরি সেশন প্রদানকারী যোগ করুন:
var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers(); builder.Services.AddDistributedMemoryCache(); builder.Services.AddSession(options => { options.IdleTimeout = TimeSpan.FromSeconds(40); options.Cookie.IsEssential = true; }); var app = builder.Build(); app.UseSession(); app.MapControllers(); app.Run();
AddDistributedMemoryCache()
বিতরণ করা মেমরি ক্যাশে পরিষেবা নিবন্ধন করে। এই পরিষেবাটি একটি ইন-মেমরি ক্যাশে সরবরাহ করে যা একাধিক অনুরোধ বা সেশন জুড়ে ডেটা সংরক্ষণ এবং পুনরুদ্ধার করতে ব্যবহার করা যেতে পারে।
AddSession()
সেশন পরিষেবা নিবন্ধন করে, অ্যাপ্লিকেশনটিকে সেশন অবস্থা বজায় রাখতে সক্ষম করে। options
প্যারামিটার আপনাকে বিভিন্ন সেশন-সম্পর্কিত বিকল্প কনফিগার করতে দেয়। IdleTimeout
নিষ্ক্রিয়তার সময়কাল সেট করতে ব্যবহৃত হয় যার পরে একটি সেশন নিষ্ক্রিয় বলে বিবেচিত হবে। এই ক্ষেত্রে, এটি 40 সেকেন্ডে সেট করা হয়েছে। Cookie.IsEssential
নিশ্চিত করে যে সেশনের অবস্থা কার্যকর থাকে এবং এমনকি এমন পরিস্থিতিতেও যেখানে কুকি প্রত্যাখ্যান সক্রিয় থাকে।
অ্যাপ্লিকেশন পাইপলাইনে UseSession
মিডলওয়্যার যোগ করে সেশন সমর্থন সক্ষম করা হয়েছে, অর্থাৎ, আপনার অ্যাপ্লিকেশনটি একটি সেশন অবজেক্টে অ্যাক্সেস লাভ করে যা ডেটা সংরক্ষণ এবং পুনরুদ্ধার করতে ব্যবহার করা যেতে পারে।
আপনার প্রকল্প ডিরেক্টরিতে একটি নতুন ফোল্ডার, মডেল তৈরি করুন। নিম্নলিখিত কোড নমুনায় দেখানো বৈশিষ্ট্য সহ দুটি মডেল ক্লাস ফাইল যোগ করুন, TriviaApiResponse.cs এবং Question.cs :
using Newtonsoft.Json; namespace TwilioWhatsAppTriviaApp.Models; public class TriviaApiResponse { [JsonProperty("category")] public string Category { get; set; } [JsonProperty("correctAnswer")] public string CorrectAnswer { get; set; } [JsonProperty("incorrectAnswers")] public List<string> IncorrectAnswers { get; set; } [JsonProperty("question")] public string Question { get; set; } [JsonProperty("type")] public string? Type { get; set; } [JsonProperty("difficulty")] public string Difficulty { get; set; } }
namespace TwilioWhatsAppTriviaApp.Models; public class Question { public string QuestionText { get; set; } public List<(string option, bool isCorrect)> Options { get; set; } }
TriviaApiResponse
মডেলে এমন বৈশিষ্ট্য রয়েছে যা ট্রিভিয়া API প্রতিক্রিয়ার ক্ষেত্রগুলিকে প্রতিনিধিত্ব করে। JsonProperty
অ্যাট্রিবিউট নিশ্চিত করে যে প্রতিটি প্রপার্টি সংশ্লিষ্ট JSON ডেটা দিয়ে সঠিকভাবে পপুলেট করা হয়েছে।
ট্রিভিয়া প্রশ্নগুলি পরিচালনা করার একটি সুবিন্যস্ত উপায়ের জন্য, Question
শ্রেণী উদ্ধারে আসে। এই ক্লাসটি একটি ট্রিভিয়া প্রশ্নের জন্য প্রয়োজনীয় তথ্য ধারণ করে, যার মধ্যে প্রশ্নের পাঠ্য এবং বিকল্পগুলির একটি তালিকা রয়েছে। প্রতিটি বিকল্পকে একটি টিপল দ্বারা উপস্থাপিত করা হয় যেখানে বিকল্প পাঠ্য এবং একটি বুলিয়ান মান নির্দেশ করে যে এটি সঠিক বিকল্প কিনা।
আপনার প্রকল্প ডিরেক্টরিতে একটি পরিষেবা ফোল্ডার তৈরি করুন এবং TriviaService.cs নামে একটি নতুন ক্লাস ফাইল যোগ করুন। নিম্নলিখিত কোডে দেখানো হিসাবে এর বিষয়বস্তু পরিবর্তন করুন:
using Newtonsoft.Json; using TwilioWhatsAppTriviaApp.Models; namespace TwilioWhatsAppTriviaApp.Services; public class TriviaService { private const string TheTriviaApiUrl = @"https://the-trivia-api.com/api/questions?limit=3"; private HttpClient httpClient; public TriviaService(HttpClient httpClient) { this.httpClient = httpClient; } public async Task<IEnumerable<TriviaApiResponse>> GetTrivia() { var response = await httpClient.GetAsync(TheTriviaApiUrl); var triviaJson = await response.Content.ReadAsStringAsync(); var trivia = JsonConvert.DeserializeObject<IEnumerable<TriviaApiResponse>>(triviaJson); return trivia; } public List<Question> ConvertTriviaToQuestions(IEnumerable<TriviaApiResponse> questions) { List<Question> newQuestions = new(); foreach (var question in questions) { var options = new List<(string option, bool isCorrect)>() { (question.CorrectAnswer, true), (question.IncorrectAnswers[0], false), (question.IncorrectAnswers[1], false), (question.IncorrectAnswers[2], false) }; // Shuffle the options randomly Random random = new(); options = options.OrderBy(_ => random.Next()).ToList(); newQuestions.Add(new Question { QuestionText = question.Question, Options = options }); } return newQuestions; } }
TriviaService
ক্লাসে দুটি পদ্ধতি রয়েছে: GetTrivia
এবং ConvertTriviaToQuestions
। GetTrivia
পদ্ধতি একটি ক্যোয়ারী প্যারামিটার সহ ট্রিভিয়া API-তে HTTP GET অনুরোধ পাঠায়, limit=3
, যা নির্দিষ্ট করে যে শুধুমাত্র 3টি প্রশ্ন ফেরত দেওয়া উচিত। সীমা পরামিতি ছাড়া, API ডিফল্টরূপে 10টি প্রশ্ন প্রদান করে।
ConvertTriviaToQuestions
পদ্ধতি API থেকে প্রতিক্রিয়াকে একটি সংগঠিত পদ্ধতিতে রূপান্তর করে। পদ্ধতিটি এলোমেলোভাবে সমস্ত প্রশ্নের বিকল্পগুলিকে এলোমেলো করে দেয়, যাতে একটি একক বিকল্প সমস্ত প্রশ্নের উত্তর হবে না।
আপনার অ্যাপ্লিকেশনের ডিপেন্ডেন্সি ইনজেকশন (DI) পাত্রে TriviaService
এবং HTTP ক্লায়েন্ট নিবন্ধন করতে, নিম্নলিখিত কোডে দেখানো হিসাবে Program.cs পরিবর্তন করুন:
using TwilioWhatsAppTriviaApp.Services; var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers(); builder.Services.AddDistributedMemoryCache(); builder.Services.AddSession(options => { options.IdleTimeout = TimeSpan.FromSeconds(40); options.Cookie.IsEssential = true; }); builder.Services.AddHttpClient(); builder.Services.AddScoped<TriviaService>(); var app = builder.Build(); app.UseSession(); app.MapControllers(); app.Run();
কন্ট্রোলার ফোল্ডারে TriviaController.cs নামের একটি ফাইলে একটি খালি API কন্ট্রোলার ক্লাস যুক্ত করুন এবং নিম্নলিখিত কোডে দেখানো হিসাবে এর বিষয়বস্তু পরিবর্তন করুন:
using Microsoft.AspNetCore.Mvc; using Newtonsoft.Json; using Twilio.AspNet.Core; using Twilio.TwiML; using Twilio.TwiML.Messaging; using TwilioWhatsAppTriviaApp.Models; using TwilioWhatsAppTriviaApp.Services; namespace WhatsappTrivia.Controllers; [Route("[controller]")] [ApiController] public class TriviaController : TwilioController { private const string SessionKeyIsGameOn = "IsGameOn"; private const string SessionKeyScore = "Score"; private const string SessionKeyCurrentQuestionIndex = "CurrentQuestionIndex"; private const string SessionKeyTotalQuestions = "TotalQuestions"; private const string SessionKeyQuestions = "Questions"; private static readonly string[] StartCommands = { "START", "S" }; private static readonly string[] OptionValues = { "A", "B", "C", "D" }; private readonly TriviaService triviaService; public TriviaController(TriviaService triviaService) { this.triviaService = triviaService; } [HttpPost] public async Task<IActionResult> Index() { var response = new MessagingResponse(); var form = await Request.ReadFormAsync(); var body = form["Body"].ToString().ToUpper().Trim(); await HttpContext.Session.LoadAsync(); var isGameOn = Convert.ToBoolean(HttpContext.Session.GetString(SessionKeyIsGameOn)); int currentQuestionIndex = HttpContext.Session.GetInt32(SessionKeyCurrentQuestionIndex) ?? 0; int totalQuestions = HttpContext.Session.GetInt32(SessionKeyTotalQuestions) ?? 0; if (StartCommands.Contains(body) && !isGameOn) { await StartGame(); HttpContext.Session.SetString(SessionKeyIsGameOn, "true"); response.Message(PresentQuestionWithOptions(currentQuestionIndex)); return TwiML(response); } if (OptionValues.Contains(body) && isGameOn) { var result = ProcessUserAnswer(body, currentQuestionIndex); response.Message(result); currentQuestionIndex++; if (currentQuestionIndex <= totalQuestions - 1) { HttpContext.Session.SetInt32(SessionKeyCurrentQuestionIndex, currentQuestionIndex); response.Append(new Message(PresentQuestionWithOptions(currentQuestionIndex))); } else { response.Append(new Message(EndTrivia())); } return TwiML(response); } response.Message(!isGameOn ? "*Hello! Send 'Start' or 'S' to play game*" : "*Invalid Input! Send a correct option 'A', 'B', 'C' or 'D'*"); return TwiML(response); } private async Task StartGame() { if (HttpContext.Session.GetString(SessionKeyQuestions) != null) { HttpContext.Session.Remove(SessionKeyQuestions); } var trivia = await this.triviaService.GetTrivia(); var questions = this.triviaService.ConvertTriviaToQuestions(trivia); AddNewQuestionsToSession(questions); HttpContext.Session.SetInt32(SessionKeyTotalQuestions, questions.Count); } private string ProcessUserAnswer(string userAnswer, int questionIndex) { bool optionIsCorrect = false; int score = HttpContext.Session.GetInt32(SessionKeyScore) ?? 0; var question = RetrieveQuestionFromSession(questionIndex); switch (userAnswer) { case "A": optionIsCorrect = question.Options[0].isCorrect; break; case "B": optionIsCorrect = question.Options[1].isCorrect; break; case "C": optionIsCorrect = question.Options[2].isCorrect; break; case "D": optionIsCorrect = question.Options[3].isCorrect; break; } if (optionIsCorrect) { score++; HttpContext.Session.SetInt32(SessionKeyScore, score); } return optionIsCorrect ? "_Correct ✅_" : $"_Incorrect ❌ Correct answer is {question.Options.Find(o => o.isCorrect).option.TrimEnd()}_"; } private string PresentQuestionWithOptions(int questionIndex) { var question = RetrieveQuestionFromSession(questionIndex); return $""" {questionIndex + 1}. {question.QuestionText} {OptionValues[0]}. {question.Options[0].option} {OptionValues[1]}. {question.Options[1].option} {OptionValues[2]}. {question.Options[2].option} {OptionValues[3]}. {question.Options[3].option} """; } private void AddNewQuestionsToSession(List<Question> questions) => HttpContext.Session.SetString(SessionKeyQuestions, JsonConvert.SerializeObject(questions)); private Question RetrieveQuestionFromSession(int questionIndex) { var questionsFromSession = HttpContext.Session.GetString(SessionKeyQuestions); return JsonConvert.DeserializeObject<List<Question>>(questionsFromSession)[questionIndex]; } private string EndTrivia() { var score = HttpContext.Session.GetInt32(SessionKeyScore) ?? 0; var totalQuestions = HttpContext.Session.GetInt32(SessionKeyTotalQuestions) ?? 0; var userResult = $""" Thanks for playing! 😊 You answered {score} out of {totalQuestions} questions correctly. To play again, send 'Start' or 'S' """; HttpContext.Session.Clear(); return userResult; } }
এই কন্ট্রোলার ক্লাস ইনকামিং বার্তা পরিচালনা, সেশন স্টেট পরিচালনা এবং প্রতিক্রিয়া তৈরি করার জন্য দায়ী। এটি Twilio.AspNet.Core লাইব্রেরি দ্বারা প্রদত্ত TwilioController
ক্লাস থেকে উত্তরাধিকারসূত্রে প্রাপ্ত, যা আপনাকে TwiML
পদ্ধতিতে অ্যাক্সেস দেয়। আপনি এর সাথে প্রতিক্রিয়া জানাতে এই পদ্ধতিটি ব্যবহার করতে পারেনTriviaController
ক্লাস সেশনের সাথে ইন্টারঅ্যাক্ট করতে HttpContext.Session
পদ্ধতি ব্যবহার করে।
বৈধ ইনপুটগুলি হল StartCommands
এবং OptionValues
এর পঠনযোগ্য অ্যারেগুলির উপাদান৷ ব্যবহারকারী একটি সঠিক ইনপুট পাঠিয়েছে কিনা তা নিশ্চিত করার জন্য আগত বার্তার মূল অংশটিকে এই উপাদানগুলির সাথে তুলনা করা হয়, যদি তা না হয় তবে ব্যবহারকারীকে একটি বার্তা পাঠানো হবে যাতে তারা গেমের বর্তমান অবস্থার উপর ভিত্তি করে সঠিক ইনপুট তৈরি করতে অনুরোধ করে। "SessionKey" উপসর্গ সহ অন্যান্য ক্ষেত্রগুলি প্রোগ্রামে সেশন কীগুলির জন্য ব্যক্তিগত ধ্রুবক স্ট্রিংগুলি সংজ্ঞায়িত করতে ব্যবহৃত হয়।
Index
পদ্ধতি হল প্রধান অ্যাকশন পদ্ধতি যা /Trivia রুটের মাধ্যমে WhatsApp থেকে ইনকামিং HTTP POST অনুরোধগুলি পরিচালনা করে। এটি HttpContext.Session.LoadAsync()
ব্যবহার করে সেশন ডেটা লোড করে এবং HttpContext.Session.GetString()
এবং HttpContext.Session.GetInt32()
পদ্ধতি ব্যবহার করে সেশন থেকে গেমের অবস্থা সম্পর্কিত ডেটা পুনরুদ্ধার করে।
নির্দিষ্ট স্ট্রিংগুলির শুরুতে এবং শেষে আন্ডারস্কোর (_) এবং তারকাচিহ্ন (*) এর ব্যবহার হল রেন্ডার করা WhatsApp বার্তাগুলিতে যথাক্রমে তির্যক এবং গাঢ় পাঠ বিন্যাস অর্জন করা।
TriviaController
প্রতিটি সহায়ক পদ্ধতি একটি নির্দিষ্ট কাজ সম্পাদন করে যা ক্লাসের প্রধান কার্যকারিতা সমর্থন করে।
StartGame
পদ্ধতি ট্রিভিয়া প্রশ্ন পুনরুদ্ধার করে, গেমের জন্য উপযুক্ত একটি বিন্যাসে রূপান্তর করে এবং সেশনে সেগুলি সংরক্ষণ করে গেমটি শুরু করে।ProcessUserAnswer
পদ্ধতি একটি প্রশ্নের ব্যবহারকারীর উত্তর প্রক্রিয়া করে এবং তা সঠিক কিনা তা নির্ধারণ করে।PresentQuestionWithOptions
পদ্ধতি একটি প্রশ্ন ফর্ম্যাটিং এবং তার বিকল্পগুলির সাথে উপস্থাপনের জন্য দায়ী।AddNewQuestionsToSession
পদ্ধতি সেশনে প্রশ্নের একটি তালিকা সংরক্ষণ করে। এটি প্রশ্নগুলিকে JSON ফর্ম্যাটে রূপান্তর করে এবং সেশনে JSON স্ট্রিং সংরক্ষণ করে।RetrieveQuestionFromSession
পদ্ধতি প্রশ্ন সূচক ব্যবহার করে সেশন থেকে একটি প্রশ্ন পুনরুদ্ধার করে।EndTrivia
পদ্ধতি ট্রিভিয়া গেমটি শেষ করার জন্য একটি বার্তা তৈরি করে। এই পদ্ধতিটি গেম সম্পর্কিত সেশন ডেটাও সরিয়ে দেয়। Program.cs- এ সেশন পরিষেবার কনফিগারেশনের উপর ভিত্তি করে, যখন সেশনটি 40 সেকেন্ডের জন্য নিষ্ক্রিয় থাকে তখন এটি স্বয়ংক্রিয়ভাবে ঘটে।
অ্যাপ্লিকেশনটি পরীক্ষা করার জন্য, আপনাকে WhatsApp-এর জন্য Twilio Sandbox সেট আপ করতে হবে, আপনার অ্যাপ্লিকেশনের এন্ডপয়েন্টকে সর্বজনীনভাবে অ্যাক্সেসযোগ্য করে তুলতে হবে এবং একটি ওয়েবহুক হিসাবে স্যান্ডবক্স কনফিগারেশনে এন্ডপয়েন্ট URL যোগ করতে হবে।
যান
WhatsApp স্যান্ডবক্সের সাথে একটি সফল সংযোগ তৈরি করার জন্য আপনার ডিভাইস থেকে Twilio নম্বরে একটি WhatsApp বার্তা পাঠিয়ে স্যান্ডবক্সের সাথে সংযোগ করতে পৃষ্ঠার নির্দেশাবলী অনুসরণ করুন। একইভাবে, অন্যান্য ব্যক্তি যারা তাদের নিজ নিজ নম্বর দিয়ে আপনার অ্যাপ পরীক্ষা করতে চান তাদের একই পদ্ধতি অনুসরণ করতে হবে।
এখন, একটি শেল টার্মিনাল খুলুন এবং ngrok শুরু করতে নিম্নলিখিত কমান্ডটি চালান এবং আপনার স্থানীয় ASP.NET কোর অ্যাপটি প্রকাশ করুন <localhost-url>
আপনার লোকালহোস্টের সম্পূর্ণ URL দিয়ে প্রতিস্থাপন করে আপনি প্রাথমিকভাবে কপি করেছেন:
ngrok http <localhost-url>
ngrok একটি সর্বজনীন URL তৈরি করবে যা আপনার স্থানীয় ASP.NET অ্যাপে অনুরোধ ফরোয়ার্ড করে। এনগ্রোক টার্মিনাল উইন্ডোতে ফরওয়ার্ডিং লেবেলযুক্ত ফরোয়ার্ডিং URLটি সন্ধান করুন এবং এটি অনুলিপি করুন।
Twilio ট্রাই হোয়াটসঅ্যাপ পৃষ্ঠাতে ফিরে যান, স্যান্ডবক্স সেটিংসে ক্লিক করুন এবং এনগ্রোক প্লাস /ট্রিভিয়া রুট দ্বারা তৈরি ফরওয়ার্ডিং URL সহ এন্ডপয়েন্ট ইউআরএলে যখন একটি বার্তা আসে তখন পরিবর্তন করুন এবং পদ্ধতিটি POST-এ সেট করা আছে তা নিশ্চিত করুন। তারপর নতুন স্যান্ডবক্স কনফিগারেশন সংরক্ষণ করতে সংরক্ষণ করুন ক্লিক করুন।
নিম্নলিখিত কমান্ড ব্যবহার করে আপনার ASP.NET কোর প্রকল্প চালান:
dotnet run
এখন, টুইলিও স্যান্ডবক্স নম্বরের সাথে প্রাথমিক কথোপকথনে একটি বার্তা পাঠিয়ে আপনার আবেদন পরীক্ষা করুন।
Twilio প্ল্যাটফর্ম এবং WhatsApp এর শক্তিকে কাজে লাগিয়ে, আপনি ব্যবহারকারীদের উপভোগ করার জন্য একটি নিমজ্জিত ট্রিভিয়া গেমের অভিজ্ঞতা তৈরি করেছেন। আপনি সেশন থেকে ডেটা সংরক্ষণ এবং পুনরুদ্ধার করতে শিখেছেন।
এই প্রকল্পের উপর উন্নত করা যেতে পারে বিভিন্ন উপায় আছে. আপনি টাইমার যোগ করে, ব্যতিক্রমগুলি পরিচালনা করে, ব্যবহারকারীদের অসুবিধা চয়ন করার অনুমতি দিয়ে এবং The Trivia API URL এর মাধ্যমে একটি ক্যোয়ারী প্যারামিটার হিসাবে নির্বাচিত অসুবিধা প্রয়োগ করে এই প্রকল্পটিকে আরও উন্নত করতে পারেন (যেমন