schema {
  query: Speedruns
  mutation: Speedruns
}

type Category implements Node {
  """
  GraphQL node ID
  """
  id: ID!

  """
  speedrun.com category ID
  """
  srcId: String!

  """
  URL slug used on speedruns.ca
  """
  slug: String!

  """
  URL slug used on speedrun.com
  """
  srcSlug: String!

  """
  name, in English if possible
  """
  name: String!

  """
  category-level links
  """
  levels: [CategoryLevel!]!

  """
  leaderboards of ranked runs
  """
  leaderboard(
    levelSlug: String
    includeObsolete: Boolean
    limit: Int
  ): [LeaderboardRun!]!

  """
  progress of record over time
  """
  progression(levelSlug: String, includeTies: Boolean): [ProgressionRun!]!
}

"""
a category-level pair
"""
type CategoryLevel {
  """
  the category
  """
  category: Category!

  """
  the level
  """
  level: Level!

  """
  leaderboards of ranked runs
  """
  leaderboard(includeObsolete: Boolean, limit: Int): [LeaderboardRun!]!

  """
  progress of record over time
  """
  progression(includeTies: Boolean): [ProgressionRun!]!
}

type Game implements Node {
  """
  GraphQL node ID
  """
  id: ID!

  """
  speedrun.com game ID
  """
  srcId: String!

  """
  URL slug used on speedruns.ca
  """
  slug: String!

  """
  URL slug used on speedrun.com
  """
  srcSlug: String!

  """
  name, in English if possible
  """
  name: String!

  """
  all runs
  """
  runs: [Run!]!

  """
  full-game run categories
  """
  gameCategories: [Category!]!

  """
  individual level run categories
  """
  levelCategories: [Category!]!

  """
  individual levels
  """
  levels: [Level!]!

  """
  primary run timing method used for this game
  """
  timingMethod: TimingMethod!
}

type LeaderboardRun {
  run: Run!
  rank: Int!
  isTied: Boolean!
  tiedRank: Int!
}

type Level implements Node {
  """
  GraphQL node ID
  """
  id: ID!

  """
  speedrun.com level ID
  """
  srcId: String!

  """
  URL slug used on speedruns.ca
  """
  slug: String!

  """
  URL slug used on speedrun.com
  """
  srcSlug: String!

  """
  name, in English if possible
  """
  name: String!
}

"""
<https://graphql.org/learn/global-object-identification/>
"""
interface Node {
  """
  GraphQL node ID
  """
  id: ID!
}

type Player {
  name: String!
  user: User
  isGuest: Boolean!
}

type ProgressionRun {
  progressMs: Int!
  run: Run!
  leaderboardRun: LeaderboardRun
}

type Run implements Node {
  """
  GraphQL node ID
  """
  id: ID!

  """
  speedrun.com level ID
  """
  srcId: String!
  category: Category!
  level: Level
  date: Float
  players: [Player!]!
  timeMs: Int!
  videos: [String!]!
}

type Speedruns {
  stats: Stats!
  game(slug: String!): Game
  games: [Game!]!
  run(srcId: ID!): Run
  node(id: ID!): Node

  """
  a random value.
  """
  seed: Int!
}

type Stats {
  """
  timestamp of last update
  """
  lastUpdated: Float!

  """
  number of games
  """
  games: Int!

  """
  number of runs
  """
  runs: Int!

  """
  the version of this server package handling this request
  """
  version: String!
}

"""
A timing method that can be used to time a run.
"""
enum TimingMethod {
  """
  In-game time
  """
  IGT

  """
  Real time
  """
  RTA

  """
  Real time with load time removed
  """
  RTA_NL
}

type User implements Node {
  """
  GraphQL node ID
  """
  id: ID!

  """
  speedrun.com user ID
  """
  srcId: String!

  """
  URL slug used on speedruns.ca
  """
  slug: String!

  """
  URL slug used on speedrun.com
  """
  srcSlug: String!
}
