We’d like to remind Forumites to please avoid political debate on the Forum.
This is to keep it a safe and useful space for MoneySaving discussions. Threads that are – or become – political in nature may be removed in line with the Forum’s rules. Thank you for your understanding.
📨 Have you signed up to the Forum's new Email Digest yet? Get a selection of trending threads sent straight to your inbox daily, weekly or monthly!
Tampermonkey script for shinier comping
Dumdeedum
Posts: 42 Forumite
For ages now I've used a Tampermonkey script to adjust the competitions page to streamline things, just a few little quick tweaks to make life easier for myself, and with the redesign I decided to expand it out a bit. Still nothing too major, but enough I figured others might be interested. The full feature list is:

So how do you get this? Well you most likely don't, if you're baffled at the prospect of addons that run custom scripts then you shouldn't be installing ones handed out by random people on forums! However, if you're tech-savvy enough then here it is:
- Left & Right arrow keys load the prev/next pages
- The little < and > prev/next links are now "< Prev" or "Next >" for less fiddly clicking
- Small bugfix to remove the horizontal scroll in some browsers (the MSE nav bar is too wide, har!)
- Tracks the last 5000 comps you've listed and highlights any new ones in yellow
- If the "E: dd/mm" date is today or before it highlights it in red
- Rearranges the layout a bit to use more of the width

So how do you get this? Well you most likely don't, if you're baffled at the prospect of addons that run custom scripts then you shouldn't be installing ones handed out by random people on forums! However, if you're tech-savvy enough then here it is:
// ==UserScript==
// @name Spiffier Comp Time
// @namespace http://tampermonkey.net/
// @version 7
// @description Make the competitions time forum a bit more streamlined and usable
// @author Dumdeedum
// @match https://forums.moneysavingexpert.com/categories/competitions-time*
// @grant none
// @require https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js
// ==/UserScript==
(function() {
// tiny bugfix to prevent horizonal scroll on Chrome
$("nav.mse-navigation").css("width", "100%");
// better prev/next links
$("a.Previous").html("< Prev");
$("a.Next").html("Next >");
// right and left arrows for navigation
$(document).keyup(function(evnt) {
if((evnt.which == 37) || (evnt.which == 39)) {
if(evnt.which == 37) {
newurl = $("a.Previous").attr("href");
}
else {
newurl = $("a.Next").attr("href");
}
evnt.preventDefault();
document.location.assign(newurl);
}
});
// get/set our seen competitions array
var seenComps = localStorage.getItem("seenComps");
// found it, convert to array
if(seenComps) {
seenComps = JSON.parse(seenComps);
}
// didn't find, create a new blank one
else {
seenComps = [];
}
// date object for playing with in places below
var rightNow = new Date();
// and another date object for today, ie. 00:00:00.0
var today = new Date(rightNow.getTime());
today.setHours(0, 0, 0, 0);
// regular expression for tinkering with comp end dates found in titles
var compEndDateRE = /^e:\s*([0-9]{1,2})\/([0-9]{1,2})(?:\/([0-9]{2}))?/i
// run through each competition listed
$("li.ItemDiscussion").not(".Announcement").each(function() {
// pick out some info we might need
var compID = $(this).attr("id");
var compViews = $("span.ViewCount", this).first().text();
var compReplies = $("span.CommentCount", this).first().text();
var compLastCommentDate = $("span.LastCommentDate > time", this).first().text();
var compLastCommentDateTime = $("span.LastCommentDate > time", this).first().attr("datetime");
// hey look it's a comp we haven't seen before
if(seenComps.indexOf(compID) == -1) {
// highlight this listing
$(this).css("background-color", "#fff2c6");
// remember that we've seen it
seenComps.push(compID);
}
// hide the info stuff on the right, it's just taking up space
$("div.DiscussionMeta", this).hide();
// and with the new space, stretch the main title over
$("div.Discussion", this).css("width", "100%");
// and bump the skipped/entered label over too
$("span.CompetitionStatus", this).css("right", "20px");
// hide the ugly-!!!!!! "new posts" box
$("strong.HasNew").hide();
// rejigger the info line
$("span.FirstCommentBy", this).prepend("By ").append(" | " + compViews + " | " + compReplies + " | " + compLastCommentDate).css("color", "#6f6f6f");
$("span.FirstCommentBy a", this).css({"font-size" : "14px", "font-weight" : "bold"});
// investigate the competition title
var compTitle = $("div.Title a", this).text();
// if the title is following the standard "E: dd/mm" format (optional /yy), investigate further
var compTitleMatches;
if(compTitleMatches = compTitle.match(compEndDateRE)) {
var compTitleDay = parseInt(compTitleMatches[1], 10);
var compTitleMonth = parseInt(compTitleMatches[2], 10);
// assume the end year is this year to begin with
var compTitleYear = rightNow.getFullYear();
// oh, unless they've specifically set it, then use that
if(typeof compTitleMatches[3] !== "undefined") {
compTitleYear = 2000 + parseInt(compTitleMatches[3], 10);
}
// wait, if it's more than 6 months behind our current month then assume they mean next year
else if((rightNow.getMonth() + 1) - compTitleMonth > 6) {
compTitleYear = rightNow.getFullYear() + 1;
}
// make an end comp date object already
var compEndDate = new Date(compTitleYear, compTitleMonth - 1, compTitleDay);
// if the end date is today or before
if(compEndDate <= today) {
// make a new title and slot it in place
var compTitleNew = compTitle.replace(compEndDateRE, "<span style='color:red'>" + compTitleMatches[0] + "</span>");
$("div.Title a", this).html(compTitleNew);
}
}
});
// crop the seen competitions list to, oh, 5000? seems like enough? Tweak down if it becomes a resource hog
var seenCompsMax = 5000;
if(seenComps.length > seenCompsMax) {
seenComps = seenComps.slice(seenCompsMax * -1);
}
// save the seen competitions list
localStorage.setItem("seenComps", JSON.stringify(seenComps));
})();Use at your own risk. Do with whatever you want. Probably not too many horrible bugs. Probably. Maybe. Install instructions deliberately not given to weed out people who shouldn't be tinkering with such things. 1
This discussion has been closed.
Confirm your email address to Create Threads and Reply
Categories
- All Categories
- 352.4K Banking & Borrowing
- 253.7K Reduce Debt & Boost Income
- 454.4K Spending & Discounts
- 245.4K Work, Benefits & Business
- 601.2K Mortgages, Homes & Bills
- 177.6K Life & Family
- 259.3K Travel & Transport
- 1.5M Hobbies & Leisure
- 16K Discuss & Feedback
- 37.7K Read-Only Boards