Top Contributors of the Month

Top Contributors of the Month [Paid] v2.1.7

No permission to buy ($30.00)
So, if I set the⁣ Ranking metric for top contributors to "Trophy Points", the counting is now hybrid too, and the points will be taken from the TrophyEssentials add-on?

Sample from the points here for every action:

5 points for best solution, 1 point for posting new thread, 0.20 for a Positive reaction, etc.
 
@rdn,

Let me clarify how Top Contributors of the Month works with M2N/TrophyEssentials for awarding points and ranking users.

When M2N/TrophyEssentials is installed, the add-on awards cumulative trophies for 1st, 2nd, and 3rd place each month. If a user keeps getting 1st place, they’ll earn the points set for the 1st place cumulative trophy every month they achieve it. The same goes for 2nd or 3rd place—they’ll accumulate the points for those trophies each time they rank there. These points show up on the user’s trophy page under the “Cumulative Trophies” section, so you can see their total points for each ranking over time.

For determining who gets 1st, 2nd, or 3rd place each month, the add-on uses the “Ranking metric” you set in the add-on options. If you choose “Trophy Points” as the metric, it only counts the standard XenForo trophy points earned by users in the past month (the same points displayed in the Top Contributors widget). It does not include the cumulative points from M2N/TrophyEssentials for ranking purposes. For example, points from actions like best solution or new thread (as shown on your trophies page) won’t affect the 1st, 2nd, or 3rd place rankings if you’re using the “Trophy Points” metric.

If you want to rank users based on post count instead, you can set the metric to “Posts” in the options, and it will use the number of posts from the past month, as shown in the widget.

Hopefully, this clears up how the points and rankings work!
 
Last edited:
I think setting the scoring metric to "Trophy points" is a bad idea, because you're giving past months’ winners users' trophy points for winning, which gives them an advantage in the next month.

Why not keep the scoring metric as a hybrid based on [Threads, Posts, Reactions], and then award users trophy points after they win? This way, you're encouraging users to actually create content, start threads, and receive positive reactions, without giving past winners a built-in edge going forward.

Just my two cents...
 
Last edited:
  • Like
Reactions: rdn
I would much prefer an option to include ranking by total trophy points, including cumulative and milestone.
 
You should also add a feature for the others in a predefined listed output.

1st , 2nd and 3rd already have a badge but if our widget has a limitaiton of 10 outputted, why not have another option for the 4th/10th as well. This would encourage user activity further. The badge only has to state Monthly Contributor or similar.
 
there is no way to disable a reoccuring subscription.

@MentaL, first off:
  • Please remove your massive image when you have a minute, if it's not too much trouble and you still have access to do so.
  • PM me in the future about customer/site/purchase related details.
Second, you simply need to visit "Subscriptions" (not payment methods), and click "Cancel" (to indefinitely cancel your subscription), or "Suspend", to temporarily suspend your subscription. The options are available 24 hours after purchase.
 
Last edited:
This looks very promising!

Our site is rather much on photos.
Could this be used for XFMG only?
I'll consider your suggestion in the future, I'm just in the midst of locking down the core features I want to support. Appreciate the suggestion though.
 
1st , 2nd and 3rd already have a badge but if our widget has a limitaiton of 10 outputted, why not have another option for the 4th/10th as well. This would encourage user activity further. The badge only has to state Monthly Contributor or similar.
Okay. "Runner-up" badges. I'll see about it.
 
I tried sorting by Trophy points and got this error on the member ranking page:


SELECT COUNT(*) AS total
FROM (
SELECT DISTINCT xf_user_trophy.user_id
FROM xf_user_trophy
LEFT JOIN xf_user ON (xf_user_trophy.user_id = xf_user.user_id)
WHERE xf_user_trophy.award_date >= 1751328000 AND xf_user_trophy.award_date < 1753670705 AND xf_user_trophy.user_id > 0
GROUP BY xf_user_trophy.user_id
ORDER BY SUM(xf_user_trophy.trophy_points) DESC, xf_user_trophy.user_id DESC
LIMIT 200
) AS limited_users
------------

XF\Db\Exception: MySQL statement prepare error [1054]: Unknown column 'xf_user_trophy.trophy_points' in 'ORDER BY' in src/XF/Db/AbstractStatement.php at line 230

  1. XF\Db\AbstractStatement->getException() in src/XF/Db/Mysqli/Statement.php at line 207
  2. XF\Db\Mysqli\Statement->getException() in src/XF/Db/Mysqli/Statement.php at line 43
  3. XF\Db\Mysqli\Statement->prepare() in src/XF/Db/Mysqli/Statement.php at line 61
  4. XF\Db\Mysqli\Statement->execute() in src/XF/Db/AbstractAdapter.php at line 96
  5. XF\Db\AbstractAdapter->query() in src/XF/Db/AbstractAdapter.php at line 152
  6. XF\Db\AbstractAdapter->fetchOne() in src/addons/Wutime/TopContributors/Pub/Controller/TopContributors.php at line 75
  7. Wutime\TopContributors\Pub\Controller\TopContributors->actionIndex() in src/XF/Mvc/Dispatcher.php at line 362
  8. XF\Mvc\Dispatcher->dispatchClass() in src/XF/Mvc/Dispatcher.php at line 264
  9. XF\Mvc\Dispatcher->dispatchFromMatch() in src/XF/Mvc/Dispatcher.php at line 121
  10. XF\Mvc\Dispatcher->dispatchLoop() in src/XF/Mvc/Dispatcher.php at line 63
  11. XF\Mvc\Dispatcher->run() in src/XF/App.php at line 2824
  12. XF\App->run() in src/XF.php at line 806
  13. XF::runApp() in index.php at line 23
 
Last edited:
Thank you.

I have another suggestion. Could you add an option to replace the user banner with an icon next to the username? Could add a tooltip as well.
Screenshot 2025-07-28 at 11-28-03 Discussion - Wreckfest 2 altBoards.webpScreenshot 2025-07-28 at 11-29-50 Matthew altBoards.webp
 
For anyone on the fence about this add-on, I would highly recommend purchasing. You can use this along with other add-ons as a makeshift gamification system.

Add-ons I'm using:
Top Contributors of the Month
Using this add-on as the base. I have the monthly leaderboard set up as it's own page and minor customizations with ranking by trophy points (after the current bug above is fixed)
Screenshot 2025-07-28 at 12-32-18 Top monthly contributors altBoards.webp

And of course 1st, 2nd, 3rd place are awarded trophy points on a monthly basis with Trophy Essentials

M2N Trophy Essentials
This add-on is essential for ongoing trophy points for user actions to contribute to the monthly leaderboard.

Screenshot 2025-07-28 at 12-59-51 Trophies altBoards.webp

[XB] Badges
I recommend using Badges for community ranks. As users accumulate more trophy points, their rank increases. My setup is straight from IC5 (I own a license). Will probably change these later, but it works for now. Set up yours however you want it.
Screenshot 2025-07-28 at 13-07-07 Badges altBoards.webp

[XB] Daily Login Streak
This one isn't required but it does reward trophy points for daily, weekly, monthly, and yearly login streaks. Incentivizes your users to visit your forum every day.

Screenshot 2025-07-28 at 13-08-47 Daily login streaks altBoards.webp

All these add-ons are tied together via one navigation tab to appear as a single system.
Screenshot 2025-07-28 at 13-10-11 Daily login streaks altBoards.webp
 
Last edited:
Just got a ton these errors after it tried to run a cron job

Code:
ErrorException: Unable to rebuild cumulative trophy (wutc_top_contributor_3) because rebuild method (rebuildWutcTopContributor3) cannot be found. src/XF/Error.php:81

Generated by: Matthew Jul 28, 2025 at 4:17 PM

Stack trace

#0 src/XF.php(266): XF\Error->logError('Unable to rebui...', false)
#1 src/addons/M2N/TrophyEssentials/Repository/CumulativeTrophy.php(66): XF::logError('Unable to rebui...')
#2 src/addons/M2N/TrophyEssentials/Job/CumulativeTrophyRebuild.php(109): M2N\TrophyEssentials\Repository\CumulativeTrophy->rebuildCumulativeTrophy(Object(M2N\TrophyEssentials\Entity\CumulativeTrophy), Object(SV\DailyStatistics\XF\Entity\User))
#3 src/addons/M2N/TrophyEssentials/Job/CumulativeTrophyRebuild.php(42): M2N\TrophyEssentials\Job\CumulativeTrophyRebuild->rebuildById(19)
#4 src/XF/Job/Manager.php(275): M2N\TrophyEssentials\Job\CumulativeTrophyRebuild->run(8)
#5 src/XF/Job/Manager.php(205): XF\Job\Manager->runJobInternal(Array, 8)
#6 src/XF/Job/Manager.php(121): XF\Job\Manager->runJobEntry(Array, 8)
#7 src/XF/Admin/Controller/ToolsController.php(146): XF\Job\Manager->runByIds(Array, 8)
#8 src/XF/Mvc/Dispatcher.php(362): XF\Admin\Controller\ToolsController->actionRunJob(Object(XF\Mvc\ParameterBag))
#9 src/XF/Mvc/Dispatcher.php(264): XF\Mvc\Dispatcher->dispatchClass('XF:Tools', 'RunJob', Object(XF\Mvc\RouteMatch), Object(SV\UserMentionsImprovements\XF\Admin\Controller\Tools), NULL)
#10 src/XF/Mvc/Dispatcher.php(121): XF\Mvc\Dispatcher->dispatchFromMatch(Object(XF\Mvc\RouteMatch), Object(SV\UserMentionsImprovements\XF\Admin\Controller\Tools), NULL)
#11 src/XF/Mvc/Dispatcher.php(63): XF\Mvc\Dispatcher->dispatchLoop(Object(XF\Mvc\RouteMatch))
#12 src/XF/App.php(2824): XF\Mvc\Dispatcher->run()
#13 src/XF.php(806): XF\App->run()
#14 admin.php(15): XF::runApp('XF\\Admin\\App')
#15 {main}

Request state

array(4) {
  ["url"] => string(24) "/admin.php?tools/run-job"
  ["referrer"] => string(116) "https://xyz..com/admin.php?tools/run-job&only_id=18404&_xfRedirect=%2Fadmin.php%3Ftools%2Frebuild%26success%3D1"
  ["_GET"] => array(1) {
    ["tools/run-job"] => string(0) ""
  }
  ["_POST"] => array(3) {
    ["_xfRedirect"] => string(55) "https://xyz.com/admin.php?tools/rebuild&success=1"
    ["_xfToken"] => string(8) "********"
    ["only_ids"] => string(5) "18404"
  }
}

Screenshot 2025-07-28 at 18-48-58 Server error log altBoards - Admin control panel.webp
 
Wutime updated Top Contributors of the Month with a new update entry:

v2.1.0

  • New: Current month User-banners for X runner-ups!
  • New: Scoring metric "Hybrid: Thread Replies Received + Posts Made"
  • New: Allow milestone trophy awards & cumulative awards simulataneously!
  • New: Option to set the Minimum Year to Display in results
  • New: Option to set the number of decimals to display on points rendering
  • New: Add style properties for light/dark colours of 1st, 2nd, 3rd place banner icons
  • New: Rebuild trophy awards for TCM (milestone awards +...

Read the rest of this update entry...
 
Awesome update!
Just upgraded and got this error afterwards:

  • ErrorException: Failed to insert cumulative trophy definition wutc_top_contributor_3: Phrase titles must be unique in a language. The specified phrase is already in use.
  • src/XF/Error.php:81
  • Generated by: Matthew
  • Jul 28, 2025 at 8:48 PM

Stack trace​


#0 src/XF.php(266): XF\Error->logError('Failed to inser...', false)
#1 src/addons/Wutime/TopContributors/Helper/M2N_TrophyEssentials_Helper.php(99): XF::logError('Failed to inser...')
#2 src/addons/Wutime/TopContributors/Setup.php(90): Wutime\TopContributors\Helper\M2N_TrophyEssentials_Helper::insertCumulativeTrophyDefinitions()
#3 src/addons/Wutime/TopContributors/Setup.php(157): Wutime\TopContributors\Setup->installStep1()
#4 src/XF/AddOn/StepRunnerUpgradeTrait.php(124): Wutime\TopContributors\Setup->upgrade2000400Step1(Array)
#5 src/XF/AddOn/StepRunnerUpgradeTrait.php(73): Wutime\TopContributors\Setup->upgradeStepRunner(2000400, 1, Array, NULL)
#6 src/XF/Job/AddOnInstallBatch.php(301): Wutime\TopContributors\Setup->upgrade(Array)
#7 src/XF/Job/AddOnInstallBatch.php(95): XF\Job\AddOnInstallBatch->stepAction(Object(XF\Timer))
#8 src/XF/Job/Manager.php(275): XF\Job\AddOnInstallBatch->run(8)
#9 src/XF/Job/Manager.php(205): XF\Job\Manager->runJobInternal(Array, 8)
#10 src/XF/Job/Manager.php(121): XF\Job\Manager->runJobEntry(Array, 8)
#11 src/XF/Admin/Controller/ToolsController.php(146): XF\Job\Manager->runByIds(Array, 8)
#12 src/XF/Mvc/Dispatcher.php(362): XF\Admin\Controller\ToolsController->actionRunJob(Object(XF\Mvc\ParameterBag))
#13 src/XF/Mvc/Dispatcher.php(264): XF\Mvc\Dispatcher->dispatchClass('XF:Tools', 'RunJob', Object(XF\Mvc\RouteMatch), Object(SV\UserMentionsImprovements\XF\Admin\Controller\Tools), NULL)
#14 src/XF/Mvc/Dispatcher.php(121): XF\Mvc\Dispatcher->dispatchFromMatch(Object(XF\Mvc\RouteMatch), Object(SV\UserMentionsImprovements\XF\Admin\Controller\Tools), NULL)
#15 src/XF/Mvc/Dispatcher.php(63): XF\Mvc\Dispatcher->dispatchLoop(Object(XF\Mvc\RouteMatch))
#16 src/XF/App.php(2824): XF\Mvc\Dispatcher->run()
#17 src/XF.php(806): XF\App->run()
#18 admin.php(15): XF::runApp('XF\\Admin\\App')
#19 {main}

Screenshot 2025-07-28 at 20-51-02 Server error log altBoards - Admin control panel.webp
 
Back
Top Bottom