Giter VIP home page Giter VIP logo

neg5.main's Introduction

Neg 5 : Quizbowl for the Cloud

Alt

Neg 5 is a web based quizbowl tournament management system. It enables tournament directors to add collaborators to their tournaments for real-time tournament management. This ranges from managing teams and players to submitting match scoresheets electronically. Transitioning quizbowl to a cloud-based system has the potential to drastically reduce tournament waiting times, expediting the entire process.

Try it out at your next tournament!

Neg 5 is currently in the last stages of a transition phase to the next version. I've been changing the entire application and there's still a bit of work to do, but it's getting closer every day!

Current Features

  • Support for standard ACF and NAQT quizbowl tournament formats
  • Infinite number of collaborators at admin or non-admin levels
  • Team and player management
  • Manual match entry
  • Self-updating electronic scoresheets for match entry
  • Realtime statistics
  • And more!

Upcoming Features

  • Support for hsquizbowl.org database upload
  • Eventual support for NAQT QBJ export
  • Realtime protest handling
  • Tournament chat
  • Built in timer for timed matches

I'd love to hear your ideas on what you'd like the application to support!

Contributing

If you're interested in contributing to Neg 5's development, please see the Getting Started and Contributing guides.

Documentation

Neg 5's documentation can be found in the docs directory in this Github repo. The SQL database schema is under docs/database.

License

MIT

neg5.main's People

Contributors

jonahgreenthal avatar mostafab avatar msbhuiyan avatar

Stargazers

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

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

neg5.main's Issues

Tracking each bonus part on scoresheet

Need to add in a way to to this.

idea right now is to make the Bonus class contain an array of BonusParts, where each BonusPart will have the answering team id as a field. Add a "dead bonus part" button

Potential problems or issues that might arise include reverting bonus parts gotten and displaying it.

Phase not automatically selected though required

When entering stats for games, the program will not allow the game to be submitted unless a phase is entered. This applies even if there is only one phase; the program doesn't even automatically select the sole phase. The program should automatically select the sole phase when there is only one phase in the tournament.

Also, I suggest moving the phase entry to the top of the match entry. This will help catch cross-"division" matches before too much data is entered (see #39). It is easy to miss this required field among the optional fields wherein it is currently located.

Warn on cross-division matches

The program accepts matches between teams in different divisions. This is likely (but not always) an error (caused by misnaming a team), so the program should warn the user about this.

Validate tossups heard

  • Game TUH should be nonnegative (except in the case of a forfeit)
  • Each player TUH should be ≤ game TUH. 0 could be permitted*, but probably doesn't mean
    anything, so it should at least incur a strong warning. Negative should never be permitted.
  • Each player TUH should add up to ≥ (powers + tossups + interrupts)
  • Player TUH on each side should add up to ≤ (players per team at a time) * (game TUH)

*For instance, in formats with lightning rounds, a player might be subbed in for the lightning rounds and subbed backed out after.

Don't accept impossible overtime results

Don't accept results that indicate one or more overtime tossups played but the game could not have been tied. (Whether this is possible depends on the format.) Example: in NAQT or ACF, an overtime game cannot end 320-220 (it's likely a typo of 230-220).

UI/UX feedback

  • Get rid of the "Loaded Team: [Team]" on the team list / team edit page. It's redundant with the fact that the team appears in the edit section. Likewise with "Loaded [Team] Players: [#]" on the game entry page.
  • It would be better to call "Divisions" "Pools". I realize SQBS calls pools "Divisions", but the term is confusing — for instance, many tournaments have "varsity" and "junior varsity" divisions, the ICT has "Division I" and "Division II", etc.; each may have pools within the divisions. The standard quizbowl definition of "division" entails that teams remain in the division for the entire tournament and there are no games (except perhaps exhibition games) between teams in different divisions.
  • Instead of having to click a pencil icon next to a field to edit it, how about having a click within the field turn it into an editable box?
  • Sometimes (e.g. on the "Configuration" page) there are groups of fields that have a collective pencil/edit icon; sometimes there is one such icon per field. Why? If there's not a good reason, standardize. (And if there is a good reason, try to somehow make it clearer.)
  • It doesn't make sense to me that divisions [sic] are entered on the Configuration page, while Phases are entered on their own page. Divisions are children of Phases, so they should be entered on the Phases page (given that there is one) or their own page. (I may also have further interface improvements to suggest once this is fixed, since I don't like how division entry works even given the page it is on.)
  • Sometimes changes are saved upon the change being made (e.g. the dropdown one uses to assign a team to a division [sic] for a phase), sometimes via a "Save Changes" button for the whole page (e.g. on the Overview page), and sometimes via a "Check" button for the specific field (e.g. the text box for adding a new phase). This is confusing and should be standardized.
  • It is not obvious to me that one should have to click the edit/pencil icon to make the delete/trash icon appear to delete something (e.g. a phase). Maybe always show the trash icon?
  • When the delete/trash icon and cancel/X icon appear side by side (e.g. when editing a phase name), it is not necessarily obvious what the difference is between those icons; either could plausibly mean the other. Don't show both icons at once (see previous item).
  • Once I start entering a game, I don't know how to say "never mind, I don't want to enter a game".

[more to come, perhaps]

Warn if 2 matches with same moderator or room in same non-TB round

Each moderator should only read one game per non-tiebreaker round, and each room should only be used in one game per non-tiebreaker round. Duplicate entries suggest a round number may have been incorrectly entered. (This won't and shouldn't catch misspellings or various alternate ways of identifying room and moderator, but a basic sanity check would help.)

Suggestions on things to validate

Here is what I suggest validating. This is based heavily on what NAQT validates.

General error-checking:

  • No team plays more than one non-tiebreaker game per round
  • No team name is repeated
  • No player name is repeated on the same team

Game error-checking:

  • No team plays a game against itself
  • Forfeit games have no data other than the teams (with winner and loser) and the forfeit status; no points or player results etc.
  • Round number is specified and positive (this was checked for "nonnegative" but should really be positive)
  • There is only a tie if the scoring rules allow ties
  • TUH is a nonnegative integer (and see below about sanity-checking) (this was checked for "nonnegative" but should really be positive)
  • Total powers + tossups (across both teams) is ≤ TUH
  • Total interrupts (across both teams) is ≤ TUH

Team-in-game error-checking:

  • No player appears more than once in the same game
  • All scores and score components are only present if appropriate to the scoring rules. For instance, if the scoring rules say there aren't bouncebacks, there shouldn't be any bounceback points recorded.
  • All scores and score components are within appropriate ranges configured according to the scoring rules. For instance, bonus points must be nonnegative [#22] and must be ≤ ((team powers + tossups) * maximum value of one bonus).
  • All scores and score components are divisible by appropriate divisors. For instance, bonus points would never be non-divisible-by-5 in any common modern format, and in most must be divisible by 10.
  • Tossups without bonuses is a nonnegative integer
  • Total powers + tossups + interrupts is ≤ game TUH

Player-in-game error-checking:

  • Each player TUH is a nonnegative integer (and shouldn't usually be 0; see #20 for why it could be)
  • Each player TUH is ≤ game TUH
  • Total player TUH on each side is ≤ (game TUH * number of players active at a time)
  • Powers is a nonnegative integer, and is 0 if the scoring rules don't include powers
  • Tossups is a nonnegative integer
  • Interrupts is a nonnegative integer, and is 0 if the scoring rules don't include interrupts
  • Powers + tossups + interrupts is ≤ player TUH

Sanity checks: These shouldn't generate an error, just a warning

  • Warn if game TUH falls outside some reasonable range (configurable according to scoring rules; for untimed 20/20 games it would be 20–~22, for NAQT games it would be ~15–~27)
  • Warn if game TUH is different from the vast majority of games in the tournament and it's not an overtime game. This doesn't apply in timed formats (because the "vast majority" criterion won't be satisfied), but in untimed 20/20, someone could fat-finger 22 for TUH when it should really be 20.
  • Warn if game combined score falls outside some reasonable range (likewise configurable; for untimed 20/20 it would be 900 if powers, 800 if not; for NAQT it would be 1080). This is only a sanity check because it gets a whole lot more complicated when you account for overtime.
  • Warn if a team's roster's size is at least the number of players active in a game at a time on each side, but the team TUH is less than (players active * game TUH). For instance, if the scoring rules say there are 4 players on each side (as usual) and the team has 4 players on its roster but only uses 3 players in the game, that should be a warning.
  • Warn if player TUH is 0
  • For what it's worth, the notion of non-error sanity checks is new to NAQT's system and there are probably a bunch that I haven't thought of yet. Feel free to suggest some to us (me)!

Allow tracking of lightning rounds (and, conceptually equivalently, worksheets)

They're isomorphic in the sense that both are points earned not by any individual player (i.e., not tossup points), not as a result of answering a tossup correctly (i.e., not bonus points), and not as a result of the opponent answering a tossup correctly and then answering a bonus incorrectly (i.e., not bounceback points).

Tournaments should be configurable in terms of whether they use lightning rounds, and if so, specify the maximum number of points a team could earn in the lightning rounds of one game.

Ideally bounceback lightning round points would be tracked separately.

Unit tests

Are there any plans for including unit tests? This would be a good idea to have especially for tournament-critical software; they would also be useful for new features (as indicated in the issues). (I'm considering writing some myself but I need to figure out how node.js and the code works and how to incorporate unit tests.)

Properly account for tossups that don't lead to bonuses

This occurs in overtime in some formats. Furthermore, some formats (like MSHSAA and MNHSQB) have sections of the game in which tossups never lead to bonuses. Calculating PPB correctly is impossible if these are not accounted for.

Accounts should be visible by default

I don't see a good reason to hide accounts by default. Users don't expect this to happen. Every time I tried to add someone to my tournament, I had to instruct people to unhide their account.

passport missing from package.json

When trying to run the server locally I get the following:

module.js:340
throw err;
^
Error: Cannot find module 'passport'
at Function.Module._resolveFilename (module.js:338:15)
at Function.Module._load (module.js:280:25)
at Module.require (module.js:364:17)
at require (module.js:380:17)
at Object. (D:\neg5\config\express.js:5:16)
at Module._compile (module.js:456:26)
at Object.Module._extensions..js (module.js:474:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Module.require (module.js:364:17)
at require (module.js:380:17)
at Object. (D:\neg5\server.js:5:15)
at Module._compile (module.js:456:26)
at Object.Module._extensions..js (module.js:474:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)

I'm assuming passport is passportjs, which is not included in the package.json file.

Allow changing the order of players on scoresheet.

In the scoresheet, players for each team are listed according to some arbitrary order (looks like alphabetical?). Scorekeepers should be able to change the order the players appear to reflect the actual order in which they're sitting.

ACF rules: warn if team gets overtime tossups and TUH==20

In untimed 20/20 formats, TUH==20 if and only if overtime is not played. If a team is credited with an overtime tossup, TUH should be greater than 20. (The converse is not true, as a game can go into overtime without a team getting an overtime tossup if the game ends by a neg.)

Needs Error checking

Manual entry of match data needs to have error checking. It needs the error checking that SQBS does to check the bonus points and check that the points per bonus for that match actually make sense (e.g. no negative bonuses). If there is a problem, it shouldn't save that match and instead warn the user there is an issue that needs to be fixed. Also, a field which is autofilled with the bonus points earned would also be useful for allowing users to error check themselves.

Bonus points can never be negative

I haven't dug too deeply into this, but in the exported .qbj file for the 2016 Illinois NAQT State Championship, two games have negative bonus points reported. This is never possible and should not be allowed to be entered or reported. I don't know if other games have faulty bonus points too.

Merge conflict in stats-route.js

Running a new server from the source will fail because app\routes\stats-route.js has an unresolved merge-conflict starting on line 7.

Allow importing a team list / rosters

When teams enter rosters in Google Forms or similar, or just email them to the TD, it's often relatively easy to massage them into a fairly uniform text document, but really annoying to paste line-by-line into a web page.

QBJ import would be nice, but a plain text file option is very desirable too.

I imagine the files would be formatted like this:

Team Name 1
Division Alpha
Player 1
Player 2
Player 3

Team Name 2
Division Beta
Player 1
Player 2
Player 3
Player 4
Player 5

etc. Players and divisions are optional (and to distinguish between the first player name and the division name, you'd specify on upload whether divisions are present). Divisions get created upon upload if they don't already exist.

same account on multiple computers

When I use the same account on different computers to work on the same tournament, there are problems that could occur due to the lack of refreshing of the web page. If the page is not refreshed, the new data does not appear. This can become troublesome for tournaments that are using a team account to reduce the hassle of having everyone creating their own account.

Don't scroll team edit section while scrolling team list

When scrolling a long team list, the team-edit section disappears. So to edit a team that's late in the list, I have to scroll to the bottom, then scroll back up. It would be better if the editing section didn't scroll (display: fixed).

Validate tossup totals

  • Each team's (powers + tossups + interrupts) should add up to ≤ game TUH
  • The total of (powers + tossups) across both teams should add up to ≤ game TUH

ACF/NAQT: Warn if bonus points not a multiple of 10

Theoretically possible with non-standard bonus scoring formats (for example, two parts for 5 points each instead of a 10 point part), but more likely a math error on the scoresheet. Not a duplicate of #24 since, even if it possible for bonus points not be a multiple of 10, the user should be alerted to the likely possibility of a math error.

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.