ppy / osu-web

the browser-facing portion of osu!
https://osu.ppy.sh
GNU Affero General Public License v3.0
989 stars 388 forks source link

Add the ability for users to add custom tags to beatmaps #8300

Open apollo-dw opened 3 years ago

apollo-dw commented 3 years ago

Keeping this super short and sweet, there were talks about adding a guideline to ranking criteria to tag the "style" of a beatmap, however there were concerns with standardizing this sort of thing.

I propose delegating this task to players. Imagining a system similar to what Steam has (screenshot below), there will be no need to define terms - players will know that stuff best. My proposal is strictly for terms that would describe a map, since I'm not sure whether user tags would be useful for describing other things...

image

cl8n commented 3 years ago

for the RC thread, the perceived issue was that direction/organisation would be required to use the tags meaningfully, not that it needed standardization from the beginning. I think the same issue applies to this

also

seems cool but like the RC thing I don't think it's practical to implement (yet!)

Hiviexd commented 12 months ago

i think having something like this could greatly benefit searchability for players and mappers alike. to solve the moderation/consistency issue, we can have players submit tags for "approval" (a 5-second task that can be done by NAT/GMT), and have those approved tags to be usable on any map by players.

if a map has misleading user tags, that can be handled through the usual beatmap report where any moderator can fix it accordingly.

Walavouchey commented 5 months ago

this could potentially be viewed as an alternative direction for https://github.com/ppy/osu-web/issues/5852

https://omdb.nyahh.net/descriptors/ list of tags used by a community beatmap database

peppy mentioned making the list predefined instead of user-defined in today's catch-up meeting. in that case the nat or bn would likely be the ones to manage the tag list and fix wrong tags whenever needed

apollo-dw commented 5 months ago

peppy mentioned making the list predefined instead of user-defined in today's catch-up meeting. in that case the nat or bn would likely be the ones to manage the tag list and fix wrong tags whenever needed

just to give more detail here, the "user-defined" tags are added by virtue of proposals that are critiqued and voted on by users -- they only pass if they have a majority

i would love to elect myself to look after the tags/descriptor list on osu-web if this goes through, as someone whos bn and already oversees omdb... and has cared about this feature since 2021 according to the issue open date 😅

Hiviexd commented 5 months ago

the general consensus from the NAT meeting about how this should work was:

by the way we didn't discuss if we should have dedicated selections of tags per mode (to allow more freedom for other modes + keep things organized to prevent the wrong tags from being used in the wrong modes), but it's worth considering as i think the majority would be in support for it.

peppy commented 5 months ago

All sound roughly in line with what I saw being required for MVP 👍

peppy commented 3 months ago

Here's an initial proposal for how we can get things moving.

TABLE beatmap_tags (beatmap_id, tag_id, user_id)
       PRIMARY KEY (beatmap_id, tag_id, user_id) -- mostly just to make it unique

TABLE tags (tag_id, name, NULLABLE BOOL approved)
PRIMARY KEY (tag_id)
UNIQUE INDEX (name)

to get displayable tags for a beatmap:

SELECT DISTINCT(name) FROM tags JOIN beatmap_tags USING (tag_id) WHERE beatmap_id = @beatmap_id AND approved = 1

would want to double-check this will perform okay. I think it should as it can use the beatmap_id,tag_id portion of the primary key, but it may still get slow when counting votes for each tag. In which case we'd want a totals table.

to give users a list of popular tags they can upvote:

SELECT name, COUNT(*) FROM tags JOIN beatmap_tags USING (tag_id) WHERE beatmap_id = @beatmap_id AND approved = 1 GROUP BY (beatmap_id, tag_id) ORDER BY COUNT(*) LIMIT 10
apollo-dw commented 3 months ago

My suggestions here would be:

Totally agreeing with applying tags to beatmaps, and a setting to apply to all difficulties seems nice.

peppy commented 3 months ago

Let's allow providing descriptions for tags. Some might not be immediately obvious, and they would be helpful for people who are confused or new players.

I don't think this should be up to the user. It should be up to moderation / management.

I'm not convinced that a single approval is appropriate here. Certain tags can be very subjective (for example, for tags related to aesthetics or gameplay), so I think we should be accounting for that with a majority-vote system. This also means there isn't a single person on the hook if they approve a tag which most people actually disagree with.

The approval is for completely disallowing tags, at a system level, not beatmap level. There is not approval for beatmap level tags – it would be based on user vote count. If abuse is seen we can wipe votes or add some kind of hide flag.

apollo-dw commented 3 months ago

Okay understood - so the full list of tags will be created by the userbase, and abuse tags will be disallowed on a case-by-case basis. I agree that descriptions shouldn't be up to the user, but I also suggested that under the impression that we will be providing the list of tags from the get-go and that there would be no support for custom tags. That doesn't sit well with me personally, but I'm not the boss and this is better than nothing

peppy commented 3 months ago

Just to be clear, you prefer the proposal I made just now where users can create new tags right?

apollo-dw commented 3 months ago

Unfortunately no, I think being rigid with the list of tags is preferable here. There are multiple reasons I can think of for why:

These are the main reasons, there are some more minor ones as well. I suspect that for a custom tags system to be actually useful and usable for players, we'll need to be disapproving tags all the way down to what is basically a rigid list. Lets save ourselves the ballache here.

peppy commented 3 months ago

Okay, in that case we can nuke the approved flag and just use a flat list to start with.

We'll probably also want an endpoint to retrieve all flags for local filtering as a user types.

peppy commented 3 months ago

Updated proposal:

TABLE beatmap_tags (beatmap_id, tag_id, user_id)
       PRIMARY KEY (beatmap_id, tag_id, user_id) -- mostly just to make it unique

TABLE tags (tag_id, name, description)
PRIMARY KEY (tag_id)
UNIQUE INDEX (name)

to get displayable tags for a beatmap:

SELECT DISTINCT(name) FROM tags JOIN beatmap_tags USING (tag_id) WHERE beatmap_id = @beatmap_id

would want to double-check this will perform okay. I think it should as it can use the beatmap_id,tag_id portion of the primary key, but it may still get slow when counting votes for each tag. In which case we'd want a totals table.

to give users a list of popular tags they can upvote:

SELECT name, COUNT(*) FROM tags JOIN beatmap_tags USING (tag_id) WHERE beatmap_id = @beatmap_id AND approved = 1 GROUP BY (beatmap_id, tag_id) ORDER BY COUNT(*) LIMIT 10

Required endpoints:

get_top_tags_for_beatmap(beatmap_id)
returns the top 50 tags for a specified beatmap

store_tag(beatmap_id, tag_id)
allows a user to specify (aka vote) for a tag

delete_tag(beatmap_id, tag_id)
allows a user to remove their vote for a tag

get_all_tags()
returns (id, name, description) for all known tags
peppy commented 2 days ago

Backend for this is now merged 🎉

Remaining is: