So I’m wanting to setup an achievements system on my site. People perform tasks and upload this information which is then stored in a database (think ‘time’, ‘date’, ‘task’, etc.). What would be the best method of checking their information and awarding achievements? Would I just have like an achievement.php that once information is uploaded it would trigger this document to run through all the checks to determine if the user needs to be awarded an achievement? Or is there something server side I should set up to award the user?
Thanks for any help or suggestions, comments, etc. 😀
EDIT: I currently have the achievements listed in the database, (id, name, class)
Tasks are stored as (‘date_time’,’time’,’device’,’user_id[fk]’)
EDIT 2: Also many achievements will be calculated based on not only the tasks the user is currently submitting but takes into account previous tasks in addition to the newly added task. EX: If the user has completed 3 tasks within 3 consecutive days, then they will be awarded for it
it really depends on where your preference for business logic placement lies, and how real time you want acheivements to be. if you’re looking to offload a bunch of business logic on you sql server, put it in a stored procedure, otherwise, class out the calculations into a class in php, and use that class to determine what new achievements have been.
i would definitely suggest doing the processing outside of the normal page response. perhaps kick off a server-side call to the php cli, or set up a cron job to run all individuals through a check for achievements at a certain interval.
edit:
as for the actual methods of awarding achievements, i would think you’re most flexible and simple implementation (you will find more simple/less flexible and more flexible/less simple options i’m sure) would be to create an AwardRunner class, an IAward interface and a bunch of individual implementations of IAward for each award you have. the basic idea would be something like:
i would think the idea of what the IAward interface would look like would be pretty clear from the usage, though you’d probably add to it the Id field from your table so it would be able to insert itself into the database, as would the way to call the AwardRunner class.
this idea should work whether you have something batching the awards process looping through all your users, or just fire it off after every task submission.