DNR's blog

By DNR, 10 months ago, In English

TL-DR

https://rshf.net/ (not adapted for mobile)
https://chromewebstore.google.com/detail/rshf/jmpohmlhicdbghkhageaiefhenmkdfcg

(the most recent version will be available at https://github.com/welcome-to-the-sunny-side/rshf-extension)


TS-DR

RSHF logo

Simply put, RSHF offers the ability for users to form groups that have their own self-contained rating, report and moderation systems. Deeper visual integration with the Codeforces website is offered through a browser extension. More details on each of these components follow:

Groups

Group members are partitioned into three tiers:

  1. Admins
  2. Moderators
  3. Members

Their roles and responsibilities closely match what you might think they do: Admins and Moderators process reports and take appropriate actions in response. Admins have additional powers (being able to modify group settings).

A group can be either public (any person who hasn't been kicked from it can freely join) or restricted (your join request must be approved by admins/mods for you to join). In addition, there are several ways to configure groups, which are described ahead.

Memberships

A user can be a member of several groups. Membership within a group serves as a weak proxy for the probability of the user participating fairly in contests. Similarly, being kicked from a group is indicative of the user likely being untrustworthy.

Rating System

Every group has a corresponding "in-group" rating for its members.

The [registration] -> [rating update] flow goes through in the following manner:

  • A member $$$M$$$ of a certain group $$$G$$$ registers for the contest $$$C$$$ with respect to that group on the RSHF website ($$$M$$$ may choose to register with respect to only a subset of groups that he belongs to).
  • $$$M$$$ participates in the contest on Codeforces.
  • Once the contest ends, we run the following algorithm:
"""
pull in the standings S of C from codeforces

for group G:
    S' = subsequence of S containing all members of G that registered for C
    compute rating deltas using S'
    for every M in S':
        apply rating delta to M's group rating in G
"""

Some additional thoughts:

  1. As this process is platform-agnostic (all that we need is a [rshf username -> cp platform username] mapping and the contest standings), we can add support for more platforms too (atcoder soon), resulting in ratings being unified across platforms.
  2. You may have noticed that I didn't mention taking initial ratings into account when deciding which members are rated (this would result in an LGM having his rating updated for a div-3). We plan to allow groups to choose their own ranges for initial ratings that would be considered rated for different classes of contests (these are currently hardcoded in and are the same as cf rating ranges (div3 <1600, div2 < 2100, etc.)). Once support for atcoder is added, ABC, ARC, and AGC will also have their rated participation eligibility be configurable in this manner.
  3. The actual rating algorithm used for updates is also hot-swappable (we currently use the default cf algorithm), so groups may choose to use different rating algorithms (for instance the atcoder algorithm).

Report System

Groups have their own self-contained report systems. Within a group, any member can make a report against any other member for offenses ranging from inappropriate conduct in contests to possessing a generally dislikable nature.

Admins/moderators process these reports and then take appropriate action (for example, kicking the person being reported or kicking the reporter for spamming low-quality reports). All reports (and their reviewal outcomes) are publicly visible to keep things transparent.

Further, all the reports that a user has been involved with (as the reporter, respondent, or reviewer) are visible on his profile.

Now, a question that arises is — "Why would an actual cheater even register and join a group, when he could simply not register on RSHF and maintain plausible deniability?". To account for this, we have the following solution:

  1. There is a primary group, "main", which is intended to be used by all users. Everyone is added to it when they do register.
  2. After pulling the standings from a completed codeforces contest, we register unregistered users to RSHF as "ghost accounts", and automatically add them to main (if you haven't registered on rshf and your account is registered as a ghost account, manually registering will result in it becoming a regular account).
  3. Reports can be made against ghost accounts, and action can be taken upon these reports. Therefore, a cheater can get kicked, with the report data being stored on RSHF, without him ever even visiting the website.

A visual demonstration for the less textually inclined:

Browser Extension

The browser extension allows for deeper visual integration with the Codeforces website, along with some ad-hoc bells and whistles. Note that you don't need an account on RSHF to use the extension.

Rating/Username color injection

I find cf ratings and subsequently username colors really helpful for mentally filtering out content in cf blogs/comments that is likely low-quality, and I suspect many other people do too. This feature is the primary reason for the existence of this extension and aims to allow you to be able to similarly mentally filter content using RSHF ratings.

You choose a "display group", and all users on Codeforces then get partitioned into three groups with respect to the chosen group —

  1. Group members.
  2. Non-members.
  3. Non-members who were kicked from the group.

You may choose to render the usernames of each class of users from a variety of display styles (rshf group ratings, regular codeforces ratings, luogu-esque brown for cheaters, etc.).

This allows you to benefit from a group's report data even if you don't want to bother engaging with RSHF — You simply:

  • Install the extension
  • Choose a group
  • Set rendering style to brown for kicked users and default to regular cf ratings for the other two categories.

This results in the usernames of cheaters being visually distinguished while other elements remain unchanged.

Blog/Comment Filtering

You can set rating lowerbounds (either RSHF or CF) and the extension will then filter away content by users below that rating threshold. You don't have to worry about accidentally missing important blogs by troll setters like tibinyte, as no content is deleted (filtered comments just get minimized, and filtered blogs are moved to a separate box).

Some QoL Stuff

Not worth making the blog longer than it has to be.


The current situation

Things are far from complete right now, and we expect there to be some undiscovered bugs. Further — some functionality, while being implemented on the backend, hasn't been exposed to the end user yet. For instance, we currently don't offer the ability to create groups to arbitrary users, and instead have one group — "main". The rationale behind this is partly to be able to accrue enough users in one group for it to reach critical mass (dilemma: people would only really want to join a group if its ratings actually mean anything, and conversely, a group's ratings would only mean anything if enough people joined it).

We intend to run RSHF in beta for a month or so, to iron out unexpected bugs and make everything resistant to malicious use. I'm not going to have much time to spend upon it after a few weeks, so I would also appreciate people contributing/taking over development.

Apply to be an admin/mod on main here.

If you would like to contribute to/take over development, DM me.

Finally, I would like to orz uniqueUser5678 for bearing with the often infuriating commands of its inept slavemasters, DNR and Chimpanzee.

  • Vote: I like it
  • +219
  • Vote: I do not like it

»
10 months ago, hide # |
 
Vote: I like it +7 Vote: I do not like it

> Blog/Comment Filtering

»
10 months ago, hide # |
Rev. 4  
Vote: I like it 0 Vote: I do not like it

I think this is a great idea. I like the custom rating for groups a lot; it's an extension of what I thought the groups feature in Codeforces itself was.

Hopefully, we can have good OSS contribution and upkeep for this project. Though I'm still confused on the role system. Can any member create a new group, or is that locked down to admin/moderators?

Also the dilema regarding critical mass for a group while valid would actually be great for group of friends who can have a private group to just compare themselves with each other relatively so I think that's pretty good

UPD: Maybe for the report system we could also have it be publically voteable instead of just an admin approving/disapproving it

  • »
    »
    10 months ago, hide # ^ |
     
    Vote: I like it 0 Vote: I do not like it
    1. Roles are local to groups, so a user may be a moderator in one and just a regular member in another.
    2. We probably won’t allow most people to create groups for a few weeks.
    3. As for the voting system, perhaps later. It doesn’t seem like a very good idea to me though.
    • »
      »
      »
      10 months ago, hide # ^ |
       
      Vote: I like it 0 Vote: I do not like it

      You marked this guy as a cheater in your screenshot above lmao

      • »
        »
        »
        »
        10 months ago, hide # ^ |
         
        Vote: I like it 0 Vote: I do not like it

        Oh I didn't even notice that, hopefully that's just an example since I'm not sure why I'm marked there

      • »
        »
        »
        »
        10 months ago, hide # ^ |
         
        Vote: I like it 0 Vote: I do not like it

        That photo isn't meant to be taken seriously, I just left out a bunch of high rated users and let the rest be rendered in a different manner lol

        • »
          »
          »
          »
          »
          10 months ago, hide # ^ |
           
          Vote: I like it 0 Vote: I do not like it

          I mean he probably is a cheater tho was my point.

»
10 months ago, hide # |
 
Vote: I like it 0 Vote: I do not like it

What does RSHF stand for?

»
10 months ago, hide # |
 
Vote: I like it +5 Vote: I do not like it

wow, very epic!!

I think an interesting idea would be to create a group (or possibly several?) that is similar to main, but with different rules for rating cutoffs. For example, I would find it very entertaining if there was a "main but every single contest is rated for everyone", and this would definitely motivate me to do more contests.

I also like the UI a lot.

»
10 months ago, hide # |
 
Vote: I like it 0 Vote: I do not like it

This is actually a cool project. It seems like this could be a good way to efficiently catch cheaters, because the reporting / processing is done entirely by community members. That is key because I'm pretty sure Mike and the other devs don't have the time to sift through all of that. And I'm sure that the community would do a very good job at catching cheaters and dismissing false reports. Once the cheaters are put on the list, the cf devs would just have to implement a system that imports the list every day or so and suspends/bans the accounts.

One note I have is that it seems like you aren't including inactive accounts in your main group. Inactive accounts have either not participated in a contest in the past $$$6$$$ months or have participated in fewer than $$$6$$$ (or maybe it was $$$7$$$) contests (or both). I think that it would be nice to include these accounts.

»
10 months ago, hide # |
 
Vote: I like it +6 Vote: I do not like it

This reminds me of what happened with Counter-Strike (a competitive first-person shooter game). Cheating was so bad that serious players abandoned the official matchmaking system and moved to third-party platforms like FACEIT. There, players are required to verify their identity with government-issued ID and install kernel-level anti-cheat software. It's extreme but all the pros still do it because humans simply can't play along side aimbotting/wallhacking cheaters.[1]

So I think for this to solve anything, it must offer some stricter system of trust verification and anti-cheat. For example, you can require posting screencasts of you solving the problem upon request. (This is good practice for analyzing your own performance in general so a lot of top competitors already do it even if they never post it to youtube) Also the stricter requirements must be something that doesn't make sense for codeforces to implement natively, otherwise you're just fracturing the community for no reason.

[1] this analogy breaks down a bit because cheaters can ruin the experience of the other player in PVP games like counter-strike and chess. But in competitive programming, cheaters mostly only affect your ranking and don't directly affect your overall problem solving experience. It will be much harder to convince a critical mass of people to join just for a cheater-free leaderboard.

  • »
    »
    10 months ago, hide # ^ |
     
    Vote: I like it +3 Vote: I do not like it

    I didn’t like Faceit myself when I played cs lol

    Anyways, I think this is an inaccurate analogy because faceit games are held on private servers, and a round doesn’t simultaneously affect your cs and faceit rank.

    Implementing verification via screencasts isn’t difficult (one can just link a youtube channel to his account, and post all his screencasts in an appropriately titled manner on this channel, with the failure to do so (if manually detected by someone) resulting in his participation becoming unrated). So this wouldn’t require any effort from our end, but I don’t think it’s a good idea to add in another necessary barrier to entry to the already overlong list right now. That said, this is definitely something that can be done in a new group (a stricter version of main).

»
10 months ago, hide # |
 
Vote: I like it 0 Vote: I do not like it

bump