views:

115

answers:

2

Hi folks,

I was working on a project a few months ago, and had the need to implement an award system. Similar to S*tackOverflow's badge system*. Badges

I might have not implemented it in the best possible way, and I am curious what your say in it would be.


What would a good way to track user activities, needed for badge awarding be?

Stackoverflow's system needs to know of a lot of information, and I also get the impression that there would be a lot of data processing complicating things.

I would assume that SO calculates badges once or twice every 24, and that maybe logs are stored or a server dedicated to badge calculation.


Thoughts?

+2  A: 

I don't think is as complicated as you think. I highly doubt that SO calculates badges with some kind of user activity log (although technically the entire database is a user activity log). When I look at the lists of badges, I don't see anything that can't be implemented by running a SQL select query.

Some of the queries could be pretty complicated, and there might be some sort of fancy caching mechanism, but I don't see any reason why you would have to calculate badges in batches.

mikerobi
yes you are right about the SQL queries, I was actually thinking more about badges based on activity. e.g. calculating that a person visits a certain page frequently
RadiantHex
@RadiantHex, in that case you would have to log page hits. I would advise against issuing badges based on page views, it is too easy to manipulate.
mikerobi
@mike very much appreciated mike :)
RadiantHex
A: 

In general badge/point systems can be based on two things.

  • Activity log of interesting events, this is effectively the paper register receipt of what has happend such that you can re-compute from the ground up if it's ever needed. Can be as simple as (user_id, timestamp, event_id, event_detail)

  • Most of the time you've pre-designed your scoring/point system so you know exactly which counters to keep on a user. Now it's as simple as having a big record that contains all of the details. (user_id, reply_points, login_points, last_login, thumbs_up_points, etc.,etc.)

Now you can slap some simple methods on that model object and have it manage/store the points as needed.

koblas