Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to implement badges?

I've given some thought to implementing badges (just like the badges here on Stack Overflow) and think it would be difficult without Windows services, but I'd like to avoid that if possible.

I came up with a plan to implement some examples:

  • Audobiographer: Check if all fields in the profile is filled out.
  • Commentor: When making a comment check if the number of comments equal 10, if so award the badge.
  • Good Answer: When voting up check to see if vote score is 25 or higher.

How could this be implemented in the database? Or would another way be better?

like image 951
Luke101 Avatar asked Jul 01 '10 23:07

Luke101


People also ask

What do you think is the purpose of badges?

Awarded by institutions, organizations, groups, or individuals, badges signify accomplishments such as completion of a project, mastery of a skill, or marks of experience.

How do you display digital badges?

upload badges to store on their site with three options (via image, link, or JSON) clean, professional interface. several, one-click options for sharing individual badges via link, through embedding, or on social media (Facebook, LinkedIn, Twitter, and/or Pinterest)


1 Answers

A similar-to-Stackoverflow implementation is actually a lot simpler than you have described, based on bits of info dropped by the team every once in awhile.

In the database, you simply store a collection of BadgeID-UserID pairs to track who has what (and a count or a rowID to allow multiple awards for some badges).

In the application, there is a worker object for each badge type. The object is in cache, and when the cache expires, the worker runs its own logic for determining who should get the badge and making the updates, and then it re-inserts itself into the cache:

public abstract class BadgeJob {     protected BadgeJob()     {         //start cycling on initialization         Insert();     }      //override to provide specific badge logic     protected abstract void AwardBadges();      //how long to wait between iterations     protected abstract TimeSpan Interval { get; }      private void Callback(string key, object value, CacheItemRemovedReason reason)     {         if (reason == CacheItemRemovedReason.Expired)         {             this.AwardBadges();             this.Insert();         }     }      private void Insert()     {         HttpRuntime.Cache.Add(this.GetType().ToString(),             this,             null,             Cache.NoAbsoluteExpiration,             this.Interval,             CacheItemPriority.Normal,             this.Callback);     } } 

And a concrete implementation:

public class CommenterBadge : BadgeJob {     public CommenterBadge() : base() { }      protected override void AwardBadges()     {         //select all users who have more than x comments          //and dont have the commenter badge         //add badges     }      //run every 10 minutes     protected override TimeSpan Interval     {         get { return new TimeSpan(0,10,0); }     } } 
like image 69
Rex M Avatar answered Oct 07 '22 17:10

Rex M