- perl v5.14+
- gcc
- make
- freetype2
- libjpg
- libpng
- libwebp
- sqlite3
- terser
- autoprefixer
- postcss-cli
perl Makefile.PL && make
./script/deploy.pl deploy
./script/server.pl
To create an admin account, run:
./script/command.pl user add USERNAME EMAIL admin
Web application for fiction writing contests
Home Page: https://writeoff.me
License: Other
perl Makefile.PL && make
./script/deploy.pl deploy
./script/server.pl
To create an admin account, run:
./script/command.pl user add USERNAME EMAIL admin
I think people will be more likely to use alts if they can delete/change them.
Possibly even move stories between alts you own?
Currently poster name colour is hardcoded (very naughty) to make user id==8 red (admin) and everyone else blue.
New posts should have a "role" field which states what role the poster is posting as. For example, I should be able to choose whether to post as "user", "admin", or "organiser".
Users who can only post under one role (most people) will have the field ommitted.
I'm pretty good at author guessing, but I worry about offending somepony with my guesses. This is why I stopped doing it a long time ago.
This is probably just me (in which case it shouldn't be implemented), but I'd like the option for one's failed author guesses to remain anonymous. Only one's successful guesses would show up in the graph.
If desired, anonymous guessers' failed guesses could go into a pool, get shuffled, and be randomly assigned to one or more "anonymous fail" nodes. That way, authors would still get feedback about how their works are perceived.
Separate but related issue: in the last Writeoff, a couple of authors mentioned they would like to see more guesses than the ones shown in the graph (they didn't know why their guesses didn't appear). If it's possible that those guesses could be useful feedback for authors, it might be worth it to find a way to show the entire gamut of guesses.
Or failing that, at least a count of how many ponies guessed that X wrote story Y... even if only X is permitted see that data.
The pager is slightly off-centre depending on body font because the line-height of body text isn't specified
This will display a message over the entry "A revised version of this entry is available at {link}"
Achieve this with user scripts only, since we don't want an ordinary GET to be modifying state.
There are currently two ways that a user's artists can be leaked to an organiser when they edit an entry:
(1) the artist field contains all of the entry's user's artists
(2) the related pics/fics field does not contain the entry's user's own entries
Solution to (1) is only include the entry's current artist and Anonymous as valid artists
Solution to (2) is to make all pics/fics valid for an organiser
[Extra note on the solution for (2) is that this would have enabled GGA's request for his fic to have every pic rel (including his own) to be done through the front-end.]
Preferable to using direct DB access to do it
Could we have the notifications listed in reverse chronological order, instead of chronological?
Right now, I need to click/scroll to get to the new ones on the bottom, instead of just clicking.
For organisers, the submission page shows the artist of every entry in the contest. However, they would generally want to avoid seeing this unless necessary to make a ruling.
Expected behaviour: Require explicit action to show the artist to organisers.
Relative scheme doesn't work for email assets, so need to specify the right scheme.
Require config option for HTTPS, otherwise HTTP.
$c->req->base has to have its previous value restored after rendering emails.
Separate but related issue: $c->stash->{wrapper} also should be localised.
I have a hard time reading through the Writeoff discussion because there are lots of stories that I haven't read, and I only want to be able to see reviews for stories I have already read.
I would love, love, love a user option to auto-spoiler any story comments if you haven't opened that story in a web browser. I suspect that most of our users would use this feature. It would be super-convenient. Once you've opened a story, you could then see all the comments in the forum that pertain to that story, so you can very easily keep track of which reviews you've seen and which you haven't seen. That way you don't miss any reviews, which will encourage discussion.
Failing that, I'd like a user option to spoiler EVERY message. At least then I can scroll down without accidentally seeing spoilertext for stories I haven't read. (TD tends to put three-word summaries at the top of his reviews and I've had stories ruined for me by that.)
Old layout had a mechanism to sort the tables.
Clicking on relevant icons in the design should sort the table. Clicking again should reverse sort.
This should have an abstracted interface to be used in later designs as well.
Currently, the scoring for art entries counts toward the same scoreboard that that round's writing period qualifies for. This is highly suboptimal for a number of reasons.
Art entries for minifics and short stories count for different numbers of points despite taking the same amount of effort.
Scoreboards have previously measured skill in a specific area (writing ponyfic/original fic, at a specific wordcount length), and counting points for activities which are not that skill dilutes that.
Individuals who are consistently good at art entries should be rewarded with recognition for that skill, rather than having those contributions diluted by ranking them against authors.
Proposed change:
– Create a third Scoreboard class for Art entries.
– Shift all medals and points from the Art portion of multi-round events into the new scoreboard.
– Remove those medals and points from their current location and recalculate scores accordingly.
Art scoreboard scores should decay only when an art round occurs, and should not contribute to the score decay of writing rounds (though typically there's a writing event attached to the art event, and that should cause writing-score decay as normal).
Current page size is always 100 posts per page. For some users and contexts this is too many.
Should allow users to choose page sizes of 10/25/50/100.
For some reason, when I go to the scoreboard, stories from multiple FIM Writeoffs are visible with the display filtered to "Mode: Fic, Genre: Original". For example, "Rising From the Ashes" is correctly listed as a FIM Writeoff on the title bar of its pages e.g. https://writeoff.me/event/66-Rising-From-the-Ashes/fic/results , but if you click on the + next to my name in the scoreboard rankings, you can see that round's story counting toward the Original Fiction scoreboard.
It looks like the problem is that "Genre: Original", Format: Blank is listing stories of both genres which fit within "Format: Short Story". If I select both Genre and Format, it displays correctly.
For JS enabled users, beside the "Post comment" button should be a "Preview" button.
When clicked, the "Preview" button should be replaced with a "Please wait..." button and the textarea should be dimmed. The post's body is sent as an AJAX request to the server which returns the post render. Once received, the post render replaces the textarea, and the "Please wait..." button is replaced with an "Edit comment" button. The post render should behave exactly like an ordinary post in the thread (that is, hovering >>RogerDodger quotes should work as expected). The "Edit comment" button when clicked removes the render and returns the textarea. At all times the "Post comment" button should behave as normal.
Suggested by Chris.
Will probably use same size/color as the genre/format.
Not sure if it's necessary since the date contains a link to the event with the prompt in the URL.
Is the same color as non-thumbed-up-posts.
So if your mouse is over a post, it's difficult to tell if you've thumbed it up or not.
During the review/judging period, often Writeoff veterans will encourage participants to add reviews to the pieces with the least feedback. This is easy for stories, because in the fic gallery page, the number of comments and the number of unique commenters are visible at a glance. In order to check those statistics for art submissions, however, someone has to click on each piece one by one and scroll down to the comments section.
This could obviously be fixed by using a story-style display instead of a gallery-style display for art, but that seems inelegant. Instead I'd like to propose adding a simple parenthetical section on a line underneath each piece's title:
🖼
Submission Name
(👥 2, 💬 6)
This should be a relatively simple addition with high return on effort, as participants can much more easily track where comments are needed.
Until we get around to finding a visualization Roger likes more.
For comments on your stories and replies to your comments.
Personally, I think some sort of targeted tagging might be good too, so if I did something like >>RogerDoger it would notify them of that post, to pull people into discussions without needing a msg to reply to.
Deal a mortarboard award out to the best performing entry by an entrant who hasn't already received a mortarboard for this genre and format.
Retroactively apply to previous events.
Unless it's not obvious, I'm kinda just throwing whatever I think the site could use up on here. :P Hopefully this is useful to you; if not, ignore it.
But yeah, it's not currently obvious how to remove stories, since you have to do so on the submissions page for the contest, but most people won't think to look there since it's closed during the contest. I'd suggest adding the post/remove checkboxes that are there to the list of stories that pop up if you click on your alias names in the alias dropdown.
Right now there are 4 events one can subscribe to:
"Prompt selected" is mostly a proxy for "Submissions open", but doesn't work that way in art rounds, so prompt-selected -> subs-open.
"Event created" should fire if a user is subscribed to any relevant modes. Every other notif should fire per mode, so only if the user is subscribed to that particular mode.
Currently, the format and genre names are localised from the lang files.
However, this is inappropriate given that it makes new formats and genres not really data, but code. (That is, it makes creating new ones impossible without writing more code.)
More sensible would be the formats and genres having a specified language, such that the names and descriptions don't need to be localised (rather, a new format/genre for the target language would be created).
Excepting some special scenarios (e.g., the in the guessing page), everywhere that the artist's names appear on the website should be a link to their profile, e.g., <a href="/artist/8-RogerDodger" class="Artist">RogerDodger</a> Aside from the obvious purpose, this is useful to disambiguate users that have similar names from each other, since artist names are not unique, but their ids, which are visible in the url, are.
Email triggers are static like Awards, so they shouldn't be in the database.
I use LED 1080p monitors. The Writeoff site has highlighting that is practically invisible. Most of it could stand to be darkened. Maybe this is unique to my monitors, but I don't have this problem anywhere else on the internet (that I can recall).
The biggest issue is the unselected green lines for author guessing. Those are almost completely invisible. Another example that's not as much of a problem, but still a bit of eye strain, would be the yellow vs. blue background in the prelim how-you-voted slate that shows which stories made the cut.
In general, I think most of those near-#FFFFFF's could be pulled back a lot.
When editing a message, you have to add tags manually (or use ctrl+{i|b|s}) because the controls aren't available at the top of the message window. It'd be nice if they were.
A GET to a certain url should return a consistent result. Currently, paged threads without an explicit page go to the page it thinks the user was at last.
This mechanism is achieved by the server storing the page the user was last at in a cache.
Instead of the server making this decision, the user should do it themselves with localStorage and link hijacking of clicked links.
Alternatively, disable page caching altogether.
Should be able to delete finals that haven't started yet.
The SubGenre and ArtistGenre data are currently not particular visible to users.
Current behaviour is to sub to any group that you join on any alias, and only unsub when you leave the group and have no other aliases in it. This will obviously be confusing to anyone using aliases wanting to leave and unsub from a group entirely.
Desired behaviour will be to display a tab "My groups" with a dropdown showing every group in SubGenre. Clicking the "My groups" button leads to /user/groups, which will contain a page with the data listed out as per example:
Group A [unsub]
- AliasA [leave]
- AliasB [leave]
- AliasC [leave]
Group B [unsub]
- AliasC [leave]
Clicking leave will unsub if there are no other aliases left (same as clicking leave at the group listing). Clicking unsub will leave on all aliases.
For convenience/ease of use. Sometimes difficult to remember art from title alone.
I noticed the "No Turning Back" event was missing from the site front as I was trying to double-check that I'd created FIMFiction folders for everything, and I'm not sure why it's gone — I thought it displayed the chronologically most recent events?
The ones currently displayed on the site front:
The Other Side · FiM Short Story · 18 May 2018
Message in a Bottle · Original Short Story · 27 Apr 2018
Just Like Old Times · FiM Minific · 7 Apr 2018
Last Call · Original Minific · 17 Mar 2018
The Next Generation · Original Polished Story · 13 Feb 2018
Long Story Short · Original Minific · 23 Dec 2017
All recent events, from the archives page:
The Other Side · FiM Short Story · 18 May 2018
Message in a Bottle · Original Short Story · 27 Apr 2018
Just Like Old Times · FiM Minific · 7 Apr 2018
Last Call · Original Minific · 17 Mar 2018
No Turning Back · FiM Short Story · 23 Feb 2018
The Next Generation · Original Polished Story · 13 Feb 2018
Under the Surface · Original Short Story · 2 Feb 2018
Lie Me a River · FiM Minific · 13 Jan 2018
Long Story Short · Original Minific · 23 Dec 2017
The event archive currently takes 3-4s to render. This is obviously too long, so caching or paging is required.
Paging by year is probably most appropriate.
Two separate issues need to be resolved:
Cancelling the voting round can't work when there is one entry, since even if there isn't anything for voters to do, there should still be time allowed for the entry to receive reviews with an anonymous author. In addition, the rating logic that gives the entry a medal wouldn't work if the voting round were removed.
For example, instead of:
$c->detach('/forbidden', [ "You are not the admin" ]);
Use:
$c->detach('/forbidden', [ $c->string('notAdmin') ]);
Then, in lang/en/strings.yml
:
notAdmin: You are not the admin
Once this is comprehensively done throughout the code, it will be possible to add support for other languages.
Footer of emails should have an unsubscribe button
Not enough ponies spoiler things from their reviews. Adding the button would encourage that behavior, and it would make composition of reviews MUCH easier for those of us who do use spoilers.
Hasn't turned up in practice yet, but the current behaviour is undefined.
Clicking the pager (re)loads the page via AJAX, but it only updates posts from the response. The pager should also be updated, in case a new page has appeared.
In the general contest discussion thread, comments on all stories on included, intermixed with more general comments/discussions directed toward the contest as a whole. It would be nice to have a discussion thread for the contest itself that doesn't include comments on individual stories. Story comments are usually specific to the story itself, and are often made without any knowledge of more general conversations taking place in the main thread. Having such comments injected into that main thread is distracting and confusing to anyone that intends to comment on the general state of a contest. Worse, many people have (seemingly accidentally) replied to a story-specific comment in the general discussion thread instead of the relevant story, preventing their reply from showing up underneath said story with the proper notifications and such to the author.
I'd propose that the main contest discussion thread be a virtual "story-like" topic of it's own, isolated in the same way as each story is. That said, I think it wouldn't go amiss to have an "all comments" thread/view option as well, which would include all comments, regardless of "topic" and thus basically persist the view the "discussion thread" view currently shows.
Either/or might be useful.
There are as I see it two primary use-cases for the guess data:
As it stands, the data is just shown as a huge table, and it's very ugly.
On top of that, the first use case is not being met well. Artists who receive more guesses against them are also more likely to have correct guesses made against them. The best example of this is Cold_in_Gardez, who receives more guesses than any other artist. Even though there's always some people that guess which he wrote, there are also many more that guess him for other stories too.
The visualisation should show how well the author avoided (or failed to avoid) detection, with consideration for how many people were looking for him/her.
Given #33 and my answer to it having been referenced multiple times now, the current listing behaviour is obviously confusing.
Clearer behaviour would be:
Paging is not currently needed here, since this is typically 5-8 events
("Theory" is the set of one user's guesses.)
The intention of the award is to reward participants who successfully avoided detection.
Previously, it was simply dealt out to any entry that received no correct guesses against it. This was bad for a number of reasons:
In fact, the mask was dealt out to so many entries, that there were more of them given out than ribbons!
With that considered, I'm brainstorming ways to bring the mask back such that it can fulfil its original purpose (encouraging people to mask their identity). Some constraints I am thinking of:
Can these constraints all be met in a non-abusable way?
(If this problem is solved, all old masks will of course be revoked.)
Current situation with formats is weird. Resolving this is important for custom groups, for a few reasons:
My intuition is that the format should be decided based on the maximum word limit, with the cut-off occurring at these points:
Under this system, people can set whatever word limits they please without worrying about what "format" it's under.
Similarly, the "polished short story" format should be removed. The purpose this format served is better served by groups in general. Also, if it remains, a "polished" version of every format, as well as any other modifier you could imagine, is implied. That doesn't scale well at all.
I also think that the per-format scoreboards should be removed, since it even now results in too many scoreboards, and it increases the burden on "formats" to be a meaningful category. I think this change to them being mostly shorthand (it's easier to say short story than 2000–8000 words) will increase the meaningfulness of groups in general and remove the friction to hosting a contest that comes from deciding "what format is this".
The issue of handling poetry vs prose vs script etc remains unresolved. My current position is that they can all go into the same contests, and that they are as comparable as they need to be for the purposes of the writeoff. The competition is mainly against yourself, so if one wants to practice poetry in the writeoff, not being likely to place as well isn't that big a deal. It'd be much worse for the non-prose authors to have their own contest in which almost no one else comments or participates.
If, however, there is big demand for segregated poetry, then a group for poetry can be made anyway. The group concept generally solves all these categorisation issues by pushing the categorisation down to the users.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.