database.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. import Database from 'better-sqlite3';
  2. const db = new Database('orl.db');
  3. db.pragma('foreign_keys = ON');
  4. db.pragma('journal_mode = WAL');
  5. db.pragma('temp_store = MEMORY');
  6. db.exec(`
  7. CREATE TABLE IF NOT EXISTS rating (
  8. user_id INTEGER NOT NULL,
  9. mode INTEGER NOT NULL, -- 0 = std, 1 = taiko, 2 = ctb, 3 = mania
  10. s1_scores INTEGER DEFAULT 0,
  11. s2_scores INTEGER DEFAULT 0,
  12. s3_scores INTEGER NOT NULL,
  13. total_scores INTEGER NOT NULL,
  14. elo REAL NOT NULL,
  15. division TEXT NOT NULL,
  16. s1_division TEXT,
  17. s2_division TEXT,
  18. UNIQUE(user_id, mode) ON CONFLICT ROLLBACK
  19. );
  20. CREATE INDEX IF NOT EXISTS rating_elo_idx ON rating (elo, mode);
  21. CREATE TABLE IF NOT EXISTS map (
  22. map_id INTEGER PRIMARY KEY,
  23. -- info from .osu file
  24. name TEXT NOT NULL,
  25. mode INTEGER NOT NULL, -- (0 = std, 1 = taiko, 2 = ctb, 3 = mania)
  26. ar REAL NOT NULL,
  27. cs REAL NOT NULL,
  28. hp REAL NOT NULL,
  29. od REAL NOT NULL,
  30. bpm REAL NOT NULL,
  31. -- info from osu!api or from osu.db scan (https://git.kiwec.net/kiwec/orl-maps-db-generator)
  32. set_id INTEGER NOT NULL,
  33. length REAL NOT NULL,
  34. ranked INTEGER NOT NULL, -- not a boolean but an enum
  35. dmca INTEGER NOT NULL
  36. );
  37. CREATE TABLE IF NOT EXISTS pp (
  38. map_id INTEGER NOT NULL,
  39. mods INTEGER NOT NULL,
  40. stars REAL NOT NULL,
  41. pp REAL NOT NULL,
  42. FOREIGN KEY(map_id) REFERENCES map(map_id),
  43. UNIQUE(map_id, mods) ON CONFLICT ROLLBACK
  44. );
  45. CREATE TABLE IF NOT EXISTS user (
  46. user_id INTEGER PRIMARY KEY,
  47. username TEXT NOT NULL,
  48. country_code TEXT NOT NULL,
  49. profile_data TEXT NOT NULL,
  50. discord_user_id TEXT
  51. );
  52. CREATE TABLE IF NOT EXISTS map_pool (
  53. season INTEGER NOT NULL,
  54. collection_id INTEGER NOT NULL,
  55. user_id INTEGER NOT NULL,
  56. added_tms INTEGER NOT NULL,
  57. data TEXT NOT NULL
  58. );
  59. CREATE TABLE IF NOT EXISTS match (
  60. match_id INTEGER PRIMARY KEY,
  61. invite_id INTEGER,
  62. name TEXT,
  63. ruleset INTEGER NOT NULL DEFAULT 0,
  64. data TEXT NOT NULL DEFAULT '{}',
  65. start_time INTEGER NOT NULL,
  66. end_time INTEGER,
  67. reopened_as INTEGER
  68. );
  69. CREATE INDEX IF NOT EXISTS match_endtms_idx ON match (end_time);
  70. CREATE TABLE IF NOT EXISTS game (
  71. game_id INTEGER PRIMARY KEY,
  72. match_id INTEGER NOT NULL, -- "match" means lobby
  73. start_time INTEGER NOT NULL,
  74. end_time INTEGER NOT NULL,
  75. beatmap_id INTEGER NOT NULL,
  76. play_mode INTEGER NOT NULL,
  77. scoring_type TEXT NOT NULL,
  78. team_type TEXT NOT NULL,
  79. mods TEXT NOT NULL,
  80. FOREIGN KEY(match_id) REFERENCES match(match_id),
  81. FOREIGN KEY(beatmap_id) REFERENCES map(map_id)
  82. );
  83. CREATE TABLE IF NOT EXISTS score (
  84. game_id INTEGER NOT NULL,
  85. user_id INTEGER NOT NULL,
  86. mode INTEGER NOT NULL,
  87. score INTEGER NOT NULL,
  88. accuracy REAL,
  89. max_combo INTEGER,
  90. count_50 INTEGER,
  91. count_100 INTEGER,
  92. count_300 INTEGER,
  93. count_miss INTEGER,
  94. count_geki INTEGER,
  95. count_katu INTEGER,
  96. perfect INTEGER,
  97. enabled_mods TEXT NOT NULL,
  98. placement INTEGER NOT NULL,
  99. dodged INTEGER NOT NULL,
  100. elo_diff REAL NOT NULL,
  101. created_at INTEGER NOT NULL,
  102. beatmap_id INTEGER NOT NULL,
  103. FOREIGN KEY(game_id) REFERENCES game(game_id),
  104. FOREIGN KEY(user_id) REFERENCES user(user_id),
  105. FOREIGN KEY(beatmap_id) REFERENCES map(map_id),
  106. UNIQUE(game_id, user_id) ON CONFLICT ROLLBACK
  107. );
  108. -- We get all scores from user X on their profile page
  109. CREATE INDEX IF NOT EXISTS score_userid_idx ON score (user_id, created_at);
  110. -- For MAX(placement)
  111. CREATE INDEX IF NOT EXISTS score_placement_idx ON score (game_id);
  112. CREATE TABLE IF NOT EXISTS token (
  113. token TEXT NOT NULL,
  114. created_at INTEGER NOT NULL,
  115. osu_id INTEGER,
  116. last_match INTEGER,
  117. discord_id TEXT
  118. );
  119. `);
  120. export default db;