অ্যাচিভমেন্টস সিস্টেমের সেরা উপায়


85

আমি আমার সাইটে ব্যবহারের জন্য একটি সাফল্য সিস্টেম ডিজাইনের সেরা পন্থার কথা ভাবছি। 3 বা ততোধিক ধারাবাহিক রেকর্ড অনুপস্থিত বলার সেরা উপায়ে ডাটাবেস কাঠামোটি পাওয়া যাবে এবং এই থ্রেডটি বিকাশকারীদের কাছ থেকে ধারণা পেতে সত্যই একটি এক্সটেনশন।

এই ওয়েবসাইটে ব্যাজ / কৃতিত্ব সিস্টেমগুলি সম্পর্কে আমার প্রচুর আলাপের সাথে যে সমস্যাটি রয়েছে তা হ'ল - এটি সমস্ত আলাপ এবং কোনও কোড নেই। প্রকৃত কোড প্রয়োগের উদাহরণগুলি কোথায়?

আমি এখানে এমন একটি নকশার প্রস্তাব দিচ্ছি যা আমি আশা করি যে লোকেরা অবদান রাখতে পারে এবং আশা করি এক্সটেনসিবল কৃতিত্ব সিস্টেমগুলিকে কোডিংয়ের জন্য একটি ভাল নকশা তৈরি করতে পারে। আমি বলছি না এটি সেরা, এটি থেকে অনেক দূরে, তবে এটি একটি সম্ভাব্য সূচনা ব্লক।

আপনার ধারণা অবদান নির্দ্বিধায় দয়া করে।


আমার সিস্টেম ডিজাইন ধারণা

মনে হচ্ছে সাধারণ sensক্যমত্যটি "ইভেন্ট ভিত্তিক সিস্টেম" তৈরি করা - যখনই কোনও পোস্ট তৈরি হওয়ার পরে মুছে ফেলার মতো কোনও ইভেন্ট ঘটে তখন তা ইভেন্ট শ্রেণিকে কল করে ..

$event->trigger('POST_CREATED', array('id' => 8));

ইভেন্ট শ্রেণিটির পরে এই ইভেন্টটির জন্য "শ্রবণ" কি ব্যাজগুলি তা খুঁজে বের requiresকরে এবং এটি সেই ফাইলটি করে এবং সেই শ্রেণীর উদাহরণ তৈরি করে, যেমন:

require '/badges/' . $file;
$badge = new $class;

এরপরে এটি যখন triggerডাকা হত তখন প্রাপ্ত ডেটা পাস করে ডিফল্ট ইভেন্টকে ;

$badge->default_event($data);

ব্যাজ

আসল যাদুটি তখনই ঘটে। একটি ব্যাজ দেওয়া উচিত কিনা তা নির্ধারণ করার জন্য প্রতিটি ব্যাজের নিজস্ব প্রশ্ন / যুক্তি রয়েছে। প্রতিটি ব্যাজ যেমন এই ফর্ম্যাটটি সেট করা আছে:

class Badge_Name extends Badge
{
 const _BADGE_500 = 'POST_500';
 const _BADGE_300 = 'POST_300';
 const _BADGE_100 = 'POST_100';

 function get_user_post_count()
 {
  $escaped_user_id = mysql_real_escape_string($this->user_id);

  $r = mysql_query("SELECT COUNT(*) FROM posts
                    WHERE userid='$escaped_user_id'");
  if ($row = mysql_fetch_row($r))
  {
   return $row[0];
  }
  return 0;
 }

 function default_event($data)
 {
  $post_count = $this->get_user_post_count();
  $this->try_award($post_count);
 }

 function try_award($post_count)
 {
  if ($post_count > 500)
  {
   $this->award(self::_BADGE_500);
  }
  else if ($post_count > 300)
  {
   $this->award(self::_BADGE_300);
  }
  else if ($post_count > 100)
  {
   $this->award(self::_BADGE_100);
  }

 }
}

awardফাংশনটি একটি বর্ধিত শ্রেণি থেকে আসে Badgeযা ব্যবহারকারীরা ইতিমধ্যে ব্যাজটি ডিজে টেবিল আপডেট করবে কিনা তা ইতিমধ্যে ব্যাজটি পুরষ্কার পেয়েছে কিনা তা পরীক্ষা করে দেখুন। ব্যাজ শ্রেণিটি ব্যবহারকারীর জন্য সমস্ত ব্যাজ পুনরুদ্ধার এবং এ্যারে এনে ফিরিয়ে দেওয়ার ক্ষেত্রেও যত্ন নেয় (যাতে ব্যাজগুলি উদাহরণস্বরূপ ব্যবহারকারীর প্রোফাইলে প্রদর্শিত হতে পারে)

ইতিমধ্যে যখন কোনও লাইভ সাইটে সিস্টেমটি প্রথম প্রথম প্রয়োগ করা হয় তখন কী হবে?

এখানে একটি "ক্রোন" জব ক্যোয়ারী রয়েছে যা প্রতিটি ব্যাজে যুক্ত হতে পারে। এর কারণ হ'ল কারণ যখন ব্যাজ সিস্টেমটি খুব প্রথম প্রয়োগ করা হয় এবং শুরু করা হয়, ইতিমধ্যে যে ব্যাজগুলি আয় করা উচিত ছিল এখনও পুরষ্কার দেওয়া হয়নি কারণ এটি একটি ইভেন্ট ভিত্তিক সিস্টেম। সুতরাং প্রতিটি ব্যাজ যা প্রয়োজন তা পুরষ্কারের দাবিতে একটি CRON কাজ চালিত হয়। উদাহরণস্বরূপ উপরের জন্য সিআরএন কাজটি দেখতে দেখতে পাবেন:

class Badge_Name_Cron extends Badge_Name
{

 function cron_job()
 {
  $r = mysql_query('SELECT COUNT(*) as post_count, user_id FROM posts');

  while ($obj = mysql_fetch_object($r))
  {
   $this->user_id = $obj->user_id; //make sure we're operating on the right user

   $this->try_award($obj->post_count);
  }
 }

}

উপরের ক্রোন শ্রেণিটি প্রধান ব্যাজ শ্রেণিকে প্রসারিত করায় এটি যুক্তি ফাংশনটি পুনরায় ব্যবহার করতে পারে try_award

আমি এর জন্য বিশেষায়িত ক্যোয়ারী তৈরি করার কারণটি হ'ল যদিও আমরা পূর্ববর্তী ইভেন্টগুলিকে "অনুকরণ" করতে পারি, অর্থাত্ প্রতিটি ব্যবহারকারীর পোস্টের মধ্য দিয়ে যেতে পারি এবং ইভেন্ট শ্রেণিটিকে ট্রিগার করতে পছন্দ $event->trigger()করি যেমন বিশেষ ধীরে ধীরে অনেক ব্যাজগুলির জন্য খুব ধীর হয়। সুতরাং আমরা পরিবর্তে একটি অনুকূলিত ক্যোয়ারী তৈরি করি।

কোন ব্যবহারকারী পুরষ্কার পায়? অন্যান্য পুরষ্কার প্রদান সম্পর্কেইভেন্টের ভিত্তিতে ব্যবহারকারীদের

Badgeবর্গ awardফাংশন উপর কাজ করে user_id- তারা সবসময় পুরস্কার দেওয়া হবে। ডিফল্টরূপে ব্যাজটি সেই ব্যক্তিকে দেওয়া হয় যিনি ইভেন্টটি ঘটানোর কারণ ঘটিয়েছেন যেমন সেশন ব্যবহারকারী আইডি (এটি default_eventফাংশনের ক্ষেত্রে সত্য , যদিও সিআরএন কাজটি অবশ্যই সমস্ত ব্যবহারকারী এবং পুরষ্কার পৃথক ব্যবহারকারীদের মধ্য দিয়ে যায়)

সুতরাং আসুন একটি উদাহরণ দেওয়া যাক, একটি কোডিং চ্যালেঞ্জ ওয়েবসাইট ব্যবহারকারীরা তাদের কোডিং এন্ট্রি জমা দিন। অ্যাডমিন তারপরে এন্ট্রিগুলি বিচার করে এবং শেষ হয়ে গেলে, সকলের জন্য দেখার জন্য চ্যালেঞ্জ পৃষ্ঠায় ফলাফল পোস্ট করে। এটি যখন ঘটে তখন একটি POSTED_RESULTS ইভেন্ট বলা হয়।

যদি আপনি পোস্ট করা সমস্ত এন্ট্রিগুলির জন্য ব্যাজ পুরষ্কার দিতে চান, তবে তাদের বলুন, যদি তাদের শীর্ষ 5 এর মধ্যে স্থান দেওয়া হয় তবে আপনার ক্রোন জবটি ব্যবহার করা উচিত (যদিও এটি বিবেচনায় না রেখে সমস্ত ব্যবহারকারীর জন্য আপডেট হবে, কেবলমাত্র সেই চ্যালেঞ্জের জন্য নয়) ফলাফল পোস্ট করা হয়েছিল)

আপনি যদি ক্রোন কাজের সাথে আপডেট করার জন্য আরও নির্দিষ্ট ক্ষেত্রকে লক্ষ্য করতে চান, আসুন ক্রোন জব অবজেক্টে ফিল্টারিং পরামিতি যুক্ত করার কোনও উপায় আছে কিনা তা দেখুন এবং সেগুলি ব্যবহার করার জন্য ক্রোন_জব ফাংশন পান। উদাহরণ স্বরূপ:

class Badge_Top5 extends Badge
{
   const _BADGE_NAME = 'top5';

   function try_award($position)
   {
     if ($position <= 5)
     {
       $this->award(self::_BADGE_NAME);
     }
   }
}

class Badge_Top5_Cron extends Badge_Top5
{
   function cron_job($challenge_id = 0)
   {
     $where = '';
     if ($challenge_id)
     {
       $escaped_challenge_id = mysql_real_escape_string($challenge_id);
       $where = "WHERE challenge_id = '$escaped_challenge_id'";
     }

     $r = mysql_query("SELECT position, user_id
                       FROM challenge_entries
                       $where");

    while ($obj = mysql_fetch_object($r))
   {
      $this->user_id = $obj->user_id; //award the correct user!
      $this->try_award($obj->position);
   }
}

প্যারামিটার সরবরাহ না করা হলেও ক্রোন ফাংশনটি এখনও কাজ করবে।


সম্পর্কিত (সম্ভবত সদৃশ): স্ট্যাকওভারফ্লো.com
গর্ডন

4
এটি সম্পর্কিত তবে সদৃশ নয়। দ্বিতীয় অনুচ্ছেদ পড়ুন দয়া করে। "এই ওয়েবসাইটে ব্যাজ / কৃতিত্ব সিস্টেমগুলি সম্পর্কে আমার প্রচুর আলাপের সাথে যে সমস্যাটি রয়েছে তা কেবল এটি - এটি সমস্ত আলাপ এবং কোনও কোড নেই the প্রকৃত কোড বাস্তবায়নের উদাহরণ কোথায়?"
গ্যারি সবুজ

4
ভাল, ওয়ার্কিং কোড লেখার একটি নির্দিষ্ট পরিমাণ পর্যন্ত কেবল সম্ভাব্য। আমি বলব যে লোকেরা কেবল আপনাকে তত্ত্বটি দেয়াই স্বাভাবিক, একবার যদি কোনও বাস্তবায়ন খুব জটিল হয়ে যায়।
গর্ডন

উত্তর:


9

আপনি যে কোনও দলিল ওরিয়েন্টেড ডাটাবেস কল করবেন এটি একবার আমি একটি পুরষ্কার সিস্টেম প্রয়োগ করেছি (এটি খেলোয়াড়দের জন্য একটি কাদা ছিল)। আমার বাস্তবায়ন থেকে কিছু হাইলাইট, পিএইচপি এবং মাইএসকিউএল অনুবাদ করা:

  • ব্যাজ সম্পর্কে প্রতিটি বিবরণ ব্যবহারকারীদের ডেটাতে সংরক্ষণ করা হয়। আপনি যদি মাইএসকিউএল ব্যবহার করেন তবে আমি নিশ্চিত হয়েছি যে পারফরম্যান্সের জন্য ডাটাবেসে ব্যবহারকারী প্রতিটি ডেটা এক রেকর্ডে রয়েছে।

  • প্রতিবার প্রশ্নে থাকা ব্যক্তি যখনই কিছু করেন, কোড ব্যাজ কোডটিকে একটি প্রদত্ত পতাকা দিয়ে ট্রিগার করে, উদাহরণস্বরূপ পতাকা ('POST_MESSAGE')।

  • একটি ইভেন্টও কাউন্টারকে ট্রিগার করতে পারে, উদাহরণস্বরূপ পোস্টের সংখ্যা সংখ্যা। বৃদ্ধি_কাউন্ট ('POST_MESSAGE')। এখানে আপনার একটি চেক থাকতে পারে (হয় কোনও হুক দ্বারা, বা কেবলমাত্র এই পদ্ধতিতে একটি পরীক্ষা করে নেওয়া হয়েছিল) যে যদি POST_MESSAGE গণনা> 300 হয় তবে আপনার একটি ব্যাজ দেওয়া উচিত, উদাহরণস্বরূপ: পতাকা ("300_POST")।

  • পতাকা পদ্ধতিতে, আমি ব্যাজগুলি পুরষ্কারের জন্য কোডটি রেখে দেব। উদাহরণস্বরূপ, যদি পতাকা 300_POST প্রেরণ করা হয়, তবে ব্যাজ পুরষ্কার_বেজ ("300_POST") কল করা উচিত।

  • পতাকা পদ্ধতিতে, আপনার ব্যবহারকারীর পূর্ববর্তী পতাকা উপস্থিত থাকা উচিত। সুতরাং আপনি বলতে পারেন যে যখন ব্যবহারকারীর কাছে FIRST_COMMENT, FIRST_POST, FIRST_READ আপনি ব্যাজ ("নতুন ব্যবহারকারী") দেন এবং আপনি যখন 100_COMMENT, 100_POST, 300_READ পেয়ে থাকেন তখন আপনি ব্যাজটি দিতে পারেন ("এক্সপ্রেইনস এডুসার")

  • এই সমস্ত পতাকা এবং ব্যাজ কোনও না কোনওভাবে সংরক্ষণ করা দরকার। পতাকাগুলি আপনি বিট হিসাবে মনে করেন এমন কোনও উপায়ে ব্যবহার করুন। আপনি যদি এটি সত্যিই দক্ষতার সাথে সঞ্চয় করতে চান তবে আপনি সেগুলি বিট হিসাবে মনে করেন এবং নীচের কোডটি ব্যবহার করেন: (অথবা আপনি যদি এই জটিলতা না চান তবে আপনি কেবল একটি খালি স্ট্রিং "000000001111000" ব্যবহার করতে পারেন)।

$achievments = 0;
$bits = sprintf("%032b", $achievements);

/* Set bit 10 */
$bits[10] = 1;

$achievements = bindec($bits);

print "Bits: $bits\n";
print "Achievements: $achievements\n";

/* Reload */

$bits = sprintf("%032b", $achievments);

/* Set bit 5 */
$bits[5] = 1;

$achievements = bindec($bits);

print "Bits: $bits\n";
print "Achievements: $achievements\n";
  • ব্যবহারকারীর জন্য একটি দস্তাবেজ সংরক্ষণ করার একটি দুর্দান্ত উপায় হ'ল জসন ব্যবহার করা এবং একক পাঠ্য কলামে ব্যবহারকারীদের ডেটা সংরক্ষণ করা। ডেটা সংরক্ষণ / পুনরুদ্ধার করতে json_encode এবং json_decode ব্যবহার করুন।

  • কিছু অন্যান্য ব্যবহারকারীর দ্বারা চালিত কিছু ব্যবহারকারীর ডেটার উপর ক্রিয়াকলাপ ট্র্যাকিংয়ের জন্য, আইটেমটিতে একটি ডেটা স্ট্রাকচার যুক্ত করুন এবং সেখানেও কাউন্টারগুলি ব্যবহার করুন। উদাহরণস্বরূপ পড়ুন গণনা। ব্যাজ পুরষ্কারের জন্য উপরে বর্ণিত একই কৌশলটি ব্যবহার করুন তবে অবশ্যই আপডেটটি ব্যবহারকারীদের পোস্টের মালিকানাধীন হওয়া উচিত। (উদাহরণস্বরূপ নিবন্ধটি 1000 বার ব্যাজ পড়ুন)।


4
ব্যাজ সিস্টেমে ক্লাসিক ট্রেন্ডটি হল আপনার টেবিলে নতুন পরিসংখ্যানগুলির জন্য একটি নতুন ক্ষেত্র যুক্ত করা। আমার কাছে, এটি কিছুটা সহজ উপায় এবং খারাপ ধারণা বলে মনে হচ্ছে কারণ আপনার স্টোরিং মিররড ডেটা যা ইতিমধ্যে টেবিলের ডেটা থেকে গণনা করা যেতে পারে (মাইআইএসএএম টেবিলগুলিতে খুব দ্রুত একটি সাধারণ COUNT (), যা 100% হবে নির্ভুল)। যদি পারফরম্যান্সটি আপনার লক্ষ্য ছিল, আপনাকে একটি আপডেট করতে হবে এবং কোনও বর্তমান ব্যাজ দেওয়া উচিত কিনা তা পরীক্ষা করার জন্য বর্তমান যেমন post_count মানটি নির্বাচন করতে হবে। আপনার কেবলমাত্র একটি ক্যোয়ারির প্রয়োজন হতে পারে, COUNT (*)। আমি আরও জটিল ডেটার জন্য সম্মত হচ্ছি যদিও ক্ষেত্রটি যুক্ত করার উপযুক্ত কারণ থাকবে
গ্যারি গ্রিন

4
@ গ্যারি গ্রিন এটি কেবল সহজেই বেরোনোর ​​উপায় নয়, এটি স্কেলযোগ্য উপায় এবং নথির ডাটাবেসের সাথেও সামঞ্জস্যপূর্ণ। নির্ভুলতার জন্য, আপনি ঠিক বলেছেন, যদিও ব্যাজ সিস্টেমের জন্য আমি এটির চেয়ে দ্রুত এবং সম্ভবত 100% সঠিক এবং ধীরের চেয়ে সঠিক হতে চাই। একটি একক গণনা সম্ভবত দ্রুত, তবে যখন আপনার সিস্টেমটি স্কেল করে এবং আপনার প্রচুর ব্যবহারকারী থাকে তখন কৌশলটি ধারণ করে না।
নুবো

4
আমি কেবল ব্যাজ সংজ্ঞা সারণী এবং ব্যবহারকারীদের ব্যাজ এবং তাদের বর্তমান অগ্রগতির সাথে লিঙ্ক করার জন্য একটি লিঙ্ক টেবিল রাখার ধারণাটি পছন্দ করি। এটি করার সময় নো এসকিউএল আপনাকে সেই সময়ে যে কোনও স্কিমায় লক করে এবং হঠাৎ ব্যাজগুলিতে টাইপগুলি পাওয়া গেলে বা 1000 টি নতুন ব্যাজ যুক্ত হয়ে যায় তা রক্ষণযোগ্য হয় না। আপনার কাছে সবসময় একটি ব্যাচ প্রক্রিয়া দ্রুত পুনরুদ্ধারের জন্য ডকুমেন্ট স্টোরের মধ্যে এটিকে ক্যাশে রাখতে পারে, তবে আমি লিঙ্কযুক্ত জিনিসগুলি রেখে দেব।
ফ্ল্যাওয়ারস্কেপ

2

ইউজারআইফিউজার একটি ওপেন সোর্স গ্যামিফিকেশন প্ল্যাটফর্ম যা একটি ব্যাজিং / পয়েন্ট পরিষেবা প্রয়োগ করে। আপনি এর এপিআই এখানে চেক করতে পারেন: http://code.google.com/p/userinfuser/wiki/API_ ডকুমেন্টেশন

আমি এটি বাস্তবায়ন করেছি এবং কার্যকারিতা সংখ্যা ন্যূনতম রাখার চেষ্টা করেছি। এখানে পিএইচপি ক্লায়েন্টের জন্য এপিআই রয়েছে:

class UserInfuser($account, $api_key)
{
    public function get_user_data($user_id);
    public function update_user($user_id);
    public function award_badge($badge_id, $user_id);
    public function remove_badge($badge_id, $user_id);
    public function award_points($user_id, $points_awarded);
    public function award_badge_points($badge_id, $user_id, $points_awarded, $points_required);
    public function get_widget($user_id, $widget_type);
}

শেষ ফলাফলটি উইজেটগুলি ব্যবহার করে অর্থবহ উপায়ে ডেটা প্রদর্শন করা। এই উইজেটগুলির মধ্যে রয়েছে: ট্রফি কেস, লিডারবোর্ড, মাইলফলক, লাইভ নোটিফিকেশন, র‌্যাঙ্ক এবং পয়েন্ট।

API- র প্রয়োগটি এখানে পাওয়া যাবে: http://code.google.com/p/userinfuser/source/browse/trunk/serverside/api/api.py


4
এই পিএইচপি ভিত্তিক? প্রশ্ন পিএইচপি ভিত্তিক
লেনিন রাজ রাজাসেকরন

4
এটিতে পিএইচপি বাইন্ডিং রয়েছে তবে সার্ভার সাইড কোডটি পাইথনে লেখা আছে।
নবরাজ চৌহান

0

অর্জনগুলি বোঝাজনক এবং আরও বেশি হতে পারে যদি আপনার পরে যদি এগুলি যোগ করতে হয় তবে আপনার একটি সুসংগঠিত Eventশ্রেণি না থাকলে।

এটি আমার সাফল্য বাস্তবায়নের কৌশলটির মধ্যে রয়েছে।

আমি প্রথমে এগুলিকে 'বিভাগে' ভাগ করতে চাই এবং এর মধ্যে সাফল্যের স্তর রয়েছে। অর্থাত্ একটি killsগেমের বিভাগে প্রথম কিলের জন্য 1, 10 দশটি কিল, 1000 হাজার কিল ইত্যাদির পুরষ্কার থাকতে পারে

তারপরে কোনও ভাল প্রয়োগের মেরুদণ্ডে, ক্লাসটি আপনার ইভেন্টগুলি পরিচালনা করছে। আবার হত্যার সাথে একটি খেলা কল্পনা করা; যখন কোনও খেলোয়াড় কিছু মারে, জিনিসগুলি ঘটে। হত্যাকাণ্ডটি উল্লেখ করা হয়েছে, ইত্যাদি এবং এটি সর্বোত্তমভাবে কেন্দ্রীভূত স্থানে পরিচালনা করা হয়েছে, যেমন এবং Eventsশ্রেণি যা জড়িত অন্যান্য জায়গাগুলিতে তথ্য প্রেরণ করতে পারে।

এটি পুরোপুরি সেখানে পড়ে যায়, সঠিক পদ্ধতিতে আপনার Achievementsক্লাসটি তাত্ক্ষণিকভাবে পরীক্ষা করুন এবং প্লেয়ারটি তার যথাযথ কারণে পরীক্ষা করে দেখুন।

বিল্ডিং হিসাবে Achievementsবর্গ এটা শুধু কিছু যদি খেলোয়াড় রয়েছে অনেক মেরে যেমন পরবর্তী কৃতিত্বের জন্য প্রয়োজন হয় যে চেক ডাটাবেসের দেখতে তুচ্ছ হয়।

আমি রেডিস ব্যবহার করে একটি বিটফিল্ডে ব্যবহারকারীর অর্জনগুলি সঞ্চয় করতে চাই তবে একই কৌশলটি মাইএসকিউএল ব্যবহার করা যেতে পারে। এটি হ'ল, আপনি খেলোয়াড়ের কৃতিত্বকে একটি হিসাবে সংরক্ষণ করতে পারেন intএবং তারপরে andআপনি যে অর্জন হিসাবে এটি সংজ্ঞা দিয়েছিলেন তার বিট দিয়ে তারা ইতিমধ্যে এটি অর্জন করেছে কিনা তা নির্ধারণ করে। এইভাবে এটি কেবল একটি একক ব্যবহার করেint ডাটাবেসে কলাম করে।

এর নেতিবাচক দিকটি হ'ল আপনার সেগুলি সুসংহত করতে হবে এবং আপনার কোডটিতে আপনার সম্ভবত কিছু মন্তব্য করতে হবে যাতে আপনি মনে করতে পারেন যে 2 correspond 14 এর সাথে কী সামঞ্জস্য হয়। যদি আপনার অর্জনগুলি তাদের নিজস্ব টেবিলে গণনা করা হয় তবে আপনি কেবল 2 2 pk করতে পারেন যেখানে pkসাফল্যের সারণির প্রাথমিক কী। এটি চেককে কিছু এমন করে তোলে

if(((2**$pk) & ($usersAchInt)) > 0){
  // fire off the giveAchievement() event 
} 

এইভাবে আপনি পরে সাফল্যগুলি যুক্ত করতে পারেন এবং এটি জরিমানা করবে না, ইতিমধ্যে পুরষ্কার প্রাপ্ত সাফল্যের প্রাথমিক কীটি কখনও পরিবর্তন করবেন না।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.