Git Product home page Git Product logo

circleguard's Introduction

logo

Latest Version GitHub Releases Downloads Discord Server

Circleguard

Circleguard is a tool to help you analyze osu! replays. Either your own, or replays from someone you suspect is cheating. Features:

  • A replay viewer, with
    • A ur bar
    • Judgment indicators (green dots for 100s, blue dots for 50s, red dots for misses)
    • Ability to speed up and slow down playback speed
    • Ability to jump to any point in the replay
    • Frame by frame movement
  • Cheat detection
    • Similarity (for replay stealing)
    • Unstable rate (for relax)
    • Suspicious movements called snaps (for aim correction)
    • Frametime (for timewarp)
  • Raw replay data (time, position, and keys pressed for each frame) in a nicely formatted table

If you're only interested in using circleguard to analyze your own replays, to (eg) figure out why you missed a note or to be able to quickly jump to any point in time in a replay, don't be scared off by the talk of cheat detection above. When you open circleguard, simply click the "Visualization" panel to easily visualize one of your replays. Circleguard is fully fledged as a replay analysis tool as well as a cheat detection tool.

Demo gif of the visualizer
(click here to view a high quality version)

Demo gif of main gui
(click here to view a high quality version)

Circleguard is developed and maintained by:

With contributions from:

Download

The latest version of circleguard can be found here: https://github.com/circleguard/circleguard/releases/latest. Download the appropriate binary for your OS (circleguard_win_x64.zip or circleguard_win_x86.zip for Windows, and circleguard_osx.app.zip for Mac OS). Circleguard was previously bundled as an exe for Windows but opened unbearably slowly, so it is distributed as a zip and you can run Circleguard.vbs (found inside the zip) in place of an exe.

If you are on another OS such as Linux, you will have to build circleguard yourself. See Building From Source.

There is an introduction / tutorial to using circleguard when you first open it. If you have any questions, feel free to ask on the discord.

Building From Source

The gui is bundled into a single program using pyinstaller. You'll need to install pyinstaller, download the source code of this repository, and read the pyinstaller documentation for your specific platform. You may find that further tweaking is required depending on your platform. If you run into trouble, I'll do my best to assist you if you ask in the discord.

If you are building for windows or mac, there are premade specfiles in the root directory for easy building. Run pyinstaller path-to-specfile to generate an app for your platform as an alternative to using pyinstaller options. For instance, pyinstaller gui_win_x64.spec for 64-bit windows.

Running Locally

To run circleguard locally, you'll need to have git and python3.10+ installed. After installing them, run the following:

git clone https://github.com/circleguard/circleguard.git
cd circleguard
pip install -r requirements.txt
python circleguard/main.py
# you might have to use python3 instead, eg python3 circleguard/main.py

Contributing

Join our discord and ask how you can help, or look around for open issues which interest you and tackle those. Pull requests are welcome!

Links

Discord: https://discord.gg/VNnkTjm

Circlecore

Circlecore does most of the heavy lifting for circleguard, such as calculating ur, similarity, frametimes, etc. If you would like to use circlecore in your own project, please see the developer guidance over at its repository:

https://github.com/circleguard/circlecore

Circlevis

The replay viewer is powerful enough that it was split off into its own repository. If you would like to use the replay viewer in your own project, please see the developer guidance over at its repository:

https://github.com/circleguard/circlevis

Credits

Thanks to Accalix for creating circleguard's logo.

circleguard's People

Contributors

invisiblesymbol avatar samuelhklumpers avatar stedoss avatar tybug avatar vvinslow avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

circleguard's Issues

KeyError/ValueError

[DEBUG] 2020/12/09 18:39:21.0882 Loading ReplayMap(timestamp=2020-11-01 01:50:40,map_id=1583472,user_id=17979769,mods=HDDT,cache=None,replay_id=3303128726,loaded=True,username=bruhnimal) (circleguard.loadables.ReplayMap, loadables.py:907)
[DEBUG] 2020/12/09 18:39:21.0883 Loaded ReplayMap by 17979769 on 1583472 already loaded, not loading (circleguard.loadables.ReplayMap, loadables.py:909)
[ERROR] 2020/12/09 18:39:22.0380 Error while running circlecore. Please report this to the developers through discord or github.
 (circleguard_gui, main_tab.py:503)
Traceback (most recent call last):
  File "site-packages\slider\library.py", line 256, in lookup_by_id
  File "site-packages\slider\library.py", line 224, in _raw_read_beatmap
KeyError: 1583472

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "site-packages\slider\beatmap.py", line 154, in parse
ValueError: not enough values to unpack (expected at least 2, got 1)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "gui\main_tab.py", line 421, in run_circleguard
  File "site-packages\circleguard\circleguard.py", line 211, in ur
  File "site-packages\circleguard\loadables.py", line 652, in beatmap
  File "site-packages\slider\library.py", line 260, in lookup_by_id
  File "site-packages\slider\library.py", line 408, in download
  File "site-packages\slider\beatmap.py", line 1905, in parse
  File "site-packages\slider\beatmap.py", line 157, in parse
ValueError: failed to parse TimingPoint from ' '

Indicate when ratelimited in status bar and terminal

Since there's currently no way for core to communicate this to guard, we just don't notify users when it occurs, which is not very good. We should formalize the loader subclassing implementation and use it in guard to connect the on_ratelimit function (whatever that ends up being) to the gui.

The separation of responsibilities between core and guard is also not very strong - core shouldn't require new_session and shouldn't keep track of progress, that should be left up to a loader subclass. If polished enough, we can include this subclass in core for use by users, although we won't use it ourselves.

OverflowError while parsing aleph naught

[ERROR] 2020/12/23 21:07:28.0721 Error while running circlecore. Please report this to the developers through discord or github.
 (circleguard_gui, main_tab.py:516)
Traceback (most recent call last):
  File "site-packages\slider\library.py", line 256, in lookup_by_id
  File "site-packages\slider\library.py", line 224, in _raw_read_beatmap
KeyError: 1680610

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "gui\main_tab.py", line 434, in run_circleguard
  File "site-packages\circleguard\circleguard.py", line 211, in ur
  File "site-packages\circleguard\loadables.py", line 652, in beatmap
  File "site-packages\slider\library.py", line 260, in lookup_by_id
  File "site-packages\slider\library.py", line 408, in download
  File "site-packages\slider\beatmap.py", line 2026, in parse
  File "site-packages\slider\beatmap.py", line 372, in parse
  File "site-packages\slider\beatmap.py", line 676, in _parse
OverflowError: Python int too large to convert to C int

The replay that caused this COULD be the following one
https://myangel.aku.lu/6J9qr90c.osr

Add abnormal frametime peaks to visualizer

To make telling whether a positive timewarp investigation is a false-positive or not easier, the option to find and view the timestamps of abnormally low frametimes in replays (for example, when a user tabs out) could be added to the visualizer if they're present.

Context for the suggestion:
https://discord.com/channels/532476765860265984/532476765860265986/786482623006244870
https://discord.com/channels/532476765860265984/532476765860265986/791423435187290143

Example replay:
https://myangel.aku.lu/QvOoz2Lp.osr

error parsing beatmap 177

Dunno if this is the same as #107, but here's another one I came across

[ERROR] 2020/12/13 17:54:06.0348 Error while running circlecore. Please report this to the developers through discord or github.
 (circleguard_gui, main_tab.py:516)
Traceback (most recent call last):
  File "site-packages\slider\library.py", line 256, in lookup_by_id
  File "site-packages\slider\library.py", line 224, in _raw_read_beatmap
KeyError: 177

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "site-packages\slider\beatmap.py", line 757, in _get_as_str
KeyError: 'PreviewTime'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "gui\main_tab.py", line 434, in run_circleguard
  File "site-packages\circleguard\circleguard.py", line 211, in ur
  File "site-packages\circleguard\loadables.py", line 652, in beatmap
  File "site-packages\slider\library.py", line 260, in lookup_by_id
  File "site-packages\slider\library.py", line 408, in download
  File "site-packages\slider\beatmap.py", line 1936, in parse
  File "site-packages\slider\beatmap.py", line 784, in _get_as_int
  File "site-packages\slider\beatmap.py", line 760, in _get_as_str
ValueError: missing field 'PreviewTime' in section 'General'

This happens when investigating the user with the id 1388767, no idea which replay or map specifically it is

Investigate potential to use 3.8 threading.excepthook

Our threading exception handling code is quite a mess right now (more so because of details outside our control than inside). Python 3.8 introduces a threading.excepthook function, and using that instead of sys.excepthook might avoid unwanted behavior where we are unintentionally silencing exceptions we want to be thrown or go somewhere else.

Or it might be a complete dead end - I haven't looked into this or tried it yet. Or even if it is a fruitful exercise, we may not want to upgrade to 3.8 (though this is more of a dependency concern than anything else; since we bundle python with circleguard we can theoretically work with any version our dependencies support).

Implement Relax checks

Will need a way to select which of the Detect options you're running a check for in the gui. This should be flexible enough to add several more options to it in the future - I'm not sure how best to display this without clutter, but something like a row of option: checkbox (eg Relax: โ˜) on each tab.

Maybe to reduce clutter, each type of detect (Steal, relax, aim correction) should be stacked vertically below the user/map id rows, and further options for them only shown when the detect is activated. So the steal threshold wouldn't show up until steal detect is checked, etc.

New settings will need to be added for relax detection output, and thresholds for it as well. Visualization can remain the same for now, but for future detect types visualization should have added information to it, like highlighting high jerk timestamps on the bottom progress bar for aim correction or only showing px distance for steal checks or showing a rolling ur + hit error bar at the bottom for relax checks.

JSONDecodeError when 429 Error

Might have replays that this happens to to be retried after a bit and add a better error message

(This was very likely caused by me browsing the osu! page while using Circleguard)

[ERROR] 2021/01/07 08:24:24.0932 JSONDecodeError, response: <Response [429]>, response.text: '<html>\r\n<head><title>429 Too Many Requests</title></head>\r\n<body>\r\n<center><h1>429 Too Many Requests</h1></center>\r\n<hr><center>nginx</center>\r\n</body>\r\n</html>\r\n' (ossapi.ossapi, ossapi.py:58)
Traceback (most recent call last):
  File "site-packages\ossapi\ossapi.py", line 56, in _process_url
  File "site-packages\requests\models.py", line 900, in json
  File "json\__init__.py", line 348, in loads
  File "json\decoder.py", line 337, in decode
  File "json\decoder.py", line 355, in raw_decode
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

NoInfoAvailableException when trying to investigate a restricted user

Circlegua rd also just stops so I'd suggest to just skip those instead. Also maybe a nicer error message.

[ERROR] 2021/01/04 16:03:16.0785 Error while running circlecore. Please report this to the developers through discord or github.
 (circleguard_gui, main_tab.py:526)
Traceback (most recent call last):
  File "gui\main_tab.py", line 308, in run_circleguard
  File "site-packages\circleguard\circleguard.py", line 477, in load_info
  File "site-packages\circleguard\loadables.py", line 140, in load_info
  File "site-packages\circleguard\loadables.py", line 329, in load_info
  File "site-packages\circleguard\loader.py", line 124, in wrapper
  File "site-packages\circleguard\loader.py", line 349, in get_user_best
  File "site-packages\circleguard\loader.py", line 610, in check_response
circleguard.loader.NoInfoAvailableException: No info was available from the api for the given arguments.

Allow a range of maps to be checked

If a user does a screen check with num_top=1, finds nothing, and decides they want to dig deeper, we shouldn't make them recheck map 1 again. Allow comma separated ranges (similar to choosing which pages to print) such as 2-4, 6, 7, which would check maps 2,3,4,6, and 7.

The comboboxes should be replaced with an InputWidget (or LineEdit) with its own validator (regex validator that qt provides or something simpler if possible). Nobody uses the combobox up/down arrows anyway, I imagine. Slider should be greyed out when the user adds a comma or dash.

This will (and should) require a core change to interpret ranges instead of numbers for convenience methods, with appropriate validation.

search for maps in user's osu installation

don't redownload a map that a user already has for osu. WIll require a changeable osu_path setting and still downloading the map through slider if they don't have it.

overhaul tutorial (aka wizard)

the tutorial is a little outdated as of 2.11.0 because it makes no mention of the two distinct screens. The Visualization screen is pretty intuitive, but it should be mentioned. And the part of the tutorial going over loadables needs to be considerably condensed / rewritten

Button to copy report template to clipboard

Don't make users type out everything for every report; generate a sensible template for them with the given result. This would be a button or dropdown on the results tab.

Related to #16 (and if #16 got implemented this would likely be rendered useless), but this is a good intermediate step before implementing an entire oauth flow which might be a bit of a pain.

Reddit integration

Use reddit's auth flow for a one click report to r/osureport on the results tab. Display a template in a new window and allow users to edit it before confirming post submission. Template should have links to both replay downloads (we have the score ids), the users, a sensible tile like [osu!std] {username} | replay stealing, and maybe a lowkey mention of circleguard somewhere.

"Copy Template" button gives superfluous outputs?

I believe that this button was added before the OsuReportBot (I believe those templates exist for Reddit reports)/the detailed score page were implemented, so there are a few superfluous lines in the output now.
An example output looks like this:

[osu!std] marinati | Timewarp

Profile: https://osu.ppy.sh/users/11078134

Map: https://osu.ppy.sh/b/1264192

replay download: https://osu.ppy.sh/scores/osu/3112210438/download

open in circleguard: circleguard://m=1264192&u=11078134&m1=DT

10.7 cv average frametime according to https://github.com/circleguard/circleguard

I don't really think that the profile has to be linked since the OsuReportBot I mentioned links the profile in question as well as important information about them:

firefox_Vd2lo376WU

On top of that, linking the map is unnecessary as well in my opinion since the replay download link links to the score page from which the map can be opened easily.

Also I think that the Replay Download line as well as the the "/download" should be replaced with just the score page as well since the link just redirects to the detailed score page.

Circleguard showing valid api key as invalid

Hi, I tried to use cg, but even creating the key in the exact same way it asks to in the tutorial, circleguard shows the api key as invalid when trying to load through handler circleguard://m=1839761&u=18539649

Implement mods option for map check

core 2.2.0 will have a mods option for the map_check convenience method, which downloads the top mods mad with only those replays. Should add this as an extra field to the gui - preferably as a small box next to the map id (don't add an extra row just for mods), but I couldn't get things to align using columnspan. Maybe someone else will have better luck.

Replays don't load on Visualize tab

I dont really know what im doing wrong. When i try to load a replay on Visualize, the tab doesn't change anything in it. I asked my friend that uses Circleguard and he said that it was working fine. Maybe my pc is missing something, i have no idea. Help?

image

(that print was taken after i tried to add a replay)

make results label clickable

so map id / other info can be copied easily. Shouldn't affect the look at all except changing cursor to the text cursor

Change visualizer icons

It's rather confusing to always see a pause icon on the visualizer, even when it's paused (one would expect to see a play icon then). I suggest we make the pause button change icons if the visualizer is paused, and change the frame advance and frame retreat icons to something like this, to avoid confusion with the play icon.

Visualizer Improvments

ordered by importance

  • mods used next to users
  • keys pressed next to users (two squares)
  • should be able to show info of at least 50 users
  • info shouldn't intrude into visualization (make window wider)
  • option to disable rendering of the beatmap #51
  • add that fancy frametime graph but without spaghetti code
  • make get_hitobjects faster
  • remove api dependency- if we don't have the ability, fall back to what we have. Also check map using hash instead of beatmap_id; the latter requires the api
  • draw sliderball
  • switch to drawing images of circles instead of circles
  • Add Skin support
  • draw nicer sliders

"Open Advanced Settings" does not work

Open Advanced Settings doesn't work on the two windows machines I have tested on.

On click, I get this error in console:
ShellExecute 'file:///C:/Users/Stedos/AppData/Roaming/Circleguard/circleguard.cfg' failed (error 31).

Settings and widgets should change concurrently

We have to do a lot of messiness with slots if we want this functionality currently. Not sure what this would look like but the current idea (with very little investigation to back it up) is to have a single slot that gets emitted with (setting name, new value) whenever a setting is written to. Widgets can then subscribe to this signal by subclassing a Linked class or so, and implement on_setting_changed. The single slot would connect to a Linked class attribute, and on_setting_changed would only be called if the slot setting_name matches the filter given at instantiation time.

The opposite of this - updating settings using an equivalent signal on a widget - could probably also be implemented here, but I'm not so sure of the details of that one. Will have to see if it's feasible

tldr abstract by adding a way to subscribe to an on_setting_changed signal

Delay expensive imports until necessary

Circleguard takes longer than it should to start, and I'm fairly certain it's because the imports (of which we have many) take a not insignificant amount of time to load. We should be loading circlecore (which in turn loads numpy/scipy), matplotlib, and potentially others only when necessary.

Using the same path for local replays folder not working after reloading loadable.

For example:

  1. Create "Local replay" loadable
  2. Click on "Choose folder", and choose any path
  3. Click "Run"
  4. After this, you wanna reload loadable, so you will delete this loadable, and do same steps (1,2,3)
  5. Circleguard refuses to run the scan because he doesn't like something in our loadable
    Screenshot_3

Edit: Step 4 also applies when you close and reopen Circleguard

Export as gif

Would be neat to export a result as a gif for easy sharing on reports or elsewhere. Unsure of how feasible this is when all the drawing/frames is handled by qt, but something to look into.

NoInfoAvailableException when attempting to investigate an unavailable/restricted user

[ERROR] 2020/12/13 17:24:38.0580 Error while running circlecore. Please report this to the developers through discord or github.
 (circleguard_gui, main_tab.py:516)
Traceback (most recent call last):
  File "gui\main_tab.py", line 308, in run_circleguard
  File "site-packages\circleguard\circleguard.py", line 465, in load_info
  File "site-packages\circleguard\loadables.py", line 138, in load_info
  File "site-packages\circleguard\loadables.py", line 327, in load_info
  File "site-packages\circleguard\loader.py", line 124, in wrapper
  File "site-packages\circleguard\loader.py", line 349, in get_user_best
  File "site-packages\circleguard\loader.py", line 610, in check_response
circleguard.loader.NoInfoAvailableException: No info was available from the api for the given arguments.

Attempted to investigate user 5645067 if it matters

Use non-rectangular icon for macos

Rectangular icons are associated with system applications on osx. Our icon should be circular, or slightly tilted (see: textedit, typora, and xcode icons). I don't see the current icon looking very good under either of these scenarios, however.

replays which are not top plays should specify mods

especially prevalent for replay remods, which have a url like circleguard://m=21777&u=12092800&u2=12092800 which just plays the same replay twice. We should specify mods like m1 or m2=HDHR (should have chosen b instead of m for map, oops...) and assume top replay if mods are not specified.

TypeError: 'NoneType' object is not subscriptable

error while loading a replay: 'NoneType' object is not subscriptable
Traceback (most recent call last):
File "gui\main_tab.py", line 341, in run_circleguard
File "site-packages\circleguard\circleguard.py", line 448, in load
File "site-packages\circleguard\loadables.py", line 1025, in load
File "site-packages\circleparse\replay.py", line 221, in parse_replay_file
File "site-packages\circleparse\replay.py", line 205, in parse_replay
File "site-packages\circleparse\replay.py", line 61, in init
File "site-packages\circleparse\replay.py", line 74, in parse_replay_and_initialize_fields
File "site-packages\circleparse\replay.py", line 151, in parse_play_data
TypeError: 'NoneType' object is not subscriptable
The replay Unloaded ReplayPath at [replay path].osr has been skipped because of this.

Replays that this happens to:
https://myangel.aku.lu/4RbDQBgU.osr
https://myangel.aku.lu/me2cIis6.osr
https://myangel.aku.lu/0rN3jDwS.osr
https://myangel.aku.lu/gQtIOdG9.osr

IndexError while running user check

[ERROR] 2019/08/24 23:32:31.0330 Error while running circlecore. Please report this to the developers through discord or github.
 (__main__, gui.py:552)
Traceback (most recent call last):
  File "gui.py", line 506, in run_circleguard
  File "site-packages\circleguard\circleguard.py", line 356, in load
  File "site-packages\circleguard\replay.py", line 157, in load
  File "site-packages\circleguard\loader.py", line 37, in wrapper
  File "site-packages\circleguard\loader.py", line 160, in user_info
IndexError: list index out of range

while running a user check with options userid: 6909105, num_top: 100, num_plays: 100, threshold: 18 it errors on map 777303 because it tries to load the replay for a user that doesn't have a replay on the map, nor does he actually exist (4680149). It's possible that since user infos are loaded at the beginning of the run, the user did indeed have a play in the top 100 on map 777303 but was restricted before we got to it. I tried to reproduce this by running a user check on only that map but could not reproduce, and the api does not return the user in the top plays, agreeing with the website. I find him getting restricted to be the most likely explanation but it's possible the only way to reproduce this issue is run the user check from the beginning (which takes ages.)

Error after starting two identical loadables "Map"

To reproduce this, create 2 same loadables "Map" like this:
Screenshot_4
And choose something to investigate, but not "similarity" (it works normal)
Last message and error:
Screenshot_6
Look like the problem in skipping, so you need to start a map, that has no replay in top 100 (for example 240011)

Suggestion: Screenshot of frametime histogram in template

By now, the template output for timewarp includes only limited information on the frametime. As looking at the frametime histogram can be important to rule out a potential false-positive, users who review the report and need to be sure about whether the score in question was cheated or not will have to look at the frametime histograph itself. To make this easier for them, the option to include a screenshot in the template could be of use.
I suggest a potential ShareX-integration of some sort could be a well solution since many community members use it.

Redesign main tab

We need to rewrite the Main tab to allow for more detects than just replay stealing. This new interface should be flexible enough to allow for more detects to be added, some with potentially strange/different requirements from current detects (think aim correct, which has more than a single number that needs to be set).

Original Thoughts

[Main]    Results    Queue    Thresholds    Settings
[Check Map]    Screen User    Check Local    Verify    Visualize

Map id: [                                  ]

--------------- Steal Detect ---------------

Enabled [ ]

# everything below hidden since enabled unchecked
num: [     ]  span: [        ] mods: [     ]
user ids: [                                ]
threshold: [18]
--------------- Relax Detect ---------------

Enabled [x]
num: [             ]  span: [              ]
user ids: [                                ]
threshold: [50]

etc..

this is OK but doesn't give enough control without us making the interface near unusasble. For instance, how would you load two players with different mods? Or signify you want some replays in replays1 and some in replays2 for a steal check? Or compare across maps or users, or online to local? We historically handled these with special cases in the respective tabs but that feels increasingly unwieldy.

Final Proposal

[Main]    Results    Queue    Thresholds    Settings

{Add Map} {Add User} {Add ReplayMap} {Add ReplayPath}

# Each {Add _} button would populate a draggable object onto the empty area below, 
# highlighted red to show not all necessary fields are filled out. It would look
# something like this, with each field being a LineEdit you could click and fill in:

|----------------|
| Map  id=1  {x} |
|----------------|
| map_id: [    ] |
| num:    [    ] |
| span:   [    ] |
| mods:   [    ] |
|----------------|


|---------------------|           |---------------|        etc.
| Steal Detect        |           | Relax Detect  |
|---------------------|           |---------------|
| Threshold: [    ]   |           | Threshold: [ ]|           
|---------------------|           |---------------|
| replays1 | replays2 |           |   draggable   |
|''''''''''|''''''''''|           |     area      |
| draggable| draggable|           |---------------|
|    area  |   area   |
|---------------------|


{---------------------  Run  --------------------}

The Map/User/etc can then be dragged onto the draggable areas, where they are referenced by id (Map 1) to avoid confusion between multiple of the same object, but do not dissapear from the main area, and can thus be dragged to multiple detects.

On run, of course, each detect with any objects in it is run by circlecore. This maps extremely well to circlecore, assuming circlecore == 2.5.0, as we represent each of core's objects as a user-creatable object in the gui.

no more subtabs below main, the user is given total freedom over how they want to compare maps/users/replays and what mods for each, and even if an individual object should be cached if we want to provide that as an option (might be useful).

If there was a need for it we could also provide functionality for adding more detects, so you can have a strict detect and a loose detect with different thresholds. But I think this is actually better served with a "suspicious threshold" and "cheat threshold" in the gui, and they're separated into two sections in the Results tab or soemthing. So you can still keep replays you may want to look at, but only want to get notified/really care about the blatant ones.

Suggestions

Imma be straight to the point, there you have some suggestions

Check Local:

  • Option to choose a replay instead of choosing the complete folder.
  • Choose mods that we want to compare.

Check Map:

  • Choose mods that we want to compare.

Visualizer:

  • Option to turn on or off circles and sliders (and reverse arrows) to the replay

New tabs:

  • Replay analytics like firedigger's replay analyzer. i guess that it would be very cool xd

Others:

  • Be able to make "Results" tab get to a new window, like debug output.
  • Make the same thing with "Queue"
  • Change background color
  • Make Message Format on settings editable from .txt directly.

I dont know if theso suggestions are possible to make ;-;

Move to config file system instead of in-house

Specifically for the string settings, editing them in the settings tab can be unwieldy. Part of the issue of course is that they are in single line boxes, but putting the reddit template (for example) in there is never going to look good or feel nice to edit. Moving all string settings to their own file also allows us to put extensive comments on what options are available (r, r1, r2 and their attributes, etc) as well as allow easier editing. We should provide a button to open this file in the system's default editor, possibly using https://doc.qt.io/qt-5/qdesktopservices.html#openUrl.

Updating the settings would become more difficult from our end if this got implemented - the easy (but a little awkward) way to do this is look for the setting key and then overwrite its value.

Hard to distinguish where Results come from

Specifically because there's no map, mods, or any other distinguishing information displayed or passed to the result string. Someone that gets a lot of results (eg https://i.imgur.com/ffbiays.png, censor was applied by the user not the program) can't investigate further beyond visualizing in the program. Aggravating this is a lack of logs to the terminal that make it obvious what's going on when to the user (checking map x, checking remods on map x), though only really pertinent to user screens.

We should subclass Replay to guarantee a map_id (retrieve it for local replays from the map hash provided). Not comfortable changing this at the circlecore level because there may be scenarios users do not know the map id.

replays on deleted maps cause errors on map lookup

eg https://cdn.discordapp.com/attachments/539956865245904906/695710230453158008/Ali_Ahmed_-_isoganakya_-_isogu_Stream_Practice_Maps_400BPM_2020-04-03_Osu_-_Copy.osr . This will likely be solved by addressing #59, since users can just have the map downloaded in osu already. In the meantime we could catch the exception thrown by slider and display a "We do not currently support relax checks on deleted beatmaps" message in the terminal.

[22:01:15] Running Relax check
[ERROR] 2020/04/03 22:01:15.0612 Error while running circlecore. Please report this to the developers through discord or github.
 (__main__, gui.py:741)
Traceback (most recent call last):
  File "lib\site-packages\slider\library.py", line 256, in lookup_by_id
  File "lib\site-packages\slider\library.py", line 224, in _raw_read_beatmap
KeyError: 0

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "lib\site-packages\circleguard\circleguard.py", line 115, in run
  File "lib\site-packages\slider\library.py", line 260, in lookup_by_id
  File "lib\site-packages\slider\library.py", line 384, in download
  File "lib\site-packages\slider\beatmap.py", line 1630, in parse
StopIteration

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "gui.py", line 719, in run_circleguard
RuntimeError: generator raised StopIteration

Not very high priority since most people care about ranked/loved maps, which will always be available from online.

Url not working?

So, i tried this: circleguard://m=240011&u=913428&m1=HDDT
and it output me this:

[DEBUG] 2020/12/11 03:26:12.0170 Loading ReplayMap(map_id=240011,user_id=913428,mods=HDDT,cache=None,loaded=False) (circleguard.loadables.ReplayMap, loadables.py:907)
[ERROR] 2020/12/11 03:26:12.0175 sys.excepthook error
Type: <class 'TypeError'>
Value: %d format: a number is required, not str
Traceback:   File "main.py", line 145, in run_with_except_hook
  File "threading.py", line 870, in run
  File "main.py", line 182, in run_server_socket
  File "gui\circleguard_window.py", line 204, in url_scheme_called
  File "site-packages\circleguard\circleguard.py", line 448, in load
  File "site-packages\circleguard\loadables.py", line 915, in load
  File "site-packages\circleguard\loader.py", line 124, in wrapper
  File "site-packages\circleguard\loader.py", line 278, in replay_info
  File "logging\__init__.py", line 1444, in log
  File "logging\__init__.py", line 1514, in _log
  File "logging\__init__.py", line 1524, in handle
  File "logging\__init__.py", line 1586, in callHandlers
  File "logging\__init__.py", line 894, in handle
  File "gui\circleguard_window.py", line 35, in emit
  File "logging\__init__.py", line 869, in format
  File "logging\__init__.py", line 608, in format
  File "logging\__init__.py", line 369, in getMessage

 (circleguard_gui, main.py:129)
Traceback (most recent call last):
  File "main.py", line 145, in run_with_except_hook
  File "threading.py", line 870, in run
  File "main.py", line 182, in run_server_socket
  File "gui\circleguard_window.py", line 204, in url_scheme_called
  File "site-packages\circleguard\circleguard.py", line 448, in load
  File "site-packages\circleguard\loadables.py", line 915, in load
  File "site-packages\circleguard\loader.py", line 124, in wrapper
  File "site-packages\circleguard\loader.py", line 278, in replay_info
  File "logging\__init__.py", line 1444, in log
  File "logging\__init__.py", line 1514, in _log
  File "logging\__init__.py", line 1524, in handle
  File "logging\__init__.py", line 1586, in callHandlers
  File "logging\__init__.py", line 894, in handle
  File "gui\circleguard_window.py", line 35, in emit
  File "logging\__init__.py", line 869, in format
  File "logging\__init__.py", line 608, in format
  File "logging\__init__.py", line 369, in getMessage
TypeError: %d format: a number is required, not str

Scaling issues on windows

Setting the scaling on windows to anything above 100% results in a broken looking gui. The cause seems to be that the padding scales but the font doesn't.

Also the buttons in the visualizer appear to have no padding at all.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.