10th Anniversary Art Event

Salamenace
Pixel Perfection - I still call her Lightning Bolt
Silly Pony - Celebrated the 13th anniversary of MLP:FIM, and 40 years of MLP!
Shimmering Smile - Celebrated the 10th anniversary of Equestria Girls!
Solar Supporter - Fought against the New Lunar Republic rebellion on the side of the Solar Deity (April Fools 2023).
Flower Trio - Helped others get their OC into the 2023 Derpibooru Collab.
Crystal Roseluck - Had their OC in the 2023 Derpibooru Collab.
A Lovely Nightmare Night - Celebrated the 12th anniversary of MLP:FIM!
Princess of Love - Extra special version for those who participated in the Canterlot Wedding 10th anniversary event by contributing art.
Tree of Harmony - Drew someone's OC for the 2022 Community Collab
Elements of Harmony - Had an OC in the 2022 Community Collab

Crossover Specialist
Right now, i’ve finished awarding all badges to images from before October 16.
There’s still the rest to go, of course.
 
I’m sorry, but you missed one user.
 
I posted my entry at least 45 minutes before the deadline posted in the opening post, so I should be granted a badge.
saby
Pixel Perfection - I still call her Lightning Bolt
Solar Supporter - Fought against the New Lunar Republic rebellion on the side of the Solar Deity (April Fools 2023).
An Artist Who Rocks - 100+ images under their artist tag
King Sombra - Celebrated the 10th anniversary of The Crystal Empire!
A Lovely Nightmare Night - Celebrated the 12th anniversary of MLP:FIM!
A Perfectly Normal Pony - Red is Sprout, yellow is Hitch, you are a lout, and also a bitch.
Speaking Fancy - Badge given to members that help with translations
Tree of Harmony - Drew someone's OC for the 2022 Community Collab
Elements of Harmony - Had an OC in the 2022 Community Collab
Non-Fungible Trixie -

Moderator
extra fun at parties
@Mildgyth  
I have been informed that mass-badging is usually done by compliling a list of usernames and running a script. It’s probably late to suggest this, but considering what a massive load of work it is, wouldn’t it make sense to start listing relevant names page by page when entries start coming in, dividing the workload over the course of the event, rather than do everything in a massive marathon after the deadline?
 
You do you, of course. Just mentioning this because I think it could save hours of your time and some repetitive stress discomfort in your clicking finger.
Ciaran
ラ・ゼッタ - For supporting the site
Pixel Perfection - I still call her Lightning Bolt
Silly Pony - Celebrated the 13th anniversary of MLP:FIM, and 40 years of MLP!
Shimmering Smile - Celebrated the 10th anniversary of Equestria Girls!
Lunar Guardian - Earned a place among the ranks of the most loyal New Lunar Republic soldiers (April Fools 2023).
Crystal Roseluck - Had their OC in the 2023 Derpibooru Collab.
Flower Trio - Helped others get their OC into the 2023 Derpibooru Collab.
A Lovely Nightmare Night - Celebrated the 12th anniversary of MLP:FIM!
Princess of Love - Extra special version for those who participated in the Canterlot Wedding 10th anniversary event by contributing art.
Tree of Harmony - Drew someone's OC for the 2022 Community Collab

Senior Moderator
友情は魔法だ
@saby  
Doing them with a script is possible, but someone still needs to create the list. In some cases, especially with some of these anniversary events, it’s easier to just work through the entries by hand and do them one at a time.
 
And anything involving badges for artists versus other badges for participants and uploaders … those are the really hard ones to sort through. Like, the April Fools badges sometimes get super tricky to sort out sometimes, when you get entires without artists where maybe the uploader is the artist but hasn’t been verified yet … or someone uploads someone else’s image but that tag isn’t tied to a profile, or an image was a collaboration.
 
So, yeah, it can be automated, but even then there’s still a lot of manual work involved.
 
IIRC the last April Fools badges we largely automated, but there were still hundreds of exceptions that had to be figured out by hand.
ZippySqrl
HARD WERK - Merited Perfect Pony Plot Provider badge with only their own art and really hates Applejack
Solar Supporter - Fought against the New Lunar Republic rebellion on the side of the Solar Deity (April Fools 2023).
Preenhub - We all know what you were up to this evening~
Twinkling Balloon - Took part in the 2021 community collab.
Friendship, Art, and Magic (2020) - Took part in the 2020 Community Collab
The Magic of Friendship Grows - For helping others attend the 2020 Community Collab
Lady's Wink -
Toola Roola - For helping others attend the 2019 Community Collab
Wallet After Summer Sale -
Friendship, Art, and Magic (2019) - Celebrated Derpibooru's seventh year anniversary with friends

Tired Artist
Yeah, there is always the possibility for edge cases that wouldn’t be programmatically detectable, that have to be reviewed by a human, so automating it really isn’t an option.  
Maybe in the year 2050 or whenever human-level AI is a thing, when robots can make literally everything for us.
Jb33124
Starlight Glimmer - For supporting the site
Starlight Glimmer - For supporting the site
Happy Derpy! - For site supporters
Silver Supporter - Silver Supporter
Pixel Perfection - Hot Pockets Spotted
Lunar Supporter - Helped forge New Lunar Republic's freedom in the face of the Solar Empire's oppressive tyrannical regime (April Fools 2023).
Crystal Roseluck - Had their OC in the 2023 Derpibooru Collab.
Non-Fungible Trixie -
Preenhub - We all know what you were up to this evening~
My Little Pony - 1992 Edition

Gaining Confidence
I’m just happy enough waiting for the badge. Some might complain about not getting it immediately, but to ne, it takes as long it takes. Hey admins! Take your time! Don’t rust distribution!
Ciaran
ラ・ゼッタ - For supporting the site
Pixel Perfection - I still call her Lightning Bolt
Silly Pony - Celebrated the 13th anniversary of MLP:FIM, and 40 years of MLP!
Shimmering Smile - Celebrated the 10th anniversary of Equestria Girls!
Lunar Guardian - Earned a place among the ranks of the most loyal New Lunar Republic soldiers (April Fools 2023).
Crystal Roseluck - Had their OC in the 2023 Derpibooru Collab.
Flower Trio - Helped others get their OC into the 2023 Derpibooru Collab.
A Lovely Nightmare Night - Celebrated the 12th anniversary of MLP:FIM!
Princess of Love - Extra special version for those who participated in the Canterlot Wedding 10th anniversary event by contributing art.
Tree of Harmony - Drew someone's OC for the 2022 Community Collab

Senior Moderator
友情は魔法だ
@saby  
That’s where a lot of the time goes though. Like, if it’s 2 minutes per badge, finding candidates and validating that they should receive the badge is the bulk of the work, and actuallly assigning the badge to the profile is just 10 to 15 seconds. Less if the dev team is involved.
 
Doing it with a script is a great idea, but it’s not always the most efficacious way to get it done. A lot of it depends on who is in the team doing it.
 
Like, sometimes there is a placeholder badge, like you suggested, or a developer will change the order of the badges in the mod tools so it’s on the top of the list so you don’t have to scroll through the list to assign them.
 
Ideally, you have a situation where you can just script “profile associated with artist tag on images with this tag” and Bob’s your uncle.
 
But sometimes, with things like this event, the person coordinating it is going to be doing a lot of work by hand.
 
I wish I could help, but this time I can’t. Maybe next time.
 
@ZippySqrl  
Yeah, there was one badge, I don’t remember which one it was, but there was a bunch of edge cases that we actually made separate projects to try to sort out. Some of them took days to figure out. Might have been April Fools - I just remember having to re-validate some artists and sending PMs to uploaders to figure out where some of the qualifying images’ badges were supposed to go.
 
@Mildgyth  
Again, thank you for taking care of all this. Wish I could help, but maybe next time :)
Background Pony #B5FC
@saby
 
@Ciaran  
I’m with saby there. You should consider that.
 
and actuallly assigning the badge to the profile is just 10 to 15 seconds. Less if the dev team is involved.
 
That’s still 10-15 seconds hundreds of times… removing this step seems very much desirable.
 
As for the manual checking: You could make a browser userscript to ease the list-compiling big time though.  
On the upload page ( like >>2387665 , just using the very first one) you could add two buttons  
“Add UPLOADER account to list”  
“Add TAGGED ARTIST(s) to list” <- maybe enable selection of which artist(s) if there are more than one. Then the script checks if that artist account has a derpibooru account associated with it and uses that.  
And then when that upload is checked, Mildgyth would just need to click the right button when it’s figured out who needs to get the badge which is then stored in a list for the userscript.  
Then add two buttons to load and store the list so it can be used in the award-all-these-accounts-the-badge-script or passed on to someone else
 
This would be seriously easy to do, with how tech savy our community is I bet many here could code that in a few minutes
 
x Worst case when neither option works is still adding the badge manually to the right person. But this would still be a step up from having to do them ALL manually.
Ciaran
ラ・ゼッタ - For supporting the site
Pixel Perfection - I still call her Lightning Bolt
Silly Pony - Celebrated the 13th anniversary of MLP:FIM, and 40 years of MLP!
Shimmering Smile - Celebrated the 10th anniversary of Equestria Girls!
Lunar Guardian - Earned a place among the ranks of the most loyal New Lunar Republic soldiers (April Fools 2023).
Crystal Roseluck - Had their OC in the 2023 Derpibooru Collab.
Flower Trio - Helped others get their OC into the 2023 Derpibooru Collab.
A Lovely Nightmare Night - Celebrated the 12th anniversary of MLP:FIM!
Princess of Love - Extra special version for those who participated in the Canterlot Wedding 10th anniversary event by contributing art.
Tree of Harmony - Drew someone's OC for the 2022 Community Collab

Senior Moderator
友情は魔法だ
@Background Pony #B5FC  
Yes. Being able to do some of these things faster or with some sort of automation is very desirable.
 
To be honest, there’s even more critical functionality that would be really great to have, too - like the ability to search for more than one artist tag on a single image.
 
But even though these kinds of tools have been suggested repeatedly over the years (and even more so now that the site’s core is publicly available) a lot of how the site operates really is just people clicking buttons.
 
However easy you might imagine these kinds of things ‘should’ be, they haven’t happened. Or, sometimes when someone does try to create automation for moderation we find bugs that keep it from being released to production, or there are other unanticipated problems that made them so unreliable that doing it by hand was easier and safer. Or, IIRC, they completely fucked the site so bad we had to take it down for a day and restore everything from backup because whoops.
 
There are instances of events where development has helped to set things up so that badging will be quick and easy when it’s all over (usually things like the April Fools events are good matches for these kinds of automation) so there is a precedence for this kind of automation - but for everything else we are blessed have really dedicated volunteers who are willing to put in hours of their own time to get these things done using what tools are available.
 
At the end of the day, we have the site and the tools we have. And staff try to accomplish what they can with the tools and workarounds that are available.
 
In the case of this event, if I recall correctly, Mildgyth volunteered to put all of this together and coordinated the run of it, and LightningBolt created the beautiful badge for it, and I know others were involved in getting it all working right including getting the badge added into the core, but this really was put together by a small group of people who really wanted to celebrate the anniversary with the community.
 
I think Mildgyth did a great job putting it all together with the tools that we have, and I’m really happy they did this, and I’m really happy that so many people participated. It really made me think, too, about what the show meant for me and how much it’s helped me over the last decade. I hope we keep having events like this one for years to come.
Background Pony #B5FC
@Ciaran  
A remark on that: Make no mistake, I didn’t mean to criticize anyone involved with the event for doing it the way they are doing it, just in case it came across as such.  
The suggestion is purely with the intent to ease the workload for the people who are doing all these things manually right now.
 
This took longer than I hoped, Javascript is not my forté, but it works. Tested in Firefox and Chrome with Violentmonkey v2.12.7
 
 
In action video (everything filter, contains some nudity)
 
If anyone wants to improve this somehow, by all means please go ahead. This is just a base to show how it could work.
 
Code:  

 
// ==UserScript==
// @name Derpibooru Badge Helper
// @namespace Derpibooru
// @match https://derpibooru.org/*
// @run-at document-idle
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_deleteValue
// @grant GM_listValues
// @grant GM_xmlhttpRequest
// ==/UserScript==
console.log(“Badge Helper Running”);
// Export and Import data functionality
createExportImport();
// Uploader
var uploader_span = document.querySelector(“span[class=image_uploader]”);
if (uploader_span) {
console.log(uploader_span);
// Check if there’s an account linked
var anchor_element = uploader_span.querySelector(“a”);
if (anchor_element){
// Uploaded with an account, create the STORE THIS ACCOUNT button
var account_name = anchor_element.textContent;
var new_button = createStoreAccountButton(account_name);
// Display it
uploader\_span.appendChild\(new\_button\);
}
}
// Artist tags
var tag_div = document.querySelector(“div[class=tag-list]”);
if (tag_div) {
console.log(tag_div);
// Get all artist tags
var artist_tag_anchors = tag_div.querySelectorAll(“a[href*=’artist-colon’][class=tag__name”);
console.log(artist_tag_anchors);
for (var artist_anchor of artist_tag_anchors){
// Parse the artist tag page and possibly create and display the storage button for this tag
var account\_name = handleArtistTag\(artist\_anchor.href, artist\_anchor.closest\("span"\)\);
}
}
/**
* Reads the given url and extracts the associated user account for this tag - if it exists - and displays a store button for it
* @param tag_url url of an artist tag to parse
* @param parent element to append new buttons to as children
*/
function handleArtistTag(tag_url, parent){
// Load the given url
GM_xmlhttpRequest({
method: “GET”,
url: tag_url,
onload: function(response) {
if (response.status == 200){
// Create document from reply to ease parsing
var response_doc = new DOMParser().parseFromString(response.responseText, “text/html”);
var tag_info_div = response_doc.querySelector(“div[class=tag-info__more]”);
if (tag_info_div){
// Check if there’s a userpage link on this artist tag page
      // Get all fitting anchors and all strongs, the anchor right after a strong announcing "Associated users:" is the right one
      // This is in case there might be more than one profile link at an artist tag in a description somewhere
      var selected\_elements = tag\_info\_div.querySelectorAll\("strong, a\[href\*='/profiles/'\]"\);
      for \(var i = 0; i \< selected\_elements.length; i++\){
        var cur\_elem = selected\_elements\[i\];
        if \(cur\_elem.nodeName === "STRONG" && cur\_elem.textContent.includes\("Associated users:"\)\){
          // This is the right one, next element is the user account anchor
          var account\_name = selected\_elements\[i+1\].textContent;
          // Display the button to save it
          var new\_button = createStoreAccountButton\(account\_name\)
          parent.insertBefore\(new\_button, parent.firstChild\);
        }
      }
    }
  }
  
  
}
});
}
/**
* Creates and returns a button to store the given account name on click
* @param account_name String containing the account name to display and store on button click
* @return the created button
*/
function createStoreAccountButton(account_name){
// New button
var new_button = document.createElement(“button”);
new_button.textContent = “Store “ + account_name;
// On click store it
new_button.onclick = async function(){
GM_setValue(account_name, true);
console.log(“Stored “ + account_name);
this.textContent = “STORED “ + account_name;
}
return new_button;
}
/**
* Displays an export and import button at the start of the page, that can be used to export or import script data
*/
function createExportImport(){
// Get HTML body
var body_elem = document.getElementsByTagName(“body”)[0];
/*
* EXPORT
*/
var export_button = document.createElement(“button”);
export_button.textContent = “Export Badge Data”;
// On click display current data
export_button.onclick = async function(){
// Get all stored keys
var stored\_keys = GM\_listValues\(\);

// Make a list
var list\_form = "";
for \(var key of stored\_keys\){
  list\_form += key + ",";
}

// Now show it to user
console.log\(list\_form\);
prompt\("Badge Data Stored", list\_form.substring\(0, list\_form.length - 1\)\);
}
// Display the button
body_elem.insertBefore(export_button, body_elem.firstChild);
/*
* IMPORT
*/
var import_button = document.createElement(“button”);
import_button.textContent = “Import Badge Data”;
// On click prompt user for new data
import_button.onclick = async function(){
// Prompt user for input
var prompt_result = prompt(“Provide Data To Import”, “Put Previously Exported Data Here, insert spaces to purge all”);
if (prompt_result){
  // Delete all currently stored keys before storing user submitted ones
  for \(var key of GM\_listValues\(\)\){
    GM\_deleteValue\(key\);
  }
  
  // Split the list to store the individual names
  var split\_result = prompt\_result.split\(","\);
  if \(split\_result.length \> 1\){
    // Now store the new data
    for \(var i = 0; i \< split\_result.length; i++\){
      GM\_setValue\(split\_result\[i\], true\);
    }
  }
  
  // Done. Inform the user
  alert\("Given data imported."\);
}
}
// Display the button
body_elem.insertBefore(import_button, body_elem.firstChild);
}
 

Jb33124
Starlight Glimmer - For supporting the site
Starlight Glimmer - For supporting the site
Happy Derpy! - For site supporters
Silver Supporter - Silver Supporter
Pixel Perfection - Hot Pockets Spotted
Lunar Supporter - Helped forge New Lunar Republic's freedom in the face of the Solar Empire's oppressive tyrannical regime (April Fools 2023).
Crystal Roseluck - Had their OC in the 2023 Derpibooru Collab.
Non-Fungible Trixie -
Preenhub - We all know what you were up to this evening~
My Little Pony - 1992 Edition

Gaining Confidence
Still no badge on my end. However, as I said earlier, I’m more than happy to wait. I don’t want to force the admins to give it me immediately. It would be pointless and slow distribution down for others.
Interested in advertising on Derpibooru? Click here for information!
Pony Arts & Prints!

Help fund the $15 daily operational cost of Derpibooru - support us financially!

Syntax quick reference: **bold** *italic* ||hide text|| `code` __underline__ ~~strike~~ ^sup^ %sub%

Detailed syntax guide