A Cutting-Edge, Modular Score Tracker

Overview

Tachi

This is the main monorepo for Tachi.

What is Tachi?

Tachi is a modern, powerful, modular Rhythm Game Score Tracker.

In short, it does the things that people would otherwise make spreadsheets for.

Tachi is a score tracker and analyser for various rhythm games. It was designed out of a dislike for existing websites that display your scores. I think that scores are integral to the rhythm game experience, and that displaying them properly is just as important!

By using Tachi, you get access to powerful, novel rhythm game score-tracking features, like automatically breaking your scores into sessions, setting goals and rivals, and more!

There are way more features that Tachi has, and you can read about all of them here.

Setup

Setting up a local instance of Tachi at the moment is a bit of a pain. You'll need MongoDB and Redis installed and running.

You'll need pnpm. Get it with npm install -g pnpm.

Run _scripts/bootstrap.sh to move example config files into an active position.

Use pnpm install to install all of the necessary dependencies.

Use pnpm start in a directory to build and run the client/ or server/.

Run both, together, to have a full tachi setup.

Use ts-node server/src/scripts/sync-database to load the database-seeds.

Repository Info

This monorepo contains the following codebases:

  • client/, Which is a React frontend for Tachi.

The client and the server are fairly decoupled. Someone could trivially create their own frontend client for Tachi.

  • server/, Which is an Express-Typescript backend for Tachi.

This contains all of our API calls, and interfaces with our database, and powers the actual score import engine.

  • database-seeds/, Which is a git-tracked set of data to be synced with Tachi.

This is the source of truth for the songs, charts, and more on the site! By submitting PRs to this, you can fix bugs on the website, add new charts, and more.

  • bot/, Which is a discord bot frontend for Tachi.

  • common/, Which contains common types, utils and functions shared between all other packages.

This is also published to NPM when it hits production.

  • docs/, Which contains Tachi documentation.

  • sieglinde/, Which contains our BMS/PMS analysis functions.

Comments
  • SDVX EXScore Support

    SDVX EXScore Support

    SDVX6 adds a new scoring system -- EX Score. This causes a myriad of problems for the site if we choose to support it, but it seems like more and more people are using it as a metric.

    Infact, as time goes on I expect people to be using this more and more as players get bettter at PUCing charts.

    This sucks, because it's very hard for us to implement it.

    Outline

    Tachi has no support for multiple scoring systems inside a score. You have score, percent and lamp. Those are all of the base properties. Since EXScore doesn't really fit into any of those, we can't use them.

    Options

    New Field

    We could add a new object to all scores, called otherScores, or something. This would define a must-include list of other scoring systems that should be included as part of the score. This would allow us to overload a score document indefinitely with other scoring systems.

    n.b. There are other games (such as DDR) which have many scoring systems actively used by the community, so this might be useful there.

    HitMeta

    We could put the value in HitMeta. It meets all the criteria to be hitMeta from a semantic perspective, but this isn't great. Scores can't have their hitMeta updated once they've been inserted into the database, and most of the time when people care about SDVX EXScore, they're getting a PUC. This means the score will have the same scoreHash, and therefore they would never be able to update their EXScore.

    There is a separate issue (#622) that might be able to give us some more wiggle room there.

    ScoreMeta

    This does not make sense to go in ScoreMeta. Also, scoreMeta should have really been called playerMeta, or something.

    CalculatedData

    Not really. It can be calculated from judgements, but it shouldn't be.

    Incredibly Difficult 
    opened by zkldi 13
  • WACCA Support

    WACCA Support

    cg505 appears to be championing this quite a bit as an idea, and there's no reason we can't. We'll just have to sit down at some point and talk about how the game works and then parse some chart data. Sounds easy enough. Which means it'll be fiendishly difficult.

    New Game 
    opened by zkldi 8
  • Investigate Storing PBs

    Investigate Storing PBs

    Motivation: Getting someones "PB" is a very common operation. This was initially optimised for Kamaitachi 1.6 not long ago, with the isScorePB and isLampPB flags. The main issue is that these are disjoint flags, and don't exhaust all states of a "pb".

    Functions like AutoCoerce handle the joining of isScorePB and isLampPB, but it's a weird performance hit.

    The other issue is that there are other things (like BP in iidx) which may be under neither flag (although this is rare). Could we perhaps do something like a "pb-scores" collection which is updated on score-submission? This would be heavily optimised, and reduce calls to things like AutoCoerce.

    Downsides: Heavy redudancy! We're copying score documents, more or less. We're conjoining scores that can't properly be referenced, either.

    This should probably be sat down and thought on. We'll see how everything looks when we approach the tail end of the score import cycle, since that should give us a better idea. I think this might be good though.

    New Feature 
    opened by zkldi 6
  • Add CI/CD

    Add CI/CD

    When a push is made to the main branch the bot should auto-deploy to the server.

    The following secrets need to be set up on the repo:

    ENV=PROD
    PROD_DISCORD_TOKEN=discordToken
    

    These env vars are used by createEnv.sh to generate the bots environment file. When pushing the bot to the server ensure you run this script beforehand and also push the generated .env file

    This ticket is blocked until TNG-dev/tachi-bot#10 is merged

    enhancement 
    opened by pfych 6
  • Ranking/Playcount Snapshots

    Ranking/Playcount Snapshots

    I want to display a Ranking-over-time graph on the overview, and maybe a cumulative playcounts one.

    The latter can be derived cheaply, but the former absolutely can not. Could we set up some sort of cronjob to do this?

    cc: @ereti

    New Feature Infrastructure High Priority 
    opened by zkldi 6
  • BeatorajaIR Dynamic Tables

    BeatorajaIR Dynamic Tables

    By using beatoraja's table functionality, we can create dynamic pseudo-tables based on some things users have going on. This might open the door for some interesting concepts.

    We don't have to actually honour the concept of a table being an ascending list of folders, but rather take advantage of the fact that we can just create folders dynamically -- things your rivals have played recently, things you've highlighted recently, etc, definitely challenge integration.

    We'll see.

    New Feature Bokutachi package:Server 
    opened by zkldi 6
  • SDVX1-2 Converts for USC have incorrect levels on the site

    SDVX1-2 Converts for USC have incorrect levels on the site

    Amusing note: The checksums used by USC include the chart level; this means that people playing the game cannot change their levels locally, or they will no longer have the same chart checksum as everyone else. Wonderful!

    However, we can change this in the seeds and it will propogate fine in the UI (and fix some faulty VF calcing)

    bug package:Database-Seeds 
    opened by zkldi 5
  • User Game Stats

    User Game Stats

    Needs to be ported from KT. Should be decently simple, maybe. This is related to TNG-dev/Tachi#462, too (sorta?).

    Could be done tonight, seems easier than writing goal support 🤮

    Port From Kamaitachi 
    opened by zkldi 5
  • USC Converts are in a terrible state

    USC Converts are in a terrible state

    Oh Boy, this might be worse than any other data issue we've had to deal with so far.

    Overview

    Charts in USC are identified by their sha1sum. This is great for avoiding stupid things like songtitle matching (which is a terrible idea). BMS uses this with md5/sha2, and it works great over there. The difference - however - between bms and usc in this regard is that USC charts are mostly converted by hand from SDVX.

    It's also worth noting that 10 minutes ago I was told that almost every single convert has a noticeable error, such as missing notes, notes on completely wrong snaps, or holds that end way too early. This is the crux of the issue -- so many people are silently playing on broken or different versions of the 'same' chart.

    Since we use the sha1sum to identify charts, all of these charts are regarded as different charts. This means the IR inevitably gets flooded with garbage, and we have to deal with it all. There isn't a nice fix for this at the moment.

    I'm thinking of standardising on the oniichan converts, since those seem to be what most players use. However, there's no telling whether they'll silently back-update charts, or some garbage like that.

    Standardising doesn't help much either, since thousands of players still have incorrect converts on their harddrive, and asking them to update to different versions is going to be a massive pain. I think we are actually just kind of screwed here.

    Unscrewing

    One of the hacks we could use is rejecting new charts on the IR if and only if they have the same song title as an official already on the IR, and the same difficulty. This would reject spam small diffs to the IR, and ultimately reduce the amount of cleaning that has to be done.

    I'll also need to append the sha1sums from oniichan at some point. That'll be fun.

    bug 
    opened by zkldi 5
  • ITG Stamina Support

    ITG Stamina Support

    I've been playing it too much and it'll take too long to write my own client (even though that's 100% what needs to be done.)

    This is a stopgap solution but I think it'll be fun. We'll fork the groovestats launcher and push tachi into it, then we'll roll.

    I only intend to support ITG Stamina at the moment -- they'll be separate GPTs (ITG Stamina (Single), maybe?). Then I'm just going to add support for all the packs I care about. That's ECS8 -> ECS10.5 and SRPG3-5. That's enough content for everyone, right? I don't really know. Our tables/folders solution should end up being fairly elegant though.

    I wonder what kind of data we can pull from the client?

    For scoring, I'm torn on what to actually use. EX Score is probably better for Stam FA nerds? I don't really know or care that much, since I think I'm personally only going to be focused on lamps.

    We'll use a profile rating of like, avg best 20 blocks. Seems good to me. We can also have server announcements for when someone raises their block level.

    This support will effectively just be for my personal usage, I don't intend for this to be a groovestats replacement or anything (Those guys are working on a full site rewrite, so god knows what I'm intruding on.)

    New Game package:Server 
    opened by zkldi 5
  • Add exporting IIDX Quests as playlister-compatible .json files

    Add exporting IIDX Quests as playlister-compatible .json files

    This would allow for better in-game integration of quests and goals. The playlister .json format is documented in the 🐽 thread

    A playlist would contain folders only for specific timing/clear goals, for example the Approaching Chuuden playlist would have HARD CLEAR, CLEAR, AAA and MAX- folders. For a CLEAR any one of type of a goal, a separate folder with just these charts would be created.

    opened by marysiamzawka 4
  • feat: update mmdx seeds

    feat: update mmdx seeds

    updating the seeds to match with live JP ratings.

    currently a draft PR since i'm going through all the charts for each decimal level, shouldn't take too long to go through them all though as i only need to go down from 14.9 to 12.7.

    opened by j1nxie 2
Releases(v2.3.0)
  • v2.3.0(Dec 21, 2022)

    Heyo. This is another major release of Tachi. I've had a pretty sudden surge in motivation to write code recently, so I've managed to achieve some absolutely insane progress.

    As always, thanks for your consistent love and support. It's been a rough week.

    Massive Session Improvements

    Sessions have gotten a huge facelift. They're now displayed in a more traditional calendar view.

    Your sessions are now analysed to break down what folder raises you got during them. For example, a session may now say that you got "10 new clears in the Level 20 folder".

    URL Changes

    The site now uses shorter URLs for most things. This should be slightly less insufferable. All existing routes will redirect to the new routes, so no changes are necessary for any scripts.

    NEW GAME: Gitadora

    Gitadora support is now available. We support Konaste only at this time. (Thanks @hibikidesu, @Bottersnike!)

    NEW FEATURE: Followers

    You can now follow users. This will show what they're up to (sessions, goals, highlights...) in your profile feed. Simple enough.

    NEW FEATURE: Game Tools & Insights

    Games can now define their own custom tools and insights. These are the current supported ones:

    • BMS In-Game Tables (Sieglinde, Rivals)
    • IIDX In-Game Playlists (AAA BPI playlists)
    • IIDX Export to e-amusement CSV
    • Jubeat Jubility Breakdown (pick-up vs normal)

    More can be added on request. They're quite easy to implement.

    New Stuff

    • You can now view site-wide activity. This shows what everyone is up to. Cool.
    • CGDev imports are now supported for SDVX, pop'n and MUSECA.
    • Tierlist View on mobile is now SIGNIFICANTLY better.
    • Jubeat "jubeat", ripples, knit, copious, saucer, prop and qubell support. (Thanks @Mobiuslau, @Meta-link!)
    • SDVX Konaste support updated to 2022113000. (Thanks @cg505!)
    • The SDVX Tierlist has been updated. (Thanks @cg505!)
    • When the site is down, a more useful error page is displayed.
    • You can now set a rival by viewing their page.
    • You can now completely wipe your profile. This requires password confirmation.
    • The jubility column now highlights the score value accordingly.
    • Charts updated in the database now automatically recalculate on the site. (i.e. changing a charts level will trigger a recalc).
    • MUSECA now uses Curator Skill.

    Fixes

    • Charts with #RANDOM are now completely removed from the site.
    • Jubeat scores now forcibly have their music rate rounded to 1dp.
    • Overjoy charts no longer give any sieglinde. Their sieglinde values are just very broken. Might be fixed in the future.
    • Jubility calculator now allows scores on multiple charts on the same song (i.e. ADV, EXT) but not ADV, HARD ADV.
    • Charts removed from BMS tables now have those changes reflected when updating BMS tables.
    • You can now delete goals in the UI.
    • SDVX Charts no longer format to "undefined" (lol)
    • You can now sign out on mobile (We went 1 year without someone noticing this! I guess you all just never want to leave.)
    • Notifications now appear on mobile.
    • 5 BMS charts no longer think they are p8107 (__).
    • DDR and maimai support have been removed (they never were enabled)
    • Sessions now format their ratings properly (They'll no longer say "Sieglinde: 27.50")

    Dev Improvements

    • It's now more obvious when you don't have local HTTPS certs accepted.
    • You can now use pnpm make-user-admin to make a user into an administrator.
    • The "no admins" error is now a warning, and more obviously explains what it entails.
    • A GitHub bot now automatically links PRs to the seeds viewer.
    • conf.json5 is no longer outdated (Thanks @Fluzzarn!)
    • CI and dockerfiles are now much more efficient on disks. (Thanks, @ereti!)
    Source code(tar.gz)
    Source code(zip)
  • v2.2.0(Nov 27, 2022)

    Hello! This is a new major release of Tachi, which I've finally gotten around to despite some roadbumps. This is some 6-9 months of work, and adds a bunch of major overhauls to the site.

    Tachi is almost in a state where I would consider it feature complete, and will no longer be actively adding things to it. That's further down the road.

    As always, thanks for your consistent love and support.

    MAJOR FEATURE: Rivals

    You can now set up to 5 rivals for each game you're involved in.

    • When on folders, charts, or other parts of the UI, you'll see comparisons against them!
    • You'll also see updates from your rivals in your activity feed...

    MAJOR FEATURE: Activity Feed

    The site now has activity feeds which more succinctly list off all the stuff you and your rivals are up to.

    This works for every part of the site!

    #MAJOR FEATURE: Goals, Quests, Questlines

    You can now set chart/folder goals, and Tachi will track them. For example, you could set AAA FREEDOM DiVE or HARD CLEAR 10% of Insane 20 and Tachi will let you know when you've achieved it. The discord bot will also let everyone know when you've achieved a new goal!

    Games can also have "quests". These are pre-made groups of goals with a common theme.

    Although all games support quests, not all games have quests pre-made for them. If you're interested in making quests for a game, use the Quest Creator tool!


    There's also a bunch of bug patches, general UI touchups and more. Have fun!

    Source code(tar.gz)
    Source code(zip)
Owner
TNG Dev
A team of rhythm game nerds.
TNG Dev
Cutting-edge Development Pushes for new Koders' Website

This is a Next.js project bootstrapped with create-next-app. Getting Started First, run the development server: npm run dev # or yarn dev Open http://

Koders 5 Dec 27, 2022
This simple project aims to connect to an API to fetch score data and display it on a LeaderBoard box, as well as provide the tool to submit a new score.

Leader Board: Hit the API! This simple project aims to connect to an API to fetch score data and display it on a LeaderBoard box, as well as provide t

Andrés Felipe Arroyave Naranjo 12 Apr 6, 2022
Finance-Tracker - A basic finance-tracker application built using Next.js, React Hooks and Context API

Next.js + Tailwind CSS Example This example shows how to use Tailwind CSS (v3.0) with Next.js. It follows the steps outlined in the official Tailwind

Osemwengie Benjamin 1 Jan 2, 2022
null 8 Nov 11, 2022
Extensão de temas para o site Gatry.com, compatível com Firefox, Chrome e Edge.

Gatry Shades Extensão que dá a possibilidade de aplicar temas ao site gatry.com, bem como demais funcionalidade para reduzir a luminosidade de imagens

João Ribeiro 2 Dec 3, 2022
🚀 A web extension starter built with React, Typescript, and Tailwind CSS. Build once, and run on multiple browsers: Google Chrome, Mozilla Firefox, Microsoft Edge, Brave, and Opera..

Web Extension Starter A web extension starter, built with React, Typescript, and Tailwind CSS. Build once, and run on multiple browsers: Google Chrome

BCIT Design & Development Club (BCIT-DDC) 28 Dec 28, 2022
ACME client microservice for the Cumulocity IoT Edge to automatically issue and renew valid certificates via e.g. Let's Encrypt.

Cumulocity IoT Edge - ACME This repository contains the sources for an ACME microservice that can be used to periodically issue/renew certificates for

Software AG 3 May 3, 2022
An unreliable and overall unusable sorting library for numbers with a global cache on the edge.

unsort An unreliable and overall unusable sorting library for numbers with a global cache on the edge. the algorithm This library implements a number

Jonas Wanner 6 May 19, 2022
A Tauri update server, hosted as a Cloudflare edge function

Tauri Update Server: Cloudflare One-Click Deploy Click the button above, let Cloudflare walk you through: it's easy! Go to your forked repository, edi

KilleenCode 33 Dec 14, 2022
Get started with AI vision at the edge with no coding experience at all!

No-Code Edge AI Vision with Node-RED Now you can get started with AI vision at the edge in just THREE STEPS with no coding experience at all! Prerequi

Seeed Studio 47 Dec 5, 2022
Sample code for resizing Images with Lambda@Edge using the Custom Origin. You can deploy using AWS CDK.

Resizing Images with Lambda@Edge using the Custom Origin You can resize the images and convert the image format by query parameters. This Lambda@Edge

AWS Samples 16 Dec 11, 2022
Abusing Cloudflare Workers to establish persistence and exfiltrate sensitive data at the edge.

Abusing Cloudflare Workers This repository contains companion code for the blog post MITM at the Edge: Abusing Cloudflare Workers. malicious-worker/ c

Christophe Tafani-Dereeper 10 Sep 16, 2022
Deploy Serverless Functions at the Edge. Current status: Dev

Deploy Serverless Functions at the Edge lagon.app ✉️ Get email updates Open Source • TypeScript • Web APIs Cron triggers • Instant deployments Interac

Lagon 354 Dec 30, 2022
A brand new bleeding edge non bloated Discord library (based on Discordeno!)

biscuit A brand new bleeding edge non bloated Discord library Install (for node18) npm install @oasisjs/biscuit pnpm add @oasisjs/biscuit yarn add @oa

null 44 Nov 15, 2022
Deploy Serverless Functions at the Edge. Current status: Dev

Deploy Serverless Functions at the Edge ?? Join the Discord ✉️ Get email updates Open Source • TypeScript • Web APIs Cron triggers • Instant deploymen

Lagon 123 Jul 26, 2022
SurrealDB on the edge!

surrealdb-cloudflare SurrealDB on the edge! Cloudflare workers This module has been build specifically to be compatible with cloudflare workers. Teste

The Open Source Company 18 Dec 10, 2022
This is a demo of updating a map to show air quality data for the user’s current location using Next.js Advanced Middleware, powered by Netlify Edge Functions.

Show Local Air Quality Based on the User's Location Use AQI data to show the air quality near the current user. This is built using Next.js Advanced M

Jason Lengstorf 8 Nov 4, 2022
High performance personalization & a/b testing example using Next.js, Edge Middleware, and Builder.io

Next.js + Builder.io Personalization & A/B Testing with Edge Middleware This is a fork of Next.js Commerce with Builder.io integrated and using Edge M

Builder.io 7 Sep 6, 2022