From 4090dd656ccd89df756e117b7f36eecd6a73d571 Mon Sep 17 00:00:00 2001 From: Akita Noek Date: Wed, 27 Nov 2024 09:19:40 -0700 Subject: [PATCH] Update docs --- docs/assets/search.js | 2 +- docs/classes/BoardState.html | 22 +- docs/classes/ConditionalMoveTree.html | 4 +- docs/classes/Goban.html | 32 +-- docs/classes/GobanBase.html | 22 +- docs/classes/GobanCanvas.html | 32 +-- docs/classes/GobanEngine.html | 48 ++--- docs/classes/GobanError.html | 4 +- docs/classes/GobanInteractive.html | 26 +-- docs/classes/GobanMoveError.html | 4 +- docs/classes/GobanSocket.html | 4 +- docs/classes/GobanTheme.html | 6 +- docs/classes/MoveTree.html | 22 +- docs/classes/SVGRenderer.html | 32 +-- docs/classes/ScoreEstimator.html | 24 +-- docs/classes/StoneString.html | 10 +- docs/classes/StoneStringBuilder.html | 4 +- docs/classes/TestGoban.html | 32 +-- docs/classes/_internal_.GCell.html | 4 +- docs/classes/_internal_.OGSConnectivity.html | 28 +-- docs/enums/JGOFNumericPlayerColor.html | 4 +- .../protocol.RemoteStorageReplication.html | 10 +- docs/functions/adjust_estimate.html | 2 +- docs/functions/allocateCanvasOrError.html | 2 +- docs/functions/autoscore.html | 2 +- docs/functions/char2num.html | 2 +- docs/functions/cloneMatrix.html | 2 +- docs/functions/closeErrorCodeToString.html | 2 +- docs/functions/color_blend.html | 2 +- docs/functions/computeAverageMoveTime.html | 2 +- docs/functions/createDeviceScaledCanvas.html | 2 +- docs/functions/createGoban.html | 2 +- docs/functions/decodeCoordinate.html | 2 +- docs/functions/decodeGTPCoordinates.html | 2 +- docs/functions/decodeMoves.html | 2 +- docs/functions/decodePrettyCoordinates.html | 2 +- docs/functions/decodePrettyXCoordinate.html | 2 +- docs/functions/deepClone.html | 2 +- docs/functions/deepEqual.html | 2 +- docs/functions/deviceCanvasScalingRatio.html | 2 +- docs/functions/elementOffset.html | 2 +- docs/functions/encodeCoordinate.html | 2 +- docs/functions/encodeMove.html | 2 +- docs/functions/encodeMoveToArray.html | 2 +- docs/functions/encodeMoves.html | 2 +- docs/functions/encodeMovesToArray.html | 2 +- docs/functions/encodePrettyXCoordinate.html | 2 +- docs/functions/escapeSGFText.html | 2 +- docs/functions/getRandomInt.html | 2 +- docs/functions/getRelativeEventPosition.html | 2 +- docs/functions/getWorstMoves.html | 2 +- .../init_remote_ownership_estimator.html | 2 +- .../init_wasm_ownership_estimator.html | 2 +- docs/functions/makeEmptyMatrix.html | 2 +- docs/functions/makeMatrix.html | 2 +- docs/functions/makeObjectMatrix.html | 2 +- docs/functions/matricesAreEqual.html | 2 +- docs/functions/newlines_to_spaces.html | 2 +- docs/functions/niceInterval.html | 2 +- docs/functions/num2char.html | 2 +- docs/functions/ojeSequenceToMoves.html | 2 +- docs/functions/placeRenderedImageStone.html | 2 +- docs/functions/positionId.html | 2 +- docs/functions/preRenderImageStone.html | 2 +- docs/functions/prettyCoordinates.html | 2 +- docs/functions/resizeDeviceScaledCanvas.html | 2 +- docs/functions/setGobanCallbacks.html | 2 +- docs/functions/setGobanRenderer.html | 2 +- .../set_local_ownership_estimator.html | 2 +- docs/functions/shortDurationString.html | 2 +- docs/functions/sortMoves.html | 2 +- docs/functions/translate._.html | 2 +- docs/functions/translate.interpolate.html | 2 +- .../translate.setGobanTranslations.html | 2 +- docs/functions/validateCanvas.html | 2 +- .../functions/voronoi_estimate_ownership.html | 2 +- docs/functions/wasm_estimate_ownership.html | 2 +- docs/interfaces/AIReviewWorstMoveEntry.html | 4 +- docs/interfaces/AdHocClock.html | 26 +-- docs/interfaces/AdHocFormat.html | 4 +- docs/interfaces/AdHocPauseControl.html | 4 +- docs/interfaces/AdHocPlayer.html | 4 +- docs/interfaces/AdHocPlayerClock.html | 14 +- docs/interfaces/AudioClockEvent.html | 14 +- docs/interfaces/BoardConfig.html | 4 +- .../interfaces/CanvasRendererGobanConfig.html | 12 +- docs/interfaces/ColoredCircle.html | 4 +- .../ConditionalMoveResponseTree.html | 2 +- docs/interfaces/GobanBounds.html | 4 +- docs/interfaces/GobanCallbacks.html | 4 +- docs/interfaces/GobanCanvasInterface.html | 4 +- docs/interfaces/GobanConfig.html | 12 +- docs/interfaces/GobanEngineConfig.html | 12 +- docs/interfaces/GobanEngineInitialState.html | 4 +- docs/interfaces/GobanEnginePlayerEntry.html | 8 +- docs/interfaces/GobanEvents.html | 6 +- .../interfaces/GobanIOErrorMessageObject.html | 4 +- docs/interfaces/GobanMetrics.html | 4 +- .../GobanMoveErrorMessageObject.html | 4 +- docs/interfaces/GobanSelectedThemes.html | 4 +- docs/interfaces/GobanSocketEvents.html | 148 ++++++------- docs/interfaces/GobanThemeBackgroundCSS.html | 4 +- .../GobanThemeBackgroundReactStyles.html | 4 +- docs/interfaces/JGOF.html | 14 +- docs/interfaces/JGOFAIReview.html | 18 +- docs/interfaces/JGOFAIReviewMove.html | 14 +- .../interfaces/JGOFAIReviewMoveVariation.html | 22 +- docs/interfaces/JGOFAbsoluteTimeControl.html | 4 +- docs/interfaces/JGOFByoYomiTimeControl.html | 4 +- docs/interfaces/JGOFCanadianTimeControl.html | 4 +- docs/interfaces/JGOFClock.html | 22 +- .../interfaces/JGOFClockWithTransmitting.html | 22 +- docs/interfaces/JGOFFischerTimeControl.html | 4 +- docs/interfaces/JGOFIntersection.html | 6 +- docs/interfaces/JGOFMove.html | 10 +- docs/interfaces/JGOFNoneTimeControl.html | 4 +- docs/interfaces/JGOFPauseState.html | 14 +- docs/interfaces/JGOFPlayer.html | 6 +- docs/interfaces/JGOFPlayerClock.html | 12 +- docs/interfaces/JGOFPlayerSummary.html | 4 +- docs/interfaces/JGOFSealingIntersection.html | 8 +- docs/interfaces/JGOFSimpleTimeControl.html | 4 +- docs/interfaces/MarkInterface.html | 4 +- docs/interfaces/MoveCommand.html | 4 +- docs/interfaces/MoveTreeChatLine.html | 4 +- docs/interfaces/MoveTreeChatLineBody.html | 4 +- docs/interfaces/MoveTreeJson.html | 4 +- docs/interfaces/PlayerScore.html | 4 +- docs/interfaces/PuzzleConfig.html | 4 +- docs/interfaces/ReviewMessage.html | 40 ++-- docs/interfaces/SVGRendererGobanConfig.html | 12 +- docs/interfaces/SVGStoneParameters.html | 4 +- docs/interfaces/SVGStop.html | 4 +- docs/interfaces/Score.html | 4 +- docs/interfaces/ScoreEstimateRequest.html | 4 +- docs/interfaces/ScoreEstimateResponse.html | 14 +- docs/interfaces/ScoringLocations.html | 4 +- docs/interfaces/StateUpdateEvents.html | 4 +- docs/interfaces/ThemesInterface.html | 4 +- docs/interfaces/_internal_.AbsoluteClock.html | 4 +- .../_internal_.AnalysisComment.html | 4 +- .../_internal_.AutoscoreResults.html | 4 +- ...internal_.BoardStateWithIsobranchHash.html | 24 +-- docs/interfaces/_internal_.ByoYomiClock.html | 4 +- docs/interfaces/_internal_.CanadianClock.html | 4 +- docs/interfaces/_internal_.ErrorResponse.html | 4 +- docs/interfaces/_internal_.FischerClock.html | 4 +- .../interfaces/_internal_.GameListPlayer.html | 4 +- .../_internal_.GobanSVGInterface.html | 4 +- .../_internal_.GobanSocketOptions.html | 6 +- ...internal_.JGOFPlayerClockWithTimedOut.html | 12 +- .../_internal_.MoveTreeViewPortInterface.html | 4 +- docs/interfaces/_internal_.ReviewComment.html | 4 +- .../_internal_.ViewPortInterface.html | 4 +- .../interfaces/protocol.AIServerToClient.html | 4 +- .../protocol.AutomatchPreferences.html | 4 +- .../interfaces/protocol.ClientToAIServer.html | 20 +- docs/interfaces/protocol.ClientToServer.html | 200 +++++++++--------- .../protocol.ClientToServerBase.html | 6 +- .../protocol.GameChatAnalysisMessage.html | 4 +- docs/interfaces/protocol.GameChatLine.html | 4 +- docs/interfaces/protocol.GameChatMessage.html | 4 +- .../protocol.GameChatReviewMessage.html | 4 +- .../protocol.GameChatTranslatedMessage.html | 4 +- docs/interfaces/protocol.GameClock.html | 4 +- docs/interfaces/protocol.GameListEntry.html | 4 +- docs/interfaces/protocol.GameListWhere.html | 4 +- docs/interfaces/protocol.Glicko2.html | 4 +- .../protocol.SeekgraphChallengeMessage.html | 60 +++--- .../protocol.SeekgraphDeleteMessage.html | 6 +- .../protocol.SeekgraphStartedMessage.html | 28 +-- docs/interfaces/protocol.ServerToClient.html | 150 ++++++------- .../protocol.StallingScoreEstimate.html | 4 +- docs/interfaces/protocol.User.html | 4 +- docs/interfaces/translate.GobanStrings.html | 4 +- docs/modules/protocol.html | 2 +- docs/modules/translate.html | 2 +- docs/types/AdHocPackedMove.html | 2 +- docs/types/AnalysisSubTool.html | 2 +- docs/types/AnalysisTool.html | 2 +- docs/types/BoardTransform.html | 2 +- docs/types/ConditionalMoveResponse.html | 2 +- docs/types/DataArgument.html | 2 +- docs/types/GobanChatLog.html | 2 +- docs/types/GobanEnginePhase.html | 2 +- docs/types/GobanEngineRules.html | 2 +- docs/types/GobanEngineSuperKoAlgorithm.html | 2 +- docs/types/GobanErrorMessageId.html | 2 +- docs/types/GobanErrorMessageObject.html | 2 +- docs/types/GobanIOErrorMessageId.html | 2 +- docs/types/GobanModes.html | 2 +- docs/types/GobanMoveErrorMessageId.html | 2 +- docs/types/GobanMovesArray.html | 2 +- docs/types/GobanRenderer.html | 2 +- docs/types/GobanRendererConfig.html | 2 +- docs/types/JGOFTimeControl.html | 2 +- docs/types/JGOFTimeControlSpeed.html | 2 +- docs/types/JGOFTimeControlSystem.html | 2 +- docs/types/LabelPosition.html | 2 +- docs/types/Matrix.html | 2 +- docs/types/MoveTreePenMarks.html | 2 +- docs/types/NumberMatrix.html | 2 +- docs/types/PlayerColor.html | 2 +- docs/types/ProtocolResponseType.html | 2 +- docs/types/PuzzleOpponentMoveMode.html | 2 +- docs/types/PuzzlePlacementSetting.html | 2 +- docs/types/PuzzlePlayerMoveMode.html | 2 +- docs/types/RawStoneString.html | 2 +- docs/types/StringMatrix.html | 2 +- docs/types/_internal_.ClockTime.html | 2 +- docs/types/_internal_.DebugOutput.html | 2 +- docs/types/_internal_.LocalEstimator.html | 2 +- docs/types/_internal_.MessageID.html | 2 +- docs/types/_internal_.NoneClock.html | 2 +- docs/types/_internal_.SimpleClock.html | 2 +- docs/types/_internal_.StoneType.html | 2 +- docs/types/_internal_.StoneTypeArray.html | 2 +- docs/types/protocol.AutomatchCondition.html | 2 +- docs/types/protocol.RuleSet.html | 2 +- docs/types/protocol.Size.html | 2 +- docs/types/protocol.Speed.html | 2 +- docs/variables/AUTOSCORE_TOLERANCE.html | 2 +- docs/variables/AUTOSCORE_TRIALS.html | 2 +- docs/variables/GOBAN_FONT.html | 2 +- docs/variables/MARK_TYPES.html | 2 +- .../variables/SCORE_ESTIMATION_TOLERANCE.html | 2 +- docs/variables/SCORE_ESTIMATION_TRIALS.html | 2 +- docs/variables/THEMES.html | 2 +- docs/variables/THEMES_SORTED.html | 2 +- docs/variables/callbacks.html | 2 +- docs/variables/remote_estimate_ownership.html | 2 +- 231 files changed, 931 insertions(+), 919 deletions(-) diff --git a/docs/assets/search.js b/docs/assets/search.js index 85c015b3..a5badc3b 100644 --- a/docs/assets/search.js +++ b/docs/assets/search.js @@ -1 +1 @@ -window.searchData = "data:application/octet-stream;base64,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"; \ No newline at end of file +window.searchData = "data:application/octet-stream;base64,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"; \ No newline at end of file diff --git a/docs/classes/BoardState.html b/docs/classes/BoardState.html index bc6ebb26..dd559be9 100644 --- a/docs/classes/BoardState.html +++ b/docs/classes/BoardState.html @@ -1,4 +1,4 @@ -BoardState | goban

Class BoardState

Hierarchy (view full)

Implements

Constructors

constructor +BoardState | goban

Class BoardState

Hierarchy (view full)

Implements

Constructors

Properties

black_prisoners board board_is_repeating @@ -25,23 +25,23 @@ default to 19x19 if no board is provided.

Any state matrices (board, removal, etc..) provided will be cloned and must have the same dimensionality.

-

Parameters

Returns BoardState

Properties

black_prisoners: number
board_is_repeating: boolean
goban_callback?: GobanBase
height: number = 19
removal: boolean[][]
white_prisoners: number
width: number = 19

Methods

  • Returns true if the .board field from the other board is equal to this one

    -

    Parameters

    Returns boolean

Properties

black_prisoners: number
board_is_repeating: boolean
goban_callback?: GobanBase
height: number = 19
removal: boolean[][]
white_prisoners: number
width: number = 19

Methods

  • Returns true if the .board field from the other board is equal to this one

    +

    Parameters

    Returns boolean

  • Computes scoring locations for the board. If area_scoring is true, we will use area scoring rules, otherwise we will use territory scoring rules (which implies omitting territory in seki).

    -

    Parameters

    • area_scoring: boolean

    Returns ScoringLocations

  • Sets a position as being removed or not removed. If emit_stone_removal_updated is set to false, the "stone-removal.updated" event will not be emitted, and it is up to the caller to emit this event appropriately.

    -

    Parameters

    • x: number
    • y: number
    • removed: boolean
    • emit_stone_removal_updated: boolean = true

    Returns void

  • Toggles a group of stones for removal or restoration.

    +

    Parameters

    • x: number
    • y: number
    • removed: boolean
    • emit_stone_removal_updated: boolean = true

    Returns void

  • Toggles a group of stones for removal or restoration.

    By default, if we are marking a group for removal but the group is almost certainly alive (two eyes, etc), this will result in a no-op, unless force_removal is set to true.

    -

    Parameters

    • x: number
    • y: number
    • force_removal: boolean = false

    Returns {
        group: RawStoneString;
        removed: boolean;
    }

\ No newline at end of file +

Parameters

  • x: number
  • y: number
  • force_removal: boolean = false

Returns {
    group: RawStoneString;
    removed: boolean;
}

\ No newline at end of file diff --git a/docs/classes/ConditionalMoveTree.html b/docs/classes/ConditionalMoveTree.html index 2072f067..d4b1f3e8 100644 --- a/docs/classes/ConditionalMoveTree.html +++ b/docs/classes/ConditionalMoveTree.html @@ -1,4 +1,4 @@ -ConditionalMoveTree | goban

Class ConditionalMoveTree

Constructors

constructor +ConditionalMoveTree | goban

Class ConditionalMoveTree

Constructors

Properties

Constructors

Properties

children: {
    [move: string]: ConditionalMoveTree;
}

Type declaration

move: null | string

Methods

\ No newline at end of file +

Constructors

Properties

children: {
    [move: string]: ConditionalMoveTree;
}

Type declaration

move: null | string

Methods

\ No newline at end of file diff --git a/docs/classes/Goban.html b/docs/classes/Goban.html index 0fb2f5cc..00940a5a 100644 --- a/docs/classes/Goban.html +++ b/docs/classes/Goban.html @@ -2,7 +2,7 @@ classes, types, and enums.

You can't create an instance of a Goban directly, you have to create an instance of one of the renderers, such as GobanSVG.

-

Hierarchy (view full)

Constructors

Hierarchy (view full)

Constructors

Properties

__board_redraw_pen_layer_timer: any = null
__clock_timer?: Timeout
__draw_state: string[][]
__last_pt: {
    i: number;
    j: number;
    valid: boolean;
} = ...

Type declaration

  • i: number
  • j: number
  • valid: boolean
__update_move_tree: any = null
analysis_move_counter: number
analysis_removal_last_position: {
    i: number;
    j: number;
} = ...

Type declaration

  • i: number
  • j: number
analysis_removal_state?: boolean
analysis_scoring_color?: string
analysis_scoring_last_position: {
    i: number;
    j: number;
} = ...

Type declaration

  • i: number
  • j: number
bounded_height: number
bounded_width: number
bounds: GobanBounds
chat_log: GobanChatLog = []
circle_radius: number
clock_should_be_paused_for_move_submission: boolean = false
colored_circles?: (undefined | ColoredCircle)[][]
conditional_path: string = ""
conditional_starting_color: "black" | "white" | "invalid" = "invalid"
conditional_tree: ConditionalMoveTree = ...
config: GobanConfig
connectToReviewSent?: boolean
current_cmove?: ConditionalMoveTree
currently_my_cmove: boolean = false
dirty_redraw: any = null
disconnectedFromGame: boolean = true
display_width?: number
done_loading_review: boolean = false
dont_draw_last_move: boolean
double_click_submit: boolean
draw_bottom_labels: boolean
draw_left_labels: boolean
draw_right_labels: boolean
draw_top_labels: boolean
edit_color?: "black" | "white"
engine: GobanEngine
errorHandler: ((e) => void)

Type declaration

    • (e): void
    • Parameters

      • e: Error

      Returns void

game_id: number
game_type: string
getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting)
goban_id: number = ++last_goban_id

Base fields *

-
heatmap?: NumberMatrix
height: number
highlight_movetree_moves: boolean
interactive: boolean
isInPushedAnalysis: (() => boolean)

Type declaration

    • (): boolean
    • Returns boolean

isPlayerController: (() => boolean)

Type declaration

    • (): boolean
    • Returns boolean

isPlayerOwner: (() => boolean)

Type declaration

    • (): boolean
    • Returns boolean

label_character: string
label_mark: string = "[UNSET]"
last_clock?: AdHocClock
last_emitted_clock?: JGOFClockWithTransmitting
last_hover_square?: JGOFIntersection
last_move?: MoveTree
last_move_radius: number
last_paused_by_player_state: null | boolean = null
last_paused_state: null | boolean = null
last_phase?: GobanEnginePhase
last_review_message: ReviewMessage
last_sound_played_for_a_stone_placement?: string
last_stone_sound: number
leavePushedAnalysis: (() => void)

Type declaration

    • (): void
    • Returns void

marked_analysis_score?: boolean[][]
move_selected?: JGOFIntersection
no_display: boolean
onError?: ((error) => void)

Type declaration

    • (error): void
    • Parameters

      • error: Error

      Returns void

on_game_screen: boolean
one_click_submit: boolean
original_square_size: number | ((goban) => number) | "auto"

Type declaration

    • (goban): number
    • Parameters

      Returns number

parent: HTMLElement
pause_control?: AdHocPauseControl
paused_since?: number
pen_marks: any[]
player_id: number
preloaded_data?: GobanConfig
previous_mode: string
puzzle_autoplace_delay: number
restrict_moves_to_movetree: boolean
review_had_gamedata: boolean
review_id: number
scoring_mode: boolean | "stalling-scoring-mode"
sendLatencyTimer?: Timeout
sent_timed_out_message: boolean = false
shift_key_is_down: boolean
show_variation_move_numbers: boolean
showing_scores: boolean = false
socket_event_bindings: [keyof GobanSocketEvents, (() => void)][] = []
square_size: number = 10
stalling_score_estimate?: StallingScoreEstimate
stone_font_scale: number
stone_placement_enabled: boolean
stone_removal_auto_scoring_done?: boolean = false
variation_stone_opacity: number
width: number
THEMES: ThemesInterface = THEMES
THEMES_SORTED: {
    black: GobanTheme[];
    board: GobanTheme[];
    white: GobanTheme[];
    [key: string]: GobanTheme[];
} = THEMES_SORTED

Type declaration

setCallbacks: ((newCallbacks) => void) = setGobanCallbacks

Type declaration

    • (newCallbacks): void
    • Set's callback functions to be called in various situations. You can set any +

Constructors

Properties

__board_redraw_pen_layer_timer: any = null
__clock_timer?: Timeout
__draw_state: string[][]
__last_pt: {
    i: number;
    j: number;
    valid: boolean;
} = ...

Type declaration

  • i: number
  • j: number
  • valid: boolean
__update_move_tree: any = null
analysis_move_counter: number
analysis_removal_last_position: {
    i: number;
    j: number;
} = ...

Type declaration

  • i: number
  • j: number
analysis_removal_state?: boolean
analysis_scoring_color?: string
analysis_scoring_last_position: {
    i: number;
    j: number;
} = ...

Type declaration

  • i: number
  • j: number
bounded_height: number
bounded_width: number
bounds: GobanBounds
chat_log: GobanChatLog = []
circle_radius: number
clock_should_be_paused_for_move_submission: boolean = false
colored_circles?: (undefined | ColoredCircle)[][]
conditional_path: string = ""
conditional_starting_color: "black" | "white" | "invalid" = "invalid"
conditional_tree: ConditionalMoveTree = ...
config: GobanConfig
connectToReviewSent?: boolean
current_cmove?: ConditionalMoveTree
currently_my_cmove: boolean = false
dirty_redraw: any = null
disconnectedFromGame: boolean = true
display_width?: number
done_loading_review: boolean = false
dont_draw_last_move: boolean
double_click_submit: boolean
draw_bottom_labels: boolean
draw_left_labels: boolean
draw_right_labels: boolean
draw_top_labels: boolean
edit_color?: "black" | "white"
engine: GobanEngine
errorHandler: ((e) => void)

Type declaration

    • (e): void
    • Parameters

      • e: Error

      Returns void

game_id: number
game_type: string
getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting)
goban_id: number = ++last_goban_id

Base fields *

+
heatmap?: NumberMatrix
height: number
highlight_movetree_moves: boolean
interactive: boolean
isInPushedAnalysis: (() => boolean)

Type declaration

    • (): boolean
    • Returns boolean

isPlayerController: (() => boolean)

Type declaration

    • (): boolean
    • Returns boolean

isPlayerOwner: (() => boolean)

Type declaration

    • (): boolean
    • Returns boolean

label_character: string
label_mark: string = "[UNSET]"
last_clock?: AdHocClock
last_emitted_clock?: JGOFClockWithTransmitting
last_hover_square?: JGOFIntersection
last_move?: MoveTree
last_move_radius: number
last_paused_by_player_state: null | boolean = null
last_paused_state: null | boolean = null
last_phase?: GobanEnginePhase
last_review_message: ReviewMessage
last_sound_played_for_a_stone_placement?: string
last_stone_sound: number
leavePushedAnalysis: (() => void)

Type declaration

    • (): void
    • Returns void

marked_analysis_score?: boolean[][]
move_selected?: JGOFIntersection
no_display: boolean
onError?: ((error) => void)

Type declaration

    • (error): void
    • Parameters

      • error: Error

      Returns void

on_game_screen: boolean
one_click_submit: boolean
original_square_size: number | ((goban) => number) | "auto"

Type declaration

    • (goban): number
    • Parameters

      Returns number

parent: HTMLElement
pause_control?: AdHocPauseControl
paused_since?: number
pen_marks: any[]
player_id: number
preloaded_data?: GobanConfig
previous_mode: string
puzzle_autoplace_delay: number
restrict_moves_to_movetree: boolean
review_had_gamedata: boolean
review_id: number
scoring_mode: boolean | "stalling-scoring-mode"
sendLatencyTimer?: Timeout
sent_timed_out_message: boolean = false
shift_key_is_down: boolean
show_variation_move_numbers: boolean
showing_scores: boolean = false
socket_event_bindings: [keyof GobanSocketEvents, (() => void)][] = []
square_size: number = 10
stalling_score_estimate?: StallingScoreEstimate
stone_font_scale: number
stone_placement_enabled: boolean
stone_removal_auto_scoring_done?: boolean = false
variation_stone_opacity: number
width: number
THEMES: ThemesInterface = THEMES
THEMES_SORTED: {
    black: GobanTheme[];
    board: GobanTheme[];
    white: GobanTheme[];
    [key: string]: GobanTheme[];
} = THEMES_SORTED

Type declaration

setCallbacks: ((newCallbacks) => void) = setGobanCallbacks

Type declaration

    • (newCallbacks): void
    • Set's callback functions to be called in various situations. You can set any or all of the callbacks, only the provided callbacks will be updated.

      -

      Parameters

      Returns void

setTranslations: ((_catalog, _debug_mode?) => void) = setGobanTranslations

Type declaration

    • (_catalog, _debug_mode?): void
    • Parameters

      Returns void

Accessors

  • get analyze_subtool(): string
  • Returns string

  • set analyze_subtool(analyze_subtool): void
  • Parameters

    • analyze_subtool: string

    Returns void

  • get destroyed(): boolean
  • Returns boolean

  • get is_game_record(): boolean
  • True if the game is a game record of a real life game

    -

    Returns boolean

  • get review_controller_id(): undefined | number
  • Returns undefined | number

  • set review_controller_id(review_controller_id): void
  • Parameters

    • review_controller_id: undefined | number

    Returns void

  • get review_owner_id(): undefined | number
  • Returns undefined | number

  • set review_owner_id(review_owner_id): void
  • Parameters

    • review_owner_id: undefined | number

    Returns void

  • get submit_move(): undefined | (() => void)
  • Returns undefined | (() => void)

  • set submit_move(submit_move): void
  • Parameters

    • submit_move: undefined | (() => void)

    Returns void

Methods

  • Clears any analysis scores on the board

    -

    Returns void

  • Decodes any of the various ways we express moves that we've accumulated over the years into +

    Parameters

    Returns void

setTranslations: ((_catalog, _debug_mode?) => void) = setGobanTranslations

Type declaration

    • (_catalog, _debug_mode?): void
    • Parameters

      Returns void

Accessors

  • get analyze_subtool(): string
  • Returns string

  • set analyze_subtool(analyze_subtool): void
  • Parameters

    • analyze_subtool: string

    Returns void

  • get destroyed(): boolean
  • Returns boolean

  • get is_game_record(): boolean
  • True if the game is a game record of a real life game

    +

    Returns boolean

  • get review_controller_id(): undefined | number
  • Returns undefined | number

  • set review_controller_id(review_controller_id): void
  • Parameters

    • review_controller_id: undefined | number

    Returns void

  • get review_owner_id(): undefined | number
  • Returns undefined | number

  • set review_owner_id(review_owner_id): void
  • Parameters

    • review_owner_id: undefined | number

    Returns void

  • get submit_move(): undefined | (() => void)
  • Returns undefined | (() => void)

  • set submit_move(submit_move): void
  • Parameters

    • submit_move: undefined | (() => void)

    Returns void

Methods

  • Clears any analysis scores on the board

    +

    Returns void

  • Parameters

    • x: number
    • y: number

    Returns undefined | string

  • Parameters

    • x: number
    • y: number

    Returns undefined | string

  • Marks scores on the board when in analysis mode. Note: this will not clear existing scores, this is intentional as I think it's the expected behavior of reviewers

    -

    Returns void

  • Parameters

    • ev: TouchEvent | MouseEvent

    Returns void

  • Parameters

    • ev: TouchEvent | MouseEvent

    Returns void

  • Parameters

    • ev: TouchEvent | MouseEvent

    Returns void

  • Parameters

    • ev: TouchEvent | MouseEvent

    Returns void

  • Parameters

    • ev: TouchEvent | MouseEvent

    Returns void

  • Parameters

    • ev: TouchEvent | MouseEvent

    Returns void

  • Parameters

    • x: number
    • y: number
    • Optional removal: boolean

    Returns void

  • Parameters

    • x: number
    • y: number
    • Optional color: string
    • sync_review_move: boolean = true

    Returns void

  • Parameters

    • x: number
    • y: number
    • Optional mode: "put" | "clear"

    Returns boolean

  • Parameters

    • x: number
    • y: number
    • Optional removal: boolean

    Returns void

  • Parameters

    • x: number
    • y: number
    • Optional color: string
    • sync_review_move: boolean = true

    Returns void

  • Parameters

    • x: number
    • y: number
    • Optional mode: "put" | "clear"

    Returns boolean

  • When we think our clock has runout, send a message to the server letting it know. Otherwise we have to wait for the server grace period to expire for it to time us out.

    -

    Returns void

  • Parameters

    • colored_marks: {
          [key: string]: {
              color: string;
              move: string;
          };
      }
      • [key: string]: {
            color: string;
            move: string;
        }
        • color: string
        • move: string

    Returns void

  • Called when a location is marked or unmarked for removal

    -

    Parameters

    • x: number
    • y: number
    • removed: boolean
    • emit_stone_removal_updated: boolean = true

    Returns void

  • Parameters

    • colored_marks: {
          [key: string]: {
              color: string;
              move: string;
          };
      }
      • [key: string]: {
            color: string;
            move: string;
        }
        • color: string
        • move: string

    Returns void

  • Called when a location is marked or unmarked for removal

    +

    Parameters

    • x: number
    • y: number
    • removed: boolean
    • emit_stone_removal_updated: boolean = true

    Returns void

  • This is a callback that gets called by GobanEngine.getState to save and board state as it pushes and pops state. Our renderers can override this to save state they need.

    -

    Parameters

    • marks: {
          [mark: string]: string;
      }
      • [mark: string]: string
    • Optional dont_draw: boolean

    Returns void

  • Parameters

    • new_ss: number
    • suppress_redraw: boolean = false

    Returns void

  • Parameters

    • display_width: number
    • suppress_redraw: boolean = false

    Returns void

  • This is a callback that gets called by GobanEngine.setState to load +

    Parameters

    • marks: {
          [mark: string]: string;
      }
      • [mark: string]: string
    • Optional dont_draw: boolean

    Returns void

  • Parameters

    • new_ss: number
    • suppress_redraw: boolean = false

    Returns void

  • Parameters

    • display_width: number
    • suppress_redraw: boolean = false

    Returns void

  • Parameters

    • new_ss: number
    • suppress_redraw: boolean = false

    Returns void

  • Parameters

    • x: number
    • y: number
    • anti_slip: boolean = true

    Returns {
        i: number;
        j: number;
        valid: boolean;
    }

    • i: number
    • j: number
    • valid: boolean
\ No newline at end of file +

Returns void

\ No newline at end of file diff --git a/docs/classes/GobanBase.html b/docs/classes/GobanBase.html index 7cf42c7d..cf84ae2f 100644 --- a/docs/classes/GobanBase.html +++ b/docs/classes/GobanBase.html @@ -2,7 +2,7 @@ classes, types, and enums.

You can't create an instance of a Goban directly, you have to create an instance of one of the renderers, such as GobanSVG.

-

Hierarchy (view full)

Constructors

Hierarchy (view full)

Constructors

Properties

Constructors

Properties

_destroyed: boolean = false
engine: GobanEngine
goban_id: number = ++last_goban_id

Base fields *

-
setCallbacks: ((newCallbacks) => void) = setGobanCallbacks

Type declaration

    • (newCallbacks): void
    • Set's callback functions to be called in various situations. You can set any +

Constructors

Properties

_destroyed: boolean = false
engine: GobanEngine
goban_id: number = ++last_goban_id

Base fields *

+
setCallbacks: ((newCallbacks) => void) = setGobanCallbacks

Type declaration

    • (newCallbacks): void
    • Set's callback functions to be called in various situations. You can set any or all of the callbacks, only the provided callbacks will be updated.

      -

      Parameters

      Returns void

setTranslations: ((_catalog, _debug_mode?) => void) = setGobanTranslations

Type declaration

    • (_catalog, _debug_mode?): void
    • Parameters

      Returns void

Accessors

  • get is_game_record(): boolean
  • True if the game is a game record of a real life game

    -

    Returns boolean

Methods

  • Decodes any of the various ways we express moves that we've accumulated over the years into +

    Parameters

    Returns void

setTranslations: ((_catalog, _debug_mode?) => void) = setGobanTranslations

Type declaration

    • (_catalog, _debug_mode?): void
    • Parameters

      Returns void

Accessors

  • get is_game_record(): boolean
  • True if the game is a game record of a real life game

    +

    Returns boolean

Methods

  • Decodes a move string like "A11" into a move object like {x: 0, y: 10}. Also handles the special cases like ".." and "pass" which map to {x: -1, y: -1}.

    -

    Parameters

    • coordinates: string

    Returns JGOFMove

  • Parameters

    • i: number
    • j: number

    Returns void

  • Parameters

    • Optional no_warp: boolean

    Returns void

  • Encodes an x,y pair or a move object like {x: 0, y: 0} into a move string like "A1"

    -

    Parameters

    Returns string

  • Parameters

    • x: number
    • y: number

    Returns string

  • Parameters

    • Optional force_clear: boolean

    Returns void

  • Called when a location is marked or unmarked for removal

    -

    Parameters

    • x: number
    • y: number
    • removed: boolean
    • emit_stone_removal_updated: boolean

    Returns void

  • Parameters

    • container: any

    Returns void

  • Called when Engine.setState loads a previously saved board state.

    -

    Returns void

  • Parameters

    • msg_id: MessageID
    • Optional parameters: {
          [key: string]: any;
      }
      • [key: string]: any
    • Optional timeout: number

    Returns void

\ No newline at end of file +

Parameters

Returns JGOFMove

\ No newline at end of file diff --git a/docs/classes/GobanCanvas.html b/docs/classes/GobanCanvas.html index 5ba07a34..36d406ea 100644 --- a/docs/classes/GobanCanvas.html +++ b/docs/classes/GobanCanvas.html @@ -2,7 +2,7 @@ classes, types, and enums.

You can't create an instance of a Goban directly, you have to create an instance of one of the renderers, such as GobanSVG.

-

Hierarchy (view full)

Implements

Constructors

Hierarchy (view full)

Implements

Constructors

Properties

__board_redraw_pen_layer_timer: any = null
__borders_initialized: boolean = false
__clock_timer?: Timeout
__draw_state: string[][]
__last_pt: {
    i: number;
    j: number;
    valid: boolean;
} = ...

Type declaration

  • i: number
  • j: number
  • valid: boolean
__set_board_height: number = -1
__set_board_width: number = -1
__update_move_tree: any = null
analysis_move_counter: number
analysis_removal_last_position: {
    i: number;
    j: number;
} = ...

Type declaration

  • i: number
  • j: number
analysis_removal_state?: boolean
autoplaying_puzzle_move: boolean = false
board: HTMLCanvasElement
bounded_height: number
bounded_width: number
bounds: GobanBounds
byoyomi_label: string = ""
chat_log: GobanChatLog = []
circle_radius: number
clock_should_be_paused_for_move_submission: boolean = false
colored_circles?: (undefined | ColoredCircle)[][]
conditional_path: string = ""
conditional_starting_color: "black" | "white" | "invalid" = "invalid"
conditional_tree: ConditionalMoveTree = ...
config: GobanConfig
connectToReviewSent?: boolean
ctx: CanvasRenderingContext2D
current_cmove?: ConditionalMoveTree
current_pen_mark?: {
    color: string;
    points: [number, number];
}

Type declaration

  • color: string
  • points: [number, number]
currently_my_cmove: boolean = false
dirty_redraw: any = null
disconnectedFromGame: boolean = true
display_width?: number
done_loading_review: boolean = false
dont_draw_last_move: boolean
double_click_submit: boolean
draw_bottom_labels: boolean
draw_left_labels: boolean
draw_right_labels: boolean
draw_top_labels: boolean
drawing_enabled: boolean = true
edit_color?: "black" | "white"
engine: GobanEngine
errorHandler: ((e) => void)

Type declaration

    • (e): void
    • Parameters

      • e: Error

      Returns void

game_id: number
game_type: string
getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting)
goban_id: number = ++last_goban_id

Base fields *

-
handleShiftKey: ((ev) => void)

Type declaration

    • (ev): void
    • Parameters

      • ev: KeyboardEvent

      Returns void

heatmap?: NumberMatrix
height: number
highlight_movetree_moves: boolean
interactive: boolean
isInPushedAnalysis: (() => boolean)

Type declaration

    • (): boolean
    • Returns boolean

isPlayerController: (() => boolean)

Type declaration

    • (): boolean
    • Returns boolean

isPlayerOwner: (() => boolean)

Type declaration

    • (): boolean
    • Returns boolean

label_character: string
label_mark: string = "[UNSET]"
labeling_mode?: "put" | "clear"
last_clock?: AdHocClock
last_emitted_clock?: JGOFClockWithTransmitting
last_hover_square?: JGOFIntersection
last_label_position: {
    i: number;
    j: number;
} = ...

Type declaration

  • i: number
  • j: number
last_move?: MoveTree
last_move_opacity: number = 1
last_move_radius: number
last_paused_by_player_state: null | boolean = null
last_paused_state: null | boolean = null
last_pen_position?: [number, number]
last_phase?: GobanEnginePhase
last_review_message: ReviewMessage
last_sound_played_for_a_stone_placement?: string
last_stone_sound: number
leavePushedAnalysis: (() => void)

Type declaration

    • (): void
    • Returns void

marked_analysis_score?: boolean[][]
message_div?: HTMLDivElement
message_td?: HTMLElement
message_text?: HTMLDivElement
message_timeout?: number
metrics: GobanMetrics = ...
move_selected?: JGOFIntersection
move_tree_canvas?: HTMLCanvasElement
move_tree_container?: HTMLElement
move_tree_inner_container?: HTMLDivElement
no_display: boolean
onError?: ((error) => void)

Type declaration

    • (error): void
    • Parameters

      • error: Error

      Returns void

on_game_screen: boolean
one_click_submit: boolean
original_square_size: number | ((goban) => number) | "auto"

Type declaration

    • (goban): number
    • Parameters

      Returns number

parent: HTMLElement
pause_control?: AdHocPauseControl
paused_since?: number
pen_ctx?: CanvasRenderingContext2D
pen_layer?: HTMLCanvasElement
pen_marks: any[]
player_id: number
preloaded_data?: GobanConfig
previous_mode: string
puzzle_autoplace_delay: number
ready_to_draw: boolean = false
restrict_moves_to_movetree: boolean
review_had_gamedata: boolean
review_id: number
scoring_mode: boolean | "stalling-scoring-mode"
sendLatencyTimer?: Timeout
sent_timed_out_message: boolean = false
shadow_ctx?: CanvasRenderingContext2D
shadow_layer?: HTMLCanvasElement
shift_key_is_down: boolean
show_variation_move_numbers: boolean
showing_scores: boolean = false
socket_event_bindings: [keyof GobanSocketEvents, (() => void)][] = []
square_size: number = 10
stalling_score_estimate?: StallingScoreEstimate
stone_font_scale: number
stone_placement_enabled: boolean
stone_removal_auto_scoring_done?: boolean = false
theme_black: GobanTheme
theme_black_stones: any[] = []
theme_black_text_color: string = HOT_PINK
theme_blank_text_color: string = HOT_PINK
theme_board: GobanTheme
theme_faded_line_color: string = HOT_PINK
theme_faded_star_color: string = HOT_PINK
theme_line_color: string = ""
theme_star_color: string = ""
theme_stone_radius: number = 10
theme_white: GobanTheme
theme_white_stones: any[] = []
theme_white_text_color: string = HOT_PINK
themes: GobanSelectedThemes = ...
title_div?: HTMLElement
variation_stone_opacity: number
width: number
THEMES: ThemesInterface = THEMES
THEMES_SORTED: {
    black: GobanTheme[];
    board: GobanTheme[];
    white: GobanTheme[];
    [key: string]: GobanTheme[];
} = THEMES_SORTED

Type declaration

setCallbacks: ((newCallbacks) => void) = setGobanCallbacks

Type declaration

    • (newCallbacks): void
    • Set's callback functions to be called in various situations. You can set any +

Constructors

Properties

__board_redraw_pen_layer_timer: any = null
__borders_initialized: boolean = false
__clock_timer?: Timeout
__draw_state: string[][]
__last_pt: {
    i: number;
    j: number;
    valid: boolean;
} = ...

Type declaration

  • i: number
  • j: number
  • valid: boolean
__set_board_height: number = -1
__set_board_width: number = -1
__update_move_tree: any = null
analysis_move_counter: number
analysis_removal_last_position: {
    i: number;
    j: number;
} = ...

Type declaration

  • i: number
  • j: number
analysis_removal_state?: boolean
autoplaying_puzzle_move: boolean = false
board: HTMLCanvasElement
bounded_height: number
bounded_width: number
bounds: GobanBounds
byoyomi_label: string = ""
chat_log: GobanChatLog = []
circle_radius: number
clock_should_be_paused_for_move_submission: boolean = false
colored_circles?: (undefined | ColoredCircle)[][]
conditional_path: string = ""
conditional_starting_color: "black" | "white" | "invalid" = "invalid"
conditional_tree: ConditionalMoveTree = ...
config: GobanConfig
connectToReviewSent?: boolean
ctx: CanvasRenderingContext2D
current_cmove?: ConditionalMoveTree
current_pen_mark?: {
    color: string;
    points: [number, number];
}

Type declaration

  • color: string
  • points: [number, number]
currently_my_cmove: boolean = false
dirty_redraw: any = null
disconnectedFromGame: boolean = true
display_width?: number
done_loading_review: boolean = false
dont_draw_last_move: boolean
double_click_submit: boolean
draw_bottom_labels: boolean
draw_left_labels: boolean
draw_right_labels: boolean
draw_top_labels: boolean
drawing_enabled: boolean = true
edit_color?: "black" | "white"
engine: GobanEngine
errorHandler: ((e) => void)

Type declaration

    • (e): void
    • Parameters

      • e: Error

      Returns void

game_id: number
game_type: string
getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting)
goban_id: number = ++last_goban_id

Base fields *

+
handleShiftKey: ((ev) => void)

Type declaration

    • (ev): void
    • Parameters

      • ev: KeyboardEvent

      Returns void

heatmap?: NumberMatrix
height: number
highlight_movetree_moves: boolean
interactive: boolean
isInPushedAnalysis: (() => boolean)

Type declaration

    • (): boolean
    • Returns boolean

isPlayerController: (() => boolean)

Type declaration

    • (): boolean
    • Returns boolean

isPlayerOwner: (() => boolean)

Type declaration

    • (): boolean
    • Returns boolean

label_character: string
label_mark: string = "[UNSET]"
labeling_mode?: "put" | "clear"
last_clock?: AdHocClock
last_emitted_clock?: JGOFClockWithTransmitting
last_hover_square?: JGOFIntersection
last_label_position: {
    i: number;
    j: number;
} = ...

Type declaration

  • i: number
  • j: number
last_move?: MoveTree
last_move_opacity: number = 1
last_move_radius: number
last_paused_by_player_state: null | boolean = null
last_paused_state: null | boolean = null
last_pen_position?: [number, number]
last_phase?: GobanEnginePhase
last_review_message: ReviewMessage
last_sound_played_for_a_stone_placement?: string
last_stone_sound: number
leavePushedAnalysis: (() => void)

Type declaration

    • (): void
    • Returns void

marked_analysis_score?: boolean[][]
message_div?: HTMLDivElement
message_td?: HTMLElement
message_text?: HTMLDivElement
message_timeout?: number
metrics: GobanMetrics = ...
move_selected?: JGOFIntersection
move_tree_canvas?: HTMLCanvasElement
move_tree_container?: HTMLElement
move_tree_inner_container?: HTMLDivElement
no_display: boolean
onError?: ((error) => void)

Type declaration

    • (error): void
    • Parameters

      • error: Error

      Returns void

on_game_screen: boolean
one_click_submit: boolean
original_square_size: number | ((goban) => number) | "auto"

Type declaration

    • (goban): number
    • Parameters

      Returns number

parent: HTMLElement
pause_control?: AdHocPauseControl
paused_since?: number
pen_ctx?: CanvasRenderingContext2D
pen_layer?: HTMLCanvasElement
pen_marks: any[]
player_id: number
preloaded_data?: GobanConfig
previous_mode: string
puzzle_autoplace_delay: number
ready_to_draw: boolean = false
restrict_moves_to_movetree: boolean
review_had_gamedata: boolean
review_id: number
scoring_mode: boolean | "stalling-scoring-mode"
sendLatencyTimer?: Timeout
sent_timed_out_message: boolean = false
shadow_ctx?: CanvasRenderingContext2D
shadow_layer?: HTMLCanvasElement
shift_key_is_down: boolean
show_variation_move_numbers: boolean
showing_scores: boolean = false
socket_event_bindings: [keyof GobanSocketEvents, (() => void)][] = []
square_size: number = 10
stalling_score_estimate?: StallingScoreEstimate
stone_font_scale: number
stone_placement_enabled: boolean
stone_removal_auto_scoring_done?: boolean = false
theme_black: GobanTheme
theme_black_stones: any[] = []
theme_black_text_color: string = HOT_PINK
theme_blank_text_color: string = HOT_PINK
theme_board: GobanTheme
theme_faded_line_color: string = HOT_PINK
theme_faded_star_color: string = HOT_PINK
theme_line_color: string = ""
theme_star_color: string = ""
theme_stone_radius: number = 10
theme_white: GobanTheme
theme_white_stones: any[] = []
theme_white_text_color: string = HOT_PINK
themes: GobanSelectedThemes = ...
title_div?: HTMLElement
variation_stone_opacity: number
width: number
THEMES: ThemesInterface = THEMES
THEMES_SORTED: {
    black: GobanTheme[];
    board: GobanTheme[];
    white: GobanTheme[];
    [key: string]: GobanTheme[];
} = THEMES_SORTED

Type declaration

setCallbacks: ((newCallbacks) => void) = setGobanCallbacks

Type declaration

    • (newCallbacks): void
    • Set's callback functions to be called in various situations. You can set any or all of the callbacks, only the provided callbacks will be updated.

      -

      Parameters

      Returns void

setTranslations: ((_catalog, _debug_mode?) => void) = setGobanTranslations

Type declaration

    • (_catalog, _debug_mode?): void
    • Parameters

      Returns void

Accessors

  • get analyze_subtool(): string
  • Returns string

  • set analyze_subtool(analyze_subtool): void
  • Parameters

    • analyze_subtool: string

    Returns void

  • get destroyed(): boolean
  • Returns boolean

  • get is_game_record(): boolean
  • True if the game is a game record of a real life game

    -

    Returns boolean

  • get review_controller_id(): undefined | number
  • Returns undefined | number

  • set review_controller_id(review_controller_id): void
  • Parameters

    • review_controller_id: undefined | number

    Returns void

  • get review_owner_id(): undefined | number
  • Returns undefined | number

  • set review_owner_id(review_owner_id): void
  • Parameters

    • review_owner_id: undefined | number

    Returns void

  • get submit_move(): undefined | (() => void)
  • Returns undefined | (() => void)

  • set submit_move(submit_move): void
  • Parameters

    • submit_move: undefined | (() => void)

    Returns void

Methods

  • Decodes any of the various ways we express moves that we've accumulated over the years into +

    Parameters

    Returns void

setTranslations: ((_catalog, _debug_mode?) => void) = setGobanTranslations

Type declaration

    • (_catalog, _debug_mode?): void
    • Parameters

      Returns void

Accessors

  • get analyze_subtool(): string
  • Returns string

  • set analyze_subtool(analyze_subtool): void
  • Parameters

    • analyze_subtool: string

    Returns void

  • get destroyed(): boolean
  • Returns boolean

  • get is_game_record(): boolean
  • True if the game is a game record of a real life game

    +

    Returns boolean

  • get review_controller_id(): undefined | number
  • Returns undefined | number

  • set review_controller_id(review_controller_id): void
  • Parameters

    • review_controller_id: undefined | number

    Returns void

  • get review_owner_id(): undefined | number
  • Returns undefined | number

  • set review_owner_id(review_owner_id): void
  • Parameters

    • review_owner_id: undefined | number

    Returns void

  • get submit_move(): undefined | (() => void)
  • Returns undefined | (() => void)

  • set submit_move(submit_move): void
  • Parameters

    • submit_move: undefined | (() => void)

    Returns void

Methods

  • Decodes a move string like "A11" into a move object like {x: 0, y: 10}. Also handles the special cases like ".." and "pass" which map to {x: -1, y: -1}.

    -

    Parameters

    • coordinates: string

    Returns JGOFMove

  • Marks scores on the board when in analysis mode. Note: this will not clear existing scores, this is intentional as I think it's the expected behavior of reviewers

    -

    Returns void

  • Parameters

    • event: TouchEvent | MouseEvent
    • double_tap: boolean
    • right_click: boolean
    • press_duration_ms: number

    Returns void

  • Parameters

    • event: TouchEvent | MouseEvent
    • double_tap: boolean
    • right_click: boolean
    • press_duration_ms: number

    Returns void

  • Goban calls some abstract methods as part of the construction process. Because our subclasses might (and do) need to do some of their own config before these are called, we set this function to be called by our subclass after it's done it's own internal config stuff.

    -

    Returns GobanEngine

  • When we think our clock has runout, send a message to the server letting it know. Otherwise we have to wait for the server grace period to expire for it to time us out.

    -

    Returns void

  • Parameters

    • colored_marks: {
          [key: string]: {
              color: string;
              move: string;
          };
      }
      • [key: string]: {
            color: string;
            move: string;
        }
        • color: string
        • move: string

    Returns void

  • Called when a location is marked or unmarked for removal

    -

    Parameters

    • x: number
    • y: number
    • removed: boolean
    • emit_stone_removal_updated: boolean = true

    Returns void

  • Parameters

    • colored_marks: {
          [key: string]: {
              color: string;
              move: string;
          };
      }
      • [key: string]: {
            color: string;
            move: string;
        }
        • color: string
        • move: string

    Returns void

  • Called when a location is marked or unmarked for removal

    +

    Parameters

    • x: number
    • y: number
    • removed: boolean
    • emit_stone_removal_updated: boolean = true

    Returns void

  • This is a callback that gets called by GobanEngine.getState to save and board state as it pushes and pops state. Our renderers can override this to save state they need.

    -

    Parameters

    • marks: {
          [mark: string]: string;
      }
      • [mark: string]: string
    • Optional dont_draw: boolean

    Returns void

  • This is a callback that gets called by GobanEngine.setState to load +

    Parameters

    • marks: {
          [mark: string]: string;
      }
      • [mark: string]: string
    • Optional dont_draw: boolean

    Returns void

  • Parameters

    • x: number
    • y: number
    • mark: string | number
    • Optional force_label: boolean
    • Optional force_put: boolean

    Returns boolean

  • Parameters

    Returns {
        remove: (() => any);
    }

    • remove: (() => any)
        • (): any
        • Returns any

  • Parameters

    • x: number
    • y: number
    • anti_slip: boolean = true

    Returns {
        i: number;
        j: number;
        valid: boolean;
    }

    • i: number
    • j: number
    • valid: boolean
\ No newline at end of file +

Returns void

\ No newline at end of file diff --git a/docs/classes/GobanEngine.html b/docs/classes/GobanEngine.html index 23c73192..5d557c79 100644 --- a/docs/classes/GobanEngine.html +++ b/docs/classes/GobanEngine.html @@ -1,4 +1,4 @@ -GobanEngine | goban

Class GobanEngine

Hierarchy (view full)

Constructors

constructor +GobanEngine | goban

Class GobanEngine

Hierarchy (view full)

Constructors

Properties

_cur_move: MoveTree
_cur_review_move: undefined | MoveTree
_last_official_move: MoveTree
_outcome: string = ""
_phase: GobanEnginePhase = "play"
_rules: GobanEngineRules = "japanese"
_strict_seki_mode: boolean = false
_undo_requested?: number
_winner?: number | "black" | "white"
aga_handicap_scoring: boolean = false
allow_ko: boolean = false
allow_self_capture: boolean = false
allow_superko: boolean = false
automatic_stone_removal: boolean = false
black_prisoners: number
board_is_repeating: boolean
decoded_moves: JGOFMove[] = []
disable_analysis: boolean = false
dontStoreBoardHistory: boolean
free_handicap_placement: boolean = false
game_id: number = NaN
goban_callback?: GobanBase
group_ids?: number[]
handicap: number = NaN
handicap_rank_difference?: number
height: number = 19
initial_state: GobanEngineInitialState = ...
is_game_record: boolean = false
komi: number = NaN
latencies?: {
    [player_id: string]: number;
}

Type declaration

  • [player_id: string]: number
loading_sgf: boolean = false
move_before_jump?: MoveTree
move_tree: MoveTree
move_tree_layout_dirty: boolean = false
move_tree_layout_hash: {
    [coords: string]: MoveTree;
} = {}

Type declaration

move_tree_layout_vector: number[] = []
name: string = ""
needs_sealing?: JGOFSealingIntersection[]
parentEventEmitter?: EventEmitter<GobanEvents, any>
player_pool: {
    [id: number]: GobanEnginePlayerEntry;
}

Type declaration

players: {
    black: GobanEnginePlayerEntry;
    white: GobanEnginePlayerEntry;
} = ...

Type declaration

puzzle_collection: number = NaN
puzzle_description: string = "[missing puzzle description]"
puzzle_opponent_move_mode: PuzzleOpponentMoveMode = "manual"
puzzle_player_move_mode: PuzzlePlayerMoveMode = "free"
puzzle_rank: number = NaN
puzzle_type: string = "[missing puzzle type]"
removal: boolean[][]
rengo?: boolean
rengo_casual_mode: boolean
rengo_teams?: {
    [colour: string]: GobanEnginePlayerEntry[];
}

Type declaration

review_id?: number
score_handicap: boolean = false
score_prisoners: boolean = false
score_stones: boolean = false
score_territory: boolean = false
score_territory_in_seki: boolean = false
stalling_score_estimate?: StallingScoreEstimate
superko_algorithm: GobanEngineSuperKoAlgorithm = "psk"
territory_included_in_sgf: boolean = false
throw_all_errors?: boolean
time_control: JGOFTimeControl = ...
white_prisoners: number
width: number = 19

Accessors

  • get winner(): undefined | number | "black" | "white"
  • Returns undefined | number | "black" | "white"

  • set winner(winner): void
  • Parameters

    • winner: undefined | number | "black" | "white"

    Returns void

Methods

  • Returns {
        black: string;
        white: string;
    }

    • black: string
    • white: string
  • Computes the score of the current board state.

    +

Constructors

Properties

_cur_move: MoveTree
_cur_review_move: undefined | MoveTree
_last_official_move: MoveTree
_outcome: string = ""
_phase: GobanEnginePhase = "play"
_rules: GobanEngineRules = "japanese"
_strict_seki_mode: boolean = false
_undo_requested?: number
_winner?: number | "black" | "white"
aga_handicap_scoring: boolean = false
allow_ko: boolean = false
allow_self_capture: boolean = false
allow_superko: boolean = false
automatic_stone_removal: boolean = false
black_prisoners: number
board_is_repeating: boolean
decoded_moves: JGOFMove[] = []
disable_analysis: boolean = false
dontStoreBoardHistory: boolean
free_handicap_placement: boolean = false
game_id: number = NaN
goban_callback?: GobanBase
group_ids?: number[]
handicap: number = NaN
handicap_rank_difference?: number
height: number = 19
initial_state: GobanEngineInitialState = ...
is_game_record: boolean = false
komi: number = NaN
latencies?: {
    [player_id: string]: number;
}

Type declaration

  • [player_id: string]: number
loading_sgf: boolean = false
move_before_jump?: MoveTree
move_tree: MoveTree
move_tree_layout_dirty: boolean = false
move_tree_layout_hash: {
    [coords: string]: MoveTree;
} = {}

Type declaration

move_tree_layout_vector: number[] = []
name: string = ""
needs_sealing?: JGOFSealingIntersection[]
parentEventEmitter?: EventEmitter<GobanEvents, any>
player_pool: {
    [id: number]: GobanEnginePlayerEntry;
}

Type declaration

players: {
    black: GobanEnginePlayerEntry;
    white: GobanEnginePlayerEntry;
} = ...

Type declaration

puzzle_collection: number = NaN
puzzle_description: string = "[missing puzzle description]"
puzzle_opponent_move_mode: PuzzleOpponentMoveMode = "manual"
puzzle_player_move_mode: PuzzlePlayerMoveMode = "free"
puzzle_rank: number = NaN
puzzle_type: string = "[missing puzzle type]"
removal: boolean[][]
rengo?: boolean
rengo_casual_mode: boolean
rengo_teams?: {
    [colour: string]: GobanEnginePlayerEntry[];
}

Type declaration

review_id?: number
score_handicap: boolean = false
score_prisoners: boolean = false
score_stones: boolean = false
score_territory: boolean = false
score_territory_in_seki: boolean = false
stalling_score_estimate?: StallingScoreEstimate
superko_algorithm: GobanEngineSuperKoAlgorithm = "psk"
territory_included_in_sgf: boolean = false
throw_all_errors?: boolean
time_control: JGOFTimeControl = ...
white_prisoners: number
width: number = 19

Accessors

  • get winner(): undefined | number | "black" | "white"
  • Returns undefined | number | "black" | "white"

  • set winner(winner): void
  • Parameters

    • winner: undefined | number | "black" | "white"

    Returns void

Methods

  • Returns {
        black: string;
        white: string;
    }

    • black: string
    • white: string
  • Computes the score of the current board state.

    If only_prisoners is true, we return the same data structure for convenience, but only the prisoners will be counted, other sources of points will be zero.

    -

    Parameters

    • Optional only_prisoners: boolean

    Returns Score

  • Decodes a move string like "A11" into a move object like {x: 0, y: 10}. Also handles the special cases like ".." and "pass" which map to {x: -1, y: -1}.

    -

    Parameters

    • coordinates: string

    Returns JGOFMove

  • Parameters

    • from_turn: number
    • moves: string | AdHocPackedMove
    • Optional cb: ((x, y, edited, color) => void)
        • (x, y, edited, color): void
        • Parameters

          • x: number
          • y: number
          • edited: boolean
          • color: number

          Returns void

    Returns MoveTree[]

  • Returns a move string from the given official move number (aka branch point)

    -

    Returns {
        from: number;
        moves: string;
    }

    • from: number
    • moves: string
  • Parameters

    • from_turn: number
    • moves: string | AdHocPackedMove
    • Optional cb: ((x, y, edited, color) => void)
        • (x, y, edited, color): void
        • Parameters

          • x: number
          • y: number
          • edited: boolean
          • color: number

          Returns void

    Returns MoveTree[]

  • Returns a move string from the given official move number (aka branch point)

    +

    Returns {
        from: number;
        moves: string;
    }

    • from: number
    • moves: string
  • returns true if our current move is our last official move

    -

    Returns boolean

  • returns true if our current move is our last official move

    +

    Returns boolean

  • Returns the number of stones removed. If you want the coordinates of the stones removed, pass in a removed_stones array to append the moves to.

    -

    Parameters

    • x: number
    • y: number
    • Optional checkForKo: boolean
    • Optional errorOnSuperKo: boolean
    • Optional dontCheckForSuperKo: boolean
    • Optional dontCheckForSelfCapture: boolean
    • Optional isTrunkMove: boolean
    • Optional removed_stones: JGOFIntersection[]

    Returns number

  • Parameters

    • Optional player_id: number

    Returns "black" | "white" | "invalid"

  • Encodes an x,y pair or a move object like {x: 0, y: 0} into a move string like "A1"

    -

    Parameters

    Returns string

  • Parameters

    • x: number
    • y: number

    Returns string

  • Saves our current move as our last official move

    -

    Returns void

  • Parameters

    • x: number
    • y: number
    • Optional needs_sealing: boolean

    Returns void

  • Sets a position as being removed or not removed. If +

    Parameters

    • x: number
    • y: number
    • Optional checkForKo: boolean
    • Optional errorOnSuperKo: boolean
    • Optional dontCheckForSuperKo: boolean
    • Optional dontCheckForSelfCapture: boolean
    • Optional isTrunkMove: boolean
    • Optional removed_stones: JGOFIntersection[]

    Returns number

  • Parameters

    • Optional player_id: number

    Returns "black" | "white" | "invalid"

  • Encodes an x,y pair or a move object like {x: 0, y: 0} into a move string like "A1"

    +

    Parameters

    Returns string

  • Parameters

    • x: number
    • y: number

    Returns string

  • Saves our current move as our last official move

    +

    Returns void

  • Parameters

    • x: number
    • y: number
    • Optional needs_sealing: boolean

    Returns void

  • Sets a position as being removed or not removed. If emit_stone_removal_updated is set to false, the "stone-removal.updated" event will not be emitted, and it is up to the caller to emit this event appropriately.

    -

    Parameters

    • x: number
    • y: number
    • removed: boolean
    • emit_stone_removal_updated: boolean = true

    Returns void

  • Toggles a group of stones for removal or restoration.

    +

    Parameters

    • x: number
    • y: number
    • removed: boolean
    • emit_stone_removal_updated: boolean = true

    Returns void

  • Toggles a group of stones for removal or restoration.

    By default, if we are marking a group for removal but the group is almost certainly alive (two eyes, etc), this will result in a no-op, unless force_removal is set to true.

    -

    Parameters

    • x: number
    • y: number
    • force_removal: boolean = false

    Returns {
        group: RawStoneString;
        removed: boolean;
    }

\ No newline at end of file +

Parameters

Returns GobanEngineConfig

\ No newline at end of file diff --git a/docs/classes/GobanError.html b/docs/classes/GobanError.html index 012f5869..9a6c9ecf 100644 --- a/docs/classes/GobanError.html +++ b/docs/classes/GobanError.html @@ -1,2 +1,2 @@ -GobanError | goban

Class GobanError

Hierarchy (view full)

Constructors

Constructors

\ No newline at end of file +GobanError | goban

Class GobanError

Hierarchy (view full)

Constructors

Constructors

\ No newline at end of file diff --git a/docs/classes/GobanInteractive.html b/docs/classes/GobanInteractive.html index 0cc02555..04f64107 100644 --- a/docs/classes/GobanInteractive.html +++ b/docs/classes/GobanInteractive.html @@ -1,7 +1,7 @@ GobanInteractive | goban

Class GobanInteractiveAbstract

This class serves as a functionality layer encapsulating core interactions we do with a Goban, we have it as a separate base class simply to help with code organization and to keep our Goban class size down.

-

Hierarchy (view full)

Constructors

Hierarchy (view full)

Constructors

Properties

__board_redraw_pen_layer_timer: any = null
__clock_timer?: Timeout
__draw_state: string[][]
__last_pt: {
    i: number;
    j: number;
    valid: boolean;
} = ...

Type declaration

  • i: number
  • j: number
  • valid: boolean
__update_move_tree: any = null
_analyze_subtool: string = "alternate"
_analyze_tool: AnalysisTool = "stone"
_mode: GobanModes = "play"
_review_controller_id?: number
_review_owner_id?: number
_score_estimator: null | ScoreEstimator = null
_submit_move?: (() => void)

Type declaration

    • (): void
    • Returns void

_title: string = "play"
analysis_move_counter: number
analysis_removal_last_position: {
    i: number;
    j: number;
} = ...

Type declaration

  • i: number
  • j: number
analysis_removal_state?: boolean
bounded_height: number
bounded_width: number
bounds: GobanBounds
chat_log: GobanChatLog = []
circle_radius: number
clock_should_be_paused_for_move_submission: boolean = false
colored_circles?: (undefined | ColoredCircle)[][]
conditional_path: string = ""
conditional_starting_color: "black" | "white" | "invalid" = "invalid"
conditional_tree: ConditionalMoveTree = ...
config: GobanConfig
current_cmove?: ConditionalMoveTree
currently_my_cmove: boolean = false
dirty_redraw: any = null
disconnectedFromGame: boolean = true
display_width?: number
done_loading_review: boolean = false
dont_draw_last_move: boolean
double_click_submit: boolean
draw_bottom_labels: boolean
draw_left_labels: boolean
draw_right_labels: boolean
draw_top_labels: boolean
edit_color?: "black" | "white"
engine: GobanEngine
errorHandler: ((e) => void)

Type declaration

    • (e): void
    • Parameters

      • e: Error

      Returns void

game_id: number
game_type: string
getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting)
goban_id: number = ++last_goban_id

Base fields *

-
heatmap?: NumberMatrix
height: number
highlight_movetree_moves: boolean
interactive: boolean
isInPushedAnalysis: (() => boolean)

Type declaration

    • (): boolean
    • Returns boolean

isPlayerController: (() => boolean)

Type declaration

    • (): boolean
    • Returns boolean

isPlayerOwner: (() => boolean)

Type declaration

    • (): boolean
    • Returns boolean

label_character: string
label_mark: string = "[UNSET]"
last_clock?: AdHocClock
last_emitted_captured_stones: JGOFIntersection[] = []
last_emitted_clock?: JGOFClockWithTransmitting
last_hover_square?: JGOFIntersection
last_move?: MoveTree
last_move_radius: number
last_paused_by_player_state: null | boolean = null
last_paused_state: null | boolean = null
last_phase?: GobanEnginePhase
last_review_message: ReviewMessage
last_sound_played_for_a_stone_placement?: string
last_stone_sound: number
leavePushedAnalysis: (() => void)

Type declaration

    • (): void
    • Returns void

marked_analysis_score?: boolean[][]
move_selected?: JGOFIntersection
no_display: boolean
onError?: ((error) => void)

Type declaration

    • (error): void
    • Parameters

      • error: Error

      Returns void

on_game_screen: boolean
one_click_submit: boolean
original_square_size: number | ((goban) => number) | "auto"

Type declaration

    • (goban): number
    • Parameters

      Returns number

pause_control?: AdHocPauseControl
paused_since?: number
pen_marks: any[]
player_id: number
preloaded_data?: GobanConfig
previous_mode: string
puzzle_autoplace_delay: number
restrict_moves_to_movetree: boolean
review_had_gamedata: boolean
review_id: number
scoring_mode: boolean | "stalling-scoring-mode"
sendLatencyTimer?: Timeout
sent_timed_out_message: boolean
shift_key_is_down: boolean
show_variation_move_numbers: boolean
showing_scores: boolean = false
square_size: number = 10
stalling_score_estimate?: StallingScoreEstimate
stone_font_scale: number
stone_placement_enabled: boolean
stone_removal_auto_scoring_done?: boolean = false
variation_stone_opacity: number
width: number
setCallbacks: ((newCallbacks) => void) = setGobanCallbacks

Type declaration

    • (newCallbacks): void
    • Set's callback functions to be called in various situations. You can set any +

Constructors

Properties

__board_redraw_pen_layer_timer: any = null
__clock_timer?: Timeout
__draw_state: string[][]
__last_pt: {
    i: number;
    j: number;
    valid: boolean;
} = ...

Type declaration

  • i: number
  • j: number
  • valid: boolean
__update_move_tree: any = null
_analyze_subtool: string = "alternate"
_analyze_tool: AnalysisTool = "stone"
_mode: GobanModes = "play"
_review_controller_id?: number
_review_owner_id?: number
_score_estimator: null | ScoreEstimator = null
_submit_move?: (() => void)

Type declaration

    • (): void
    • Returns void

_title: string = "play"
analysis_move_counter: number
analysis_removal_last_position: {
    i: number;
    j: number;
} = ...

Type declaration

  • i: number
  • j: number
analysis_removal_state?: boolean
bounded_height: number
bounded_width: number
bounds: GobanBounds
chat_log: GobanChatLog = []
circle_radius: number
clock_should_be_paused_for_move_submission: boolean = false
colored_circles?: (undefined | ColoredCircle)[][]
conditional_path: string = ""
conditional_starting_color: "black" | "white" | "invalid" = "invalid"
conditional_tree: ConditionalMoveTree = ...
config: GobanConfig
current_cmove?: ConditionalMoveTree
currently_my_cmove: boolean = false
dirty_redraw: any = null
disconnectedFromGame: boolean = true
display_width?: number
done_loading_review: boolean = false
dont_draw_last_move: boolean
double_click_submit: boolean
draw_bottom_labels: boolean
draw_left_labels: boolean
draw_right_labels: boolean
draw_top_labels: boolean
edit_color?: "black" | "white"
engine: GobanEngine
errorHandler: ((e) => void)

Type declaration

    • (e): void
    • Parameters

      • e: Error

      Returns void

game_id: number
game_type: string
getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting)
goban_id: number = ++last_goban_id

Base fields *

+
heatmap?: NumberMatrix
height: number
highlight_movetree_moves: boolean
interactive: boolean
isInPushedAnalysis: (() => boolean)

Type declaration

    • (): boolean
    • Returns boolean

isPlayerController: (() => boolean)

Type declaration

    • (): boolean
    • Returns boolean

isPlayerOwner: (() => boolean)

Type declaration

    • (): boolean
    • Returns boolean

label_character: string
label_mark: string = "[UNSET]"
last_clock?: AdHocClock
last_emitted_captured_stones: JGOFIntersection[] = []
last_emitted_clock?: JGOFClockWithTransmitting
last_hover_square?: JGOFIntersection
last_move?: MoveTree
last_move_radius: number
last_paused_by_player_state: null | boolean = null
last_paused_state: null | boolean = null
last_phase?: GobanEnginePhase
last_review_message: ReviewMessage
last_sound_played_for_a_stone_placement?: string
last_stone_sound: number
leavePushedAnalysis: (() => void)

Type declaration

    • (): void
    • Returns void

marked_analysis_score?: boolean[][]
move_selected?: JGOFIntersection
no_display: boolean
onError?: ((error) => void)

Type declaration

    • (error): void
    • Parameters

      • error: Error

      Returns void

on_game_screen: boolean
one_click_submit: boolean
original_square_size: number | ((goban) => number) | "auto"

Type declaration

    • (goban): number
    • Parameters

      Returns number

pause_control?: AdHocPauseControl
paused_since?: number
pen_marks: any[]
player_id: number
preloaded_data?: GobanConfig
previous_mode: string
puzzle_autoplace_delay: number
restrict_moves_to_movetree: boolean
review_had_gamedata: boolean
review_id: number
scoring_mode: boolean | "stalling-scoring-mode"
sendLatencyTimer?: Timeout
sent_timed_out_message: boolean
shift_key_is_down: boolean
show_variation_move_numbers: boolean
showing_scores: boolean = false
square_size: number = 10
stalling_score_estimate?: StallingScoreEstimate
stone_font_scale: number
stone_placement_enabled: boolean
stone_removal_auto_scoring_done?: boolean = false
variation_stone_opacity: number
width: number
setCallbacks: ((newCallbacks) => void) = setGobanCallbacks

Type declaration

    • (newCallbacks): void
    • Set's callback functions to be called in various situations. You can set any or all of the callbacks, only the provided callbacks will be updated.

      -

      Parameters

      Returns void

setTranslations: ((_catalog, _debug_mode?) => void) = setGobanTranslations

Type declaration

    • (_catalog, _debug_mode?): void
    • Parameters

      Returns void

Accessors

  • get destroyed(): boolean
  • Returns boolean

  • get is_game_record(): boolean
  • True if the game is a game record of a real life game

    -

    Returns boolean

Methods

  • Decodes any of the various ways we express moves that we've accumulated over the years into +

    Parameters

    Returns void

setTranslations: ((_catalog, _debug_mode?) => void) = setGobanTranslations

Type declaration

    • (_catalog, _debug_mode?): void
    • Parameters

      Returns void

Accessors

  • get destroyed(): boolean
  • Returns boolean

  • get is_game_record(): boolean
  • True if the game is a game record of a real life game

    +

    Returns boolean

Methods

  • Decodes a move string like "A11" into a move object like {x: 0, y: 10}. Also handles the special cases like ".." and "pass" which map to {x: -1, y: -1}.

    -

    Parameters

    • coordinates: string

    Returns JGOFMove

  • Parameters

    • x: number
    • y: number
    • mark: string
    • Optional drawSquare: boolean

    Returns void

  • Parameters

    • perGameSettingAppliesToNonPlayers: boolean = false

    Returns boolean

  • Parameters

    • x: number
    • y: number
    • mark: string
    • Optional drawSquare: boolean

    Returns void

  • Parameters

    • perGameSettingAppliesToNonPlayers: boolean = false

    Returns boolean

  • Goban calls some abstract methods as part of the construction process. Because our subclasses might (and do) need to do some of their own config before these are called, we set this function to be called by our subclass after it's done it's own internal config stuff.

    -

    Returns GobanEngine

  • Parameters

    • colored_marks: {
          [key: string]: {
              color: string;
              move: string;
          };
      }
      • [key: string]: {
            color: string;
            move: string;
        }
        • color: string
        • move: string

    Returns void

  • Parameters

    • x: number
    • y: number
    • mark: string
    • Optional drawSquare: boolean

    Returns void

  • Called when a location is marked or unmarked for removal

    -

    Parameters

    • x: number
    • y: number
    • removed: boolean
    • emit_stone_removal_updated: boolean = true

    Returns void

  • Parameters

    • Optional set_override: "letters" | "numbers"

    Returns void

  • Parameters

    • x: number
    • y: number
    • mark: string
    • Optional drawSquare: boolean

    Returns void

  • Parameters

    • x: number
    • y: number
    • mark: string | number
    • Optional dont_draw: boolean

    Returns void

  • Parameters

    • coordinates: string
    • mark: string | number
    • Optional dont_draw: boolean

    Returns void

  • Parameters

    • colored_marks: {
          [key: string]: {
              color: string;
              move: string;
          };
      }
      • [key: string]: {
            color: string;
            move: string;
        }
        • color: string
        • move: string

    Returns void

  • Parameters

    • x: number
    • y: number
    • mark: string
    • Optional drawSquare: boolean

    Returns void

  • Called when a location is marked or unmarked for removal

    +

    Parameters

    • x: number
    • y: number
    • removed: boolean
    • emit_stone_removal_updated: boolean = true

    Returns void

  • Parameters

    • Optional set_override: "letters" | "numbers"

    Returns void

  • Parameters

    • x: number
    • y: number
    • mark: string
    • Optional drawSquare: boolean

    Returns void

  • Parameters

    • x: number
    • y: number
    • mark: string | number
    • Optional dont_draw: boolean

    Returns void

  • Parameters

    • coordinates: string
    • mark: string | number
    • Optional dont_draw: boolean

    Returns void

  • This is a callback that gets called by GobanEngine.getState to save and board state as it pushes and pops state. Our renderers can override this to save state they need.

    -

    Parameters

    • marks: {
          [mark: string]: string;
      }
      • [mark: string]: string
    • Optional dont_draw: boolean

    Returns void

  • Parameters

    • x: number
    • y: number
    • mark: string
    • drawSquare: boolean = true

    Returns void

  • Parameters

    • Optional dont_jump_to_official_move: boolean

    Returns boolean

  • Parameters

    • x: number
    • y: number
    • mark: string | number
    • Optional dont_draw: boolean

    Returns void

  • Parameters

    • msg_id: MessageID
    • Optional parameters: {
          [key: string]: any;
      }
      • [key: string]: any
    • Optional timeout: number

    Returns void

  • Parameters

    • x: number
    • y: number
    • mark: string | number
    • Optional force_label: boolean
    • Optional force_put: boolean

    Returns boolean

  • Parameters

    • x: number
    • y: number
    • anti_slip: boolean = true

    Returns {
        i: number;
        j: number;
        valid: boolean;
    }

    • i: number
    • j: number
    • valid: boolean
\ No newline at end of file +

Parameters

Returns void

\ No newline at end of file diff --git a/docs/classes/GobanMoveError.html b/docs/classes/GobanMoveError.html index 589c2607..b3356bcf 100644 --- a/docs/classes/GobanMoveError.html +++ b/docs/classes/GobanMoveError.html @@ -1,6 +1,6 @@ -GobanMoveError | goban

Class GobanMoveError

Hierarchy (view full)

Constructors

constructor +GobanMoveError | goban

Class GobanMoveError

Hierarchy (view full)

Constructors

Properties

coords: string
game_id: number
move_number: number
\ No newline at end of file +

Constructors

Properties

coords: string
game_id: number
move_number: number
\ No newline at end of file diff --git a/docs/classes/GobanSocket.html b/docs/classes/GobanSocket.html index 27f288b5..2d6f2b93 100644 --- a/docs/classes/GobanSocket.html +++ b/docs/classes/GobanSocket.html @@ -8,7 +8,7 @@
  • Optional promise support for sends
  • Latency tracking (doubling as keep alive)
  • -

    Type Parameters

    Hierarchy

    Constructors

    Type Parameters

    Hierarchy

    Constructors

    Properties

    authentication?: DataArgument<SendProtocol["authenticate"]>
    callbacks: Map<number, ((data?, error?) => void)> = ...

    Type declaration

      • (data?, error?): void
      • Parameters

        Returns void

    clock_drift: number = 0.0
    current_ping_interval: number
    last_request_id: number = 0
    latency: number = 0.0
    manually_disconnected: boolean = false
    ping_timer?: Timeout
    promises_in_flight: Map<number, {
        args: any[];
        command: string;
        reject: ((...args) => void);
        resolve: ((...args) => void);
    }> = ...

    Type declaration

    • args: any[]
    • command: string
    • reject: ((...args) => void)
        • (...args): void
        • Parameters

          • Rest ...args: any[]

          Returns void

    • resolve: ((...args) => void)
        • (...args): void
        • Parameters

          • Rest ...args: any[]

          Returns void

    reconnect_tries: number = 0
    reconnecting: boolean = false
    send_queue: (() => void)[] = []

    Type declaration

      • (): void
      • Returns void

    socket: WebSocket
    timeout_timer?: Timeout
    url: string

    Accessors

    Methods

    \ No newline at end of file +

    Constructors

    Properties

    authentication?: DataArgument<SendProtocol["authenticate"]>
    callbacks: Map<number, ((data?, error?) => void)> = ...

    Type declaration

      • (data?, error?): void
      • Parameters

        Returns void

    clock_drift: number = 0.0
    current_ping_interval: number
    last_request_id: number = 0
    latency: number = 0.0
    manually_disconnected: boolean = false
    ping_timer?: Timeout
    promises_in_flight: Map<number, {
        args: any[];
        command: string;
        reject: ((...args) => void);
        resolve: ((...args) => void);
    }> = ...

    Type declaration

    • args: any[]
    • command: string
    • reject: ((...args) => void)
        • (...args): void
        • Parameters

          • Rest ...args: any[]

          Returns void

    • resolve: ((...args) => void)
        • (...args): void
        • Parameters

          • Rest ...args: any[]

          Returns void

    reconnect_tries: number = 0
    reconnecting: boolean = false
    send_queue: (() => void)[] = []

    Type declaration

      • (): void
      • Returns void

    socket: WebSocket
    timeout_timer?: Timeout
    url: string

    Accessors

    Methods

    \ No newline at end of file diff --git a/docs/classes/GobanTheme.html b/docs/classes/GobanTheme.html index 2c37bcf0..808cc67a 100644 --- a/docs/classes/GobanTheme.html +++ b/docs/classes/GobanTheme.html @@ -1,4 +1,4 @@ -GobanTheme | goban

    Class GobanTheme

    Constructors

    constructor +GobanTheme | goban

    Class GobanTheme

    Constructors

    Properties

    Constructors

    Properties

    name: string
    parent?: GobanTheme
    styles: {
        [style_name: string]: string;
    } = {}

    Type declaration

    • [style_name: string]: string

    Accessors

    Methods

    • Parameters

      • ctx: CanvasRenderingContext2D
      • _shadow_ctx: null | CanvasRenderingContext2D
      • _stone: any
      • cx: number
      • cy: number
      • radius: number

      Returns void

    • Parameters

      • cell: SVGGraphicsElement
      • shadow_cell: undefined | SVGGraphicsElement
      • stone: string
      • cx: number
      • cy: number
      • radius: number

      Returns [SVGElement, undefined | SVGElement]

    • Parameters

      • cell: SVGGraphicsElement
      • shadow_cell: undefined | SVGGraphicsElement
      • stone: string
      • cx: number
      • cy: number
      • radius: number
      • shadow_circle_color: string

      Returns [SVGElement, undefined | SVGElement]

    • Parameters

      • shadow_cell: undefined | SVGGraphicsElement
      • cx: number
      • cy: number
      • radius: number
      • color: string

      Returns undefined | SVGElement

    • Parameters

      • ctx: CanvasRenderingContext2D
      • _shadow_ctx: null | CanvasRenderingContext2D
      • _stone: any
      • cx: number
      • cy: number
      • radius: number

      Returns void

    • Parameters

      • cell: SVGGraphicsElement
      • shadow_cell: undefined | SVGGraphicsElement
      • stone: string
      • cx: number
      • cy: number
      • radius: number

      Returns [SVGElement, undefined | SVGElement]

    • Parameters

      • _radius: number
      • _seed: number
      • _deferredRenderCallback: (() => void)
          • (): void
          • Returns void

      Returns any

    • Parameters

      • defs: SVGDefsElement
      • radius: number
      • _seed: number
      • _deferredRenderCallback: (() => void)
          • (): void
          • Returns void

      Returns string[]

    • Parameters

      • _radius: number
      • _seed: number
      • _deferredRenderCallback: (() => void)
          • (): void
          • Returns void

      Returns any

    • Parameters

      • defs: SVGDefsElement
      • radius: number
      • _seed: number
      • _deferredRenderCallback: (() => void)
          • (): void
          • Returns void

      Returns string[]

    \ No newline at end of file +

    Constructors

    Properties

    name: string
    parent?: GobanTheme
    styles: {
        [style_name: string]: string;
    } = {}

    Type declaration

    • [style_name: string]: string

    Accessors

    Methods

    • Parameters

      • ctx: CanvasRenderingContext2D
      • _shadow_ctx: null | CanvasRenderingContext2D
      • _stone: any
      • cx: number
      • cy: number
      • radius: number

      Returns void

    • Parameters

      • cell: SVGGraphicsElement
      • shadow_cell: undefined | SVGGraphicsElement
      • stone: string
      • cx: number
      • cy: number
      • radius: number

      Returns [SVGElement, undefined | SVGElement]

    • Parameters

      • cell: SVGGraphicsElement
      • shadow_cell: undefined | SVGGraphicsElement
      • stone: string
      • cx: number
      • cy: number
      • radius: number
      • shadow_circle_color: string

      Returns [SVGElement, undefined | SVGElement]

    • Parameters

      • shadow_cell: undefined | SVGGraphicsElement
      • cx: number
      • cy: number
      • radius: number
      • color: string

      Returns undefined | SVGElement

    • Parameters

      • ctx: CanvasRenderingContext2D
      • _shadow_ctx: null | CanvasRenderingContext2D
      • _stone: any
      • cx: number
      • cy: number
      • radius: number

      Returns void

    • Parameters

      • cell: SVGGraphicsElement
      • shadow_cell: undefined | SVGGraphicsElement
      • stone: string
      • cx: number
      • cy: number
      • radius: number

      Returns [SVGElement, undefined | SVGElement]

    • Parameters

      • _radius: number
      • _seed: number
      • _deferredRenderCallback: (() => void)
          • (): void
          • Returns void

      Returns any

    • Parameters

      • defs: SVGDefsElement
      • radius: number
      • _seed: number
      • _deferredRenderCallback: (() => void)
          • (): void
          • Returns void

      Returns string[]

    • Parameters

      • _radius: number
      • _seed: number
      • _deferredRenderCallback: (() => void)
          • (): void
          • Returns void

      Returns any

    • Parameters

      • defs: SVGDefsElement
      • radius: number
      • _seed: number
      • _deferredRenderCallback: (() => void)
          • (): void
          • Returns void

      Returns string[]

    \ No newline at end of file diff --git a/docs/classes/MoveTree.html b/docs/classes/MoveTree.html index 4b0b2eaa..f734f789 100644 --- a/docs/classes/MoveTree.html +++ b/docs/classes/MoveTree.html @@ -1,4 +1,4 @@ -MoveTree | goban

    Class MoveTree

    Constructors

    constructor +MoveTree | goban

    Class MoveTree

    Constructors

    Properties

    active_path_number: number = 0
    branches: MoveTree[]
    chat_log?: MoveTreeChatLine[]
    correct_answer: boolean = false
    edited: boolean
    engine: GobanEngine
    hint_next?: MoveTree
    id: number
    isobranch_hash?: string
    isobranches: any
    label: string = "[unset]"
    label_metrics?: any
    layout_cx: number = 0
    layout_cy: number = 0
    layout_x: number = 0
    layout_y: number = 0
    line_color: number
    marks?: MarkInterface[][]
    move_number: number
    parent: null | MoveTree
    pen_marks: MoveTreePenMarks = []
    played_by: undefined | number
    player_update: undefined | JGOFPlayerSummary
    pretty_coordinates: string
    stashed_marks: MarkInterface[][][] = []
    text: string
    trunk: boolean
    trunk_next?: MoveTree
    wrong_answer: boolean = false
    x: number
    y: number
    active_path_number: number = 0

    ** Layout & Rendering ***

    -
    current_line_color: number = 0
    isobranch_colors: {
        strong: string;
        weak: string;
    } = ...

    Type declaration

    • strong: string
    • weak: string
    line_colors: string[] = ...
    stone_padding: 3 = 3
    stone_radius: 11 = 11
    stone_square_size: number = ...

    Accessors

    • get stoneColor(): "black" | "white" | "empty"
    • Returns "black" | "white" | "empty"

    Methods

    • Calls a callback for each positions that has a mark on it

      -

      Parameters

      • fn: ((i, j) => void)
          • (i, j): void
          • Parameters

            • i: number
            • j: number

            Returns void

      Returns void

    • Returns true if there are any marks that have been set

      -

      Returns boolean

    • Parameters

      • x: number
      • min_y: number
      • layout_hash: {
            [coords: string]: MoveTree;
        }
      • line_color: number

      Returns number

    • Loads the state of this MoveTree node from a MoveTreeJson object

      -

      Parameters

      Returns void

    • Recomputes the isobranches for the entire tree. This needs to be called on the root node.

      -

      Returns void

    • Saves the current marks in our stash, restore them with popMarks

      -

      Returns void

    \ No newline at end of file +

    Constructors

    Properties

    active_path_number: number = 0
    branches: MoveTree[]
    chat_log?: MoveTreeChatLine[]
    correct_answer: boolean = false
    edited: boolean
    engine: GobanEngine
    hint_next?: MoveTree
    id: number
    isobranch_hash?: string
    isobranches: any
    label: string = "[unset]"
    label_metrics?: any
    layout_cx: number = 0
    layout_cy: number = 0
    layout_x: number = 0
    layout_y: number = 0
    line_color: number
    marks?: MarkInterface[][]
    move_number: number
    parent: null | MoveTree
    pen_marks: MoveTreePenMarks = []
    played_by: undefined | number
    player_update: undefined | JGOFPlayerSummary
    pretty_coordinates: string
    stashed_marks: MarkInterface[][][] = []
    text: string
    trunk: boolean
    trunk_next?: MoveTree
    wrong_answer: boolean = false
    x: number
    y: number
    active_path_number: number = 0

    ** Layout & Rendering ***

    +
    current_line_color: number = 0
    isobranch_colors: {
        strong: string;
        weak: string;
    } = ...

    Type declaration

    • strong: string
    • weak: string
    line_colors: string[] = ...
    stone_padding: 3 = 3
    stone_radius: 11 = 11
    stone_square_size: number = ...

    Accessors

    • get stoneColor(): "black" | "white" | "empty"
    • Returns "black" | "white" | "empty"

    Methods

    • Calls a callback for each positions that has a mark on it

      +

      Parameters

      • fn: ((i, j) => void)
          • (i, j): void
          • Parameters

            • i: number
            • j: number

            Returns void

      Returns void

    • Returns true if there are any marks that have been set

      +

      Returns boolean

    • Parameters

      • x: number
      • min_y: number
      • layout_hash: {
            [coords: string]: MoveTree;
        }
      • line_color: number

      Returns number

    • Loads the state of this MoveTree node from a MoveTreeJson object

      +

      Parameters

      Returns void

    • Recomputes the isobranches for the entire tree. This needs to be called on the root node.

      +

      Returns void

    • Saves the current marks in our stash, restore them with popMarks

      +

      Returns void

    \ No newline at end of file diff --git a/docs/classes/SVGRenderer.html b/docs/classes/SVGRenderer.html index baadd699..8a2caae1 100644 --- a/docs/classes/SVGRenderer.html +++ b/docs/classes/SVGRenderer.html @@ -2,7 +2,7 @@ classes, types, and enums.

    You can't create an instance of a Goban directly, you have to create an instance of one of the renderers, such as GobanSVG.

    -

    Hierarchy (view full)

    Implements

    Constructors

    Hierarchy (view full)

    Implements

    Constructors

    Properties

    __board_redraw_pen_layer_timer: any = null
    __clock_timer?: Timeout
    __draw_state: string[][]
    __last_pt: {
        i: number;
        j: number;
        valid: boolean;
    } = ...

    Type declaration

    • i: number
    • j: number
    • valid: boolean
    __set_board_height: number = -1
    __set_board_width: number = -1
    __update_move_tree: any = null
    analysis_move_counter: number
    analysis_removal_last_position: {
        i: number;
        j: number;
    } = ...

    Type declaration

    • i: number
    • j: number
    analysis_removal_state?: boolean
    autoplaying_puzzle_move: boolean = false
    bounded_height: number
    bounded_width: number
    bounds: GobanBounds
    byoyomi_label: string = ""
    cells: GCell[][] = []
    chat_log: GobanChatLog = []
    circle_radius: number
    clock_should_be_paused_for_move_submission: boolean = false
    colored_circles?: (undefined | ColoredCircle)[][]
    conditional_path: string = ""
    conditional_starting_color: "black" | "white" | "invalid" = "invalid"
    conditional_tree: ConditionalMoveTree = ...
    config: GobanConfig
    connectToReviewSent?: boolean
    coordinate_labels_layer?: SVGGraphicsElement
    current_cmove?: ConditionalMoveTree
    current_pen_mark?: {
        color: string;
        points: [number, number];
    }

    Type declaration

    • color: string
    • points: [number, number]
    currently_my_cmove: boolean = false
    dirty_redraw: any = null
    disconnectedFromGame: boolean = true
    display_width?: number
    done_loading_review: boolean = false
    dont_draw_last_move: boolean
    double_click_submit: boolean
    draw_bottom_labels: boolean
    draw_left_labels: boolean
    draw_right_labels: boolean
    draw_top_labels: boolean
    drawing_enabled: boolean = true
    edit_color?: "black" | "white"
    engine: GobanEngine
    errorHandler: ((e) => void)

    Type declaration

      • (e): void
      • Parameters

        • e: Error

        Returns void

    event_layer?: HTMLDivElement
    game_id: number
    game_type: string
    getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting)
    goban_id: number = ++last_goban_id

    Base fields *

    -
    grid: SVGGraphicsElement[][] = []
    grid_layer?: SVGGraphicsElement
    handleShiftKey: ((ev) => void)

    Type declaration

      • (ev): void
      • Parameters

        • ev: KeyboardEvent

        Returns void

    heatmap?: NumberMatrix
    height: number
    highlight_movetree_moves: boolean
    interactive: boolean
    isInPushedAnalysis: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerController: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerOwner: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    label_character: string
    label_mark: string = "[UNSET]"
    labeling_mode?: "put" | "clear"
    last_clock?: AdHocClock
    last_emitted_clock?: JGOFClockWithTransmitting
    last_hover_square?: JGOFIntersection
    last_label_position: {
        i: number;
        j: number;
    } = ...

    Type declaration

    • i: number
    • j: number
    last_move?: MoveTree
    last_move_opacity: number = 1
    last_move_radius: number
    last_paused_by_player_state: null | boolean = null
    last_paused_state: null | boolean = null
    last_pen_position?: [number, number]
    last_phase?: GobanEnginePhase
    last_review_message: ReviewMessage
    last_sound_played_for_a_stone_placement?: string
    last_stone_sound: number
    leavePushedAnalysis: (() => void)

    Type declaration

      • (): void
      • Returns void

    lines_layer?: SVGGraphicsElement
    marked_analysis_score?: boolean[][]
    message_div?: HTMLDivElement
    message_td?: HTMLElement
    message_text?: HTMLDivElement
    message_timeout?: number
    metrics: GobanMetrics = ...
    move_selected?: JGOFIntersection
    move_tree_container?: HTMLElement
    move_tree_inner_container?: HTMLDivElement
    move_tree_svg?: SVGElement
    move_tree_svg_defs?: SVGDefsElement
    no_display: boolean
    onError?: ((error) => void)

    Type declaration

      • (error): void
      • Parameters

        • error: Error

        Returns void

    on_game_screen: boolean
    one_click_submit: boolean
    original_square_size: number | ((goban) => number) | "auto"

    Type declaration

      • (goban): number
      • Parameters

        Returns number

    parent: HTMLElement
    pause_control?: AdHocPauseControl
    paused_since?: number
    pen_layer?: SVGGraphicsElement
    pen_marks: any[]
    player_id: number
    preloaded_data?: GobanConfig
    previous_mode: string
    puzzle_autoplace_delay: number
    ready_to_draw: boolean = false
    restrict_moves_to_movetree: boolean
    review_had_gamedata: boolean
    review_id: number
    scoring_mode: boolean | "stalling-scoring-mode"
    sendLatencyTimer?: Timeout
    sent_timed_out_message: boolean = false
    shadow_grid: (undefined | SVGElement)[][] = []
    shadow_layer?: SVGGraphicsElement
    shift_key_is_down: boolean
    show_variation_move_numbers: boolean
    showing_scores: boolean = false
    socket_event_bindings: [keyof GobanSocketEvents, (() => void)][] = []
    square_size: number = 10
    stalling_score_estimate?: StallingScoreEstimate
    stone_font_scale: number
    stone_placement_enabled: boolean
    stone_removal_auto_scoring_done?: boolean = false
    svg: SVGElement
    svg_defs: SVGDefsElement
    theme_black: GobanTheme
    theme_black_stones: any[] = []
    theme_black_text_color: string = HOT_PINK
    theme_blank_text_color: string = HOT_PINK
    theme_board: GobanTheme
    theme_faded_line_color: string = HOT_PINK
    theme_faded_star_color: string = HOT_PINK
    theme_line_color: string = ""
    theme_star_color: string = ""
    theme_stone_radius: number = 10
    theme_white: GobanTheme
    theme_white_stones: any[] = []
    theme_white_text_color: string = HOT_PINK
    themes: GobanSelectedThemes = ...
    title_div?: HTMLElement
    variation_stone_opacity: number
    width: number
    THEMES: ThemesInterface = THEMES
    THEMES_SORTED: {
        black: GobanTheme[];
        board: GobanTheme[];
        white: GobanTheme[];
        [key: string]: GobanTheme[];
    } = THEMES_SORTED

    Type declaration

    setCallbacks: ((newCallbacks) => void) = setGobanCallbacks

    Type declaration

      • (newCallbacks): void
      • Set's callback functions to be called in various situations. You can set any +

    Constructors

    Properties

    __board_redraw_pen_layer_timer: any = null
    __clock_timer?: Timeout
    __draw_state: string[][]
    __last_pt: {
        i: number;
        j: number;
        valid: boolean;
    } = ...

    Type declaration

    • i: number
    • j: number
    • valid: boolean
    __set_board_height: number = -1
    __set_board_width: number = -1
    __update_move_tree: any = null
    analysis_move_counter: number
    analysis_removal_last_position: {
        i: number;
        j: number;
    } = ...

    Type declaration

    • i: number
    • j: number
    analysis_removal_state?: boolean
    autoplaying_puzzle_move: boolean = false
    bounded_height: number
    bounded_width: number
    bounds: GobanBounds
    byoyomi_label: string = ""
    cells: GCell[][] = []
    chat_log: GobanChatLog = []
    circle_radius: number
    clock_should_be_paused_for_move_submission: boolean = false
    colored_circles?: (undefined | ColoredCircle)[][]
    conditional_path: string = ""
    conditional_starting_color: "black" | "white" | "invalid" = "invalid"
    conditional_tree: ConditionalMoveTree = ...
    config: GobanConfig
    connectToReviewSent?: boolean
    coordinate_labels_layer?: SVGGraphicsElement
    current_cmove?: ConditionalMoveTree
    current_pen_mark?: {
        color: string;
        points: [number, number];
    }

    Type declaration

    • color: string
    • points: [number, number]
    currently_my_cmove: boolean = false
    dirty_redraw: any = null
    disconnectedFromGame: boolean = true
    display_width?: number
    done_loading_review: boolean = false
    dont_draw_last_move: boolean
    double_click_submit: boolean
    draw_bottom_labels: boolean
    draw_left_labels: boolean
    draw_right_labels: boolean
    draw_top_labels: boolean
    drawing_enabled: boolean = true
    edit_color?: "black" | "white"
    engine: GobanEngine
    errorHandler: ((e) => void)

    Type declaration

      • (e): void
      • Parameters

        • e: Error

        Returns void

    event_layer?: HTMLDivElement
    game_id: number
    game_type: string
    getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting)
    goban_id: number = ++last_goban_id

    Base fields *

    +
    grid: SVGGraphicsElement[][] = []
    grid_layer?: SVGGraphicsElement
    handleShiftKey: ((ev) => void)

    Type declaration

      • (ev): void
      • Parameters

        • ev: KeyboardEvent

        Returns void

    heatmap?: NumberMatrix
    height: number
    highlight_movetree_moves: boolean
    interactive: boolean
    isInPushedAnalysis: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerController: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerOwner: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    label_character: string
    label_mark: string = "[UNSET]"
    labeling_mode?: "put" | "clear"
    last_clock?: AdHocClock
    last_emitted_clock?: JGOFClockWithTransmitting
    last_hover_square?: JGOFIntersection
    last_label_position: {
        i: number;
        j: number;
    } = ...

    Type declaration

    • i: number
    • j: number
    last_move?: MoveTree
    last_move_opacity: number = 1
    last_move_radius: number
    last_paused_by_player_state: null | boolean = null
    last_paused_state: null | boolean = null
    last_pen_position?: [number, number]
    last_phase?: GobanEnginePhase
    last_review_message: ReviewMessage
    last_sound_played_for_a_stone_placement?: string
    last_stone_sound: number
    leavePushedAnalysis: (() => void)

    Type declaration

      • (): void
      • Returns void

    lines_layer?: SVGGraphicsElement
    marked_analysis_score?: boolean[][]
    message_div?: HTMLDivElement
    message_td?: HTMLElement
    message_text?: HTMLDivElement
    message_timeout?: number
    metrics: GobanMetrics = ...
    move_selected?: JGOFIntersection
    move_tree_container?: HTMLElement
    move_tree_inner_container?: HTMLDivElement
    move_tree_svg?: SVGElement
    move_tree_svg_defs?: SVGDefsElement
    no_display: boolean
    onError?: ((error) => void)

    Type declaration

      • (error): void
      • Parameters

        • error: Error

        Returns void

    on_game_screen: boolean
    one_click_submit: boolean
    original_square_size: number | ((goban) => number) | "auto"

    Type declaration

      • (goban): number
      • Parameters

        Returns number

    parent: HTMLElement
    pause_control?: AdHocPauseControl
    paused_since?: number
    pen_layer?: SVGGraphicsElement
    pen_marks: any[]
    player_id: number
    preloaded_data?: GobanConfig
    previous_mode: string
    puzzle_autoplace_delay: number
    ready_to_draw: boolean = false
    restrict_moves_to_movetree: boolean
    review_had_gamedata: boolean
    review_id: number
    scoring_mode: boolean | "stalling-scoring-mode"
    sendLatencyTimer?: Timeout
    sent_timed_out_message: boolean = false
    shadow_grid: (undefined | SVGElement)[][] = []
    shadow_layer?: SVGGraphicsElement
    shift_key_is_down: boolean
    show_variation_move_numbers: boolean
    showing_scores: boolean = false
    socket_event_bindings: [keyof GobanSocketEvents, (() => void)][] = []
    square_size: number = 10
    stalling_score_estimate?: StallingScoreEstimate
    stone_font_scale: number
    stone_placement_enabled: boolean
    stone_removal_auto_scoring_done?: boolean = false
    svg: SVGElement
    svg_defs: SVGDefsElement
    theme_black: GobanTheme
    theme_black_stones: any[] = []
    theme_black_text_color: string = HOT_PINK
    theme_blank_text_color: string = HOT_PINK
    theme_board: GobanTheme
    theme_faded_line_color: string = HOT_PINK
    theme_faded_star_color: string = HOT_PINK
    theme_line_color: string = ""
    theme_star_color: string = ""
    theme_stone_radius: number = 10
    theme_white: GobanTheme
    theme_white_stones: any[] = []
    theme_white_text_color: string = HOT_PINK
    themes: GobanSelectedThemes = ...
    title_div?: HTMLElement
    variation_stone_opacity: number
    width: number
    THEMES: ThemesInterface = THEMES
    THEMES_SORTED: {
        black: GobanTheme[];
        board: GobanTheme[];
        white: GobanTheme[];
        [key: string]: GobanTheme[];
    } = THEMES_SORTED

    Type declaration

    setCallbacks: ((newCallbacks) => void) = setGobanCallbacks

    Type declaration

      • (newCallbacks): void
      • Set's callback functions to be called in various situations. You can set any or all of the callbacks, only the provided callbacks will be updated.

        -

        Parameters

        Returns void

    setTranslations: ((_catalog, _debug_mode?) => void) = setGobanTranslations

    Type declaration

      • (_catalog, _debug_mode?): void
      • Parameters

        Returns void

    Accessors

    • get analyze_subtool(): string
    • Returns string

    • set analyze_subtool(analyze_subtool): void
    • Parameters

      • analyze_subtool: string

      Returns void

    • get destroyed(): boolean
    • Returns boolean

    • get is_game_record(): boolean
    • True if the game is a game record of a real life game

      -

      Returns boolean

    • get review_controller_id(): undefined | number
    • Returns undefined | number

    • set review_controller_id(review_controller_id): void
    • Parameters

      • review_controller_id: undefined | number

      Returns void

    • get review_owner_id(): undefined | number
    • Returns undefined | number

    • set review_owner_id(review_owner_id): void
    • Parameters

      • review_owner_id: undefined | number

      Returns void

    • get submit_move(): undefined | (() => void)
    • Returns undefined | (() => void)

    • set submit_move(submit_move): void
    • Parameters

      • submit_move: undefined | (() => void)

      Returns void

    Methods

    • Decodes any of the various ways we express moves that we've accumulated over the years into +

      Parameters

      Returns void

    setTranslations: ((_catalog, _debug_mode?) => void) = setGobanTranslations

    Type declaration

      • (_catalog, _debug_mode?): void
      • Parameters

        Returns void

    Accessors

    • get analyze_subtool(): string
    • Returns string

    • set analyze_subtool(analyze_subtool): void
    • Parameters

      • analyze_subtool: string

      Returns void

    • get destroyed(): boolean
    • Returns boolean

    • get is_game_record(): boolean
    • True if the game is a game record of a real life game

      +

      Returns boolean

    • get review_controller_id(): undefined | number
    • Returns undefined | number

    • set review_controller_id(review_controller_id): void
    • Parameters

      • review_controller_id: undefined | number

      Returns void

    • get review_owner_id(): undefined | number
    • Returns undefined | number

    • set review_owner_id(review_owner_id): void
    • Parameters

      • review_owner_id: undefined | number

      Returns void

    • get submit_move(): undefined | (() => void)
    • Returns undefined | (() => void)

    • set submit_move(submit_move): void
    • Parameters

      • submit_move: undefined | (() => void)

      Returns void

    Methods

    • Decodes a move string like "A11" into a move object like {x: 0, y: 10}. Also handles the special cases like ".." and "pass" which map to {x: -1, y: -1}.

      -

      Parameters

      • coordinates: string

      Returns JGOFMove

    • Parameters

      • Optional force_clear: boolean

      Returns void

    • Parameters

      • Optional force_clear: boolean

      Returns void

    • Marks scores on the board when in analysis mode. Note: this will not clear existing scores, this is intentional as I think it's the expected behavior of reviewers

      -

      Returns void

    • Parameters

      • event: TouchEvent | MouseEvent
      • double_tap: boolean
      • right_click: boolean
      • press_duration_ms: number

      Returns void

    • Parameters

      • event: TouchEvent | MouseEvent
      • double_tap: boolean
      • right_click: boolean
      • press_duration_ms: number

      Returns void

    • Goban calls some abstract methods as part of the construction process. Because our subclasses might (and do) need to do some of their own config before these are called, we set this function to be called by our subclass after it's done it's own internal config stuff.

      -

      Returns GobanEngine

    • When we think our clock has runout, send a message to the server letting it know. Otherwise we have to wait for the server grace period to expire for it to time us out.

      -

      Returns void

    • Parameters

      • colored_marks: {
            [key: string]: {
                color: string;
                move: string;
            };
        }
        • [key: string]: {
              color: string;
              move: string;
          }
          • color: string
          • move: string

      Returns void

    • Called when a location is marked or unmarked for removal

      -

      Parameters

      • x: number
      • y: number
      • removed: boolean
      • emit_stone_removal_updated: boolean = true

      Returns void

    • Parameters

      • colored_marks: {
            [key: string]: {
                color: string;
                move: string;
            };
        }
        • [key: string]: {
              color: string;
              move: string;
          }
          • color: string
          • move: string

      Returns void

    • Called when a location is marked or unmarked for removal

      +

      Parameters

      • x: number
      • y: number
      • removed: boolean
      • emit_stone_removal_updated: boolean = true

      Returns void

    • This is a callback that gets called by GobanEngine.getState to save and board state as it pushes and pops state. Our renderers can override this to save state they need.

      -

      Parameters

      • marks: {
            [mark: string]: string;
        }
        • [mark: string]: string
      • Optional dont_draw: boolean

      Returns void

    • This is a callback that gets called by GobanEngine.setState to load +

      Parameters

      • marks: {
            [mark: string]: string;
        }
        • [mark: string]: string
      • Optional dont_draw: boolean

      Returns void

    • Parameters

      • x: number
      • y: number
      • mark: string | number
      • Optional force_label: boolean
      • Optional force_put: boolean

      Returns boolean

    • Parameters

      Returns {
          remove: (() => any);
      }

      • remove: (() => any)
          • (): any
          • Returns any

    • Parameters

      • x: number
      • y: number
      • anti_slip: boolean = true

      Returns {
          i: number;
          j: number;
          valid: boolean;
      }

      • i: number
      • j: number
      • valid: boolean
    \ No newline at end of file +

    Returns void

    \ No newline at end of file diff --git a/docs/classes/ScoreEstimator.html b/docs/classes/ScoreEstimator.html index 015c99c0..bf7b94ed 100644 --- a/docs/classes/ScoreEstimator.html +++ b/docs/classes/ScoreEstimator.html @@ -1,4 +1,4 @@ -ScoreEstimator | goban

    Class ScoreEstimator

    Hierarchy (view full)

    Constructors

    constructor +ScoreEstimator | goban

    Class ScoreEstimator

    Hierarchy (view full)

    Constructors

    Properties

    amount: number = NaN
    autoscore: boolean = false
    autoscored_needs_sealing?: JGOFSealingIntersection[]
    autoscored_removed?: JGOFMove[]
    autoscored_state?: JGOFNumericPlayerColor[][]
    black: PlayerScore = ...
    black_prisoners: number
    board_is_repeating: boolean
    color_to_move: "black" | "white"
    engine: GobanEngine
    estimated_hard_score: number
    goban_callback?: GobanBase
    height: number = 19
    ownership: number[][]
    prefer_remote: boolean
    removal: boolean[][]
    territory: number[][]
    tolerance: number
    trials: number
    when_ready: Promise<void>
    white: PlayerScore = ...
    white_prisoners: number
    width: number = 19
    winner: string = ""

    Methods

    • Computes scoring locations for the board. If area_scoring is true, we +

    Constructors

    Properties

    amount: number = NaN
    autoscore: boolean = false
    autoscored_needs_sealing?: JGOFSealingIntersection[]
    autoscored_removed?: JGOFMove[]
    autoscored_state?: JGOFNumericPlayerColor[][]
    black: PlayerScore = ...
    black_prisoners: number
    board_is_repeating: boolean
    color_to_move: "black" | "white"
    engine: GobanEngine
    estimated_hard_score: number
    goban_callback?: GobanBase
    height: number = 19
    ownership: number[][]
    prefer_remote: boolean
    removal: boolean[][]
    territory: number[][]
    tolerance: number
    trials: number
    when_ready: Promise<void>
    white: PlayerScore = ...
    white_prisoners: number
    width: number = 19
    winner: string = ""

    Methods

    • Parameters

      • trials: number
      • tolerance: number
      • autoscore: boolean

      Returns Promise<void>

    • Parameters

      • trials: number
      • tolerance: number

      Returns Promise<void>

    • Parameters

      • trials: number
      • tolerance: number
      • autoscore: boolean

      Returns Promise<void>

    • Parameters

      • trials: number
      • tolerance: number

      Returns Promise<void>

    • Parameters

      • i: number
      • j: number
      • mod_key: boolean
      • press_duration_ms: number

      Returns void

    • Parameters

      • i: number
      • j: number
      • mod_key: boolean
      • press_duration_ms: number

      Returns void

    • Sets a position as being removed or not removed. If emit_stone_removal_updated is set to false, the "stone-removal.updated" event will not be emitted, and it is up to the caller to emit this event appropriately.

      -

      Parameters

      • x: number
      • y: number
      • removed: boolean

      Returns void

    • Toggles a group of stones for removal or restoration.

      By default, if we are marking a group for removal but the group is almost certainly alive (two eyes, etc), this will result in a no-op, unless force_removal is set to true.

      -

      Parameters

      • x: number
      • y: number
      • force_removal: boolean = false

      Returns {
          group: RawStoneString;
          removed: boolean;
      }

    • Parameters

      • estimated_score: number
      • ownership: number[][]
      • Optional score: number

      Returns void

    \ No newline at end of file +

    Parameters

    Returns {
        group: RawStoneString;
        removed: boolean;
    }

    \ No newline at end of file diff --git a/docs/classes/StoneString.html b/docs/classes/StoneString.html index 71a8c2c3..d25d55c0 100644 --- a/docs/classes/StoneString.html +++ b/docs/classes/StoneString.html @@ -1,6 +1,6 @@ StoneString | goban

    Class StoneString

    A StoneString instance represents a group of intersections that are connected to each other and are all the same color.

    -

    Constructors

    Constructors

    Properties

    Constructors

    Properties

    __added_neighbors: {
        [group_id: number]: boolean;
    }

    Type declaration

    • [group_id: number]: boolean
    id: number
    intersections: JGOFIntersection[]
    is_territory: boolean = false
    neighboring_space: StoneString[]
    neighboring_stone_strings: StoneString[]
    neighbors: StoneString[]
    territory_color: JGOFNumericPlayerColor = 0

    Methods

    • Adds a stone string to our neighbor list. This should probably only be called by StoneStringBuilder.

      -

      Parameters

      Returns void

    • Add a stone to the group. This should probably only be called by StoneStringBuilder.

      -

      Parameters

      • x: number
      • y: number

      Returns void

    • Compute if this string is considered potential territory (if all of it's +

    Constructors

    Properties

    __added_neighbors: {
        [group_id: number]: boolean;
    }

    Type declaration

    • [group_id: number]: boolean
    id: number
    intersections: JGOFIntersection[]
    is_territory: boolean = false
    neighboring_space: StoneString[]
    neighboring_stone_strings: StoneString[]
    neighbors: StoneString[]
    territory_color: JGOFNumericPlayerColor = 0

    Methods

    • Adds a stone string to our neighbor list. This should probably only be called by StoneStringBuilder.

      +

      Parameters

      Returns void

    • Add a stone to the group. This should probably only be called by StoneStringBuilder.

      +

      Parameters

      • x: number
      • y: number

      Returns void

    • Compute if this string is considered potential territory (if all of it's neighbors are the same color). NOTE: This does not perform any advanced logic to determine seki status or anything like that, this only looks to see if the string contains EMPTY locations and that all of the surrounding neighboring are the same color. This should probably only be called by StoneStringBuilder.

      -

      Returns void

    • Parameters

      • fn: ((stone_string) => void)
          • (stone_string): void
          • Parameters

            Returns void

      Returns void

    • Parameters

      • fn: ((stone_string) => void)
          • (stone_string): void
          • Parameters

            Returns void

      Returns void

    • Parameters

      • fn: ((stone_string) => void)
          • (stone_string): void
          • Parameters

            Returns void

      Returns void

    \ No newline at end of file +

    Returns void

    \ No newline at end of file diff --git a/docs/classes/StoneStringBuilder.html b/docs/classes/StoneStringBuilder.html index 612467af..10a29106 100644 --- a/docs/classes/StoneStringBuilder.html +++ b/docs/classes/StoneStringBuilder.html @@ -1,7 +1,7 @@ -StoneStringBuilder | goban

    Class StoneStringBuilder

    Constructors

    constructor +StoneStringBuilder | goban

    Class StoneStringBuilder

    Constructors

    Properties

    state: BoardState
    stone_string_id_map: number[][]
    stone_strings: StoneString[]

    Methods

    \ No newline at end of file +

    Constructors

    Properties

    state: BoardState
    stone_string_id_map: number[][]
    stone_strings: StoneString[]

    Methods

    \ No newline at end of file diff --git a/docs/classes/TestGoban.html b/docs/classes/TestGoban.html index 28f86c73..faac2830 100644 --- a/docs/classes/TestGoban.html +++ b/docs/classes/TestGoban.html @@ -1,5 +1,5 @@ TestGoban | goban

    Class TestGoban

    This is a minimal implementation of Goban, primarily used for unit tests.

    -

    Hierarchy (view full)

    Constructors

    Hierarchy (view full)

    Constructors

    Properties

    __board_redraw_pen_layer_timer: any = null
    __clock_timer?: Timeout
    __draw_state: string[][]
    __last_pt: {
        i: number;
        j: number;
        valid: boolean;
    } = ...

    Type declaration

    • i: number
    • j: number
    • valid: boolean
    __update_move_tree: any = null
    analysis_move_counter: number
    analysis_removal_last_position: {
        i: number;
        j: number;
    } = ...

    Type declaration

    • i: number
    • j: number
    analysis_removal_state?: boolean
    bounded_height: number
    bounded_width: number
    bounds: GobanBounds
    chat_log: GobanChatLog = []
    circle_radius: number
    clock_should_be_paused_for_move_submission: boolean = false
    colored_circles?: (undefined | ColoredCircle)[][]
    conditional_path: string = ""
    conditional_starting_color: "black" | "white" | "invalid" = "invalid"
    conditional_tree: ConditionalMoveTree = ...
    config: GobanConfig
    connectToReviewSent?: boolean
    current_cmove?: ConditionalMoveTree
    currently_my_cmove: boolean = false
    dirty_redraw: any = null
    disconnectedFromGame: boolean = true
    display_width?: number
    done_loading_review: boolean = false
    dont_draw_last_move: boolean
    double_click_submit: boolean
    draw_bottom_labels: boolean
    draw_left_labels: boolean
    draw_right_labels: boolean
    draw_top_labels: boolean
    edit_color?: "black" | "white"
    engine: GobanEngine
    errorHandler: ((e) => void)

    Type declaration

      • (e): void
      • Parameters

        • e: Error

        Returns void

    game_id: number
    game_type: string
    getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting)
    goban_id: number = ++last_goban_id

    Base fields *

    -
    heatmap?: NumberMatrix
    height: number
    highlight_movetree_moves: boolean
    interactive: boolean
    isInPushedAnalysis: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerController: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerOwner: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    label_character: string
    label_mark: string = "[UNSET]"
    last_clock?: AdHocClock
    last_emitted_clock?: JGOFClockWithTransmitting
    last_hover_square?: JGOFIntersection
    last_move?: MoveTree
    last_move_radius: number
    last_paused_by_player_state: null | boolean = null
    last_paused_state: null | boolean = null
    last_phase?: GobanEnginePhase
    last_review_message: ReviewMessage
    last_sound_played_for_a_stone_placement?: string
    last_stone_sound: number
    leavePushedAnalysis: (() => void)

    Type declaration

      • (): void
      • Returns void

    marked_analysis_score?: boolean[][]
    move_selected?: JGOFIntersection
    no_display: boolean
    onError?: ((error) => void)

    Type declaration

      • (error): void
      • Parameters

        • error: Error

        Returns void

    on_game_screen: boolean
    one_click_submit: boolean
    original_square_size: number | ((goban) => number) | "auto"

    Type declaration

      • (goban): number
      • Parameters

        Returns number

    parent: HTMLElement
    pause_control?: AdHocPauseControl
    paused_since?: number
    pen_marks: any[]
    player_id: number
    preloaded_data?: GobanConfig
    previous_mode: string
    puzzle_autoplace_delay: number
    restrict_moves_to_movetree: boolean
    review_had_gamedata: boolean
    review_id: number
    scoring_mode: boolean | "stalling-scoring-mode"
    sendLatencyTimer?: Timeout
    sent_timed_out_message: boolean = false
    shift_key_is_down: boolean
    show_variation_move_numbers: boolean
    showing_scores: boolean = false
    socket_event_bindings: [keyof GobanSocketEvents, (() => void)][] = []
    square_size: number = 10
    stalling_score_estimate?: StallingScoreEstimate
    stone_font_scale: number
    stone_placement_enabled: boolean
    stone_removal_auto_scoring_done?: boolean = false
    variation_stone_opacity: number
    width: number
    THEMES: ThemesInterface = THEMES
    THEMES_SORTED: {
        black: GobanTheme[];
        board: GobanTheme[];
        white: GobanTheme[];
        [key: string]: GobanTheme[];
    } = THEMES_SORTED

    Type declaration

    setCallbacks: ((newCallbacks) => void) = setGobanCallbacks

    Type declaration

      • (newCallbacks): void
      • Set's callback functions to be called in various situations. You can set any +

    Constructors

    Properties

    __board_redraw_pen_layer_timer: any = null
    __clock_timer?: Timeout
    __draw_state: string[][]
    __last_pt: {
        i: number;
        j: number;
        valid: boolean;
    } = ...

    Type declaration

    • i: number
    • j: number
    • valid: boolean
    __update_move_tree: any = null
    analysis_move_counter: number
    analysis_removal_last_position: {
        i: number;
        j: number;
    } = ...

    Type declaration

    • i: number
    • j: number
    analysis_removal_state?: boolean
    bounded_height: number
    bounded_width: number
    bounds: GobanBounds
    chat_log: GobanChatLog = []
    circle_radius: number
    clock_should_be_paused_for_move_submission: boolean = false
    colored_circles?: (undefined | ColoredCircle)[][]
    conditional_path: string = ""
    conditional_starting_color: "black" | "white" | "invalid" = "invalid"
    conditional_tree: ConditionalMoveTree = ...
    config: GobanConfig
    connectToReviewSent?: boolean
    current_cmove?: ConditionalMoveTree
    currently_my_cmove: boolean = false
    dirty_redraw: any = null
    disconnectedFromGame: boolean = true
    display_width?: number
    done_loading_review: boolean = false
    dont_draw_last_move: boolean
    double_click_submit: boolean
    draw_bottom_labels: boolean
    draw_left_labels: boolean
    draw_right_labels: boolean
    draw_top_labels: boolean
    edit_color?: "black" | "white"
    engine: GobanEngine
    errorHandler: ((e) => void)

    Type declaration

      • (e): void
      • Parameters

        • e: Error

        Returns void

    game_id: number
    game_type: string
    getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting)
    goban_id: number = ++last_goban_id

    Base fields *

    +
    heatmap?: NumberMatrix
    height: number
    highlight_movetree_moves: boolean
    interactive: boolean
    isInPushedAnalysis: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerController: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerOwner: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    label_character: string
    label_mark: string = "[UNSET]"
    last_clock?: AdHocClock
    last_emitted_clock?: JGOFClockWithTransmitting
    last_hover_square?: JGOFIntersection
    last_move?: MoveTree
    last_move_radius: number
    last_paused_by_player_state: null | boolean = null
    last_paused_state: null | boolean = null
    last_phase?: GobanEnginePhase
    last_review_message: ReviewMessage
    last_sound_played_for_a_stone_placement?: string
    last_stone_sound: number
    leavePushedAnalysis: (() => void)

    Type declaration

      • (): void
      • Returns void

    marked_analysis_score?: boolean[][]
    move_selected?: JGOFIntersection
    no_display: boolean
    onError?: ((error) => void)

    Type declaration

      • (error): void
      • Parameters

        • error: Error

        Returns void

    on_game_screen: boolean
    one_click_submit: boolean
    original_square_size: number | ((goban) => number) | "auto"

    Type declaration

      • (goban): number
      • Parameters

        Returns number

    parent: HTMLElement
    pause_control?: AdHocPauseControl
    paused_since?: number
    pen_marks: any[]
    player_id: number
    preloaded_data?: GobanConfig
    previous_mode: string
    puzzle_autoplace_delay: number
    restrict_moves_to_movetree: boolean
    review_had_gamedata: boolean
    review_id: number
    scoring_mode: boolean | "stalling-scoring-mode"
    sendLatencyTimer?: Timeout
    sent_timed_out_message: boolean = false
    shift_key_is_down: boolean
    show_variation_move_numbers: boolean
    showing_scores: boolean = false
    socket_event_bindings: [keyof GobanSocketEvents, (() => void)][] = []
    square_size: number = 10
    stalling_score_estimate?: StallingScoreEstimate
    stone_font_scale: number
    stone_placement_enabled: boolean
    stone_removal_auto_scoring_done?: boolean = false
    variation_stone_opacity: number
    width: number
    THEMES: ThemesInterface = THEMES
    THEMES_SORTED: {
        black: GobanTheme[];
        board: GobanTheme[];
        white: GobanTheme[];
        [key: string]: GobanTheme[];
    } = THEMES_SORTED

    Type declaration

    setCallbacks: ((newCallbacks) => void) = setGobanCallbacks

    Type declaration

      • (newCallbacks): void
      • Set's callback functions to be called in various situations. You can set any or all of the callbacks, only the provided callbacks will be updated.

        -

        Parameters

        Returns void

    setTranslations: ((_catalog, _debug_mode?) => void) = setGobanTranslations

    Type declaration

      • (_catalog, _debug_mode?): void
      • Parameters

        Returns void

    Accessors

    • get analyze_subtool(): string
    • Returns string

    • set analyze_subtool(analyze_subtool): void
    • Parameters

      • analyze_subtool: string

      Returns void

    • get destroyed(): boolean
    • Returns boolean

    • get is_game_record(): boolean
    • True if the game is a game record of a real life game

      -

      Returns boolean

    • get review_controller_id(): undefined | number
    • Returns undefined | number

    • set review_controller_id(review_controller_id): void
    • Parameters

      • review_controller_id: undefined | number

      Returns void

    • get review_owner_id(): undefined | number
    • Returns undefined | number

    • set review_owner_id(review_owner_id): void
    • Parameters

      • review_owner_id: undefined | number

      Returns void

    • get submit_move(): undefined | (() => void)
    • Returns undefined | (() => void)

    • set submit_move(submit_move): void
    • Parameters

      • submit_move: undefined | (() => void)

      Returns void

    Methods

    • Decodes any of the various ways we express moves that we've accumulated over the years into +

      Parameters

      Returns void

    setTranslations: ((_catalog, _debug_mode?) => void) = setGobanTranslations

    Type declaration

      • (_catalog, _debug_mode?): void
      • Parameters

        Returns void

    Accessors

    • get analyze_subtool(): string
    • Returns string

    • set analyze_subtool(analyze_subtool): void
    • Parameters

      • analyze_subtool: string

      Returns void

    • get destroyed(): boolean
    • Returns boolean

    • get is_game_record(): boolean
    • True if the game is a game record of a real life game

      +

      Returns boolean

    • get review_controller_id(): undefined | number
    • Returns undefined | number

    • set review_controller_id(review_controller_id): void
    • Parameters

      • review_controller_id: undefined | number

      Returns void

    • get review_owner_id(): undefined | number
    • Returns undefined | number

    • set review_owner_id(review_owner_id): void
    • Parameters

      • review_owner_id: undefined | number

      Returns void

    • get submit_move(): undefined | (() => void)
    • Returns undefined | (() => void)

    • set submit_move(submit_move): void
    • Parameters

      • submit_move: undefined | (() => void)

      Returns void

    Methods

    • Decodes a move string like "A11" into a move object like {x: 0, y: 10}. Also handles the special cases like ".." and "pass" which map to {x: -1, y: -1}.

      -

      Parameters

      • coordinates: string

      Returns JGOFMove

    • Marks scores on the board when in analysis mode. Note: this will not clear existing scores, this is intentional as I think it's the expected behavior of reviewers

      -

      Returns void

    • Goban calls some abstract methods as part of the construction process. Because our subclasses might (and do) need to do some of their own config before these are called, we set this function to be called by our subclass after it's done it's own internal config stuff.

      -

      Returns GobanEngine

    • When we think our clock has runout, send a message to the server letting it know. Otherwise we have to wait for the server grace period to expire for it to time us out.

      -

      Returns void

    • Parameters

      • colored_marks: {
            [key: string]: {
                color: string;
                move: string;
            };
        }
        • [key: string]: {
              color: string;
              move: string;
          }
          • color: string
          • move: string

      Returns void

    • Called when a location is marked or unmarked for removal

      -

      Parameters

      • x: number
      • y: number
      • removed: boolean
      • emit_stone_removal_updated: boolean = true

      Returns void

    • Parameters

      • colored_marks: {
            [key: string]: {
                color: string;
                move: string;
            };
        }
        • [key: string]: {
              color: string;
              move: string;
          }
          • color: string
          • move: string

      Returns void

    • Called when a location is marked or unmarked for removal

      +

      Parameters

      • x: number
      • y: number
      • removed: boolean
      • emit_stone_removal_updated: boolean = true

      Returns void

    • This is a callback that gets called by GobanEngine.getState to save and board state as it pushes and pops state. Our renderers can override this to save state they need.

      -

      Parameters

      • marks: {
            [mark: string]: string;
        }
        • [mark: string]: string
      • Optional dont_draw: boolean

      Returns void

    • This is a callback that gets called by GobanEngine.setState to load +

      Parameters

      • marks: {
            [mark: string]: string;
        }
        • [mark: string]: string
      • Optional dont_draw: boolean

      Returns void

    • Parameters

      • msg_id: MessageID
      • Optional parameters: {
            [key: string]: any;
        }
        • [key: string]: any
      • Optional timeout: number

      Returns void

    • Parameters

      • x: number
      • y: number
      • mark: string | number
      • Optional force_label: boolean
      • Optional force_put: boolean

      Returns boolean

    • Parameters

      • x: number
      • y: number
      • anti_slip: boolean = true

      Returns {
          i: number;
          j: number;
          valid: boolean;
      }

      • i: number
      • j: number
      • valid: boolean
    \ No newline at end of file +

    Returns void

    \ No newline at end of file diff --git a/docs/classes/_internal_.GCell.html b/docs/classes/_internal_.GCell.html index f738fd62..04b3261a 100644 --- a/docs/classes/_internal_.GCell.html +++ b/docs/classes/_internal_.GCell.html @@ -1,4 +1,4 @@ -GCell | goban

    Constructors

    constructor +GCell | goban

    Constructors

    Properties

    Constructors

    Properties

    _g?: SVGGraphicsElement
    _transform: string = ""
    i: number
    j: number
    last_blue_move?: SVGCircleElement
    last_blue_move_border_width?: number
    last_blue_move_color?: string
    last_circle?: SVGCircleElement
    last_circle_fill?: string
    last_circle_radius?: number
    last_circle_stroke?: string
    last_circle_stroke_width?: number
    last_circle_symbol?: SVGCircleElement
    last_circle_symbol_color?: string
    last_circle_symbol_opacity?: number
    last_cross_symbol?: SVGPathElement
    last_cross_symbol_color?: string
    last_cross_symbol_opacity?: number
    last_faded_lines?: SVGPathElement
    last_faded_star_point?: SVGCircleElement
    last_heatmap_rect?: SVGRectElement
    last_heatmap_value?: number
    last_highlight_color?: string
    last_highlight_rect?: SVGRectElement
    last_last_move?: SVGElement
    last_last_move_color?: string
    last_last_move_opacity?: number
    last_last_move_symbol?: "?" | "+" | "o"
    last_letter?: SVGTextElement
    last_letter_color?: string
    last_letter_font_size?: number
    last_letter_letter?: string
    last_letter_opacity?: number
    last_letter_room_for_subscript?: boolean
    last_removal_cross?: SVGPathElement
    last_removal_cross_fill?: string
    last_removal_cross_opacity?: number
    last_removal_cross_radius?: number
    last_score?: SVGRectElement
    last_score_estimate?: SVGRectElement
    last_score_estimate_color?: string
    last_score_estimate_estimate?: number
    last_score_fill?: string
    last_score_opacity?: number
    last_score_stroke?: string
    last_square_symbol?: SVGRectElement
    last_square_symbol_color?: string
    last_square_symbol_opacity?: number
    last_stone?: SVGElement
    last_stone_alpha_value?: number
    last_stone_color?: JGOFNumericPlayerColor
    last_stone_radius?: number
    last_stone_shadow?: SVGElement
    last_stone_stone?: string
    last_stone_transparent?: boolean
    last_subscript?: SVGTextElement
    last_subscript_color?: string
    last_subscript_font_size?: number
    last_subscript_opacity?: number
    last_subscript_room_for_letter?: boolean
    last_subscript_room_for_sub_triangle?: boolean
    last_subscript_subscript?: string
    last_triangle_symbol?: SVGPathElement
    last_triangle_symbol_as_subscript?: boolean
    last_triangle_symbol_color?: string
    last_triangle_symbol_opacity?: number
    renderer: SVGRenderer

    Accessors

    Methods

    • Parameters

      • color: string
      • border_width: number

      Returns void

    • Parameters

      • draw_star_point: boolean
      • star_radius: number

      Returns void

    • Parameters

      • symbol: "?" | "+" | "o"
      • color: string
      • opacity: number

      Returns void

    • Parameters

      • letter: string
      • color: string
      • font_size: number
      • opacity: number
      • room_for_subscript: boolean

      Returns void

    • Parameters

      • fill: string
      • radius: number
      • opacity: number

      Returns void

    • Parameters

      • fill: string
      • stroke: string
      • opacity: number

      Returns void

    • Parameters

      • subscript: string
      • color: string
      • font_size: number
      • opacity: number
      • room_for_letter: boolean
      • room_for_sub_triangle: boolean

      Returns void

    • Parameters

      • color: string
      • opacity: number
      • as_subscript: boolean

      Returns void

    \ No newline at end of file +

    Constructors

    Properties

    _g?: SVGGraphicsElement
    _transform: string = ""
    i: number
    j: number
    last_blue_move?: SVGCircleElement
    last_blue_move_border_width?: number
    last_blue_move_color?: string
    last_circle?: SVGCircleElement
    last_circle_fill?: string
    last_circle_radius?: number
    last_circle_stroke?: string
    last_circle_stroke_width?: number
    last_circle_symbol?: SVGCircleElement
    last_circle_symbol_color?: string
    last_circle_symbol_opacity?: number
    last_cross_symbol?: SVGPathElement
    last_cross_symbol_color?: string
    last_cross_symbol_opacity?: number
    last_faded_lines?: SVGPathElement
    last_faded_star_point?: SVGCircleElement
    last_heatmap_rect?: SVGRectElement
    last_heatmap_value?: number
    last_highlight_color?: string
    last_highlight_rect?: SVGRectElement
    last_last_move?: SVGElement
    last_last_move_color?: string
    last_last_move_opacity?: number
    last_last_move_symbol?: "?" | "+" | "o"
    last_letter?: SVGTextElement
    last_letter_color?: string
    last_letter_font_size?: number
    last_letter_letter?: string
    last_letter_opacity?: number
    last_letter_room_for_subscript?: boolean
    last_removal_cross?: SVGPathElement
    last_removal_cross_fill?: string
    last_removal_cross_opacity?: number
    last_removal_cross_radius?: number
    last_score?: SVGRectElement
    last_score_estimate?: SVGRectElement
    last_score_estimate_color?: string
    last_score_estimate_estimate?: number
    last_score_fill?: string
    last_score_opacity?: number
    last_score_stroke?: string
    last_square_symbol?: SVGRectElement
    last_square_symbol_color?: string
    last_square_symbol_opacity?: number
    last_stone?: SVGElement
    last_stone_alpha_value?: number
    last_stone_color?: JGOFNumericPlayerColor
    last_stone_radius?: number
    last_stone_shadow?: SVGElement
    last_stone_stone?: string
    last_stone_transparent?: boolean
    last_subscript?: SVGTextElement
    last_subscript_color?: string
    last_subscript_font_size?: number
    last_subscript_opacity?: number
    last_subscript_room_for_letter?: boolean
    last_subscript_room_for_sub_triangle?: boolean
    last_subscript_subscript?: string
    last_triangle_symbol?: SVGPathElement
    last_triangle_symbol_as_subscript?: boolean
    last_triangle_symbol_color?: string
    last_triangle_symbol_opacity?: number
    renderer: SVGRenderer

    Accessors

    Methods

    • Parameters

      • color: string
      • border_width: number

      Returns void

    • Parameters

      • draw_star_point: boolean
      • star_radius: number

      Returns void

    • Parameters

      • symbol: "?" | "+" | "o"
      • color: string
      • opacity: number

      Returns void

    • Parameters

      • letter: string
      • color: string
      • font_size: number
      • opacity: number
      • room_for_subscript: boolean

      Returns void

    • Parameters

      • fill: string
      • radius: number
      • opacity: number

      Returns void

    • Parameters

      • fill: string
      • stroke: string
      • opacity: number

      Returns void

    • Parameters

      • subscript: string
      • color: string
      • font_size: number
      • opacity: number
      • room_for_letter: boolean
      • room_for_sub_triangle: boolean

      Returns void

    • Parameters

      • color: string
      • opacity: number
      • as_subscript: boolean

      Returns void

    \ No newline at end of file diff --git a/docs/classes/_internal_.OGSConnectivity.html b/docs/classes/_internal_.OGSConnectivity.html index a37d9b6f..deffd736 100644 --- a/docs/classes/_internal_.OGSConnectivity.html +++ b/docs/classes/_internal_.OGSConnectivity.html @@ -2,7 +2,7 @@ that manages connections to the online-go.com servers.

    We have it as a separate base class simply to help with code organization and to keep our Goban class size down.

    -

    Hierarchy (view full)

    Constructors

    Hierarchy (view full)

    Constructors

    Properties

    __board_redraw_pen_layer_timer: any = null
    __clock_timer?: Timeout
    __draw_state: string[][]
    __last_pt: {
        i: number;
        j: number;
        valid: boolean;
    } = ...

    Type declaration

    • i: number
    • j: number
    • valid: boolean
    __update_move_tree: any = null
    analysis_move_counter: number
    analysis_removal_last_position: {
        i: number;
        j: number;
    } = ...

    Type declaration

    • i: number
    • j: number
    analysis_removal_state?: boolean
    bounded_height: number
    bounded_width: number
    bounds: GobanBounds
    chat_log: GobanChatLog = []
    circle_radius: number
    clock_should_be_paused_for_move_submission: boolean = false
    colored_circles?: (undefined | ColoredCircle)[][]
    conditional_path: string = ""
    conditional_starting_color: "black" | "white" | "invalid" = "invalid"
    conditional_tree: ConditionalMoveTree = ...
    config: GobanConfig
    connectToReviewSent?: boolean
    current_cmove?: ConditionalMoveTree
    currently_my_cmove: boolean = false
    dirty_redraw: any = null
    disconnectedFromGame: boolean = true
    display_width?: number
    done_loading_review: boolean = false
    dont_draw_last_move: boolean
    double_click_submit: boolean
    draw_bottom_labels: boolean
    draw_left_labels: boolean
    draw_right_labels: boolean
    draw_top_labels: boolean
    edit_color?: "black" | "white"
    engine: GobanEngine
    errorHandler: ((e) => void)

    Type declaration

      • (e): void
      • Parameters

        • e: Error

        Returns void

    game_id: number
    game_type: string
    getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting)
    goban_id: number = ++last_goban_id

    Base fields *

    -
    heatmap?: NumberMatrix
    height: number
    highlight_movetree_moves: boolean
    interactive: boolean
    isInPushedAnalysis: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerController: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerOwner: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    label_character: string
    label_mark: string = "[UNSET]"
    last_clock?: AdHocClock
    last_emitted_clock?: JGOFClockWithTransmitting
    last_hover_square?: JGOFIntersection
    last_move?: MoveTree
    last_move_radius: number
    last_paused_by_player_state: null | boolean = null
    last_paused_state: null | boolean = null
    last_phase?: GobanEnginePhase
    last_review_message: ReviewMessage
    last_sound_played_for_a_stone_placement?: string
    last_stone_sound: number
    leavePushedAnalysis: (() => void)

    Type declaration

      • (): void
      • Returns void

    marked_analysis_score?: boolean[][]
    move_selected?: JGOFIntersection
    no_display: boolean
    onError?: ((error) => void)

    Type declaration

      • (error): void
      • Parameters

        • error: Error

        Returns void

    on_game_screen: boolean
    one_click_submit: boolean
    original_square_size: number | ((goban) => number) | "auto"

    Type declaration

      • (goban): number
      • Parameters

        Returns number

    pause_control?: AdHocPauseControl
    paused_since?: number
    pen_marks: any[]
    player_id: number
    preloaded_data?: GobanConfig
    previous_mode: string
    puzzle_autoplace_delay: number
    restrict_moves_to_movetree: boolean
    review_had_gamedata: boolean
    review_id: number
    scoring_mode: boolean | "stalling-scoring-mode"
    sendLatencyTimer?: Timeout
    sent_timed_out_message: boolean = false
    shift_key_is_down: boolean
    show_variation_move_numbers: boolean
    showing_scores: boolean = false
    socket_event_bindings: [keyof GobanSocketEvents, (() => void)][] = []
    square_size: number = 10
    stalling_score_estimate?: StallingScoreEstimate
    stone_font_scale: number
    stone_placement_enabled: boolean
    stone_removal_auto_scoring_done?: boolean = false
    variation_stone_opacity: number
    width: number
    setCallbacks: ((newCallbacks) => void) = setGobanCallbacks

    Type declaration

      • (newCallbacks): void
      • Set's callback functions to be called in various situations. You can set any +

    Constructors

    Properties

    __board_redraw_pen_layer_timer: any = null
    __clock_timer?: Timeout
    __draw_state: string[][]
    __last_pt: {
        i: number;
        j: number;
        valid: boolean;
    } = ...

    Type declaration

    • i: number
    • j: number
    • valid: boolean
    __update_move_tree: any = null
    analysis_move_counter: number
    analysis_removal_last_position: {
        i: number;
        j: number;
    } = ...

    Type declaration

    • i: number
    • j: number
    analysis_removal_state?: boolean
    bounded_height: number
    bounded_width: number
    bounds: GobanBounds
    chat_log: GobanChatLog = []
    circle_radius: number
    clock_should_be_paused_for_move_submission: boolean = false
    colored_circles?: (undefined | ColoredCircle)[][]
    conditional_path: string = ""
    conditional_starting_color: "black" | "white" | "invalid" = "invalid"
    conditional_tree: ConditionalMoveTree = ...
    config: GobanConfig
    connectToReviewSent?: boolean
    current_cmove?: ConditionalMoveTree
    currently_my_cmove: boolean = false
    dirty_redraw: any = null
    disconnectedFromGame: boolean = true
    display_width?: number
    done_loading_review: boolean = false
    dont_draw_last_move: boolean
    double_click_submit: boolean
    draw_bottom_labels: boolean
    draw_left_labels: boolean
    draw_right_labels: boolean
    draw_top_labels: boolean
    edit_color?: "black" | "white"
    engine: GobanEngine
    errorHandler: ((e) => void)

    Type declaration

      • (e): void
      • Parameters

        • e: Error

        Returns void

    game_id: number
    game_type: string
    getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting)
    goban_id: number = ++last_goban_id

    Base fields *

    +
    heatmap?: NumberMatrix
    height: number
    highlight_movetree_moves: boolean
    interactive: boolean
    isInPushedAnalysis: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerController: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerOwner: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    label_character: string
    label_mark: string = "[UNSET]"
    last_clock?: AdHocClock
    last_emitted_clock?: JGOFClockWithTransmitting
    last_hover_square?: JGOFIntersection
    last_move?: MoveTree
    last_move_radius: number
    last_paused_by_player_state: null | boolean = null
    last_paused_state: null | boolean = null
    last_phase?: GobanEnginePhase
    last_review_message: ReviewMessage
    last_sound_played_for_a_stone_placement?: string
    last_stone_sound: number
    leavePushedAnalysis: (() => void)

    Type declaration

      • (): void
      • Returns void

    marked_analysis_score?: boolean[][]
    move_selected?: JGOFIntersection
    no_display: boolean
    onError?: ((error) => void)

    Type declaration

      • (error): void
      • Parameters

        • error: Error

        Returns void

    on_game_screen: boolean
    one_click_submit: boolean
    original_square_size: number | ((goban) => number) | "auto"

    Type declaration

      • (goban): number
      • Parameters

        Returns number

    pause_control?: AdHocPauseControl
    paused_since?: number
    pen_marks: any[]
    player_id: number
    preloaded_data?: GobanConfig
    previous_mode: string
    puzzle_autoplace_delay: number
    restrict_moves_to_movetree: boolean
    review_had_gamedata: boolean
    review_id: number
    scoring_mode: boolean | "stalling-scoring-mode"
    sendLatencyTimer?: Timeout
    sent_timed_out_message: boolean = false
    shift_key_is_down: boolean
    show_variation_move_numbers: boolean
    showing_scores: boolean = false
    socket_event_bindings: [keyof GobanSocketEvents, (() => void)][] = []
    square_size: number = 10
    stalling_score_estimate?: StallingScoreEstimate
    stone_font_scale: number
    stone_placement_enabled: boolean
    stone_removal_auto_scoring_done?: boolean = false
    variation_stone_opacity: number
    width: number
    setCallbacks: ((newCallbacks) => void) = setGobanCallbacks

    Type declaration

      • (newCallbacks): void
      • Set's callback functions to be called in various situations. You can set any or all of the callbacks, only the provided callbacks will be updated.

        -

        Parameters

        Returns void

    setTranslations: ((_catalog, _debug_mode?) => void) = setGobanTranslations

    Type declaration

      • (_catalog, _debug_mode?): void
      • Parameters

        Returns void

    Accessors

    • get analyze_subtool(): string
    • Returns string

    • set analyze_subtool(analyze_subtool): void
    • Parameters

      • analyze_subtool: string

      Returns void

    • get destroyed(): boolean
    • Returns boolean

    • get is_game_record(): boolean
    • True if the game is a game record of a real life game

      -

      Returns boolean

    • get review_controller_id(): undefined | number
    • Returns undefined | number

    • set review_controller_id(review_controller_id): void
    • Parameters

      • review_controller_id: undefined | number

      Returns void

    • get review_owner_id(): undefined | number
    • Returns undefined | number

    • set review_owner_id(review_owner_id): void
    • Parameters

      • review_owner_id: undefined | number

      Returns void

    • get submit_move(): undefined | (() => void)
    • Returns undefined | (() => void)

    • set submit_move(submit_move): void
    • Parameters

      • submit_move: undefined | (() => void)

      Returns void

    Methods

    • Decodes any of the various ways we express moves that we've accumulated over the years into +

      Parameters

      Returns void

    setTranslations: ((_catalog, _debug_mode?) => void) = setGobanTranslations

    Type declaration

      • (_catalog, _debug_mode?): void
      • Parameters

        Returns void

    Accessors

    • get analyze_subtool(): string
    • Returns string

    • set analyze_subtool(analyze_subtool): void
    • Parameters

      • analyze_subtool: string

      Returns void

    • get destroyed(): boolean
    • Returns boolean

    • get is_game_record(): boolean
    • True if the game is a game record of a real life game

      +

      Returns boolean

    • get review_controller_id(): undefined | number
    • Returns undefined | number

    • set review_controller_id(review_controller_id): void
    • Parameters

      • review_controller_id: undefined | number

      Returns void

    • get review_owner_id(): undefined | number
    • Returns undefined | number

    • set review_owner_id(review_owner_id): void
    • Parameters

      • review_owner_id: undefined | number

      Returns void

    • get submit_move(): undefined | (() => void)
    • Returns undefined | (() => void)

    • set submit_move(submit_move): void
    • Parameters

      • submit_move: undefined | (() => void)

      Returns void

    Methods

    • Parameters

      • colored_marks: {
            [key: string]: {
                color: string;
                move: string;
            };
        }
        • [key: string]: {
              color: string;
              move: string;
          }
          • color: string
          • move: string

      Returns void

    • Called when a location is marked or unmarked for removal

      -

      Parameters

      • x: number
      • y: number
      • removed: boolean
      • emit_stone_removal_updated: boolean = true

      Returns void

    • Parameters

      • colored_marks: {
            [key: string]: {
                color: string;
                move: string;
            };
        }
        • [key: string]: {
              color: string;
              move: string;
          }
          • color: string
          • move: string

      Returns void

    • Called when a location is marked or unmarked for removal

      +

      Parameters

      • x: number
      • y: number
      • removed: boolean
      • emit_stone_removal_updated: boolean = true

      Returns void

    • This is a callback that gets called by GobanEngine.getState to save and board state as it pushes and pops state. Our renderers can override this to save state they need.

      -

      Parameters

      • marks: {
            [mark: string]: string;
        }
        • [mark: string]: string
      • Optional dont_draw: boolean

      Returns void

    • This is a callback that gets called by GobanEngine.setState to load +

      Parameters

      • marks: {
            [mark: string]: string;
        }
        • [mark: string]: string
      • Optional dont_draw: boolean

      Returns void

    • Parameters

      • x: number
      • y: number
      • anti_slip: boolean = true

      Returns {
          i: number;
          j: number;
          valid: boolean;
      }

      • i: number
      • j: number
      • valid: boolean
    \ No newline at end of file +

    Returns void

    \ No newline at end of file diff --git a/docs/enums/JGOFNumericPlayerColor.html b/docs/enums/JGOFNumericPlayerColor.html index 70e0feb8..294d5e78 100644 --- a/docs/enums/JGOFNumericPlayerColor.html +++ b/docs/enums/JGOFNumericPlayerColor.html @@ -1,4 +1,4 @@ -JGOFNumericPlayerColor | goban

    Enumeration JGOFNumericPlayerColor

    Enumeration Members

    BLACK +JGOFNumericPlayerColor | goban

    Enumeration JGOFNumericPlayerColor

    Enumeration Members

    Enumeration Members

    BLACK: 1
    EMPTY: 0
    WHITE: 2
    \ No newline at end of file +

    Enumeration Members

    BLACK: 1
    EMPTY: 0
    WHITE: 2
    \ No newline at end of file diff --git a/docs/enums/protocol.RemoteStorageReplication.html b/docs/enums/protocol.RemoteStorageReplication.html index 25f0cb1f..5b84ef7e 100644 --- a/docs/enums/protocol.RemoteStorageReplication.html +++ b/docs/enums/protocol.RemoteStorageReplication.html @@ -1,13 +1,13 @@ RemoteStorageReplication | goban

    Enumeration RemoteStorageReplication

    This enum defines the various replication strategies for the remote storage system. For more details on the remote storage replication system see: https://github.com/online-go/online-go.com/blob/devel/src/lib/data.ts

    -

    Enumeration Members

    Enumeration Members

    LOCAL_OVERWRITES_REMOTE: 1

    Locally set data will overwrite remotely set data, but if not set will default to remotely set data

    -
    NONE: 0

    No replication of this change

    -
    REMOTE_ONLY: 4

    Remotely set data, but do not update our local value

    -
    REMOTE_OVERWRITES_LOCAL: 2

    Remotely set data will overwrite locally set data

    -
    \ No newline at end of file +
    NONE: 0

    No replication of this change

    +
    REMOTE_ONLY: 4

    Remotely set data, but do not update our local value

    +
    REMOTE_OVERWRITES_LOCAL: 2

    Remotely set data will overwrite locally set data

    +
    \ No newline at end of file diff --git a/docs/functions/adjust_estimate.html b/docs/functions/adjust_estimate.html index 232517d3..b0e51313 100644 --- a/docs/functions/adjust_estimate.html +++ b/docs/functions/adjust_estimate.html @@ -4,4 +4,4 @@
  • area_map: number[][]

    Representation of the ownership, 1=Black, -1=White, 0=Undecided using Area rules

  • score: number

    estimated score (not accounting for captures)

    -
  • Returns {
        ownership: Matrix<number>;
        score: number;
    }

    \ No newline at end of file +

    Returns {
        ownership: Matrix<number>;
        score: number;
    }

    \ No newline at end of file diff --git a/docs/functions/allocateCanvasOrError.html b/docs/functions/allocateCanvasOrError.html index 9f7c013d..20f93d71 100644 --- a/docs/functions/allocateCanvasOrError.html +++ b/docs/functions/allocateCanvasOrError.html @@ -5,4 +5,4 @@

    If string dimensions are used we'll use setAttribute, if numbers are used we'll set the canvas .width and .height parameter. This is for device scaling considerations when the given dimensions are scaled on HDPI devices.

    -

    Parameters

    Returns HTMLCanvasElement

    \ No newline at end of file +

    Parameters

    Returns HTMLCanvasElement

    \ No newline at end of file diff --git a/docs/functions/autoscore.html b/docs/functions/autoscore.html index aacdbb17..0ae48102 100644 --- a/docs/functions/autoscore.html +++ b/docs/functions/autoscore.html @@ -1 +1 @@ -autoscore | goban

    Function autoscore

    \ No newline at end of file +autoscore | goban

    Function autoscore

    \ No newline at end of file diff --git a/docs/functions/char2num.html b/docs/functions/char2num.html index f7477aeb..2ccaf7ea 100644 --- a/docs/functions/char2num.html +++ b/docs/functions/char2num.html @@ -1 +1 @@ -char2num | goban

    Function char2num

    \ No newline at end of file +char2num | goban

    Function char2num

    \ No newline at end of file diff --git a/docs/functions/cloneMatrix.html b/docs/functions/cloneMatrix.html index 2a31520c..396d0870 100644 --- a/docs/functions/cloneMatrix.html +++ b/docs/functions/cloneMatrix.html @@ -1,2 +1,2 @@ cloneMatrix | goban

    Function cloneMatrix

    • Returns a cloned copy of the provided matrix

      -

      Type Parameters

      • T

      Parameters

      • matrix: T[][]

      Returns T[][]

    \ No newline at end of file +

    Type Parameters

    Parameters

    Returns T[][]

    \ No newline at end of file diff --git a/docs/functions/closeErrorCodeToString.html b/docs/functions/closeErrorCodeToString.html index af8fb81f..fe94ed2f 100644 --- a/docs/functions/closeErrorCodeToString.html +++ b/docs/functions/closeErrorCodeToString.html @@ -1 +1 @@ -closeErrorCodeToString | goban

    Function closeErrorCodeToString

    \ No newline at end of file +closeErrorCodeToString | goban

    Function closeErrorCodeToString

    \ No newline at end of file diff --git a/docs/functions/color_blend.html b/docs/functions/color_blend.html index e4f94606..879e9d2f 100644 --- a/docs/functions/color_blend.html +++ b/docs/functions/color_blend.html @@ -1,2 +1,2 @@ color_blend | goban

    Function color_blend

    • Simple 50% blend of two colors in hex format

      -

      Parameters

      • c1: string
      • c2: string

      Returns string

    \ No newline at end of file +

    Parameters

    Returns string

    \ No newline at end of file diff --git a/docs/functions/computeAverageMoveTime.html b/docs/functions/computeAverageMoveTime.html index 1aa77f21..53cc9066 100644 --- a/docs/functions/computeAverageMoveTime.html +++ b/docs/functions/computeAverageMoveTime.html @@ -1,2 +1,2 @@ computeAverageMoveTime | goban

    Function computeAverageMoveTime

    \ No newline at end of file +

    Parameters

    Returns number

    \ No newline at end of file diff --git a/docs/functions/createDeviceScaledCanvas.html b/docs/functions/createDeviceScaledCanvas.html index a76f30b5..a3df31e2 100644 --- a/docs/functions/createDeviceScaledCanvas.html +++ b/docs/functions/createDeviceScaledCanvas.html @@ -1 +1 @@ -createDeviceScaledCanvas | goban

    Function createDeviceScaledCanvas

    • Parameters

      • width: number
      • height: number

      Returns HTMLCanvasElement

    \ No newline at end of file +createDeviceScaledCanvas | goban

    Function createDeviceScaledCanvas

    • Parameters

      • width: number
      • height: number

      Returns HTMLCanvasElement

    \ No newline at end of file diff --git a/docs/functions/createGoban.html b/docs/functions/createGoban.html index 5f50ffe3..2b377842 100644 --- a/docs/functions/createGoban.html +++ b/docs/functions/createGoban.html @@ -1 +1 @@ -createGoban | goban

    Function createGoban

    \ No newline at end of file +createGoban | goban

    Function createGoban

    \ No newline at end of file diff --git a/docs/functions/decodeCoordinate.html b/docs/functions/decodeCoordinate.html index 9e8e829a..a41c2f31 100644 --- a/docs/functions/decodeCoordinate.html +++ b/docs/functions/decodeCoordinate.html @@ -1,2 +1,2 @@ decodeCoordinate | goban

    Function decodeCoordinate

    \ No newline at end of file +

    Parameters

    Returns number

    \ No newline at end of file diff --git a/docs/functions/decodeGTPCoordinates.html b/docs/functions/decodeGTPCoordinates.html index f389970e..6c971982 100644 --- a/docs/functions/decodeGTPCoordinates.html +++ b/docs/functions/decodeGTPCoordinates.html @@ -1,2 +1,2 @@ decodeGTPCoordinates | goban

    Function decodeGTPCoordinates

    \ No newline at end of file +

    Parameters

    Returns JGOFMove

    \ No newline at end of file diff --git a/docs/functions/decodeMoves.html b/docs/functions/decodeMoves.html index 435eddc3..3af0864d 100644 --- a/docs/functions/decodeMoves.html +++ b/docs/functions/decodeMoves.html @@ -1,3 +1,3 @@ decodeMoves | goban

    Function decodeMoves

    \ No newline at end of file +

    Parameters

    Returns JGOFMove[]

    \ No newline at end of file diff --git a/docs/functions/decodePrettyCoordinates.html b/docs/functions/decodePrettyCoordinates.html index a38210e0..db5f5fd7 100644 --- a/docs/functions/decodePrettyCoordinates.html +++ b/docs/functions/decodePrettyCoordinates.html @@ -1,2 +1,2 @@ decodePrettyCoordinates | goban

    Function decodePrettyCoordinates

    \ No newline at end of file +

    Parameters

    Returns JGOFMove

    \ No newline at end of file diff --git a/docs/functions/decodePrettyXCoordinate.html b/docs/functions/decodePrettyXCoordinate.html index 310de07c..095aed3e 100644 --- a/docs/functions/decodePrettyXCoordinate.html +++ b/docs/functions/decodePrettyXCoordinate.html @@ -1,2 +1,2 @@ decodePrettyXCoordinate | goban

    Function decodePrettyXCoordinate

    • Decodes the pretty X coordinate to a number

      -

      Parameters

      • ch: string

      Returns number

    \ No newline at end of file +

    Parameters

    Returns number

    \ No newline at end of file diff --git a/docs/functions/deepClone.html b/docs/functions/deepClone.html index ea9e727e..bdc4a253 100644 --- a/docs/functions/deepClone.html +++ b/docs/functions/deepClone.html @@ -1,2 +1,2 @@ deepClone | goban

    Function deepClone

    \ No newline at end of file +

    Parameters

    Returns any

    \ No newline at end of file diff --git a/docs/functions/deepEqual.html b/docs/functions/deepEqual.html index 01f9d4cd..62bb09ff 100644 --- a/docs/functions/deepEqual.html +++ b/docs/functions/deepEqual.html @@ -1,2 +1,2 @@ deepEqual | goban

    Function deepEqual

    \ No newline at end of file +

    Parameters

    Returns boolean

    \ No newline at end of file diff --git a/docs/functions/deviceCanvasScalingRatio.html b/docs/functions/deviceCanvasScalingRatio.html index 430d7b3b..6e9de018 100644 --- a/docs/functions/deviceCanvasScalingRatio.html +++ b/docs/functions/deviceCanvasScalingRatio.html @@ -1 +1 @@ -deviceCanvasScalingRatio | goban

    Function deviceCanvasScalingRatio

    \ No newline at end of file +deviceCanvasScalingRatio | goban

    Function deviceCanvasScalingRatio

    \ No newline at end of file diff --git a/docs/functions/elementOffset.html b/docs/functions/elementOffset.html index 3e2f44bc..63566d9d 100644 --- a/docs/functions/elementOffset.html +++ b/docs/functions/elementOffset.html @@ -1 +1 @@ -elementOffset | goban

    Function elementOffset

    • Parameters

      • element: HTMLElement

      Returns {
          left: number;
          top: number;
      }

      • left: number
      • top: number
    \ No newline at end of file +elementOffset | goban

    Function elementOffset

    • Parameters

      • element: HTMLElement

      Returns {
          left: number;
          top: number;
      }

      • left: number
      • top: number
    \ No newline at end of file diff --git a/docs/functions/encodeCoordinate.html b/docs/functions/encodeCoordinate.html index 6d866a71..21f7ea8b 100644 --- a/docs/functions/encodeCoordinate.html +++ b/docs/functions/encodeCoordinate.html @@ -1,2 +1,2 @@ encodeCoordinate | goban

    Function encodeCoordinate

    • Encodes a single coordinate to a number

      -

      Parameters

      • coor: number

      Returns string

    \ No newline at end of file +

    Parameters

    Returns string

    \ No newline at end of file diff --git a/docs/functions/encodeMove.html b/docs/functions/encodeMove.html index 45b3484e..c9d64887 100644 --- a/docs/functions/encodeMove.html +++ b/docs/functions/encodeMove.html @@ -1 +1 @@ -encodeMove | goban

    Function encodeMove

    \ No newline at end of file +encodeMove | goban

    Function encodeMove

    \ No newline at end of file diff --git a/docs/functions/encodeMoveToArray.html b/docs/functions/encodeMoveToArray.html index e2ddc700..a73291d3 100644 --- a/docs/functions/encodeMoveToArray.html +++ b/docs/functions/encodeMoveToArray.html @@ -1 +1 @@ -encodeMoveToArray | goban

    Function encodeMoveToArray

    \ No newline at end of file +encodeMoveToArray | goban

    Function encodeMoveToArray

    \ No newline at end of file diff --git a/docs/functions/encodeMoves.html b/docs/functions/encodeMoves.html index 1e394696..e18dbd0a 100644 --- a/docs/functions/encodeMoves.html +++ b/docs/functions/encodeMoves.html @@ -1 +1 @@ -encodeMoves | goban

    Function encodeMoves

    \ No newline at end of file +encodeMoves | goban

    Function encodeMoves

    \ No newline at end of file diff --git a/docs/functions/encodeMovesToArray.html b/docs/functions/encodeMovesToArray.html index 4d5ce28a..22e50715 100644 --- a/docs/functions/encodeMovesToArray.html +++ b/docs/functions/encodeMovesToArray.html @@ -1 +1 @@ -encodeMovesToArray | goban

    Function encodeMovesToArray

    \ No newline at end of file +encodeMovesToArray | goban

    Function encodeMovesToArray

    \ No newline at end of file diff --git a/docs/functions/encodePrettyXCoordinate.html b/docs/functions/encodePrettyXCoordinate.html index f0386f12..24ccf86d 100644 --- a/docs/functions/encodePrettyXCoordinate.html +++ b/docs/functions/encodePrettyXCoordinate.html @@ -1,2 +1,2 @@ encodePrettyXCoordinate | goban

    Function encodePrettyXCoordinate

    • Encodes an X coordinate to a display encoding

      -

      Parameters

      • coor: number

      Returns string

    \ No newline at end of file +

    Parameters

    Returns string

    \ No newline at end of file diff --git a/docs/functions/escapeSGFText.html b/docs/functions/escapeSGFText.html index 03df9a7c..12549841 100644 --- a/docs/functions/escapeSGFText.html +++ b/docs/functions/escapeSGFText.html @@ -1 +1 @@ -escapeSGFText | goban

    Function escapeSGFText

    • Parameters

      • txt: string
      • escapeColon: boolean = false

      Returns string

    \ No newline at end of file +escapeSGFText | goban

    Function escapeSGFText

    • Parameters

      • txt: string
      • escapeColon: boolean = false

      Returns string

    \ No newline at end of file diff --git a/docs/functions/getRandomInt.html b/docs/functions/getRandomInt.html index 6fa7dcf6..a5c98fcb 100644 --- a/docs/functions/getRandomInt.html +++ b/docs/functions/getRandomInt.html @@ -1,2 +1,2 @@ getRandomInt | goban

    Function getRandomInt

    • Returns a random integer between min (inclusive) and max (exclusive)

      -

      Parameters

      • min: number
      • max: number

      Returns number

    \ No newline at end of file +

    Parameters

    Returns number

    \ No newline at end of file diff --git a/docs/functions/getRelativeEventPosition.html b/docs/functions/getRelativeEventPosition.html index b9885794..6a651cab 100644 --- a/docs/functions/getRelativeEventPosition.html +++ b/docs/functions/getRelativeEventPosition.html @@ -1,2 +1,2 @@ getRelativeEventPosition | goban

    Function getRelativeEventPosition

    • Returns {x,y} of the event relative to the event target

      -

      Parameters

      • event: TouchEvent | MouseEvent
      • Optional target: HTMLElement

      Returns {
          x: number;
          y: number;
      }

      • x: number
      • y: number
    \ No newline at end of file +

    Parameters

    Returns {
        x: number;
        y: number;
    }

    \ No newline at end of file diff --git a/docs/functions/getWorstMoves.html b/docs/functions/getWorstMoves.html index 553a411f..a8beaf77 100644 --- a/docs/functions/getWorstMoves.html +++ b/docs/functions/getWorstMoves.html @@ -1,4 +1,4 @@ getWorstMoves | goban

    Function getWorstMoves

    \ No newline at end of file +

    Parameters

    Returns AIReviewWorstMoveEntry[]

    \ No newline at end of file diff --git a/docs/functions/init_remote_ownership_estimator.html b/docs/functions/init_remote_ownership_estimator.html index 76b0c8b4..f5e6c2b1 100644 --- a/docs/functions/init_remote_ownership_estimator.html +++ b/docs/functions/init_remote_ownership_estimator.html @@ -1 +1 @@ -init_remote_ownership_estimator | goban

    Function init_remote_ownership_estimator

    \ No newline at end of file +init_remote_ownership_estimator | goban

    Function init_remote_ownership_estimator

    \ No newline at end of file diff --git a/docs/functions/init_wasm_ownership_estimator.html b/docs/functions/init_wasm_ownership_estimator.html index b458841e..6f877d81 100644 --- a/docs/functions/init_wasm_ownership_estimator.html +++ b/docs/functions/init_wasm_ownership_estimator.html @@ -1 +1 @@ -init_wasm_ownership_estimator | goban

    Function init_wasm_ownership_estimator

    \ No newline at end of file +init_wasm_ownership_estimator | goban

    Function init_wasm_ownership_estimator

    \ No newline at end of file diff --git a/docs/functions/makeEmptyMatrix.html b/docs/functions/makeEmptyMatrix.html index c0353824..f19801e2 100644 --- a/docs/functions/makeEmptyMatrix.html +++ b/docs/functions/makeEmptyMatrix.html @@ -1 +1 @@ -makeEmptyMatrix | goban

    Function makeEmptyMatrix

    • Type Parameters

      • T

      Parameters

      • width: number
      • height: number

      Returns (T | undefined)[][]

    \ No newline at end of file +makeEmptyMatrix | goban

    Function makeEmptyMatrix

    • Type Parameters

      • T

      Parameters

      • width: number
      • height: number

      Returns (T | undefined)[][]

    \ No newline at end of file diff --git a/docs/functions/makeMatrix.html b/docs/functions/makeMatrix.html index e859e142..3a8bb959 100644 --- a/docs/functions/makeMatrix.html +++ b/docs/functions/makeMatrix.html @@ -1 +1 @@ -makeMatrix | goban

    Function makeMatrix

    \ No newline at end of file +makeMatrix | goban

    Function makeMatrix

    \ No newline at end of file diff --git a/docs/functions/makeObjectMatrix.html b/docs/functions/makeObjectMatrix.html index 4044b326..08deb98b 100644 --- a/docs/functions/makeObjectMatrix.html +++ b/docs/functions/makeObjectMatrix.html @@ -1 +1 @@ -makeObjectMatrix | goban

    Function makeObjectMatrix

    • Type Parameters

      • T

      Parameters

      • width: number
      • height: number

      Returns T[][]

    \ No newline at end of file +makeObjectMatrix | goban

    Function makeObjectMatrix

    • Type Parameters

      • T

      Parameters

      • width: number
      • height: number

      Returns T[][]

    \ No newline at end of file diff --git a/docs/functions/matricesAreEqual.html b/docs/functions/matricesAreEqual.html index 7590a147..b689464b 100644 --- a/docs/functions/matricesAreEqual.html +++ b/docs/functions/matricesAreEqual.html @@ -1,3 +1,3 @@ matricesAreEqual | goban

    Function matricesAreEqual

    • Returns true if the contents of the two 2d matrices are equal when the cells are compared with ===

      -

      Type Parameters

      • T

      Parameters

      • m1: T[][]
      • m2: T[][]

      Returns boolean

    \ No newline at end of file +

    Type Parameters

    Parameters

    Returns boolean

    \ No newline at end of file diff --git a/docs/functions/newlines_to_spaces.html b/docs/functions/newlines_to_spaces.html index cddce6cf..c6f24f2d 100644 --- a/docs/functions/newlines_to_spaces.html +++ b/docs/functions/newlines_to_spaces.html @@ -1,3 +1,3 @@ newlines_to_spaces | goban

    Function newlines_to_spaces

    • SGF "simple text", eg used in the LB property, we can't have newlines. This strips them and replaces them with spaces.

      -

      Parameters

      • txt: string

      Returns string

    \ No newline at end of file +

    Parameters

    Returns string

    \ No newline at end of file diff --git a/docs/functions/niceInterval.html b/docs/functions/niceInterval.html index 237c29d0..19980f48 100644 --- a/docs/functions/niceInterval.html +++ b/docs/functions/niceInterval.html @@ -1,4 +1,4 @@ niceInterval | goban

    Function niceInterval

    • Like setInterval, but debounces catchups (multiple invocation in rapid succession less than our desired interval) that happen in some browsers when tabs wake up from sleep. Cleared with the standard clearInterval.

      -

      Parameters

      • callback: (() => void)
          • (): void
          • Returns void

      • interval: number

      Returns ReturnType<typeof setInterval>

    \ No newline at end of file +

    Parameters

    Returns ReturnType<typeof setInterval>

    \ No newline at end of file diff --git a/docs/functions/num2char.html b/docs/functions/num2char.html index baabdf31..2af6fcfc 100644 --- a/docs/functions/num2char.html +++ b/docs/functions/num2char.html @@ -1 +1 @@ -num2char | goban

    Function num2char

    \ No newline at end of file +num2char | goban

    Function num2char

    \ No newline at end of file diff --git a/docs/functions/ojeSequenceToMoves.html b/docs/functions/ojeSequenceToMoves.html index 1b066a8c..b6f7c839 100644 --- a/docs/functions/ojeSequenceToMoves.html +++ b/docs/functions/ojeSequenceToMoves.html @@ -1 +1 @@ -ojeSequenceToMoves | goban

    Function ojeSequenceToMoves

    \ No newline at end of file +ojeSequenceToMoves | goban

    Function ojeSequenceToMoves

    \ No newline at end of file diff --git a/docs/functions/placeRenderedImageStone.html b/docs/functions/placeRenderedImageStone.html index 4e0d36ea..3c46480c 100644 --- a/docs/functions/placeRenderedImageStone.html +++ b/docs/functions/placeRenderedImageStone.html @@ -1 +1 @@ -placeRenderedImageStone | goban

    Function placeRenderedImageStone

    • Parameters

      • ctx: CanvasRenderingContext2D
      • shadow_ctx: null | CanvasRenderingContext2D
      • stone: StoneType
      • cx: number
      • cy: number
      • radius: number

      Returns void

    \ No newline at end of file +placeRenderedImageStone | goban

    Function placeRenderedImageStone

    • Parameters

      • ctx: CanvasRenderingContext2D
      • shadow_ctx: null | CanvasRenderingContext2D
      • stone: StoneType
      • cx: number
      • cy: number
      • radius: number

      Returns void

    \ No newline at end of file diff --git a/docs/functions/positionId.html b/docs/functions/positionId.html index b2270cff..076be7c7 100644 --- a/docs/functions/positionId.html +++ b/docs/functions/positionId.html @@ -1 +1 @@ -positionId | goban

    Function positionId

    \ No newline at end of file +positionId | goban

    Function positionId

    \ No newline at end of file diff --git a/docs/functions/preRenderImageStone.html b/docs/functions/preRenderImageStone.html index fbc27cfa..e4137c47 100644 --- a/docs/functions/preRenderImageStone.html +++ b/docs/functions/preRenderImageStone.html @@ -1 +1 @@ -preRenderImageStone | goban

    Function preRenderImageStone

    \ No newline at end of file +preRenderImageStone | goban

    Function preRenderImageStone

    \ No newline at end of file diff --git a/docs/functions/prettyCoordinates.html b/docs/functions/prettyCoordinates.html index fe6bfd33..7b98462d 100644 --- a/docs/functions/prettyCoordinates.html +++ b/docs/functions/prettyCoordinates.html @@ -1,2 +1,2 @@ prettyCoordinates | goban

    Function prettyCoordinates

    • Encodes an x,y pair to "pretty" coordinates, like "A3", or "K10"

      -

      Parameters

      • x: number
      • y: number
      • board_height: number

      Returns string

    \ No newline at end of file +

    Parameters

    Returns string

    \ No newline at end of file diff --git a/docs/functions/resizeDeviceScaledCanvas.html b/docs/functions/resizeDeviceScaledCanvas.html index 83e30bcd..72e51832 100644 --- a/docs/functions/resizeDeviceScaledCanvas.html +++ b/docs/functions/resizeDeviceScaledCanvas.html @@ -1 +1 @@ -resizeDeviceScaledCanvas | goban

    Function resizeDeviceScaledCanvas

    • Parameters

      • canvas: HTMLCanvasElement
      • width: number
      • height: number

      Returns HTMLCanvasElement

    \ No newline at end of file +resizeDeviceScaledCanvas | goban

    Function resizeDeviceScaledCanvas

    • Parameters

      • canvas: HTMLCanvasElement
      • width: number
      • height: number

      Returns HTMLCanvasElement

    \ No newline at end of file diff --git a/docs/functions/setGobanCallbacks.html b/docs/functions/setGobanCallbacks.html index c71ebe74..b1d5ef69 100644 --- a/docs/functions/setGobanCallbacks.html +++ b/docs/functions/setGobanCallbacks.html @@ -1,3 +1,3 @@ setGobanCallbacks | goban

    Function setGobanCallbacks

    • Set's callback functions to be called in various situations. You can set any or all of the callbacks, only the provided callbacks will be updated.

      -

      Parameters

      Returns void

    \ No newline at end of file +

    Parameters

    Returns void

    \ No newline at end of file diff --git a/docs/functions/setGobanRenderer.html b/docs/functions/setGobanRenderer.html index 8bbedae0..0e15e98e 100644 --- a/docs/functions/setGobanRenderer.html +++ b/docs/functions/setGobanRenderer.html @@ -1 +1 @@ -setGobanRenderer | goban

    Function setGobanRenderer

    • Parameters

      • _renderer: "canvas" | "svg"

      Returns void

    \ No newline at end of file +setGobanRenderer | goban

    Function setGobanRenderer

    • Parameters

      • _renderer: "canvas" | "svg"

      Returns void

    \ No newline at end of file diff --git a/docs/functions/set_local_ownership_estimator.html b/docs/functions/set_local_ownership_estimator.html index 8191aeec..b375e652 100644 --- a/docs/functions/set_local_ownership_estimator.html +++ b/docs/functions/set_local_ownership_estimator.html @@ -1 +1 @@ -set_local_ownership_estimator | goban

    Function set_local_ownership_estimator

    \ No newline at end of file +set_local_ownership_estimator | goban

    Function set_local_ownership_estimator

    \ No newline at end of file diff --git a/docs/functions/shortDurationString.html b/docs/functions/shortDurationString.html index 146ea88f..6b136949 100644 --- a/docs/functions/shortDurationString.html +++ b/docs/functions/shortDurationString.html @@ -1,2 +1,2 @@ shortDurationString | goban

    Function shortDurationString

    • Takes a number of seconds and returns a string like "1d 3h 2m 52s"

      -

      Parameters

      • seconds: number

      Returns string

    \ No newline at end of file +

    Parameters

    Returns string

    \ No newline at end of file diff --git a/docs/functions/sortMoves.html b/docs/functions/sortMoves.html index d0c1798f..3842a40a 100644 --- a/docs/functions/sortMoves.html +++ b/docs/functions/sortMoves.html @@ -1,2 +1,2 @@ sortMoves | goban

    Function sortMoves

    \ No newline at end of file +

    Parameters

    Returns string

  • Parameters

    • moves: JGOFMove[]
    • width: number
    • height: number

    Returns JGOFMove[]

  • \ No newline at end of file diff --git a/docs/functions/translate._.html b/docs/functions/translate._.html index a4db1d8b..da2710bb 100644 --- a/docs/functions/translate._.html +++ b/docs/functions/translate._.html @@ -1 +1 @@ -_ | goban

    Function _

    \ No newline at end of file +_ | goban

    Function _

    \ No newline at end of file diff --git a/docs/functions/translate.interpolate.html b/docs/functions/translate.interpolate.html index 872707b6..2576df31 100644 --- a/docs/functions/translate.interpolate.html +++ b/docs/functions/translate.interpolate.html @@ -1 +1 @@ -interpolate | goban

    Function interpolate

    • Parameters

      • str: string
      • params: any

      Returns string

    \ No newline at end of file +interpolate | goban

    Function interpolate

    • Parameters

      • str: string
      • params: any

      Returns string

    \ No newline at end of file diff --git a/docs/functions/translate.setGobanTranslations.html b/docs/functions/translate.setGobanTranslations.html index 97e6cb6f..68e5aacc 100644 --- a/docs/functions/translate.setGobanTranslations.html +++ b/docs/functions/translate.setGobanTranslations.html @@ -1 +1 @@ -setGobanTranslations | goban

    Function setGobanTranslations

    \ No newline at end of file +setGobanTranslations | goban

    Function setGobanTranslations

    \ No newline at end of file diff --git a/docs/functions/validateCanvas.html b/docs/functions/validateCanvas.html index c45683f7..96a6b92e 100644 --- a/docs/functions/validateCanvas.html +++ b/docs/functions/validateCanvas.html @@ -1,4 +1,4 @@ validateCanvas | goban

    Function validateCanvas

    • Validates that a canvas was created successfully and a 2d context can be allocated for it. If not, we call the GobanCore.canvasAllocationErrorHandler hook.

      -

      Parameters

      • canvas: null | HTMLCanvasElement
      • Optional err: Error
      • Optional width: string | number
      • Optional height: string | number

      Returns boolean

    \ No newline at end of file +

    Parameters

    Returns boolean

    \ No newline at end of file diff --git a/docs/functions/voronoi_estimate_ownership.html b/docs/functions/voronoi_estimate_ownership.html index 5df583ca..b8d5a980 100644 --- a/docs/functions/voronoi_estimate_ownership.html +++ b/docs/functions/voronoi_estimate_ownership.html @@ -1,4 +1,4 @@ voronoi_estimate_ownership | goban

    Function voronoi_estimate_ownership

    \ No newline at end of file +

    Parameters

    Returns number[][]

    \ No newline at end of file diff --git a/docs/functions/wasm_estimate_ownership.html b/docs/functions/wasm_estimate_ownership.html index 7fac9f55..6c943e15 100644 --- a/docs/functions/wasm_estimate_ownership.html +++ b/docs/functions/wasm_estimate_ownership.html @@ -1 +1 @@ -wasm_estimate_ownership | goban

    Function wasm_estimate_ownership

    \ No newline at end of file +wasm_estimate_ownership | goban

    Function wasm_estimate_ownership

    \ No newline at end of file diff --git a/docs/interfaces/AIReviewWorstMoveEntry.html b/docs/interfaces/AIReviewWorstMoveEntry.html index de919229..ab32f414 100644 --- a/docs/interfaces/AIReviewWorstMoveEntry.html +++ b/docs/interfaces/AIReviewWorstMoveEntry.html @@ -1,5 +1,5 @@ -AIReviewWorstMoveEntry | goban

    Interface AIReviewWorstMoveEntry

    interface AIReviewWorstMoveEntry {
        delta: number;
        move: JGOFIntersection;
        move_number: number;
        player: JGOFNumericPlayerColor;
    }

    Properties

    delta +AIReviewWorstMoveEntry | goban

    Interface AIReviewWorstMoveEntry

    interface AIReviewWorstMoveEntry {
        delta: number;
        move: JGOFIntersection;
        move_number: number;
        player: JGOFNumericPlayerColor;
    }

    Properties

    delta: number
    move_number: number
    \ No newline at end of file +

    Properties

    delta: number
    move_number: number
    \ No newline at end of file diff --git a/docs/interfaces/AdHocClock.html b/docs/interfaces/AdHocClock.html index 02291b8d..7a721788 100644 --- a/docs/interfaces/AdHocClock.html +++ b/docs/interfaces/AdHocClock.html @@ -1,4 +1,4 @@ -AdHocClock | goban

    Interface AdHocClock

    interface AdHocClock {
        black_player_id: number;
        black_time: number | AdHocPlayerClock;
        current_player: number;
        expiration: number;
        game_id: number;
        last_move: number;
        pause?: {
            pause_control: AdHocPauseControl;
            paused: boolean;
            paused_since: number;
        };
        paused_since?: number;
        start_mode?: boolean;
        title: string;
        white_player_id: number;
        white_time: number | AdHocPlayerClock;
    }

    Properties

    black_player_id +AdHocClock | goban

    Interface AdHocClock

    interface AdHocClock {
        black_player_id: number;
        black_time: number | AdHocPlayerClock;
        current_player: number;
        expiration: number;
        game_id: number;
        last_move: number;
        pause?: {
            pause_control: AdHocPauseControl;
            paused: boolean;
            paused_since: number;
        };
        paused_since?: number;
        start_mode?: boolean;
        title: string;
        white_player_id: number;
        white_time: number | AdHocPlayerClock;
    }

    Properties

    black_player_id: number

    OGS player id for black

    -
    black_time: number | AdHocPlayerClock

    Time left on black's clock. If this is a number (such as is the case +

    black_time: number | AdHocPlayerClock

    Time left on black's clock. If this is a number (such as is the case with simple time), it is expressed in milliseconds.

    -
    current_player: number

    Current player to move

    -
    expiration: number

    Time the game will end if no move is played, in milliseconds since +

    current_player: number

    Current player to move

    +
    expiration: number

    Time the game will end if no move is played, in milliseconds since 1970. This is computed by adding together any main and overtime left on the clock. If start_mode is set, this is the number of milliseconds left on the start clock.

    -
    game_id: number

    OGS Game id

    -
    last_move: number

    Time the last move was made, in milliseconds since 1970

    -
    pause?: {
        pause_control: AdHocPauseControl;
        paused: boolean;
        paused_since: number;
    }

    If set, this AdHocClock is updating the pause state

    -

    Type declaration

    paused_since?: number

    Time the game was paused. This field erroneously exists even after the +

    game_id: number

    OGS Game id

    +
    last_move: number

    Time the last move was made, in milliseconds since 1970

    +
    pause?: {
        pause_control: AdHocPauseControl;
        paused: boolean;
        paused_since: number;
    }

    If set, this AdHocClock is updating the pause state

    +

    Type declaration

    paused_since?: number

    Time the game was paused. This field erroneously exists even after the game has been resumed, this will be removed in these cases.

    -
    start_mode?: boolean

    If true, the game has not started and this is the count down until +

    start_mode?: boolean

    If true, the game has not started and this is the count down until the game is canceled if a move has not been played yet. If this is true, then the duration left on the start clock is stored in expiration (in ms)

    -
    title: string

    Title of the game. This field will be removed.

    -
    white_player_id: number

    OGS player id for white

    -
    white_time: number | AdHocPlayerClock

    Time left on white's clock. If this is a number (such as is the case +

    title: string

    Title of the game. This field will be removed.

    +
    white_player_id: number

    OGS player id for white

    +
    white_time: number | AdHocPlayerClock

    Time left on white's clock. If this is a number (such as is the case with simple time), it is expressed in milliseconds.k

    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/interfaces/AdHocFormat.html b/docs/interfaces/AdHocFormat.html index dd1a4426..3434e2d4 100644 --- a/docs/interfaces/AdHocFormat.html +++ b/docs/interfaces/AdHocFormat.html @@ -1,8 +1,8 @@ AdHocFormat | goban

    Interface AdHocFormat

    The to-be-deprecated format used by Online-Go.com, will be replaced by JGOF as we develop a migration plan

    -
    interface AdHocFormat {
        black: AdHocPlayer;
        clock: AdHocClock;
        pause_control: AdHocPauseControl;
        time_control: JGOFTimeControl;
        white: AdHocPlayer;
    }

    Properties

    interface AdHocFormat {
        black: AdHocPlayer;
        clock: AdHocClock;
        pause_control: AdHocPauseControl;
        time_control: JGOFTimeControl;
        white: AdHocPlayer;
    }

    Properties

    clock: AdHocClock
    pause_control: AdHocPauseControl
    time_control: JGOFTimeControl
    \ No newline at end of file +

    Properties

    clock: AdHocClock
    pause_control: AdHocPauseControl
    time_control: JGOFTimeControl
    \ No newline at end of file diff --git a/docs/interfaces/AdHocPauseControl.html b/docs/interfaces/AdHocPauseControl.html index e57085fc..bd5143ff 100644 --- a/docs/interfaces/AdHocPauseControl.html +++ b/docs/interfaces/AdHocPauseControl.html @@ -1,6 +1,6 @@ -AdHocPauseControl | goban

    Interface AdHocPauseControl

    interface AdHocPauseControl {
        moderator_paused?: {
            moderator_id: number;
        };
        paused?: {
            pauses_left: number;
            pausing_player_id: number;
        };
        stone-removal?: true;
        system?: true;
        weekend?: true;
        [vacation: string]: any;
    }

    Indexable

    [vacation: string]: any

    Properties

    moderator_paused? +AdHocPauseControl | goban

    Interface AdHocPauseControl

    interface AdHocPauseControl {
        moderator_paused?: {
            moderator_id: number;
        };
        paused?: {
            pauses_left: number;
            pausing_player_id: number;
        };
        stone-removal?: true;
        system?: true;
        weekend?: true;
        [vacation: string]: any;
    }

    Indexable

    [vacation: string]: any

    Properties

    moderator_paused?: {
        moderator_id: number;
    }

    Type declaration

    • moderator_id: number
    paused?: {
        pauses_left: number;
        pausing_player_id: number;
    }

    Type declaration

    • pauses_left: number
    • pausing_player_id: number
    stone-removal?: true
    system?: true
    weekend?: true
    \ No newline at end of file +

    Properties

    moderator_paused?: {
        moderator_id: number;
    }

    Type declaration

    • moderator_id: number
    paused?: {
        pauses_left: number;
        pausing_player_id: number;
    }

    Type declaration

    • pauses_left: number
    • pausing_player_id: number
    stone-removal?: true
    system?: true
    weekend?: true
    \ No newline at end of file diff --git a/docs/interfaces/AdHocPlayer.html b/docs/interfaces/AdHocPlayer.html index 70ab83e6..8c3f6cfc 100644 --- a/docs/interfaces/AdHocPlayer.html +++ b/docs/interfaces/AdHocPlayer.html @@ -1,3 +1,3 @@ -AdHocPlayer | goban

    Interface AdHocPlayer

    interface AdHocPlayer {
        id: number;
        name: string;
    }

    Properties

    id +AdHocPlayer | goban

    Interface AdHocPlayer

    interface AdHocPlayer {
        id: number;
        name: string;
    }

    Properties

    Properties

    id: number
    name: string
    \ No newline at end of file +

    Properties

    id: number
    name: string
    \ No newline at end of file diff --git a/docs/interfaces/AdHocPlayerClock.html b/docs/interfaces/AdHocPlayerClock.html index 60fc2563..fbe79d0e 100644 --- a/docs/interfaces/AdHocPlayerClock.html +++ b/docs/interfaces/AdHocPlayerClock.html @@ -1,4 +1,4 @@ -AdHocPlayerClock | goban

    Interface AdHocPlayerClock

    interface AdHocPlayerClock {
        block_time?: number;
        moves_left?: number;
        period_time?: number;
        periods?: number;
        skip_bonus?: boolean;
        thinking_time: number;
    }

    Properties

    block_time? +AdHocPlayerClock | goban

    Interface AdHocPlayerClock

    interface AdHocPlayerClock {
        block_time?: number;
        moves_left?: number;
        period_time?: number;
        periods?: number;
        skip_bonus?: boolean;
        thinking_time: number;
    }

    Properties

    block_time?: number

    Used with canadian time control. Time left (in seconds) to make the remainder of your moves in yu

    -
    moves_left?: number

    Used with canadian time control. Number of moves left before a new +

    moves_left?: number

    Used with canadian time control. Number of moves left before a new block of time.

    -
    period_time?: number

    Used with byo-yomi time control. Length of each period, in seconds.

    -
    periods?: number

    Used with byo-yomi time control. Number of periods left.

    -
    skip_bonus?: boolean

    Used with fischer time control to denote that the next move should not +

    period_time?: number

    Used with byo-yomi time control. Length of each period, in seconds.

    +
    periods?: number

    Used with byo-yomi time control. Number of periods left.

    +
    skip_bonus?: boolean

    Used with fischer time control to denote that the next move should not increment the clock.

    -
    thinking_time: number

    Thinking time left, in seconds. Also used as main time for byo-yomi and +

    thinking_time: number

    Thinking time left, in seconds. Also used as main time for byo-yomi and canadian clocks.

    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/interfaces/AudioClockEvent.html b/docs/interfaces/AudioClockEvent.html index 0f30caf0..5c72ede0 100644 --- a/docs/interfaces/AudioClockEvent.html +++ b/docs/interfaces/AudioClockEvent.html @@ -1,14 +1,14 @@ -AudioClockEvent | goban

    Interface AudioClockEvent

    interface AudioClockEvent {
        clock: JGOFPlayerClock;
        color: PlayerColor;
        countdown_seconds: number;
        in_overtime: boolean;
        player_id: string;
        time_control_system: JGOFTimeControlSystem;
    }

    Properties

    clock +AudioClockEvent | goban

    Interface AudioClockEvent

    interface AudioClockEvent {
        clock: JGOFPlayerClock;
        color: PlayerColor;
        countdown_seconds: number;
        in_overtime: boolean;
        player_id: string;
        time_control_system: JGOFTimeControlSystem;
    }

    Properties

    Full player clock information

    -

    The player whose turn it is

    -
    countdown_seconds: number

    Number of seconds left in the current period

    -
    in_overtime: boolean

    True if we are in overtime. This is only ever set for systems that have +

    The player whose turn it is

    +
    countdown_seconds: number

    Number of seconds left in the current period

    +
    in_overtime: boolean

    True if we are in overtime. This is only ever set for systems that have a concept of overtime.

    -
    player_id: string

    The player (id) whose turn it is

    -
    time_control_system: JGOFTimeControlSystem

    Time control system being used by the clock

    -
    \ No newline at end of file +
    player_id: string

    The player (id) whose turn it is

    +
    time_control_system: JGOFTimeControlSystem

    Time control system being used by the clock

    +
    \ No newline at end of file diff --git a/docs/interfaces/BoardConfig.html b/docs/interfaces/BoardConfig.html index a3b72ac9..0d16c9cf 100644 --- a/docs/interfaces/BoardConfig.html +++ b/docs/interfaces/BoardConfig.html @@ -1,4 +1,4 @@ -BoardConfig | goban

    Interface BoardConfig

    interface BoardConfig {
        black_prisoners?: number;
        board?: JGOFNumericPlayerColor[][];
        board_is_repeating?: boolean;
        height?: number;
        isobranch_hash?: string;
        player?: JGOFNumericPlayerColor;
        removal?: boolean[][];
        white_prisoners?: number;
        width?: number;
    }

    Hierarchy (view full)

    Implemented by

    Properties

    black_prisoners? +BoardConfig | goban

    Interface BoardConfig

    interface BoardConfig {
        black_prisoners?: number;
        board?: JGOFNumericPlayerColor[][];
        board_is_repeating?: boolean;
        height?: number;
        isobranch_hash?: string;
        player?: JGOFNumericPlayerColor;
        removal?: boolean[][];
        white_prisoners?: number;
        width?: number;
    }

    Hierarchy (view full)

    Implemented by

    Properties

    black_prisoners?: number
    board_is_repeating?: boolean
    height?: number
    isobranch_hash?: string
    removal?: boolean[][]
    white_prisoners?: number
    width?: number
    \ No newline at end of file +

    Properties

    black_prisoners?: number
    board_is_repeating?: boolean
    height?: number
    isobranch_hash?: string
    removal?: boolean[][]
    white_prisoners?: number
    width?: number
    \ No newline at end of file diff --git a/docs/interfaces/CanvasRendererGobanConfig.html b/docs/interfaces/CanvasRendererGobanConfig.html index c3811788..0fb1663e 100644 --- a/docs/interfaces/CanvasRendererGobanConfig.html +++ b/docs/interfaces/CanvasRendererGobanConfig.html @@ -1,4 +1,4 @@ -CanvasRendererGobanConfig | goban

    Interface CanvasRendererGobanConfig

    interface CanvasRendererGobanConfig {
        aga_handicap_scoring?: boolean;
        allow_ko?: boolean;
        allow_self_capture?: boolean;
        allow_superko?: boolean;
        auth?: string;
        automatic_stone_removal?: boolean;
        black_player_id?: number;
        black_prisoners?: number;
        board?: JGOFNumericPlayerColor[][];
        board_div?: HTMLElement;
        board_is_repeating?: boolean;
        bounds?: GobanBounds;
        chat_log?: GobanChatLog;
        circle_radius?: number;
        clock?: GameClock;
        connect_to_chat?: number | boolean;
        disable_analysis?: boolean;
        display_width?: number;
        dont_draw_last_move?: boolean;
        dont_show_messages?: boolean;
        double_click_submit?: boolean;
        draw_bottom_labels?: boolean;
        draw_left_labels?: boolean;
        draw_right_labels?: boolean;
        draw_top_labels?: boolean;
        end_time?: number;
        errors?: {
            error: string;
            stack: any;
        }[];
        free_handicap_placement?: boolean;
        game_date?: string;
        game_id?: string | number;
        game_name?: string;
        game_type?: "temporary";
        getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting);
        group_ids?: number[];
        handicap?: number;
        handicap_rank_difference?: number;
        height?: number;
        initial_player?: PlayerColor;
        initial_state?: GobanEngineInitialState;
        interactive?: boolean;
        isInPushedAnalysis?: (() => boolean);
        isPlayerController?: (() => boolean);
        isPlayerOwner?: (() => boolean);
        is_game_record?: boolean;
        isobranch_hash?: string;
        komi?: number;
        ladder?: number;
        ladder_id?: number;
        last_move_opacity?: number;
        last_move_radius?: number;
        latencies?: {
            [player_id: string]: number;
        };
        leavePushedAnalysis?: (() => void);
        malkovich_log?: GobanChatLog;
        marks?: {
            [mark: string]: string;
        };
        mode?: GobanModes;
        move_tree?: MoveTreeJson;
        move_tree_container?: HTMLElement;
        moves?: GobanMovesArray;
        name?: string;
        needs_sealing?: JGOFSealingIntersection[];
        ogs?: {
            black_dead_stones: string;
            black_seki_eyes: string;
            black_stones: string;
            black_territory: string;
            white_dead_stones: string;
            white_seki_eyes: string;
            white_stones: string;
            white_territory: string;
        };
        ogs_import?: boolean;
        onError?: ((err) => void);
        onScoreEstimationUpdated?: ((winning_color, points) => void);
        one_click_submit?: boolean;
        opponent_plays_first_after_resume?: boolean;
        original_disable_analysis?: boolean;
        original_sgf?: string;
        outcome?: string;
        pause_control?: AdHocPauseControl;
        paused_since?: number;
        phase?: GobanEnginePhase;
        player?: JGOFNumericPlayerColor;
        player_id?: number;
        player_pool?: {
            [id: number]: GobanEnginePlayerEntry;
        };
        players?: {
            black: GobanEnginePlayerEntry;
            white: GobanEnginePlayerEntry;
        };
        puzzle_autoplace_delay?: number;
        puzzle_collection?: number;
        puzzle_description?: string;
        puzzle_opponent_move_mode?: PuzzleOpponentMoveMode;
        puzzle_player_move_mode?: PuzzlePlayerMoveMode;
        puzzle_rank?: number;
        puzzle_type?: string;
        ranked?: boolean;
        removal?: boolean[][];
        removed?: string | JGOFMove[];
        rengo?: boolean;
        rengo_casual_mode?: boolean;
        rengo_teams?: {
            black: GobanEnginePlayerEntry[];
            white: GobanEnginePlayerEntry[];
        };
        review_id?: number;
        reviews?: {
            [review_id: number]: GobanEnginePlayerEntry;
        };
        rules?: GobanEngineRules;
        score?: Score;
        score_handicap?: boolean;
        score_passes?: boolean;
        score_prisoners?: boolean;
        score_stones?: boolean;
        score_territory?: boolean;
        score_territory_in_seki?: boolean;
        server_socket?: GobanSocket<ClientToServer, ServerToClient>;
        spectator_log?: GobanChatLog;
        square_size?: number | "auto" | ((goban) => number);
        stalling_score_estimate?: StallingScoreEstimate;
        start_time?: number;
        stone_font_scale?: number;
        strict_seki_mode?: boolean;
        superko_algorithm?: GobanEngineSuperKoAlgorithm;
        throw_all_errors?: boolean;
        time_control?: JGOFTimeControl;
        time_per_move?: number;
        title_div?: HTMLElement;
        tournament_id?: number;
        username?: string;
        variation_stone_opacity?: number;
        white_must_pass_last?: boolean;
        white_player_id?: number;
        white_prisoners?: number;
        width?: number;
        winner?: number | "black" | "white";
    }

    Hierarchy (view full)

    Properties

    aga_handicap_scoring? +CanvasRendererGobanConfig | goban

    Interface CanvasRendererGobanConfig

    interface CanvasRendererGobanConfig {
        aga_handicap_scoring?: boolean;
        allow_ko?: boolean;
        allow_self_capture?: boolean;
        allow_superko?: boolean;
        auth?: string;
        automatic_stone_removal?: boolean;
        black_player_id?: number;
        black_prisoners?: number;
        board?: JGOFNumericPlayerColor[][];
        board_div?: HTMLElement;
        board_is_repeating?: boolean;
        bounds?: GobanBounds;
        chat_log?: GobanChatLog;
        circle_radius?: number;
        clock?: GameClock;
        connect_to_chat?: number | boolean;
        disable_analysis?: boolean;
        display_width?: number;
        dont_draw_last_move?: boolean;
        dont_show_messages?: boolean;
        double_click_submit?: boolean;
        draw_bottom_labels?: boolean;
        draw_left_labels?: boolean;
        draw_right_labels?: boolean;
        draw_top_labels?: boolean;
        end_time?: number;
        errors?: {
            error: string;
            stack: any;
        }[];
        free_handicap_placement?: boolean;
        game_date?: string;
        game_id?: string | number;
        game_name?: string;
        game_type?: "temporary";
        getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting);
        group_ids?: number[];
        handicap?: number;
        handicap_rank_difference?: number;
        height?: number;
        initial_player?: PlayerColor;
        initial_state?: GobanEngineInitialState;
        interactive?: boolean;
        isInPushedAnalysis?: (() => boolean);
        isPlayerController?: (() => boolean);
        isPlayerOwner?: (() => boolean);
        is_game_record?: boolean;
        isobranch_hash?: string;
        komi?: number;
        ladder?: number;
        ladder_id?: number;
        last_move_opacity?: number;
        last_move_radius?: number;
        latencies?: {
            [player_id: string]: number;
        };
        leavePushedAnalysis?: (() => void);
        malkovich_log?: GobanChatLog;
        marks?: {
            [mark: string]: string;
        };
        mode?: GobanModes;
        move_tree?: MoveTreeJson;
        move_tree_container?: HTMLElement;
        moves?: GobanMovesArray;
        name?: string;
        needs_sealing?: JGOFSealingIntersection[];
        ogs?: {
            black_dead_stones: string;
            black_seki_eyes: string;
            black_stones: string;
            black_territory: string;
            white_dead_stones: string;
            white_seki_eyes: string;
            white_stones: string;
            white_territory: string;
        };
        ogs_import?: boolean;
        onError?: ((err) => void);
        onScoreEstimationUpdated?: ((winning_color, points) => void);
        one_click_submit?: boolean;
        opponent_plays_first_after_resume?: boolean;
        original_disable_analysis?: boolean;
        original_sgf?: string;
        outcome?: string;
        pause_control?: AdHocPauseControl;
        paused_since?: number;
        phase?: GobanEnginePhase;
        player?: JGOFNumericPlayerColor;
        player_id?: number;
        player_pool?: {
            [id: number]: GobanEnginePlayerEntry;
        };
        players?: {
            black: GobanEnginePlayerEntry;
            white: GobanEnginePlayerEntry;
        };
        puzzle_autoplace_delay?: number;
        puzzle_collection?: number;
        puzzle_description?: string;
        puzzle_opponent_move_mode?: PuzzleOpponentMoveMode;
        puzzle_player_move_mode?: PuzzlePlayerMoveMode;
        puzzle_rank?: number;
        puzzle_type?: string;
        ranked?: boolean;
        removal?: boolean[][];
        removed?: string | JGOFMove[];
        rengo?: boolean;
        rengo_casual_mode?: boolean;
        rengo_teams?: {
            black: GobanEnginePlayerEntry[];
            white: GobanEnginePlayerEntry[];
        };
        review_id?: number;
        reviews?: {
            [review_id: number]: GobanEnginePlayerEntry;
        };
        rules?: GobanEngineRules;
        score?: Score;
        score_handicap?: boolean;
        score_passes?: boolean;
        score_prisoners?: boolean;
        score_stones?: boolean;
        score_territory?: boolean;
        score_territory_in_seki?: boolean;
        server_socket?: GobanSocket<ClientToServer, ServerToClient>;
        spectator_log?: GobanChatLog;
        square_size?: number | "auto" | ((goban) => number);
        stalling_score_estimate?: StallingScoreEstimate;
        start_time?: number;
        stone_font_scale?: number;
        strict_seki_mode?: boolean;
        superko_algorithm?: GobanEngineSuperKoAlgorithm;
        throw_all_errors?: boolean;
        time_control?: JGOFTimeControl;
        time_per_move?: number;
        title_div?: HTMLElement;
        tournament_id?: number;
        username?: string;
        variation_stone_opacity?: number;
        white_must_pass_last?: boolean;
        white_player_id?: number;
        white_prisoners?: number;
        width?: number;
        winner?: number | "black" | "white";
    }

    Hierarchy (view full)

    Properties

    aga_handicap_scoring?: boolean
    allow_ko?: boolean
    allow_self_capture?: boolean
    allow_superko?: boolean
    auth?: string
    automatic_stone_removal?: boolean
    black_player_id?: number
    black_prisoners?: number
    board_div?: HTMLElement
    board_is_repeating?: boolean
    bounds?: GobanBounds
    chat_log?: GobanChatLog
    circle_radius?: number
    clock?: GameClock
    connect_to_chat?: number | boolean
    disable_analysis?: boolean
    display_width?: number
    dont_draw_last_move?: boolean
    dont_show_messages?: boolean
    double_click_submit?: boolean
    draw_bottom_labels?: boolean
    draw_left_labels?: boolean
    draw_right_labels?: boolean
    draw_top_labels?: boolean
    end_time?: number
    errors?: {
        error: string;
        stack: any;
    }[]

    Type declaration

    • error: string
    • stack: any
    free_handicap_placement?: boolean
    game_date?: string
    game_id?: string | number
    game_name?: string
    game_type?: "temporary"
    getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting)
    group_ids?: number[]
    handicap?: number
    handicap_rank_difference?: number
    height?: number
    initial_player?: PlayerColor
    initial_state?: GobanEngineInitialState
    interactive?: boolean
    isInPushedAnalysis?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerController?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerOwner?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    is_game_record?: boolean
    isobranch_hash?: string
    komi?: number
    ladder?: number
    ladder_id?: number
    last_move_opacity?: number
    last_move_radius?: number
    latencies?: {
        [player_id: string]: number;
    }

    Type declaration

    • [player_id: string]: number
    leavePushedAnalysis?: (() => void)

    Type declaration

      • (): void
      • Returns void

    malkovich_log?: GobanChatLog
    marks?: {
        [mark: string]: string;
    }

    Type declaration

    • [mark: string]: string
    mode?: GobanModes
    move_tree?: MoveTreeJson
    move_tree_container?: HTMLElement
    name?: string
    needs_sealing?: JGOFSealingIntersection[]

    Intersections that need to be sealed before scoring should happen

    -
    ogs?: {
        black_dead_stones: string;
        black_seki_eyes: string;
        black_stones: string;
        black_territory: string;
        white_dead_stones: string;
        white_seki_eyes: string;
        white_stones: string;
        white_territory: string;
    }

    Type declaration

    • black_dead_stones: string
    • black_seki_eyes: string
    • black_stones: string
    • black_territory: string
    • white_dead_stones: string
    • white_seki_eyes: string
    • white_stones: string
    • white_territory: string
    ogs_import?: boolean

    Deprecated, I don't think we need this anymore, but need to be sure

    -
    onError?: ((err) => void)

    Type declaration

      • (err): void
      • Parameters

        • err: Error

        Returns void

    onScoreEstimationUpdated?: ((winning_color, points) => void)

    Type declaration

      • (winning_color, points): void
      • Parameters

        • winning_color: "black" | "white"
        • points: number

        Returns void

    one_click_submit?: boolean
    opponent_plays_first_after_resume?: boolean
    original_disable_analysis?: boolean
    original_sgf?: string
    outcome?: string
    pause_control?: AdHocPauseControl
    paused_since?: number
    player_id?: number
    player_pool?: {
        [id: number]: GobanEnginePlayerEntry;
    }

    Type declaration

    players?: {
        black: GobanEnginePlayerEntry;
        white: GobanEnginePlayerEntry;
    }

    Type declaration

    puzzle_autoplace_delay?: number
    puzzle_collection?: number
    puzzle_description?: string
    puzzle_opponent_move_mode?: PuzzleOpponentMoveMode
    puzzle_player_move_mode?: PuzzlePlayerMoveMode
    puzzle_rank?: number
    puzzle_type?: string
    ranked?: boolean
    removal?: boolean[][]
    removed?: string | JGOFMove[]

    Removed stones in stone removal phase +

    Properties

    aga_handicap_scoring?: boolean
    allow_ko?: boolean
    allow_self_capture?: boolean
    allow_superko?: boolean
    auth?: string
    automatic_stone_removal?: boolean
    black_player_id?: number
    black_prisoners?: number
    board_div?: HTMLElement
    board_is_repeating?: boolean
    bounds?: GobanBounds
    chat_log?: GobanChatLog
    circle_radius?: number
    clock?: GameClock
    connect_to_chat?: number | boolean
    disable_analysis?: boolean
    display_width?: number
    dont_draw_last_move?: boolean
    dont_show_messages?: boolean
    double_click_submit?: boolean
    draw_bottom_labels?: boolean
    draw_left_labels?: boolean
    draw_right_labels?: boolean
    draw_top_labels?: boolean
    end_time?: number
    errors?: {
        error: string;
        stack: any;
    }[]

    Type declaration

    • error: string
    • stack: any
    free_handicap_placement?: boolean
    game_date?: string
    game_id?: string | number
    game_name?: string
    game_type?: "temporary"
    getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting)
    group_ids?: number[]
    handicap?: number
    handicap_rank_difference?: number
    height?: number
    initial_player?: PlayerColor
    initial_state?: GobanEngineInitialState
    interactive?: boolean
    isInPushedAnalysis?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerController?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerOwner?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    is_game_record?: boolean
    isobranch_hash?: string
    komi?: number
    ladder?: number
    ladder_id?: number
    last_move_opacity?: number
    last_move_radius?: number
    latencies?: {
        [player_id: string]: number;
    }

    Type declaration

    • [player_id: string]: number
    leavePushedAnalysis?: (() => void)

    Type declaration

      • (): void
      • Returns void

    malkovich_log?: GobanChatLog
    marks?: {
        [mark: string]: string;
    }

    Type declaration

    • [mark: string]: string
    mode?: GobanModes
    move_tree?: MoveTreeJson
    move_tree_container?: HTMLElement
    name?: string
    needs_sealing?: JGOFSealingIntersection[]

    Intersections that need to be sealed before scoring should happen

    +
    ogs?: {
        black_dead_stones: string;
        black_seki_eyes: string;
        black_stones: string;
        black_territory: string;
        white_dead_stones: string;
        white_seki_eyes: string;
        white_stones: string;
        white_territory: string;
    }

    Type declaration

    • black_dead_stones: string
    • black_seki_eyes: string
    • black_stones: string
    • black_territory: string
    • white_dead_stones: string
    • white_seki_eyes: string
    • white_stones: string
    • white_territory: string
    ogs_import?: boolean

    Deprecated, I don't think we need this anymore, but need to be sure

    +
    onError?: ((err) => void)

    Type declaration

      • (err): void
      • Parameters

        • err: Error

        Returns void

    onScoreEstimationUpdated?: ((winning_color, points) => void)

    Type declaration

      • (winning_color, points): void
      • Parameters

        • winning_color: "black" | "white"
        • points: number

        Returns void

    one_click_submit?: boolean
    opponent_plays_first_after_resume?: boolean
    original_disable_analysis?: boolean
    original_sgf?: string
    outcome?: string
    pause_control?: AdHocPauseControl
    paused_since?: number
    player_id?: number
    player_pool?: {
        [id: number]: GobanEnginePlayerEntry;
    }

    Type declaration

    players?: {
        black: GobanEnginePlayerEntry;
        white: GobanEnginePlayerEntry;
    }

    Type declaration

    puzzle_autoplace_delay?: number
    puzzle_collection?: number
    puzzle_description?: string
    puzzle_opponent_move_mode?: PuzzleOpponentMoveMode
    puzzle_player_move_mode?: PuzzlePlayerMoveMode
    puzzle_rank?: number
    puzzle_type?: string
    ranked?: boolean
    removal?: boolean[][]
    removed?: string | JGOFMove[]

    Removed stones in stone removal phase Passing an array of JGOFMove objects is preferred, the string format exists for historical backwards compatibility. It is an encoded move string, e.g. "aa" for A19

    -
    rengo?: boolean
    rengo_casual_mode?: boolean
    rengo_teams?: {
        black: GobanEnginePlayerEntry[];
        white: GobanEnginePlayerEntry[];
    }

    Type declaration

    review_id?: number
    reviews?: {
        [review_id: number]: GobanEnginePlayerEntry;
    }

    Type declaration

    score?: Score
    score_handicap?: boolean
    score_passes?: boolean
    score_prisoners?: boolean
    score_stones?: boolean
    score_territory?: boolean
    score_territory_in_seki?: boolean
    spectator_log?: GobanChatLog
    square_size?: number | "auto" | ((goban) => number)

    Type declaration

      • (goban): number
      • Parameters

        Returns number

    stalling_score_estimate?: StallingScoreEstimate
    start_time?: number
    stone_font_scale?: number
    strict_seki_mode?: boolean
    superko_algorithm?: GobanEngineSuperKoAlgorithm
    throw_all_errors?: boolean

    When loading initial state or moves, by default GobanEngine will try and +

    rengo?: boolean
    rengo_casual_mode?: boolean
    rengo_teams?: {
        black: GobanEnginePlayerEntry[];
        white: GobanEnginePlayerEntry[];
    }

    Type declaration

    review_id?: number
    reviews?: {
        [review_id: number]: GobanEnginePlayerEntry;
    }

    Type declaration

    score?: Score
    score_handicap?: boolean
    score_passes?: boolean
    score_prisoners?: boolean
    score_stones?: boolean
    score_territory?: boolean
    score_territory_in_seki?: boolean
    spectator_log?: GobanChatLog
    square_size?: number | "auto" | ((goban) => number)

    Type declaration

      • (goban): number
      • Parameters

        Returns number

    stalling_score_estimate?: StallingScoreEstimate
    start_time?: number
    stone_font_scale?: number
    strict_seki_mode?: boolean
    superko_algorithm?: GobanEngineSuperKoAlgorithm
    throw_all_errors?: boolean

    When loading initial state or moves, by default GobanEngine will try and handle bad data by just resorting to 'edit placing' moves. If this is true, then those errors are thrown instead.

    -
    time_control?: JGOFTimeControl
    time_per_move?: number
    title_div?: HTMLElement
    tournament_id?: number
    username?: string
    variation_stone_opacity?: number
    white_must_pass_last?: boolean
    white_player_id?: number
    white_prisoners?: number
    width?: number
    winner?: number | "black" | "white"
    \ No newline at end of file +
    time_control?: JGOFTimeControl
    time_per_move?: number
    title_div?: HTMLElement
    tournament_id?: number
    username?: string
    variation_stone_opacity?: number
    white_must_pass_last?: boolean
    white_player_id?: number
    white_prisoners?: number
    width?: number
    winner?: number | "black" | "white"
    \ No newline at end of file diff --git a/docs/interfaces/ColoredCircle.html b/docs/interfaces/ColoredCircle.html index f856e72d..4119df37 100644 --- a/docs/interfaces/ColoredCircle.html +++ b/docs/interfaces/ColoredCircle.html @@ -1,5 +1,5 @@ -ColoredCircle | goban

    Interface ColoredCircle

    interface ColoredCircle {
        border_color?: string;
        border_width?: number;
        color: string;
        move: JGOFIntersection;
    }

    Properties

    border_color? +ColoredCircle | goban

    Interface ColoredCircle

    interface ColoredCircle {
        border_color?: string;
        border_width?: number;
        color: string;
        move: JGOFIntersection;
    }

    Properties

    border_color?: string
    border_width?: number
    color: string
    \ No newline at end of file +

    Properties

    border_color?: string
    border_width?: number
    color: string
    \ No newline at end of file diff --git a/docs/interfaces/ConditionalMoveResponseTree.html b/docs/interfaces/ConditionalMoveResponseTree.html index 8bfbebc8..03f0d722 100644 --- a/docs/interfaces/ConditionalMoveResponseTree.html +++ b/docs/interfaces/ConditionalMoveResponseTree.html @@ -1 +1 @@ -ConditionalMoveResponseTree | goban

    Interface ConditionalMoveResponseTree

    interface ConditionalMoveResponseTree {
        [move: string]: ConditionalMoveResponse;
    }

    Indexable

    [move: string]: ConditionalMoveResponse
    \ No newline at end of file +ConditionalMoveResponseTree | goban

    Interface ConditionalMoveResponseTree

    interface ConditionalMoveResponseTree {
        [move: string]: ConditionalMoveResponse;
    }

    Indexable

    [move: string]: ConditionalMoveResponse
    \ No newline at end of file diff --git a/docs/interfaces/GobanBounds.html b/docs/interfaces/GobanBounds.html index d4d87ef4..66b878be 100644 --- a/docs/interfaces/GobanBounds.html +++ b/docs/interfaces/GobanBounds.html @@ -1,5 +1,5 @@ -GobanBounds | goban

    Interface GobanBounds

    interface GobanBounds {
        bottom: number;
        left: number;
        right: number;
        top: number;
    }

    Properties

    bottom +GobanBounds | goban

    Interface GobanBounds

    interface GobanBounds {
        bottom: number;
        left: number;
        right: number;
        top: number;
    }

    Properties

    Properties

    bottom: number
    left: number
    right: number
    top: number
    \ No newline at end of file +

    Properties

    bottom: number
    left: number
    right: number
    top: number
    \ No newline at end of file diff --git a/docs/interfaces/GobanCallbacks.html b/docs/interfaces/GobanCallbacks.html index 9bd73383..3f72d434 100644 --- a/docs/interfaces/GobanCallbacks.html +++ b/docs/interfaces/GobanCallbacks.html @@ -1,4 +1,4 @@ -GobanCallbacks | goban

    Interface GobanCallbacks

    interface GobanCallbacks {
        addCoordinatesToChatInput?: ((coordinates) => void);
        canvasAllocationErrorHandler?: ((note, error, extra) => void);
        customBlackStoneColor?: (() => string);
        customBlackStoneUrl?: (() => string);
        customBlackTextColor?: (() => string);
        customBoardColor?: (() => string);
        customBoardLineColor?: (() => string);
        customBoardUrl?: (() => string);
        customWhiteStoneColor?: (() => string);
        customWhiteStoneUrl?: (() => string);
        customWhiteTextColor?: (() => string);
        defaultConfig?: (() => any);
        getCDNReleaseBase?: (() => string);
        getClockDrift?: (() => number);
        getCoordinateDisplaySystem?: (() => "A1" | "1-1");
        getLocation?: (() => string);
        getMoveTreeNumbering?: (() => "none" | "move-coordinates" | "move-number");
        getNetworkLatency?: (() => number);
        getSelectedThemes?: (() => GobanSelectedThemes);
        getShowUndoRequestIndicator?: (() => boolean);
        getShowVariationMoveNumbers?: (() => boolean);
        getSoundEnabled?: (() => boolean);
        getSoundVolume?: (() => number);
        getStoneFontScale?: (() => number);
        isAnalysisDisabled?: ((goban, perGameSettingAppliesToNonPlayers) => boolean);
        toast?: ((message_id, duration) => void);
        updateScoreEstimation?: ((est_winning_color, number_of_points) => void);
        watchSelectedThemes?: ((cb) => {
            remove: (() => any);
        });
    }

    Properties

    addCoordinatesToChatInput? +GobanCallbacks | goban

    Interface GobanCallbacks

    interface GobanCallbacks {
        addCoordinatesToChatInput?: ((coordinates) => void);
        canvasAllocationErrorHandler?: ((note, error, extra) => void);
        customBlackStoneColor?: (() => string);
        customBlackStoneUrl?: (() => string);
        customBlackTextColor?: (() => string);
        customBoardColor?: (() => string);
        customBoardLineColor?: (() => string);
        customBoardUrl?: (() => string);
        customWhiteStoneColor?: (() => string);
        customWhiteStoneUrl?: (() => string);
        customWhiteTextColor?: (() => string);
        defaultConfig?: (() => any);
        getCDNReleaseBase?: (() => string);
        getClockDrift?: (() => number);
        getCoordinateDisplaySystem?: (() => "A1" | "1-1");
        getLocation?: (() => string);
        getMoveTreeNumbering?: (() => "none" | "move-coordinates" | "move-number");
        getNetworkLatency?: (() => number);
        getSelectedThemes?: (() => GobanSelectedThemes);
        getShowUndoRequestIndicator?: (() => boolean);
        getShowVariationMoveNumbers?: (() => boolean);
        getSoundEnabled?: (() => boolean);
        getSoundVolume?: (() => number);
        getStoneFontScale?: (() => number);
        isAnalysisDisabled?: ((goban, perGameSettingAppliesToNonPlayers) => boolean);
        toast?: ((message_id, duration) => void);
        updateScoreEstimation?: ((est_winning_color, number_of_points) => void);
        watchSelectedThemes?: ((cb) => {
            remove: (() => any);
        });
    }

    Properties

    addCoordinatesToChatInput?: ((coordinates) => void)

    Type declaration

      • (coordinates): void
      • Parameters

        • coordinates: string

        Returns void

    canvasAllocationErrorHandler?: ((note, error, extra) => void)

    Type declaration

      • (note, error, extra): void
      • Parameters

        • note: null | string
        • error: Error
        • extra: {
              height?: string | number;
              total_allocations_made: number;
              total_pixels_allocated: number;
              width?: string | number;
          }
          • Optional height?: string | number
          • total_allocations_made: number
          • total_pixels_allocated: number
          • Optional width?: string | number

        Returns void

    customBlackStoneColor?: (() => string)

    Type declaration

      • (): string
      • Returns string

    customBlackStoneUrl?: (() => string)

    Type declaration

      • (): string
      • Returns string

    customBlackTextColor?: (() => string)

    Type declaration

      • (): string
      • Returns string

    customBoardColor?: (() => string)

    Type declaration

      • (): string
      • Returns string

    customBoardLineColor?: (() => string)

    Type declaration

      • (): string
      • Returns string

    customBoardUrl?: (() => string)

    Type declaration

      • (): string
      • Returns string

    customWhiteStoneColor?: (() => string)

    Type declaration

      • (): string
      • Returns string

    customWhiteStoneUrl?: (() => string)

    Type declaration

      • (): string
      • Returns string

    customWhiteTextColor?: (() => string)

    Type declaration

      • (): string
      • Returns string

    defaultConfig?: (() => any)

    Type declaration

      • (): any
      • Returns any

    getCDNReleaseBase?: (() => string)

    Type declaration

      • (): string
      • Returns string

    getClockDrift?: (() => number)

    Type declaration

      • (): number
      • Returns number

    getCoordinateDisplaySystem?: (() => "A1" | "1-1")

    Type declaration

      • (): "A1" | "1-1"
      • Returns "A1" | "1-1"

    getLocation?: (() => string)

    Type declaration

      • (): string
      • Returns string

    getMoveTreeNumbering?: (() => "none" | "move-coordinates" | "move-number")

    Type declaration

      • (): "none" | "move-coordinates" | "move-number"
      • Returns "none" | "move-coordinates" | "move-number"

    getNetworkLatency?: (() => number)

    Type declaration

      • (): number
      • Returns number

    getSelectedThemes?: (() => GobanSelectedThemes)

    Type declaration

    getShowUndoRequestIndicator?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    getShowVariationMoveNumbers?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    getSoundEnabled?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    getSoundVolume?: (() => number)

    Type declaration

      • (): number
      • Returns number

    getStoneFontScale?: (() => number)

    Type declaration

      • (): number
      • Returns number

    isAnalysisDisabled?: ((goban, perGameSettingAppliesToNonPlayers) => boolean)

    Type declaration

      • (goban, perGameSettingAppliesToNonPlayers): boolean
      • Parameters

        • goban: GobanBase
        • perGameSettingAppliesToNonPlayers: boolean

        Returns boolean

    toast?: ((message_id, duration) => void)

    Type declaration

      • (message_id, duration): void
      • Parameters

        • message_id: string
        • duration: number

        Returns void

    updateScoreEstimation?: ((est_winning_color, number_of_points) => void)

    Type declaration

      • (est_winning_color, number_of_points): void
      • Parameters

        • est_winning_color: "black" | "white"
        • number_of_points: number

        Returns void

    watchSelectedThemes?: ((cb) => {
        remove: (() => any);
    })

    Type declaration

      • (cb): {
            remove: (() => any);
        }
      • Parameters

        Returns {
            remove: (() => any);
        }

        • remove: (() => any)
            • (): any
            • Returns any

    \ No newline at end of file +

    Properties

    addCoordinatesToChatInput?: ((coordinates) => void)

    Type declaration

      • (coordinates): void
      • Parameters

        • coordinates: string

        Returns void

    canvasAllocationErrorHandler?: ((note, error, extra) => void)

    Type declaration

      • (note, error, extra): void
      • Parameters

        • note: null | string
        • error: Error
        • extra: {
              height?: string | number;
              total_allocations_made: number;
              total_pixels_allocated: number;
              width?: string | number;
          }
          • Optional height?: string | number
          • total_allocations_made: number
          • total_pixels_allocated: number
          • Optional width?: string | number

        Returns void

    customBlackStoneColor?: (() => string)

    Type declaration

      • (): string
      • Returns string

    customBlackStoneUrl?: (() => string)

    Type declaration

      • (): string
      • Returns string

    customBlackTextColor?: (() => string)

    Type declaration

      • (): string
      • Returns string

    customBoardColor?: (() => string)

    Type declaration

      • (): string
      • Returns string

    customBoardLineColor?: (() => string)

    Type declaration

      • (): string
      • Returns string

    customBoardUrl?: (() => string)

    Type declaration

      • (): string
      • Returns string

    customWhiteStoneColor?: (() => string)

    Type declaration

      • (): string
      • Returns string

    customWhiteStoneUrl?: (() => string)

    Type declaration

      • (): string
      • Returns string

    customWhiteTextColor?: (() => string)

    Type declaration

      • (): string
      • Returns string

    defaultConfig?: (() => any)

    Type declaration

      • (): any
      • Returns any

    getCDNReleaseBase?: (() => string)

    Type declaration

      • (): string
      • Returns string

    getClockDrift?: (() => number)

    Type declaration

      • (): number
      • Returns number

    getCoordinateDisplaySystem?: (() => "A1" | "1-1")

    Type declaration

      • (): "A1" | "1-1"
      • Returns "A1" | "1-1"

    getLocation?: (() => string)

    Type declaration

      • (): string
      • Returns string

    getMoveTreeNumbering?: (() => "none" | "move-coordinates" | "move-number")

    Type declaration

      • (): "none" | "move-coordinates" | "move-number"
      • Returns "none" | "move-coordinates" | "move-number"

    getNetworkLatency?: (() => number)

    Type declaration

      • (): number
      • Returns number

    getSelectedThemes?: (() => GobanSelectedThemes)

    Type declaration

    getShowUndoRequestIndicator?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    getShowVariationMoveNumbers?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    getSoundEnabled?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    getSoundVolume?: (() => number)

    Type declaration

      • (): number
      • Returns number

    getStoneFontScale?: (() => number)

    Type declaration

      • (): number
      • Returns number

    isAnalysisDisabled?: ((goban, perGameSettingAppliesToNonPlayers) => boolean)

    Type declaration

      • (goban, perGameSettingAppliesToNonPlayers): boolean
      • Parameters

        • goban: GobanBase
        • perGameSettingAppliesToNonPlayers: boolean

        Returns boolean

    toast?: ((message_id, duration) => void)

    Type declaration

      • (message_id, duration): void
      • Parameters

        • message_id: string
        • duration: number

        Returns void

    updateScoreEstimation?: ((est_winning_color, number_of_points) => void)

    Type declaration

      • (est_winning_color, number_of_points): void
      • Parameters

        • est_winning_color: "black" | "white"
        • number_of_points: number

        Returns void

    watchSelectedThemes?: ((cb) => {
        remove: (() => any);
    })

    Type declaration

      • (cb): {
            remove: (() => any);
        }
      • Parameters

        Returns {
            remove: (() => any);
        }

        • remove: (() => any)
            • (): any
            • Returns any

    \ No newline at end of file diff --git a/docs/interfaces/GobanCanvasInterface.html b/docs/interfaces/GobanCanvasInterface.html index 2617d0ce..e7d37efa 100644 --- a/docs/interfaces/GobanCanvasInterface.html +++ b/docs/interfaces/GobanCanvasInterface.html @@ -1,4 +1,4 @@ -GobanCanvasInterface | goban

    Interface GobanCanvasInterface

    interface GobanCanvasInterface {
        engine: GobanEngine;
        move_tree_container?: HTMLElement;
        clearAnalysisDrawing(): void;
        clearMessage(): void;
        destroy(): void;
        disablePen(): void;
        drawPenMarks(pen_marks): void;
        drawSquare(i, j): void;
        enablePen(): void;
        move_tree_bindCanvasEvents(canvas): void;
        move_tree_redraw(no_warp?): void;
        setByoYomiLabel(label): void;
        setLastMoveOpacity(opacity): void;
        setMoveTreeContainer(container): void;
        showMessage(message_id_or_error, parameters?, timeout?): void;
    }

    Implemented by

    Properties

    engine +GobanCanvasInterface | goban

    Interface GobanCanvasInterface

    interface GobanCanvasInterface {
        engine: GobanEngine;
        move_tree_container?: HTMLElement;
        clearAnalysisDrawing(): void;
        clearMessage(): void;
        destroy(): void;
        disablePen(): void;
        drawPenMarks(pen_marks): void;
        drawSquare(i, j): void;
        enablePen(): void;
        move_tree_bindCanvasEvents(canvas): void;
        move_tree_redraw(no_warp?): void;
        setByoYomiLabel(label): void;
        setLastMoveOpacity(opacity): void;
        setMoveTreeContainer(container): void;
        showMessage(message_id_or_error, parameters?, timeout?): void;
    }

    Implemented by

    Properties

    engine: GobanEngine
    move_tree_container?: HTMLElement

    Methods

    • Parameters

      • message_id_or_error: MessageID
      • Optional parameters: {
            [key: string]: any;
        }
        • [key: string]: any
      • Optional timeout: number

      Returns void

    \ No newline at end of file +

    Properties

    engine: GobanEngine
    move_tree_container?: HTMLElement

    Methods

    • Parameters

      • message_id_or_error: MessageID
      • Optional parameters: {
            [key: string]: any;
        }
        • [key: string]: any
      • Optional timeout: number

      Returns void

    \ No newline at end of file diff --git a/docs/interfaces/GobanConfig.html b/docs/interfaces/GobanConfig.html index 235a6f22..74909479 100644 --- a/docs/interfaces/GobanConfig.html +++ b/docs/interfaces/GobanConfig.html @@ -1,4 +1,4 @@ -GobanConfig | goban

    Interface GobanConfig

    interface GobanConfig {
        aga_handicap_scoring?: boolean;
        allow_ko?: boolean;
        allow_self_capture?: boolean;
        allow_superko?: boolean;
        auth?: string;
        automatic_stone_removal?: boolean;
        black_player_id?: number;
        black_prisoners?: number;
        board?: JGOFNumericPlayerColor[][];
        board_is_repeating?: boolean;
        bounds?: GobanBounds;
        chat_log?: GobanChatLog;
        circle_radius?: number;
        clock?: GameClock;
        connect_to_chat?: number | boolean;
        disable_analysis?: boolean;
        display_width?: number;
        dont_draw_last_move?: boolean;
        dont_show_messages?: boolean;
        double_click_submit?: boolean;
        draw_bottom_labels?: boolean;
        draw_left_labels?: boolean;
        draw_right_labels?: boolean;
        draw_top_labels?: boolean;
        end_time?: number;
        errors?: {
            error: string;
            stack: any;
        }[];
        free_handicap_placement?: boolean;
        game_date?: string;
        game_id?: string | number;
        game_name?: string;
        game_type?: "temporary";
        getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting);
        group_ids?: number[];
        handicap?: number;
        handicap_rank_difference?: number;
        height?: number;
        initial_player?: PlayerColor;
        initial_state?: GobanEngineInitialState;
        interactive?: boolean;
        isInPushedAnalysis?: (() => boolean);
        isPlayerController?: (() => boolean);
        isPlayerOwner?: (() => boolean);
        is_game_record?: boolean;
        isobranch_hash?: string;
        komi?: number;
        ladder?: number;
        ladder_id?: number;
        last_move_radius?: number;
        latencies?: {
            [player_id: string]: number;
        };
        leavePushedAnalysis?: (() => void);
        malkovich_log?: GobanChatLog;
        marks?: {
            [mark: string]: string;
        };
        mode?: GobanModes;
        move_tree?: MoveTreeJson;
        moves?: GobanMovesArray;
        name?: string;
        needs_sealing?: JGOFSealingIntersection[];
        ogs?: {
            black_dead_stones: string;
            black_seki_eyes: string;
            black_stones: string;
            black_territory: string;
            white_dead_stones: string;
            white_seki_eyes: string;
            white_stones: string;
            white_territory: string;
        };
        ogs_import?: boolean;
        onError?: ((err) => void);
        onScoreEstimationUpdated?: ((winning_color, points) => void);
        one_click_submit?: boolean;
        opponent_plays_first_after_resume?: boolean;
        original_disable_analysis?: boolean;
        original_sgf?: string;
        outcome?: string;
        pause_control?: AdHocPauseControl;
        paused_since?: number;
        phase?: GobanEnginePhase;
        player?: JGOFNumericPlayerColor;
        player_id?: number;
        player_pool?: {
            [id: number]: GobanEnginePlayerEntry;
        };
        players?: {
            black: GobanEnginePlayerEntry;
            white: GobanEnginePlayerEntry;
        };
        puzzle_autoplace_delay?: number;
        puzzle_collection?: number;
        puzzle_description?: string;
        puzzle_opponent_move_mode?: PuzzleOpponentMoveMode;
        puzzle_player_move_mode?: PuzzlePlayerMoveMode;
        puzzle_rank?: number;
        puzzle_type?: string;
        ranked?: boolean;
        removal?: boolean[][];
        removed?: string | JGOFMove[];
        rengo?: boolean;
        rengo_casual_mode?: boolean;
        rengo_teams?: {
            black: GobanEnginePlayerEntry[];
            white: GobanEnginePlayerEntry[];
        };
        review_id?: number;
        reviews?: {
            [review_id: number]: GobanEnginePlayerEntry;
        };
        rules?: GobanEngineRules;
        score?: Score;
        score_handicap?: boolean;
        score_passes?: boolean;
        score_prisoners?: boolean;
        score_stones?: boolean;
        score_territory?: boolean;
        score_territory_in_seki?: boolean;
        server_socket?: GobanSocket<ClientToServer, ServerToClient>;
        spectator_log?: GobanChatLog;
        square_size?: number | "auto" | ((goban) => number);
        stalling_score_estimate?: StallingScoreEstimate;
        start_time?: number;
        stone_font_scale?: number;
        strict_seki_mode?: boolean;
        superko_algorithm?: GobanEngineSuperKoAlgorithm;
        throw_all_errors?: boolean;
        time_control?: JGOFTimeControl;
        time_per_move?: number;
        tournament_id?: number;
        username?: string;
        variation_stone_opacity?: number;
        white_must_pass_last?: boolean;
        white_player_id?: number;
        white_prisoners?: number;
        width?: number;
        winner?: number | "black" | "white";
    }

    Hierarchy (view full)

    Properties

    aga_handicap_scoring? +GobanConfig | goban

    Interface GobanConfig

    interface GobanConfig {
        aga_handicap_scoring?: boolean;
        allow_ko?: boolean;
        allow_self_capture?: boolean;
        allow_superko?: boolean;
        auth?: string;
        automatic_stone_removal?: boolean;
        black_player_id?: number;
        black_prisoners?: number;
        board?: JGOFNumericPlayerColor[][];
        board_is_repeating?: boolean;
        bounds?: GobanBounds;
        chat_log?: GobanChatLog;
        circle_radius?: number;
        clock?: GameClock;
        connect_to_chat?: number | boolean;
        disable_analysis?: boolean;
        display_width?: number;
        dont_draw_last_move?: boolean;
        dont_show_messages?: boolean;
        double_click_submit?: boolean;
        draw_bottom_labels?: boolean;
        draw_left_labels?: boolean;
        draw_right_labels?: boolean;
        draw_top_labels?: boolean;
        end_time?: number;
        errors?: {
            error: string;
            stack: any;
        }[];
        free_handicap_placement?: boolean;
        game_date?: string;
        game_id?: string | number;
        game_name?: string;
        game_type?: "temporary";
        getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting);
        group_ids?: number[];
        handicap?: number;
        handicap_rank_difference?: number;
        height?: number;
        initial_player?: PlayerColor;
        initial_state?: GobanEngineInitialState;
        interactive?: boolean;
        isInPushedAnalysis?: (() => boolean);
        isPlayerController?: (() => boolean);
        isPlayerOwner?: (() => boolean);
        is_game_record?: boolean;
        isobranch_hash?: string;
        komi?: number;
        ladder?: number;
        ladder_id?: number;
        last_move_radius?: number;
        latencies?: {
            [player_id: string]: number;
        };
        leavePushedAnalysis?: (() => void);
        malkovich_log?: GobanChatLog;
        marks?: {
            [mark: string]: string;
        };
        mode?: GobanModes;
        move_tree?: MoveTreeJson;
        moves?: GobanMovesArray;
        name?: string;
        needs_sealing?: JGOFSealingIntersection[];
        ogs?: {
            black_dead_stones: string;
            black_seki_eyes: string;
            black_stones: string;
            black_territory: string;
            white_dead_stones: string;
            white_seki_eyes: string;
            white_stones: string;
            white_territory: string;
        };
        ogs_import?: boolean;
        onError?: ((err) => void);
        onScoreEstimationUpdated?: ((winning_color, points) => void);
        one_click_submit?: boolean;
        opponent_plays_first_after_resume?: boolean;
        original_disable_analysis?: boolean;
        original_sgf?: string;
        outcome?: string;
        pause_control?: AdHocPauseControl;
        paused_since?: number;
        phase?: GobanEnginePhase;
        player?: JGOFNumericPlayerColor;
        player_id?: number;
        player_pool?: {
            [id: number]: GobanEnginePlayerEntry;
        };
        players?: {
            black: GobanEnginePlayerEntry;
            white: GobanEnginePlayerEntry;
        };
        puzzle_autoplace_delay?: number;
        puzzle_collection?: number;
        puzzle_description?: string;
        puzzle_opponent_move_mode?: PuzzleOpponentMoveMode;
        puzzle_player_move_mode?: PuzzlePlayerMoveMode;
        puzzle_rank?: number;
        puzzle_type?: string;
        ranked?: boolean;
        removal?: boolean[][];
        removed?: string | JGOFMove[];
        rengo?: boolean;
        rengo_casual_mode?: boolean;
        rengo_teams?: {
            black: GobanEnginePlayerEntry[];
            white: GobanEnginePlayerEntry[];
        };
        review_id?: number;
        reviews?: {
            [review_id: number]: GobanEnginePlayerEntry;
        };
        rules?: GobanEngineRules;
        score?: Score;
        score_handicap?: boolean;
        score_passes?: boolean;
        score_prisoners?: boolean;
        score_stones?: boolean;
        score_territory?: boolean;
        score_territory_in_seki?: boolean;
        server_socket?: GobanSocket<ClientToServer, ServerToClient>;
        spectator_log?: GobanChatLog;
        square_size?: number | "auto" | ((goban) => number);
        stalling_score_estimate?: StallingScoreEstimate;
        start_time?: number;
        stone_font_scale?: number;
        strict_seki_mode?: boolean;
        superko_algorithm?: GobanEngineSuperKoAlgorithm;
        throw_all_errors?: boolean;
        time_control?: JGOFTimeControl;
        time_per_move?: number;
        tournament_id?: number;
        username?: string;
        variation_stone_opacity?: number;
        white_must_pass_last?: boolean;
        white_player_id?: number;
        white_prisoners?: number;
        width?: number;
        winner?: number | "black" | "white";
    }

    Hierarchy (view full)

    Properties

    aga_handicap_scoring?: boolean
    allow_ko?: boolean
    allow_self_capture?: boolean
    allow_superko?: boolean
    auth?: string
    automatic_stone_removal?: boolean
    black_player_id?: number
    black_prisoners?: number
    board_is_repeating?: boolean
    bounds?: GobanBounds
    chat_log?: GobanChatLog
    circle_radius?: number
    clock?: GameClock
    connect_to_chat?: number | boolean
    disable_analysis?: boolean
    display_width?: number
    dont_draw_last_move?: boolean
    dont_show_messages?: boolean
    double_click_submit?: boolean
    draw_bottom_labels?: boolean
    draw_left_labels?: boolean
    draw_right_labels?: boolean
    draw_top_labels?: boolean
    end_time?: number
    errors?: {
        error: string;
        stack: any;
    }[]

    Type declaration

    • error: string
    • stack: any
    free_handicap_placement?: boolean
    game_date?: string
    game_id?: string | number
    game_name?: string
    game_type?: "temporary"
    getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting)
    group_ids?: number[]
    handicap?: number
    handicap_rank_difference?: number
    height?: number
    initial_player?: PlayerColor
    initial_state?: GobanEngineInitialState
    interactive?: boolean
    isInPushedAnalysis?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerController?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerOwner?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    is_game_record?: boolean
    isobranch_hash?: string
    komi?: number
    ladder?: number
    ladder_id?: number
    last_move_radius?: number
    latencies?: {
        [player_id: string]: number;
    }

    Type declaration

    • [player_id: string]: number
    leavePushedAnalysis?: (() => void)

    Type declaration

      • (): void
      • Returns void

    malkovich_log?: GobanChatLog
    marks?: {
        [mark: string]: string;
    }

    Type declaration

    • [mark: string]: string
    mode?: GobanModes
    move_tree?: MoveTreeJson
    name?: string
    needs_sealing?: JGOFSealingIntersection[]

    Intersections that need to be sealed before scoring should happen

    -
    ogs?: {
        black_dead_stones: string;
        black_seki_eyes: string;
        black_stones: string;
        black_territory: string;
        white_dead_stones: string;
        white_seki_eyes: string;
        white_stones: string;
        white_territory: string;
    }

    Type declaration

    • black_dead_stones: string
    • black_seki_eyes: string
    • black_stones: string
    • black_territory: string
    • white_dead_stones: string
    • white_seki_eyes: string
    • white_stones: string
    • white_territory: string
    ogs_import?: boolean

    Deprecated, I don't think we need this anymore, but need to be sure

    -
    onError?: ((err) => void)

    Type declaration

      • (err): void
      • Parameters

        • err: Error

        Returns void

    onScoreEstimationUpdated?: ((winning_color, points) => void)

    Type declaration

      • (winning_color, points): void
      • Parameters

        • winning_color: "black" | "white"
        • points: number

        Returns void

    one_click_submit?: boolean
    opponent_plays_first_after_resume?: boolean
    original_disable_analysis?: boolean
    original_sgf?: string
    outcome?: string
    pause_control?: AdHocPauseControl
    paused_since?: number
    player_id?: number
    player_pool?: {
        [id: number]: GobanEnginePlayerEntry;
    }

    Type declaration

    players?: {
        black: GobanEnginePlayerEntry;
        white: GobanEnginePlayerEntry;
    }

    Type declaration

    puzzle_autoplace_delay?: number
    puzzle_collection?: number
    puzzle_description?: string
    puzzle_opponent_move_mode?: PuzzleOpponentMoveMode
    puzzle_player_move_mode?: PuzzlePlayerMoveMode
    puzzle_rank?: number
    puzzle_type?: string
    ranked?: boolean
    removal?: boolean[][]
    removed?: string | JGOFMove[]

    Removed stones in stone removal phase +

    Properties

    aga_handicap_scoring?: boolean
    allow_ko?: boolean
    allow_self_capture?: boolean
    allow_superko?: boolean
    auth?: string
    automatic_stone_removal?: boolean
    black_player_id?: number
    black_prisoners?: number
    board_is_repeating?: boolean
    bounds?: GobanBounds
    chat_log?: GobanChatLog
    circle_radius?: number
    clock?: GameClock
    connect_to_chat?: number | boolean
    disable_analysis?: boolean
    display_width?: number
    dont_draw_last_move?: boolean
    dont_show_messages?: boolean
    double_click_submit?: boolean
    draw_bottom_labels?: boolean
    draw_left_labels?: boolean
    draw_right_labels?: boolean
    draw_top_labels?: boolean
    end_time?: number
    errors?: {
        error: string;
        stack: any;
    }[]

    Type declaration

    • error: string
    • stack: any
    free_handicap_placement?: boolean
    game_date?: string
    game_id?: string | number
    game_name?: string
    game_type?: "temporary"
    getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting)
    group_ids?: number[]
    handicap?: number
    handicap_rank_difference?: number
    height?: number
    initial_player?: PlayerColor
    initial_state?: GobanEngineInitialState
    interactive?: boolean
    isInPushedAnalysis?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerController?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerOwner?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    is_game_record?: boolean
    isobranch_hash?: string
    komi?: number
    ladder?: number
    ladder_id?: number
    last_move_radius?: number
    latencies?: {
        [player_id: string]: number;
    }

    Type declaration

    • [player_id: string]: number
    leavePushedAnalysis?: (() => void)

    Type declaration

      • (): void
      • Returns void

    malkovich_log?: GobanChatLog
    marks?: {
        [mark: string]: string;
    }

    Type declaration

    • [mark: string]: string
    mode?: GobanModes
    move_tree?: MoveTreeJson
    name?: string
    needs_sealing?: JGOFSealingIntersection[]

    Intersections that need to be sealed before scoring should happen

    +
    ogs?: {
        black_dead_stones: string;
        black_seki_eyes: string;
        black_stones: string;
        black_territory: string;
        white_dead_stones: string;
        white_seki_eyes: string;
        white_stones: string;
        white_territory: string;
    }

    Type declaration

    • black_dead_stones: string
    • black_seki_eyes: string
    • black_stones: string
    • black_territory: string
    • white_dead_stones: string
    • white_seki_eyes: string
    • white_stones: string
    • white_territory: string
    ogs_import?: boolean

    Deprecated, I don't think we need this anymore, but need to be sure

    +
    onError?: ((err) => void)

    Type declaration

      • (err): void
      • Parameters

        • err: Error

        Returns void

    onScoreEstimationUpdated?: ((winning_color, points) => void)

    Type declaration

      • (winning_color, points): void
      • Parameters

        • winning_color: "black" | "white"
        • points: number

        Returns void

    one_click_submit?: boolean
    opponent_plays_first_after_resume?: boolean
    original_disable_analysis?: boolean
    original_sgf?: string
    outcome?: string
    pause_control?: AdHocPauseControl
    paused_since?: number
    player_id?: number
    player_pool?: {
        [id: number]: GobanEnginePlayerEntry;
    }

    Type declaration

    players?: {
        black: GobanEnginePlayerEntry;
        white: GobanEnginePlayerEntry;
    }

    Type declaration

    puzzle_autoplace_delay?: number
    puzzle_collection?: number
    puzzle_description?: string
    puzzle_opponent_move_mode?: PuzzleOpponentMoveMode
    puzzle_player_move_mode?: PuzzlePlayerMoveMode
    puzzle_rank?: number
    puzzle_type?: string
    ranked?: boolean
    removal?: boolean[][]
    removed?: string | JGOFMove[]

    Removed stones in stone removal phase Passing an array of JGOFMove objects is preferred, the string format exists for historical backwards compatibility. It is an encoded move string, e.g. "aa" for A19

    -
    rengo?: boolean
    rengo_casual_mode?: boolean
    rengo_teams?: {
        black: GobanEnginePlayerEntry[];
        white: GobanEnginePlayerEntry[];
    }

    Type declaration

    review_id?: number
    reviews?: {
        [review_id: number]: GobanEnginePlayerEntry;
    }

    Type declaration

    score?: Score
    score_handicap?: boolean
    score_passes?: boolean
    score_prisoners?: boolean
    score_stones?: boolean
    score_territory?: boolean
    score_territory_in_seki?: boolean
    spectator_log?: GobanChatLog
    square_size?: number | "auto" | ((goban) => number)

    Type declaration

      • (goban): number
      • Parameters

        Returns number

    stalling_score_estimate?: StallingScoreEstimate
    start_time?: number
    stone_font_scale?: number
    strict_seki_mode?: boolean
    superko_algorithm?: GobanEngineSuperKoAlgorithm
    throw_all_errors?: boolean

    When loading initial state or moves, by default GobanEngine will try and +

    rengo?: boolean
    rengo_casual_mode?: boolean
    rengo_teams?: {
        black: GobanEnginePlayerEntry[];
        white: GobanEnginePlayerEntry[];
    }

    Type declaration

    review_id?: number
    reviews?: {
        [review_id: number]: GobanEnginePlayerEntry;
    }

    Type declaration

    score?: Score
    score_handicap?: boolean
    score_passes?: boolean
    score_prisoners?: boolean
    score_stones?: boolean
    score_territory?: boolean
    score_territory_in_seki?: boolean
    spectator_log?: GobanChatLog
    square_size?: number | "auto" | ((goban) => number)

    Type declaration

      • (goban): number
      • Parameters

        Returns number

    stalling_score_estimate?: StallingScoreEstimate
    start_time?: number
    stone_font_scale?: number
    strict_seki_mode?: boolean
    superko_algorithm?: GobanEngineSuperKoAlgorithm
    throw_all_errors?: boolean

    When loading initial state or moves, by default GobanEngine will try and handle bad data by just resorting to 'edit placing' moves. If this is true, then those errors are thrown instead.

    -
    time_control?: JGOFTimeControl
    time_per_move?: number
    tournament_id?: number
    username?: string
    variation_stone_opacity?: number
    white_must_pass_last?: boolean
    white_player_id?: number
    white_prisoners?: number
    width?: number
    winner?: number | "black" | "white"
    \ No newline at end of file +
    time_control?: JGOFTimeControl
    time_per_move?: number
    tournament_id?: number
    username?: string
    variation_stone_opacity?: number
    white_must_pass_last?: boolean
    white_player_id?: number
    white_prisoners?: number
    width?: number
    winner?: number | "black" | "white"
    \ No newline at end of file diff --git a/docs/interfaces/GobanEngineConfig.html b/docs/interfaces/GobanEngineConfig.html index f4523720..274ac614 100644 --- a/docs/interfaces/GobanEngineConfig.html +++ b/docs/interfaces/GobanEngineConfig.html @@ -1,4 +1,4 @@ -GobanEngineConfig | goban

    Interface GobanEngineConfig

    interface GobanEngineConfig {
        aga_handicap_scoring?: boolean;
        allow_ko?: boolean;
        allow_self_capture?: boolean;
        allow_superko?: boolean;
        automatic_stone_removal?: boolean;
        black_player_id?: number;
        black_prisoners?: number;
        board?: JGOFNumericPlayerColor[][];
        board_is_repeating?: boolean;
        clock?: GameClock;
        disable_analysis?: boolean;
        end_time?: number;
        errors?: {
            error: string;
            stack: any;
        }[];
        free_handicap_placement?: boolean;
        game_date?: string;
        game_id?: string | number;
        game_name?: string;
        group_ids?: number[];
        handicap?: number;
        handicap_rank_difference?: number;
        height?: number;
        initial_player?: PlayerColor;
        initial_state?: GobanEngineInitialState;
        is_game_record?: boolean;
        isobranch_hash?: string;
        komi?: number;
        ladder?: number;
        ladder_id?: number;
        latencies?: {
            [player_id: string]: number;
        };
        marks?: {
            [mark: string]: string;
        };
        move_tree?: MoveTreeJson;
        moves?: GobanMovesArray;
        needs_sealing?: JGOFSealingIntersection[];
        ogs?: {
            black_dead_stones: string;
            black_seki_eyes: string;
            black_stones: string;
            black_territory: string;
            white_dead_stones: string;
            white_seki_eyes: string;
            white_stones: string;
            white_territory: string;
        };
        ogs_import?: boolean;
        opponent_plays_first_after_resume?: boolean;
        original_disable_analysis?: boolean;
        original_sgf?: string;
        outcome?: string;
        phase?: GobanEnginePhase;
        player?: JGOFNumericPlayerColor;
        player_id?: number;
        player_pool?: {
            [id: number]: GobanEnginePlayerEntry;
        };
        players?: {
            black: GobanEnginePlayerEntry;
            white: GobanEnginePlayerEntry;
        };
        ranked?: boolean;
        removal?: boolean[][];
        removed?: string | JGOFMove[];
        rengo?: boolean;
        rengo_casual_mode?: boolean;
        rengo_teams?: {
            black: GobanEnginePlayerEntry[];
            white: GobanEnginePlayerEntry[];
        };
        review_id?: number;
        reviews?: {
            [review_id: number]: GobanEnginePlayerEntry;
        };
        rules?: GobanEngineRules;
        score?: Score;
        score_handicap?: boolean;
        score_passes?: boolean;
        score_prisoners?: boolean;
        score_stones?: boolean;
        score_territory?: boolean;
        score_territory_in_seki?: boolean;
        stalling_score_estimate?: StallingScoreEstimate;
        start_time?: number;
        strict_seki_mode?: boolean;
        superko_algorithm?: GobanEngineSuperKoAlgorithm;
        throw_all_errors?: boolean;
        time_control?: JGOFTimeControl;
        time_per_move?: number;
        tournament_id?: number;
        white_must_pass_last?: boolean;
        white_player_id?: number;
        white_prisoners?: number;
        width?: number;
        winner?: number | "black" | "white";
    }

    Hierarchy (view full)

    Properties

    aga_handicap_scoring? +GobanEngineConfig | goban

    Interface GobanEngineConfig

    interface GobanEngineConfig {
        aga_handicap_scoring?: boolean;
        allow_ko?: boolean;
        allow_self_capture?: boolean;
        allow_superko?: boolean;
        automatic_stone_removal?: boolean;
        black_player_id?: number;
        black_prisoners?: number;
        board?: JGOFNumericPlayerColor[][];
        board_is_repeating?: boolean;
        clock?: GameClock;
        disable_analysis?: boolean;
        end_time?: number;
        errors?: {
            error: string;
            stack: any;
        }[];
        free_handicap_placement?: boolean;
        game_date?: string;
        game_id?: string | number;
        game_name?: string;
        group_ids?: number[];
        handicap?: number;
        handicap_rank_difference?: number;
        height?: number;
        initial_player?: PlayerColor;
        initial_state?: GobanEngineInitialState;
        is_game_record?: boolean;
        isobranch_hash?: string;
        komi?: number;
        ladder?: number;
        ladder_id?: number;
        latencies?: {
            [player_id: string]: number;
        };
        marks?: {
            [mark: string]: string;
        };
        move_tree?: MoveTreeJson;
        moves?: GobanMovesArray;
        needs_sealing?: JGOFSealingIntersection[];
        ogs?: {
            black_dead_stones: string;
            black_seki_eyes: string;
            black_stones: string;
            black_territory: string;
            white_dead_stones: string;
            white_seki_eyes: string;
            white_stones: string;
            white_territory: string;
        };
        ogs_import?: boolean;
        opponent_plays_first_after_resume?: boolean;
        original_disable_analysis?: boolean;
        original_sgf?: string;
        outcome?: string;
        phase?: GobanEnginePhase;
        player?: JGOFNumericPlayerColor;
        player_id?: number;
        player_pool?: {
            [id: number]: GobanEnginePlayerEntry;
        };
        players?: {
            black: GobanEnginePlayerEntry;
            white: GobanEnginePlayerEntry;
        };
        ranked?: boolean;
        removal?: boolean[][];
        removed?: string | JGOFMove[];
        rengo?: boolean;
        rengo_casual_mode?: boolean;
        rengo_teams?: {
            black: GobanEnginePlayerEntry[];
            white: GobanEnginePlayerEntry[];
        };
        review_id?: number;
        reviews?: {
            [review_id: number]: GobanEnginePlayerEntry;
        };
        rules?: GobanEngineRules;
        score?: Score;
        score_handicap?: boolean;
        score_passes?: boolean;
        score_prisoners?: boolean;
        score_stones?: boolean;
        score_territory?: boolean;
        score_territory_in_seki?: boolean;
        stalling_score_estimate?: StallingScoreEstimate;
        start_time?: number;
        strict_seki_mode?: boolean;
        superko_algorithm?: GobanEngineSuperKoAlgorithm;
        throw_all_errors?: boolean;
        time_control?: JGOFTimeControl;
        time_per_move?: number;
        tournament_id?: number;
        white_must_pass_last?: boolean;
        white_player_id?: number;
        white_prisoners?: number;
        width?: number;
        winner?: number | "black" | "white";
    }

    Hierarchy (view full)

    Properties

    aga_handicap_scoring?: boolean
    allow_ko?: boolean
    allow_self_capture?: boolean
    allow_superko?: boolean
    automatic_stone_removal?: boolean
    black_player_id?: number
    black_prisoners?: number
    board_is_repeating?: boolean
    clock?: GameClock
    disable_analysis?: boolean
    end_time?: number
    errors?: {
        error: string;
        stack: any;
    }[]

    Type declaration

    • error: string
    • stack: any
    free_handicap_placement?: boolean
    game_date?: string
    game_id?: string | number
    game_name?: string
    group_ids?: number[]
    handicap?: number
    handicap_rank_difference?: number
    height?: number
    initial_player?: PlayerColor
    initial_state?: GobanEngineInitialState
    is_game_record?: boolean
    isobranch_hash?: string
    komi?: number
    ladder?: number
    ladder_id?: number
    latencies?: {
        [player_id: string]: number;
    }

    Type declaration

    • [player_id: string]: number
    marks?: {
        [mark: string]: string;
    }

    Type declaration

    • [mark: string]: string
    move_tree?: MoveTreeJson
    needs_sealing?: JGOFSealingIntersection[]

    Intersections that need to be sealed before scoring should happen

    -
    ogs?: {
        black_dead_stones: string;
        black_seki_eyes: string;
        black_stones: string;
        black_territory: string;
        white_dead_stones: string;
        white_seki_eyes: string;
        white_stones: string;
        white_territory: string;
    }

    Type declaration

    • black_dead_stones: string
    • black_seki_eyes: string
    • black_stones: string
    • black_territory: string
    • white_dead_stones: string
    • white_seki_eyes: string
    • white_stones: string
    • white_territory: string
    ogs_import?: boolean

    Deprecated, I don't think we need this anymore, but need to be sure

    -
    opponent_plays_first_after_resume?: boolean
    original_disable_analysis?: boolean
    original_sgf?: string
    outcome?: string
    player_id?: number
    player_pool?: {
        [id: number]: GobanEnginePlayerEntry;
    }

    Type declaration

    players?: {
        black: GobanEnginePlayerEntry;
        white: GobanEnginePlayerEntry;
    }

    Type declaration

    ranked?: boolean
    removal?: boolean[][]
    removed?: string | JGOFMove[]

    Removed stones in stone removal phase +

    Properties

    aga_handicap_scoring?: boolean
    allow_ko?: boolean
    allow_self_capture?: boolean
    allow_superko?: boolean
    automatic_stone_removal?: boolean
    black_player_id?: number
    black_prisoners?: number
    board_is_repeating?: boolean
    clock?: GameClock
    disable_analysis?: boolean
    end_time?: number
    errors?: {
        error: string;
        stack: any;
    }[]

    Type declaration

    • error: string
    • stack: any
    free_handicap_placement?: boolean
    game_date?: string
    game_id?: string | number
    game_name?: string
    group_ids?: number[]
    handicap?: number
    handicap_rank_difference?: number
    height?: number
    initial_player?: PlayerColor
    initial_state?: GobanEngineInitialState
    is_game_record?: boolean
    isobranch_hash?: string
    komi?: number
    ladder?: number
    ladder_id?: number
    latencies?: {
        [player_id: string]: number;
    }

    Type declaration

    • [player_id: string]: number
    marks?: {
        [mark: string]: string;
    }

    Type declaration

    • [mark: string]: string
    move_tree?: MoveTreeJson
    needs_sealing?: JGOFSealingIntersection[]

    Intersections that need to be sealed before scoring should happen

    +
    ogs?: {
        black_dead_stones: string;
        black_seki_eyes: string;
        black_stones: string;
        black_territory: string;
        white_dead_stones: string;
        white_seki_eyes: string;
        white_stones: string;
        white_territory: string;
    }

    Type declaration

    • black_dead_stones: string
    • black_seki_eyes: string
    • black_stones: string
    • black_territory: string
    • white_dead_stones: string
    • white_seki_eyes: string
    • white_stones: string
    • white_territory: string
    ogs_import?: boolean

    Deprecated, I don't think we need this anymore, but need to be sure

    +
    opponent_plays_first_after_resume?: boolean
    original_disable_analysis?: boolean
    original_sgf?: string
    outcome?: string
    player_id?: number
    player_pool?: {
        [id: number]: GobanEnginePlayerEntry;
    }

    Type declaration

    players?: {
        black: GobanEnginePlayerEntry;
        white: GobanEnginePlayerEntry;
    }

    Type declaration

    ranked?: boolean
    removal?: boolean[][]
    removed?: string | JGOFMove[]

    Removed stones in stone removal phase Passing an array of JGOFMove objects is preferred, the string format exists for historical backwards compatibility. It is an encoded move string, e.g. "aa" for A19

    -
    rengo?: boolean
    rengo_casual_mode?: boolean
    rengo_teams?: {
        black: GobanEnginePlayerEntry[];
        white: GobanEnginePlayerEntry[];
    }

    Type declaration

    review_id?: number
    reviews?: {
        [review_id: number]: GobanEnginePlayerEntry;
    }

    Type declaration

    score?: Score
    score_handicap?: boolean
    score_passes?: boolean
    score_prisoners?: boolean
    score_stones?: boolean
    score_territory?: boolean
    score_territory_in_seki?: boolean
    stalling_score_estimate?: StallingScoreEstimate
    start_time?: number
    strict_seki_mode?: boolean
    superko_algorithm?: GobanEngineSuperKoAlgorithm
    throw_all_errors?: boolean

    When loading initial state or moves, by default GobanEngine will try and +

    rengo?: boolean
    rengo_casual_mode?: boolean
    rengo_teams?: {
        black: GobanEnginePlayerEntry[];
        white: GobanEnginePlayerEntry[];
    }

    Type declaration

    review_id?: number
    reviews?: {
        [review_id: number]: GobanEnginePlayerEntry;
    }

    Type declaration

    score?: Score
    score_handicap?: boolean
    score_passes?: boolean
    score_prisoners?: boolean
    score_stones?: boolean
    score_territory?: boolean
    score_territory_in_seki?: boolean
    stalling_score_estimate?: StallingScoreEstimate
    start_time?: number
    strict_seki_mode?: boolean
    superko_algorithm?: GobanEngineSuperKoAlgorithm
    throw_all_errors?: boolean

    When loading initial state or moves, by default GobanEngine will try and handle bad data by just resorting to 'edit placing' moves. If this is true, then those errors are thrown instead.

    -
    time_control?: JGOFTimeControl
    time_per_move?: number
    tournament_id?: number
    white_must_pass_last?: boolean
    white_player_id?: number
    white_prisoners?: number
    width?: number
    winner?: number | "black" | "white"
    \ No newline at end of file +
    time_control?: JGOFTimeControl
    time_per_move?: number
    tournament_id?: number
    white_must_pass_last?: boolean
    white_player_id?: number
    white_prisoners?: number
    width?: number
    winner?: number | "black" | "white"
    \ No newline at end of file diff --git a/docs/interfaces/GobanEngineInitialState.html b/docs/interfaces/GobanEngineInitialState.html index fdf0fe1f..8e0f66e9 100644 --- a/docs/interfaces/GobanEngineInitialState.html +++ b/docs/interfaces/GobanEngineInitialState.html @@ -1,3 +1,3 @@ -GobanEngineInitialState | goban

    Interface GobanEngineInitialState

    interface GobanEngineInitialState {
        black?: string;
        white?: string;
    }

    Properties

    black? +GobanEngineInitialState | goban

    Interface GobanEngineInitialState

    interface GobanEngineInitialState {
        black?: string;
        white?: string;
    }

    Properties

    Properties

    black?: string
    white?: string
    \ No newline at end of file +

    Properties

    black?: string
    white?: string
    \ No newline at end of file diff --git a/docs/interfaces/GobanEnginePlayerEntry.html b/docs/interfaces/GobanEnginePlayerEntry.html index b6744345..8c9fd159 100644 --- a/docs/interfaces/GobanEnginePlayerEntry.html +++ b/docs/interfaces/GobanEnginePlayerEntry.html @@ -1,4 +1,4 @@ -GobanEnginePlayerEntry | goban

    Interface GobanEnginePlayerEntry

    interface GobanEnginePlayerEntry {
        accepted_stones?: string;
        accepted_strict_seki_mode?: boolean;
        country?: string;
        id: number;
        name?: string;
        pro?: boolean;
        rank?: number;
        username: string;
    }

    Properties

    accepted_stones? +GobanEnginePlayerEntry | goban

    Interface GobanEnginePlayerEntry

    interface GobanEnginePlayerEntry {
        accepted_stones?: string;
        accepted_strict_seki_mode?: boolean;
        country?: string;
        id: number;
        name?: string;
        pro?: boolean;
        rank?: number;
        username: string;
    }

    Properties

    accepted_stones?: string

    The accepted stones for the stone removal phase that the player has accepted

    -
    accepted_strict_seki_mode?: boolean

    Whether or not the player has accepted scoring with strict seki mode on or not

    -
    country?: string
    id: number
    name?: string

    XXX: The server is using these, the client may or may not be, we need to normalize this

    -
    pro?: boolean
    rank?: number
    username: string
    \ No newline at end of file +
    accepted_strict_seki_mode?: boolean

    Whether or not the player has accepted scoring with strict seki mode on or not

    +
    country?: string
    id: number
    name?: string

    XXX: The server is using these, the client may or may not be, we need to normalize this

    +
    pro?: boolean
    rank?: number
    username: string
    \ No newline at end of file diff --git a/docs/interfaces/GobanEvents.html b/docs/interfaces/GobanEvents.html index a58c0e98..274ab418 100644 --- a/docs/interfaces/GobanEvents.html +++ b/docs/interfaces/GobanEvents.html @@ -1,4 +1,4 @@ -GobanEvents | goban

    Interface GobanEvents

    interface GobanEvents {
        advance-to-next-board: (() => void);
        analyze_subtool: ((d) => void);
        analyze_tool: ((d) => void);
        audio-capture-stones: ((obj) => void);
        audio-clock: ((event) => void);
        audio-disconnected: (() => void);
        audio-enter-stone-removal: (() => void);
        audio-game-ended: ((winner) => void);
        audio-game-paused: (() => void);
        audio-game-resumed: (() => void);
        audio-game-started: ((obj) => void);
        audio-other-player-disconnected: ((obj) => void);
        audio-other-player-reconnected: ((obj) => void);
        audio-pass: (() => void);
        audio-reconnected: (() => void);
        audio-resume-game-from-stone-removal: (() => void);
        audio-stone: ((obj) => void);
        audio-undo-granted: (() => void);
        audio-undo-requested: (() => void);
        auto-resign: ((obj) => void);
        captured-stones: ((obj) => void);
        chat: ((d) => void);
        chat-remove: ((ids) => void);
        chat-reset: (() => void);
        clear-auto-resign: ((obj) => void);
        clear-message: (() => void);
        clock: ((clock) => void);
        conditional-moves.updated: (() => void);
        cur_move: ((d) => void);
        cur_review_move: ((d) => void);
        destroy: (() => void);
        engine.updated: ((engine) => void);
        error: ((d) => void);
        gamedata: ((d) => void);
        last_official_move: ((d) => void);
        load: ((config) => void);
        mode: ((d) => void);
        move-made: (() => void);
        outcome: ((d) => void);
        paused: ((d) => void);
        phase: ((d) => void);
        played-by-click: ((player) => void);
        player-update: ((player) => void);
        puzzle-correct-answer: (() => void);
        puzzle-place: ((obj) => void);
        puzzle-wrong-answer: (() => void);
        review.load-end: (() => void);
        review.load-start: (() => void);
        review.sync-to-current-move: (() => void);
        review.updated: (() => void);
        review_controller_id: ((d) => void);
        review_owner_id: ((d) => void);
        rules: ((d) => void);
        score_estimate: ((d) => void);
        set-for-removal: {
            removed: boolean;
            x: number;
            y: number;
        };
        show-message: ((message) => void);
        stalling_score_estimate: ((data?) => void);
        state_text: ((state) => void);
        stone-removal.accepted: (() => void);
        stone-removal.auto-scoring-complete: (() => void);
        stone-removal.auto-scoring-started: (() => void);
        stone-removal.needs-sealing: ((positions) => void);
        stone-removal.updated: (() => void);
        strict_seki_mode: ((d) => void);
        submit_move: ((d) => void);
        submitting-move: ((tf) => void);
        title: ((d) => void);
        undo_canceled: (() => void);
        undo_requested: ((d) => void);
        update: (() => void);
        winner: ((d) => void);
    }

    Hierarchy (view full)

    Properties

    advance-to-next-board +GobanEvents | goban

    Interface GobanEvents

    interface GobanEvents {
        advance-to-next-board: (() => void);
        analyze_subtool: ((d) => void);
        analyze_tool: ((d) => void);
        audio-capture-stones: ((obj) => void);
        audio-clock: ((event) => void);
        audio-disconnected: (() => void);
        audio-enter-stone-removal: (() => void);
        audio-game-ended: ((winner) => void);
        audio-game-paused: (() => void);
        audio-game-resumed: (() => void);
        audio-game-started: ((obj) => void);
        audio-other-player-disconnected: ((obj) => void);
        audio-other-player-reconnected: ((obj) => void);
        audio-pass: (() => void);
        audio-reconnected: (() => void);
        audio-resume-game-from-stone-removal: (() => void);
        audio-stone: ((obj) => void);
        audio-undo-granted: (() => void);
        audio-undo-requested: (() => void);
        auto-resign: ((obj) => void);
        captured-stones: ((obj) => void);
        chat: ((d) => void);
        chat-remove: ((ids) => void);
        chat-reset: (() => void);
        clear-auto-resign: ((obj) => void);
        clear-message: (() => void);
        clock: ((clock) => void);
        conditional-moves.updated: (() => void);
        cur_move: ((d) => void);
        cur_review_move: ((d) => void);
        destroy: (() => void);
        engine.updated: ((engine) => void);
        error: ((d) => void);
        gamedata: ((d) => void);
        last_official_move: ((d) => void);
        load: ((config) => void);
        mode: ((d) => void);
        move-made: (() => void);
        outcome: ((d) => void);
        paused: ((d) => void);
        phase: ((d) => void);
        played-by-click: ((player) => void);
        player-update: ((player) => void);
        puzzle-correct-answer: (() => void);
        puzzle-place: ((obj) => void);
        puzzle-wrong-answer: (() => void);
        review.load-end: (() => void);
        review.load-start: (() => void);
        review.sync-to-current-move: (() => void);
        review.updated: (() => void);
        review_controller_id: ((d) => void);
        review_owner_id: ((d) => void);
        rules: ((d) => void);
        score_estimate: ((d) => void);
        set-for-removal: {
            removed: boolean;
            x: number;
            y: number;
        };
        show-message: ((message) => void);
        stalling_score_estimate: ((data?) => void);
        state_text: ((state) => void);
        stone-removal.accepted: (() => void);
        stone-removal.auto-scoring-complete: (() => void);
        stone-removal.auto-scoring-started: (() => void);
        stone-removal.needs-sealing: ((positions) => void);
        stone-removal.updated: (() => void);
        strict_seki_mode: ((d) => void);
        submit_move: ((d) => void);
        submitting-move: ((tf) => void);
        title: ((d) => void);
        undo_canceled: (() => void);
        undo_requested: ((d) => void);
        update: (() => void);
        winner: ((d) => void);
    }

    Hierarchy (view full)

    Properties

    advance-to-next-board: (() => void)

    Type declaration

      • (): void
      • Returns void

    analyze_subtool: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: string

        Returns void

    analyze_tool: ((d) => void)

    Type declaration

    audio-capture-stones: ((obj) => void)

    Type declaration

      • (obj): void
      • Parameters

        • obj: {
              already_captured: number;
              count: number;
          }
          • already_captured: number
          • count: number

        Returns void

    audio-clock: ((event) => void)

    Type declaration

    audio-disconnected: (() => void)

    Type declaration

      • (): void
      • Returns void

    audio-enter-stone-removal: (() => void)

    Type declaration

      • (): void
      • Returns void

    audio-game-ended: ((winner) => void)

    Type declaration

      • (winner): void
      • Parameters

        • winner: "black" | "white" | "tie"

        Returns void

    audio-game-paused: (() => void)

    Type declaration

      • (): void
      • Returns void

    audio-game-resumed: (() => void)

    Type declaration

      • (): void
      • Returns void

    audio-game-started: ((obj) => void)

    Type declaration

      • (obj): void
      • Parameters

        • obj: {
              player_id: number;
          }
          • player_id: number

            Player to move

            -

        Returns void

    audio-other-player-disconnected: ((obj) => void)

    Type declaration

      • (obj): void
      • Parameters

        • obj: {
              player_id: number;
          }
          • player_id: number

        Returns void

    audio-other-player-reconnected: ((obj) => void)

    Type declaration

      • (obj): void
      • Parameters

        • obj: {
              player_id: number;
          }
          • player_id: number

        Returns void

    audio-pass: (() => void)

    Type declaration

      • (): void
      • Returns void

    audio-reconnected: (() => void)

    Type declaration

      • (): void
      • Returns void

    audio-resume-game-from-stone-removal: (() => void)

    Type declaration

      • (): void
      • Returns void

    audio-stone: ((obj) => void)

    Type declaration

      • (obj): void
      • Parameters

        • obj: {
              color: "black" | "white";
              height: number;
              width: number;
              x: number;
              y: number;
          }
          • color: "black" | "white"
          • height: number
          • width: number
          • x: number
          • y: number

        Returns void

    audio-undo-granted: (() => void)

    Type declaration

      • (): void
      • Returns void

    audio-undo-requested: (() => void)

    Type declaration

      • (): void
      • Returns void

    auto-resign: ((obj) => void)

    Type declaration

      • (obj): void
      • Parameters

        • obj: {
              expiration: number;
              game_id: number;
              player_id: number;
          }
          • expiration: number
          • game_id: number
          • player_id: number

        Returns void

    captured-stones: ((obj) => void)

    Type declaration

    chat: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: any

        Returns void

    chat-remove: ((ids) => void)

    Type declaration

      • (ids): void
      • Parameters

        • ids: {
              chat_ids: string[];
          }
          • chat_ids: string[]

        Returns void

    chat-reset: (() => void)

    Type declaration

      • (): void
      • Returns void

    clear-auto-resign: ((obj) => void)

    Type declaration

      • (obj): void
      • Parameters

        • obj: {
              game_id: number;
              player_id: number;
          }
          • game_id: number
          • player_id: number

        Returns void

    clear-message: (() => void)

    Type declaration

      • (): void
      • Returns void

    clock: ((clock) => void)

    Type declaration

    conditional-moves.updated: (() => void)

    Type declaration

      • (): void
      • Returns void

    cur_move: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        Returns void

    cur_review_move: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        Returns void

    destroy: (() => void)

    Type declaration

      • (): void
      • Returns void

    engine.updated: ((engine) => void)

    Type declaration

      • (engine): void
      • Parameters

        Returns void

    error: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: any

        Returns void

    gamedata: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: any

        Returns void

    last_official_move: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        Returns void

    load: ((config) => void)

    Type declaration

      • (config): void
      • Parameters

        Returns void

    mode: ((d) => void)

    Type declaration

    move-made: (() => void)

    Type declaration

      • (): void
      • Returns void

    outcome: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: string

        Returns void

    paused: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: boolean

        Returns void

    phase: ((d) => void)

    Type declaration

    played-by-click: ((player) => void)

    Type declaration

      • (player): void
      • Parameters

        • player: {
              player_id: number;
              x: number;
              y: number;
          }
          • player_id: number
          • x: number
          • y: number

        Returns void

    player-update: ((player) => void)

    Type declaration

    puzzle-correct-answer: (() => void)

    Type declaration

      • (): void
      • Returns void

    puzzle-place: ((obj) => void)

    Type declaration

      • (obj): void
      • Parameters

        • obj: {
              color: "black" | "white";
              height: number;
              width: number;
              x: number;
              y: number;
          }
          • color: "black" | "white"
          • height: number
          • width: number
          • x: number
          • y: number

        Returns void

    puzzle-wrong-answer: (() => void)

    Type declaration

      • (): void
      • Returns void

    review.load-end: (() => void)

    Type declaration

      • (): void
      • Returns void

    review.load-start: (() => void)

    Type declaration

      • (): void
      • Returns void

    review.sync-to-current-move: (() => void)

    Type declaration

      • (): void
      • Returns void

    review.updated: (() => void)

    Type declaration

      • (): void
      • Returns void

    review_controller_id: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: undefined | number

        Returns void

    review_owner_id: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: undefined | number

        Returns void

    rules: ((d) => void)

    Type declaration

    score_estimate: ((d) => void)

    Type declaration

    set-for-removal: {
        removed: boolean;
        x: number;
        y: number;
    }

    Type declaration

    • removed: boolean
    • x: number
    • y: number
    show-message: ((message) => void)

    Type declaration

      • (message): void
      • Parameters

        • message: {
              formatted: string;
              message_id: string;
              parameters?: {
                  [key: string]: any;
              };
          }
          • formatted: string
          • message_id: string
          • Optional parameters?: {
                [key: string]: any;
            }
            • [key: string]: any

        Returns void

    stalling_score_estimate: ((data?) => void)

    Type declaration

    state_text: ((state) => void)

    Type declaration

      • (state): void
      • Parameters

        • state: {
              show_moves_made_count?: boolean;
              title: string;
          }
          • Optional show_moves_made_count?: boolean
          • title: string

        Returns void

    stone-removal.accepted: (() => void)

    Type declaration

      • (): void
      • Returns void

    stone-removal.auto-scoring-complete: (() => void)

    Type declaration

      • (): void
      • Returns void

    stone-removal.auto-scoring-started: (() => void)

    Type declaration

      • (): void
      • Returns void

    stone-removal.needs-sealing: ((positions) => void)

    Type declaration

    stone-removal.updated: (() => void)

    Type declaration

      • (): void
      • Returns void

    strict_seki_mode: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: boolean

        Returns void

    submit_move: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: undefined | (() => void)

        Returns void

    submitting-move: ((tf) => void)

    Type declaration

      • (tf): void
      • Parameters

        • tf: boolean

        Returns void

    title: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: string

        Returns void

    undo_canceled: (() => void)

    Type declaration

      • (): void
      • Returns void

    undo_requested: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: undefined | number

        Returns void

    update: (() => void)

    Type declaration

      • (): void
      • Returns void

    winner: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: undefined | number

        Returns void

    \ No newline at end of file +

    Properties

    advance-to-next-board: (() => void)

    Type declaration

      • (): void
      • Returns void

    analyze_subtool: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: string

        Returns void

    analyze_tool: ((d) => void)

    Type declaration

    audio-capture-stones: ((obj) => void)

    Type declaration

      • (obj): void
      • Parameters

        • obj: {
              already_captured: number;
              count: number;
          }
          • already_captured: number
          • count: number

        Returns void

    audio-clock: ((event) => void)

    Type declaration

    audio-disconnected: (() => void)

    Type declaration

      • (): void
      • Returns void

    audio-enter-stone-removal: (() => void)

    Type declaration

      • (): void
      • Returns void

    audio-game-ended: ((winner) => void)

    Type declaration

      • (winner): void
      • Parameters

        • winner: "black" | "white" | "tie"

        Returns void

    audio-game-paused: (() => void)

    Type declaration

      • (): void
      • Returns void

    audio-game-resumed: (() => void)

    Type declaration

      • (): void
      • Returns void

    audio-game-started: ((obj) => void)

    Type declaration

      • (obj): void
      • Parameters

        • obj: {
              player_id: number;
          }
          • player_id: number

            Player to move

            +

        Returns void

    audio-other-player-disconnected: ((obj) => void)

    Type declaration

      • (obj): void
      • Parameters

        • obj: {
              player_id: number;
          }
          • player_id: number

        Returns void

    audio-other-player-reconnected: ((obj) => void)

    Type declaration

      • (obj): void
      • Parameters

        • obj: {
              player_id: number;
          }
          • player_id: number

        Returns void

    audio-pass: (() => void)

    Type declaration

      • (): void
      • Returns void

    audio-reconnected: (() => void)

    Type declaration

      • (): void
      • Returns void

    audio-resume-game-from-stone-removal: (() => void)

    Type declaration

      • (): void
      • Returns void

    audio-stone: ((obj) => void)

    Type declaration

      • (obj): void
      • Parameters

        • obj: {
              color: "black" | "white";
              height: number;
              width: number;
              x: number;
              y: number;
          }
          • color: "black" | "white"
          • height: number
          • width: number
          • x: number
          • y: number

        Returns void

    audio-undo-granted: (() => void)

    Type declaration

      • (): void
      • Returns void

    audio-undo-requested: (() => void)

    Type declaration

      • (): void
      • Returns void

    auto-resign: ((obj) => void)

    Type declaration

      • (obj): void
      • Parameters

        • obj: {
              expiration: number;
              game_id: number;
              player_id: number;
          }
          • expiration: number
          • game_id: number
          • player_id: number

        Returns void

    captured-stones: ((obj) => void)

    Type declaration

    chat: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: any

        Returns void

    chat-remove: ((ids) => void)

    Type declaration

      • (ids): void
      • Parameters

        • ids: {
              chat_ids: string[];
          }
          • chat_ids: string[]

        Returns void

    chat-reset: (() => void)

    Type declaration

      • (): void
      • Returns void

    clear-auto-resign: ((obj) => void)

    Type declaration

      • (obj): void
      • Parameters

        • obj: {
              game_id: number;
              player_id: number;
          }
          • game_id: number
          • player_id: number

        Returns void

    clear-message: (() => void)

    Type declaration

      • (): void
      • Returns void

    clock: ((clock) => void)

    Type declaration

    conditional-moves.updated: (() => void)

    Type declaration

      • (): void
      • Returns void

    cur_move: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        Returns void

    cur_review_move: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        Returns void

    destroy: (() => void)

    Type declaration

      • (): void
      • Returns void

    engine.updated: ((engine) => void)

    Type declaration

      • (engine): void
      • Parameters

        Returns void

    error: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: any

        Returns void

    gamedata: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: any

        Returns void

    last_official_move: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        Returns void

    load: ((config) => void)

    Type declaration

      • (config): void
      • Parameters

        Returns void

    mode: ((d) => void)

    Type declaration

    move-made: (() => void)

    Type declaration

      • (): void
      • Returns void

    outcome: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: string

        Returns void

    paused: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: boolean

        Returns void

    phase: ((d) => void)

    Type declaration

    played-by-click: ((player) => void)

    Type declaration

      • (player): void
      • Parameters

        • player: {
              player_id: number;
              x: number;
              y: number;
          }
          • player_id: number
          • x: number
          • y: number

        Returns void

    player-update: ((player) => void)

    Type declaration

    puzzle-correct-answer: (() => void)

    Type declaration

      • (): void
      • Returns void

    puzzle-place: ((obj) => void)

    Type declaration

      • (obj): void
      • Parameters

        • obj: {
              color: "black" | "white";
              height: number;
              width: number;
              x: number;
              y: number;
          }
          • color: "black" | "white"
          • height: number
          • width: number
          • x: number
          • y: number

        Returns void

    puzzle-wrong-answer: (() => void)

    Type declaration

      • (): void
      • Returns void

    review.load-end: (() => void)

    Type declaration

      • (): void
      • Returns void

    review.load-start: (() => void)

    Type declaration

      • (): void
      • Returns void

    review.sync-to-current-move: (() => void)

    Type declaration

      • (): void
      • Returns void

    review.updated: (() => void)

    Type declaration

      • (): void
      • Returns void

    review_controller_id: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: undefined | number

        Returns void

    review_owner_id: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: undefined | number

        Returns void

    rules: ((d) => void)

    Type declaration

    score_estimate: ((d) => void)

    Type declaration

    set-for-removal: {
        removed: boolean;
        x: number;
        y: number;
    }

    Type declaration

    • removed: boolean
    • x: number
    • y: number
    show-message: ((message) => void)

    Type declaration

      • (message): void
      • Parameters

        • message: {
              formatted: string;
              message_id: string;
              parameters?: {
                  [key: string]: any;
              };
          }
          • formatted: string
          • message_id: string
          • Optional parameters?: {
                [key: string]: any;
            }
            • [key: string]: any

        Returns void

    stalling_score_estimate: ((data?) => void)

    Type declaration

    state_text: ((state) => void)

    Type declaration

      • (state): void
      • Parameters

        • state: {
              show_moves_made_count?: boolean;
              title: string;
          }
          • Optional show_moves_made_count?: boolean
          • title: string

        Returns void

    stone-removal.accepted: (() => void)

    Type declaration

      • (): void
      • Returns void

    stone-removal.auto-scoring-complete: (() => void)

    Type declaration

      • (): void
      • Returns void

    stone-removal.auto-scoring-started: (() => void)

    Type declaration

      • (): void
      • Returns void

    stone-removal.needs-sealing: ((positions) => void)

    Type declaration

    stone-removal.updated: (() => void)

    Type declaration

      • (): void
      • Returns void

    strict_seki_mode: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: boolean

        Returns void

    submit_move: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: undefined | (() => void)

        Returns void

    submitting-move: ((tf) => void)

    Type declaration

      • (tf): void
      • Parameters

        • tf: boolean

        Returns void

    title: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: string

        Returns void

    undo_canceled: (() => void)

    Type declaration

      • (): void
      • Returns void

    undo_requested: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: undefined | number

        Returns void

    update: (() => void)

    Type declaration

      • (): void
      • Returns void

    winner: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: undefined | number

        Returns void

    \ No newline at end of file diff --git a/docs/interfaces/GobanIOErrorMessageObject.html b/docs/interfaces/GobanIOErrorMessageObject.html index 2394dd83..970956dc 100644 --- a/docs/interfaces/GobanIOErrorMessageObject.html +++ b/docs/interfaces/GobanIOErrorMessageObject.html @@ -1,3 +1,3 @@ -GobanIOErrorMessageObject | goban

    Interface GobanIOErrorMessageObject

    interface GobanIOErrorMessageObject {
        message_id: "failed_to_load_sgf";
        url: string;
    }

    Properties

    message_id +GobanIOErrorMessageObject | goban

    Interface GobanIOErrorMessageObject

    interface GobanIOErrorMessageObject {
        message_id: "failed_to_load_sgf";
        url: string;
    }

    Properties

    Properties

    message_id: "failed_to_load_sgf"
    url: string
    \ No newline at end of file +

    Properties

    message_id: "failed_to_load_sgf"
    url: string
    \ No newline at end of file diff --git a/docs/interfaces/GobanMetrics.html b/docs/interfaces/GobanMetrics.html index c2376b43..8faf9285 100644 --- a/docs/interfaces/GobanMetrics.html +++ b/docs/interfaces/GobanMetrics.html @@ -1,5 +1,5 @@ -GobanMetrics | goban

    Interface GobanMetrics

    interface GobanMetrics {
        height: number;
        mid: number;
        offset: number;
        width: number;
    }

    Properties

    height +GobanMetrics | goban

    Interface GobanMetrics

    interface GobanMetrics {
        height: number;
        mid: number;
        offset: number;
        width: number;
    }

    Properties

    Properties

    height: number
    mid: number
    offset: number
    width: number
    \ No newline at end of file +

    Properties

    height: number
    mid: number
    offset: number
    width: number
    \ No newline at end of file diff --git a/docs/interfaces/GobanMoveErrorMessageObject.html b/docs/interfaces/GobanMoveErrorMessageObject.html index bb8056d8..2f1e75e1 100644 --- a/docs/interfaces/GobanMoveErrorMessageObject.html +++ b/docs/interfaces/GobanMoveErrorMessageObject.html @@ -1,4 +1,4 @@ -GobanMoveErrorMessageObject | goban

    Interface GobanMoveErrorMessageObject

    interface GobanMoveErrorMessageObject {
        coords: string;
        message_id: GobanMoveErrorMessageId;
        move_number: number;
    }

    Properties

    coords +GobanMoveErrorMessageObject | goban

    Interface GobanMoveErrorMessageObject

    interface GobanMoveErrorMessageObject {
        coords: string;
        message_id: GobanMoveErrorMessageId;
        move_number: number;
    }

    Properties

    coords: string
    move_number: number
    \ No newline at end of file +

    Properties

    coords: string
    move_number: number
    \ No newline at end of file diff --git a/docs/interfaces/GobanSelectedThemes.html b/docs/interfaces/GobanSelectedThemes.html index f9842c26..51c5307e 100644 --- a/docs/interfaces/GobanSelectedThemes.html +++ b/docs/interfaces/GobanSelectedThemes.html @@ -1,6 +1,6 @@ -GobanSelectedThemes | goban

    Interface GobanSelectedThemes

    interface GobanSelectedThemes {
        black: string;
        board: string;
        removal-graphic: "x" | "square";
        removal-scale: number;
        white: string;
    }

    Properties

    black +GobanSelectedThemes | goban

    Interface GobanSelectedThemes

    interface GobanSelectedThemes {
        black: string;
        board: string;
        removal-graphic: "x" | "square";
        removal-scale: number;
        white: string;
    }

    Properties

    black: string
    board: string
    removal-graphic: "x" | "square"
    removal-scale: number
    white: string
    \ No newline at end of file +

    Properties

    black: string
    board: string
    removal-graphic: "x" | "square"
    removal-scale: number
    white: string
    \ No newline at end of file diff --git a/docs/interfaces/GobanSocketEvents.html b/docs/interfaces/GobanSocketEvents.html index 5b590916..e27d1184 100644 --- a/docs/interfaces/GobanSocketEvents.html +++ b/docs/interfaces/GobanSocketEvents.html @@ -1,7 +1,9 @@ -GobanSocketEvents | goban

    Interface GobanSocketEvents

    interface GobanSocketEvents {
        ERROR: ((data) => void);
        HUP: (() => void);
        active-bots: ((data) => void);
        active_game: ((data) => void);
        automatch/cancel: ((data) => void);
        automatch/entry: ((data) => void);
        automatch/start: ((data) => void);
        chat-join: ((data) => void);
        chat-message: ((data) => void);
        chat-message-removed: ((data) => void);
        chat-part: ((data) => void);
        chat-topic: ((data) => void);
        chat-update-user: ((data) => void);
        connect: (() => void);
        disconnect: ((code) => void);
        game/:id/auto_resign: ((data) => void);
        game/:id/chat: ((data) => void);
        game/:id/chat/remove: ((data) => void);
        game/:id/clear_auto_resign: ((data) => void);
        game/:id/clock: ((data) => void);
        game/:id/conditional_moves: ((data) => void);
        game/:id/error: ((data) => void);
        game/:id/gamedata: ((data) => void);
        game/:id/latency: ((data) => void);
        game/:id/phase: ((data) => void);
        game/:id/removed_stones: ((data) => void);
        game/:id/removed_stones_accepted: ((data) => void);
        game/:id/reset-chats: (() => void);
        game/:id/stalling_score_estimate: ((data?) => void);
        game/:id/undo_accepted: ((data) => void);
        game/:id/undo_canceled: ((data) => void);
        game/:id/undo_requested: ((data) => void);
        gamelist-count: ((data) => void);
        gamelist-count-:channel: ((data) => void);
        hostinfo: ((data) => void);
        incident-report: ((data) => void);
        itc: ((data) => void);
        latency: ((latency, clock_drift) => void);
        net/pong: ((data) => void);
        notification: ((data) => void);
        private-message: ((data) => void);
        private-superchat: ((data) => void);
        reconnect: (() => void);
        remote_storage/sync_complete: (() => void);
        remote_storage/update: ((data) => void);
        review/:id/full_state: ((data) => void);
        review/:id/r: ((data) => void);
        score-estimator-enabled-state: ((data) => void);
        seekgraph/global: ((messages) => void);
        timeout: (() => void);
        ui-push: ((data) => void);
        unrecoverable_error: ((code, tag, message) => void);
        user/jwt: ((jwt) => void);
        user/state: ((data) => void);
        user/update: ((user) => void);
    }

    Hierarchy (view full)

    Properties

    ERROR +GobanSocketEvents | goban

    Interface GobanSocketEvents

    interface GobanSocketEvents {
        ERROR: ((data) => void);
        HUP: (() => void);
        active-bots: ((data) => void);
        active_game: ((data) => void);
        automatch/available/add: ((data) => void);
        automatch/available/remove: ((uuid) => void);
        automatch/cancel: ((data) => void);
        automatch/entry: ((data) => void);
        automatch/start: ((data) => void);
        chat-join: ((data) => void);
        chat-message: ((data) => void);
        chat-message-removed: ((data) => void);
        chat-part: ((data) => void);
        chat-topic: ((data) => void);
        chat-update-user: ((data) => void);
        connect: (() => void);
        disconnect: ((code) => void);
        game/:id/auto_resign: ((data) => void);
        game/:id/chat: ((data) => void);
        game/:id/chat/remove: ((data) => void);
        game/:id/clear_auto_resign: ((data) => void);
        game/:id/clock: ((data) => void);
        game/:id/conditional_moves: ((data) => void);
        game/:id/error: ((data) => void);
        game/:id/gamedata: ((data) => void);
        game/:id/latency: ((data) => void);
        game/:id/phase: ((data) => void);
        game/:id/removed_stones: ((data) => void);
        game/:id/removed_stones_accepted: ((data) => void);
        game/:id/reset-chats: (() => void);
        game/:id/stalling_score_estimate: ((data?) => void);
        game/:id/undo_accepted: ((data) => void);
        game/:id/undo_canceled: ((data) => void);
        game/:id/undo_requested: ((data) => void);
        gamelist-count: ((data) => void);
        gamelist-count-:channel: ((data) => void);
        hostinfo: ((data) => void);
        incident-report: ((data) => void);
        itc: ((data) => void);
        latency: ((latency, clock_drift) => void);
        net/pong: ((data) => void);
        notification: ((data) => void);
        private-message: ((data) => void);
        private-superchat: ((data) => void);
        reconnect: (() => void);
        remote_storage/sync_complete: (() => void);
        remote_storage/update: ((data) => void);
        review/:id/full_state: ((data) => void);
        review/:id/r: ((data) => void);
        score-estimator-enabled-state: ((data) => void);
        seekgraph/global: ((messages) => void);
        timeout: (() => void);
        ui-push: ((data) => void);
        unrecoverable_error: ((code, tag, message) => void);
        user/jwt: ((jwt) => void);
        user/state: ((data) => void);
        user/update: ((user) => void);
    }

    Hierarchy (view full)

    Properties

    ERROR: ((data) => void)

    An error occurred, the message string should be displayed to the user. For a list of errcode's used, see https://github.com/online-go/online-go.com/blob/devel/src/components/Errcode/Errcode.tsx

    -

    Type declaration

      • (data): void
      • Parameters

        • data: string | {
              errcode: string;
          }

        Returns void

    HUP: (() => void)

    The client should reload

    -

    Type declaration

      • (): void
      • Returns void

    active-bots: ((data) => void)

    Updates the list of bots that are connected and ready to the server

    -

    Type declaration

      • (data): void
      • Parameters

        • data: {
              [id: number]: User;
          }

        Returns void

    active_game: ((data) => void)

    Message to inform the client of an active game, or a change to an existing game

    -

    Type declaration

    automatch/cancel: ((data) => void)

    An automatch request was canceled

    -

    Type declaration

      • (data): void
      • Parameters

        • data: {
              uuid: string;
          }
          • uuid: string

        Returns void

    automatch/entry: ((data) => void)

    An automatch request is active

    -

    Type declaration

    automatch/start: ((data) => void)

    An automatch request was started

    -

    Type declaration

      • (data): void
      • Parameters

        • data: {
              game_id: number;
              uuid: string;
          }
          • game_id: number
          • uuid: string

        Returns void

    chat-join: ((data) => void)

    User(s) joined a chat channel

    -

    Type declaration

    HUP: (() => void)

    The client should reload

    +

    Type declaration

      • (): void
      • Returns void

    active-bots: ((data) => void)

    Updates the list of bots that are connected and ready to the server

    +

    Type declaration

      • (data): void
      • Parameters

        • data: {
              [id: number]: User;
          }

        Returns void

    active_game: ((data) => void)

    Message to inform the client of an active game, or a change to an existing game

    +

    Type declaration

    automatch/available/add: ((data) => void)

    An automatch offer was added

    +

    Type declaration

      • (data): void
      • Parameters

        • data: {
              created: number;
              player: {
                  id: number;
                  username: string;
              };
              preferences: AutomatchPreferences;
              uuid: string;
          }
          • created: number
          • player: {
                id: number;
                username: string;
            }
            • id: number
            • username: string
          • preferences: AutomatchPreferences
          • uuid: string

        Returns void

    automatch/available/remove: ((uuid) => void)

    An automatch offer was removed

    +

    Type declaration

      • (uuid): void
      • Parameters

        • uuid: string

        Returns void

    automatch/cancel: ((data) => void)

    An automatch request was canceled

    +

    Type declaration

      • (data): void
      • Parameters

        • data: {
              uuid: string;
          }
          • uuid: string

        Returns void

    automatch/entry: ((data) => void)

    An automatch request is active

    +

    Type declaration

    automatch/start: ((data) => void)

    An automatch request was started

    +

    Type declaration

      • (data): void
      • Parameters

        • data: {
              game_id: number;
              uuid: string;
          }
          • game_id: number
          • uuid: string

        Returns void

    chat-join: ((data) => void)

    User(s) joined a chat channel

    +

    Type declaration

      • (data): void
      • Parameters

        • data: {
              channel: string;
              users: User[];
          }
          • channel: string

            The channel

          • users: User[]

            List of users that joined

            -

        Returns void

    chat-message: ((data) => void)

    Chat message was received

    -

    Type declaration

      • (data): void
      • Parameters

        • data: {
              channel: string;
              country?: string;
              id: number;
              message: {
                  i?: string;
                  m: string;
                  t: number;
              };
              professional: boolean;
              ranking: number;
              system?: true;
              system_message_type?: "flood";
              ui_class: string;
              username: string;
          }
          • channel: string

            The channel

            +

        Returns void

    chat-message: ((data) => void)

    Chat message was received

    +

    Type declaration

      • (data): void
      • Parameters

        • data: {
              channel: string;
              country?: string;
              id: number;
              message: {
                  i?: string;
                  m: string;
                  t: number;
              };
              professional: boolean;
              ranking: number;
              system?: true;
              system_message_type?: "flood";
              ui_class: string;
              username: string;
          }
          • channel: string

            The channel

          • Optional country?: string

            Country the user is from

          • id: number

            User id of the sender

          • message: {
                i?: string;
                m: string;
                t: number;
            }

            The message received

            @@ -78,15 +82,15 @@
          • Optional system?: true

            Whether it's a system message or not

          • Optional system_message_type?: "flood"
          • ui_class: string

            UI class of the sender

          • username: string

            Username of the sender

            -

        Returns void

    chat-message-removed: ((data) => void)

    A chat message should be removed from the display

    -

    Type declaration

      • (data): void
      • Parameters

        • data: {
              channel: string;
              uuid: string;
          }
          • channel: string

            The channel

            +

        Returns void

    chat-message-removed: ((data) => void)

    A chat message should be removed from the display

    +

    Type declaration

      • (data): void
      • Parameters

        • data: {
              channel: string;
              uuid: string;
          }
          • channel: string

            The channel

          • uuid: string

            Message id. Note, despite the name, I don't think this is always a uuid in uuid format, just treat it as a string.

            -

        Returns void

    chat-part: ((data) => void)

    User left a chat channel

    -

    Type declaration

      • (data): void
      • Parameters

        • data: {
              channel: string;
              user: User;
          }
          • channel: string

            The channel

            +

        Returns void

    chat-part: ((data) => void)

    User left a chat channel

    +

    Type declaration

      • (data): void
      • Parameters

        • data: {
              channel: string;
              user: User;
          }
          • channel: string

            The channel

          • user: User

            User that left

            -

        Returns void

    chat-topic: ((data) => void)

    Channel topic was updated

    -

    Type declaration

      • (data): void
      • Parameters

        • data: {
              channel: string;
              country?: string;
              id: number;
              professional: boolean;
              ranking: number;
              timestamp: number;
              topic: string;
              ui_class: string;
              username: string;
          }
          • channel: string

            The channel

            +

        Returns void

    chat-topic: ((data) => void)

    Channel topic was updated

    +

    Type declaration

      • (data): void
      • Parameters

        • data: {
              channel: string;
              country?: string;
              id: number;
              professional: boolean;
              ranking: number;
              timestamp: number;
              topic: string;
              ui_class: string;
              username: string;
          }
          • channel: string

            The channel

          • Optional country?: string

            Country of the user that changed the topic

          • id: number

            User id of the user that changed the topic

          • professional: boolean

            If the user that changed the topic was a professional

            @@ -95,43 +99,43 @@
          • topic: string

            The new topic

          • ui_class: string

            UI class of the user that changed the topic

          • username: string

            Username of the user that changed the topic

            -

        Returns void

    chat-update-user: ((data) => void)

    A user's profile was updated

    -

    Type declaration

      • (data): void
      • Parameters

        • data: {
              channel: string;
              old_player_id: number;
              user: User;
          }
          • channel: string

            The channel

            +

        Returns void

    chat-update-user: ((data) => void)

    A user's profile was updated

    +

    Type declaration

      • (data): void
      • Parameters

        • data: {
              channel: string;
              old_player_id: number;
              user: User;
          }
          • channel: string

            The channel

          • old_player_id: number

            Player id entry that was update. This might change in the case of a guest logging in, in this case this will switch from being a negative (guest) id, to some positive id. It is not expected that a non guest id should change using this system.

          • user: User

            New user details

            -

        Returns void

    connect: (() => void)

    Type declaration

      • (): void
      • Returns void

    disconnect: ((code) => void)

    Type declaration

      • (code): void
      • Parameters

        • code: number

        Returns void

    game/:id/auto_resign: ((data) => void)

    Informs the client the player is scheduled to resign if not cleared

    -

    Type declaration

      • (data): void
      • Parameters

        • data: {
              expiration: number;
              game_id: number;
              player_id: number;
          }
          • expiration: number

            When the auto resign will happen

            +

        Returns void

    connect: (() => void)

    Type declaration

      • (): void
      • Returns void

    disconnect: ((code) => void)

    Type declaration

      • (code): void
      • Parameters

        • code: number

        Returns void

    game/:id/auto_resign: ((data) => void)

    Informs the client the player is scheduled to resign if not cleared

    +

    Type declaration

      • (data): void
      • Parameters

        • data: {
              expiration: number;
              game_id: number;
              player_id: number;
          }
          • expiration: number

            When the auto resign will happen

          • game_id: number

            The game id

          • player_id: number

            The player id

            -

        Returns void

    game/:id/chat: ((data) => void)

    A game chat message

    -

    Type declaration

    game/:id/chat/remove: ((data) => void)

    Game chat lines should be removed

    -

    Type declaration

      • (data): void
      • Parameters

        • data: {
              chat_ids: string[];
              game_id: number;
          }
          • chat_ids: string[]

            The chat ids

            +

        Returns void

    game/:id/chat: ((data) => void)

    A game chat message

    +

    Type declaration

    game/:id/chat/remove: ((data) => void)

    Game chat lines should be removed

    +

    Type declaration

      • (data): void
      • Parameters

        • data: {
              chat_ids: string[];
              game_id: number;
          }
          • chat_ids: string[]

            The chat ids

          • game_id: number

            The game id

            -

        Returns void

    game/:id/clear_auto_resign: ((data) => void)

    The auto resign for the given player has been cleared

    -

    Type declaration

      • (data): void
      • Parameters

        • data: {
              game_id: number;
              player_id: number;
          }
          • game_id: number

            The game id

            +

        Returns void

    game/:id/clear_auto_resign: ((data) => void)

    The auto resign for the given player has been cleared

    +

    Type declaration

      • (data): void
      • Parameters

        • data: {
              game_id: number;
              player_id: number;
          }
          • game_id: number

            The game id

          • player_id: number

            The player id

            -

        Returns void

    game/:id/clock: ((data) => void)

    Game clock update

    -

    Type declaration

      • (data): void
      • Parameters

        Returns void

    game/:id/conditional_moves: ((data) => void)

    Update the conditional moves currently active

    -

    Type declaration

      • (data): void
      • Parameters

        Returns void

    game/:id/clock: ((data) => void)

    Game clock update

    +

    Type declaration

      • (data): void
      • Parameters

        Returns void

    game/:id/conditional_moves: ((data) => void)

    Update the conditional moves currently active

    +

    Type declaration

      • (data): void
      • Parameters

        • data: {
              conditional_moves: ConditionalMoveResponse;
              game_id: number;
              move_number: number;
          }
          • conditional_moves: ConditionalMoveResponse

            The conditional moves. The top level should be an array that looks like [null, { ... }] where the second element contains the responses to the opponent's move.

          • game_id: number

            The game id

          • move_number: number

            The move number from which the conditional moves are rooted in

            -

        Returns void

    game/:id/error: ((data) => void)

    Error that should be displayed to the user

    -

    Type declaration

      • (data): void
      • Parameters

        • data: string

        Returns void

    game/:id/gamedata: ((data) => void)

    Update the entire game state

    -

    Type declaration

    game/:id/latency: ((data) => void)

    Update latency information for a player

    -

    Type declaration

      • (data): void
      • Parameters

        • data: {
              game_id: number;
              latency: number;
              player_id: number;
          }
          • game_id: number

            The game id

            +

        Returns void

    game/:id/error: ((data) => void)

    Error that should be displayed to the user

    +

    Type declaration

      • (data): void
      • Parameters

        • data: string

        Returns void

    game/:id/gamedata: ((data) => void)

    Update the entire game state

    +

    Type declaration

    game/:id/latency: ((data) => void)

    Update latency information for a player

    +

    Type declaration

      • (data): void
      • Parameters

        • data: {
              game_id: number;
              latency: number;
              player_id: number;
          }
          • game_id: number

            The game id

          • latency: number

            The latency in milliseconds

          • player_id: number

            The player id

            -

        Returns void

    game/:id/phase: ((data) => void)

    The phase has changed for the game

    -

    Type declaration

      • (data): void
      • Parameters

        • data: "play" | "stone removal" | "finished"

        Returns void

    game/:id/removed_stones: ((data) => void)

    Update the state of the stone removal phase

    -

    Type declaration

      • (data): void
      • Parameters

        • data: {
              all_removed: string;
              removed: boolean;
              stones: string;
          } | {
              strict_seki_mode: boolean;
          }

        Returns void

    game/:id/removed_stones_accepted: ((data) => void)

    The stone removal phase has been completed, this is the final state and +

    Returns void

    game/:id/phase: ((data) => void)

    The phase has changed for the game

    +

    Type declaration

      • (data): void
      • Parameters

        • data: "play" | "stone removal" | "finished"

        Returns void

    game/:id/removed_stones: ((data) => void)

    Update the state of the stone removal phase

    +

    Type declaration

      • (data): void
      • Parameters

        • data: {
              all_removed: string;
              removed: boolean;
              stones: string;
          } | {
              strict_seki_mode: boolean;
          }

        Returns void

    game/:id/removed_stones_accepted: ((data) => void)

    The stone removal phase has been completed, this is the final state and indicates a phase change to the given phase (should always be "finished")

    -

    Type declaration

      • (data): void
      • Parameters

        • data: {
              end_time: number;
              outcome: string;
              phase: "finished";
              player_id: number;
              players: {
                  black: User | {
                      accepted_stones: string;
                      accepted_strict_seki_mode: boolean;
                  };
                  white: User | {
                      accepted_stones: string;
                      accepted_strict_seki_mode: boolean;
                  };
              };
              score: Score;
              stones: string;
              strict_seki_mode: boolean;
              winner: number;
          }
          • end_time: number

            Timestamp in ms

            +

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      end_time: number;
                      outcome: string;
                      phase: "finished";
                      player_id: number;
                      players: {
                          black: User | {
                              accepted_stones: string;
                              accepted_strict_seki_mode: boolean;
                          };
                          white: User | {
                              accepted_stones: string;
                              accepted_strict_seki_mode: boolean;
                          };
                      };
                      score: Score;
                      stones: string;
                      strict_seki_mode: boolean;
                      winner: number;
                  }
                  • end_time: number

                    Timestamp in ms

                  • outcome: string

                    Outcome of the game

                  • phase: "finished"

                    Game phase (finished

                  • player_id: number
                  • players: {
                        black: User | {
                            accepted_stones: string;
                            accepted_strict_seki_mode: boolean;
                        };
                        white: User | {
                            accepted_stones: string;
                            accepted_strict_seki_mode: boolean;
                        };
                    }

                    Current players and their accepted stone statuses

                    @@ -140,46 +144,46 @@
                  • stones: string
                  • strict_seki_mode: boolean

                    True if Japanese strict seki mode was true. This will probably always be false and may be removed in the future.

                  • winner: number

                    Player id of the winner

                    -

                Returns void

    game/:id/reset-chats: (() => void)

    The chat log should be reset.

    -

    Type declaration

      • (): void
      • Returns void

    game/:id/stalling_score_estimate: ((data?) => void)

    A score estimation result has been broadcast, this is used for avoiding game stalling

    -

    Type declaration

    game/:id/undo_accepted: ((data) => void)

    Undo move has been accepted, the parameter is the new move number

    -

    Type declaration

      • (data): void
      • Parameters

        • data: number

        Returns void

    game/:id/undo_canceled: ((data) => void)

    Undo request has been canceled, the parameter is the move number of the original request

    -

    Type declaration

      • (data): void
      • Parameters

        • data: number

        Returns void

    game/:id/undo_requested: ((data) => void)

    Undo request has been requested, the parameter is the move number that we want to go back to

    -

    Type declaration

      • (data): void
      • Parameters

        • data: number

        Returns void

    gamelist-count: ((data) => void)

    Update number of live and correspondence games are currently being +

    Returns void

    game/:id/reset-chats: (() => void)

    The chat log should be reset.

    +

    Type declaration

      • (): void
      • Returns void

    game/:id/stalling_score_estimate: ((data?) => void)

    A score estimation result has been broadcast, this is used for avoiding game stalling

    +

    Type declaration

    game/:id/undo_accepted: ((data) => void)

    Undo move has been accepted, the parameter is the new move number

    +

    Type declaration

      • (data): void
      • Parameters

        • data: number

        Returns void

    game/:id/undo_canceled: ((data) => void)

    Undo request has been canceled, the parameter is the move number of the original request

    +

    Type declaration

      • (data): void
      • Parameters

        • data: number

        Returns void

    game/:id/undo_requested: ((data) => void)

    Undo request has been requested, the parameter is the move number that we want to go back to

    +

    Type declaration

      • (data): void
      • Parameters

        • data: number

        Returns void

    gamelist-count: ((data) => void)

    Update number of live and correspondence games are currently being played

    -

    Type declaration

      • (data): void
      • Parameters

        • data: {
              correspondence: number;
              live: number;
          }
          • correspondence: number

            Number of correspondence games

            +

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      correspondence: number;
                      live: number;
                  }
                  • correspondence: number

                    Number of correspondence games

                  • live: number

                    Number of live games

                    -

                Returns void

    gamelist-count-:channel: ((data) => void)

    Update number of live and correspondence games are currently being +

    Returns void

    gamelist-count-:channel: ((data) => void)

    Update number of live and correspondence games are currently being played in a particular channel

    -

    Type declaration

      • (data): void
      • Parameters

        • data: {
              correspondence: number;
              live: number;
          }
    hostinfo: ((data) => void)

    General host information for the termination server you +

    Returns void

    hostinfo: ((data) => void)

    General host information for the termination server you are connected to. This is a response to the hostinfo client message.

    -

    Type declaration

      • (data): void
      • Parameters

        • data: {
              clients: number;
              hostname: string;
              uptime: number;
          }
          • clients: number

            Number of clients connected, if available

            +

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      clients: number;
                      hostname: string;
                      uptime: number;
                  }
                  • clients: number

                    Number of clients connected, if available

                  • hostname: string

                    The hostname of the server

                  • uptime: number

                    Number of seconds the server has been running

                    -

                Returns void

    incident-report: ((data) => void)

    Incident report update

    -

    Type declaration

      • (data): void
      • Parameters

        • data: {
              cleared_by_user?: boolean;
              created: string;
              id: number;
              moderator?: User;
              moderator_note: string;
              report_type: string;
              reported_conversation?: string;
              reported_game?: number;
              reported_review?: number;
              reported_user?: User;
              reporter_note: string;
              reporter_note_translation: {
                  source_language: string;
                  source_text: string;
                  target_language: string;
                  target_text: string;
              };
              reporting_user?: User;
              source: string;
              state: "pending" | "claimed" | "resolved";
              system_note: string;
              updated: string;
              url: string;
              was_helpful: boolean;
          }
          • Optional cleared_by_user?: boolean
          • created: string
          • id: number
          • Optional moderator?: User
          • moderator_note: string
          • report_type: string
          • Optional reported_conversation?: string
          • Optional reported_game?: number
          • Optional reported_review?: number
          • Optional reported_user?: User
          • reporter_note: string
          • reporter_note_translation: {
                source_language: string;
                source_text: string;
                target_language: string;
                target_text: string;
            }
            • source_language: string
            • source_text: string
            • target_language: string
            • target_text: string
          • Optional reporting_user?: User
          • source: string
          • state: "pending" | "claimed" | "resolved"
          • system_note: string
          • updated: string
          • url: string
          • was_helpful: boolean

        Returns void

    itc: ((data) => void)

    "Inter Tab Communication" message. This is a client utility to enable +

    Returns void

    incident-report: ((data) => void)

    Incident report update

    +

    Type declaration

      • (data): void
      • Parameters

        • data: {
              cleared_by_user?: boolean;
              created: string;
              id: number;
              moderator?: User;
              moderator_note: string;
              report_type: string;
              reported_conversation?: string;
              reported_game?: number;
              reported_review?: number;
              reported_user?: User;
              reporter_note: string;
              reporter_note_translation: {
                  source_language: string;
                  source_text: string;
                  target_language: string;
                  target_text: string;
              };
              reporting_user?: User;
              source: string;
              state: "pending" | "claimed" | "resolved";
              system_note: string;
              updated: string;
              url: string;
              was_helpful: boolean;
          }
          • Optional cleared_by_user?: boolean
          • created: string
          • id: number
          • Optional moderator?: User
          • moderator_note: string
          • report_type: string
          • Optional reported_conversation?: string
          • Optional reported_game?: number
          • Optional reported_review?: number
          • Optional reported_user?: User
          • reporter_note: string
          • reporter_note_translation: {
                source_language: string;
                source_text: string;
                target_language: string;
                target_text: string;
            }
            • source_language: string
            • source_text: string
            • target_language: string
            • target_text: string
          • Optional reporting_user?: User
          • source: string
          • state: "pending" | "claimed" | "resolved"
          • system_note: string
          • updated: string
          • url: string
          • was_helpful: boolean

        Returns void

    itc: ((data) => void)

    "Inter Tab Communication" message. This is a client utility to enable relaying of messages between devices - the event and data are application defined, the server blindly relays to all connected devices for the sending user. Note this is relayed to all devices regardless of client, so your application should be prepared to handle ITC messages from other applications, not just your own application. (For instance, the web client sending this will arrive on an android and ios instance)

    -

    Type declaration

      • (data): void
      • Parameters

        • data: {
              data: any;
              event: string;
          }
          • data: any

            User defined data

            +

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      data: any;
                      event: string;
                  }
                  • data: any

                    User defined data

                  • event: string

                    User defined event string

                    -

                Returns void

    latency: ((latency, clock_drift) => void)

    Type declaration

      • (latency, clock_drift): void
      • Parameters

        • latency: number
        • clock_drift: number

        Returns void

    net/pong: ((data) => void)

    Pong response from a ping

    -

    Type declaration

      • (data): void
      • Parameters

        • data: {
              client: number;
              server: number;
          }
          • client: number

            Client timestamp that was sent

            +

        Returns void

    latency: ((latency, clock_drift) => void)

    Type declaration

      • (latency, clock_drift): void
      • Parameters

        • latency: number
        • clock_drift: number

        Returns void

    net/pong: ((data) => void)

    Pong response from a ping

    +

    Type declaration

      • (data): void
      • Parameters

        • data: {
              client: number;
              server: number;
          }
          • client: number

            Client timestamp that was sent

          • server: number

            Server timestamp when it was received

            -

        Returns void

    notification: ((data) => void)

    A notification that should be displayed to the user +

    Returns void

    notification: ((data) => void)

    A notification that should be displayed to the user These are not strongly modeled, see https://github.com/online-go/online-go.com/blob/devel/src/components/Notifications/Notifications.tsx as a reference for what types there are and what data they contain

    -

    Type declaration

      • (data): void
      • Parameters

        • data: {
              id: string;
              type: string;
              [key: string]: any;
          }
          • [key: string]: any

            There are often more fields here

            +

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      id: string;
                      type: string;
                      [key: string]: any;
                  }
                  • [key: string]: any

                    There are often more fields here

                  • id: string

                    The notification id

                  • type: string

                    The notification type

                    -

                Returns void

    private-message: ((data) => void)

    A private message was received

    -

    Type declaration

      • (data): void
      • Parameters

        • data: {
              from: User;
              message: {
                  i: string;
                  m: string;
                  t: number;
              };
              superchat_enabled?: boolean;
              to: User;
          }
          • from: User

            Who sent the message

            +

        Returns void

    private-message: ((data) => void)

    A private message was received

    +

    Type declaration

      • (data): void
      • Parameters

        • data: {
              from: User;
              message: {
                  i: string;
                  m: string;
                  t: number;
              };
              superchat_enabled?: boolean;
              to: User;
          }
          • from: User

            Who sent the message

          • message: {
                i: string;
                m: string;
                t: number;
            }

            The message received

            • i: string

              Message id.

            • m: string

              Message text

              @@ -188,41 +192,41 @@ is when a moderator needs to talk with a player and ignoring the moderator is not suitable thing to do.

            • to: User

              Your user id

              -

        Returns void

    private-superchat: ((data) => void)

    Notify the client that a private message "super chat" has started. A +

    Returns void

    private-superchat: ((data) => void)

    Notify the client that a private message "super chat" has started. A super chat is an undismissable chat sent by a moderator. It should take all focus and not let the client do anything until the conversation is resolved (the enable flag is set to false)

    -

    Type declaration

      • (data): void
      • Parameters

        • data: {
              enable: boolean;
              moderator_id: number;
              moderator_username: string;
              player_id: number;
              player_username: string;
          }
          • enable: boolean

            Whether the superchat is enabled or not. When true, the client +

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      enable: boolean;
                      moderator_id: number;
                      moderator_username: string;
                      player_id: number;
                      player_username: string;
                  }
                  • enable: boolean

                    Whether the superchat is enabled or not. When true, the client should make an undismissable chat window, when false the window can be dismissed.

                  • moderator_id: number

                    The moderator id contacting the player

                  • moderator_username: string

                    The moderator username contacting the player

                  • player_id: number

                    Your id

                  • player_username: string

                    Your username

                    -

                Returns void

    reconnect: (() => void)

    Type declaration

      • (): void
      • Returns void

    remote_storage/sync_complete: (() => void)

    Notification that the server has completed sending all remote storage +

    Returns void

    reconnect: (() => void)

    Type declaration

      • (): void
      • Returns void

    remote_storage/sync_complete: (() => void)

    Notification that the server has completed sending all remote storage data and the client should now be up to date.

    -

    Type declaration

      • (): void
      • Returns void

    remote_storage/update: ((data) => void)

    Updates a key value pair

    -

    Type declaration

    remote_storage/update: ((data) => void)

    Updates a key value pair

    +

    Type declaration

      • (data): void
      • Parameters

        • data: {
              key: string;
              modified: string;
              replication: RemoteStorageReplication;
              value: any;
          }
          • key: string

            Key for the k/v pair

          • modified: string

            Timestamp of the update

          • replication: RemoteStorageReplication

            Replication mode

          • value: any

            Value of of the k/v pair

            -

        Returns void

    review/:id/full_state: ((data) => void)

    Replay of the entire full state of the review

    -

    Type declaration

    review/:id/r: ((data) => void)

    An incremental modification to the review stream

    -

    Type declaration

    score-estimator-enabled-state: ((data) => void)

    Notifies the client whether the the client shares an IP with one of the +

    Returns void

    review/:id/full_state: ((data) => void)

    Replay of the entire full state of the review

    +

    Type declaration

    review/:id/r: ((data) => void)

    An incremental modification to the review stream

    +

    Type declaration

    score-estimator-enabled-state: ((data) => void)

    Notifies the client whether the the client shares an IP with one of the players of the game. This is used to disable the score estimator in anonymous browsing windows for players of a game when the score estimator is disabled for the game.

    -

    Type declaration

      • (data): void
      • Parameters

        • data: {
              game_id: number;
              shared_ip_with_player: boolean;
          }
    seekgraph/global: ((messages) => void)

    Type declaration

    timeout: (() => void)

    Type declaration

      • (): void
      • Returns void

    ui-push: ((data) => void)

    A UI Push notification. The event and data are not well defined here, +

    Returns void

    seekgraph/global: ((messages) => void)

    Type declaration

    timeout: (() => void)

    Type declaration

      • (): void
      • Returns void

    ui-push: ((data) => void)

    A UI Push notification. The event and data are not well defined here, they come as a result to subscribing to ui push channels with ui-pushes/subscribe.

    -

    Type declaration

      • (data): void
      • Parameters

        • data: {
              data: string;
              event: string;
          }
    unrecoverable_error: ((code, tag, message) => void)

    Type declaration

      • (code, tag, message): void
      • Parameters

        • code: number
        • tag: string
        • message: string

        Returns void

    user/jwt: ((jwt) => void)

    Update the user's JWT token

    -

    Type declaration

      • (jwt): void
      • Parameters

        • jwt: string

        Returns void

    user/state: ((data) => void)

    Updates whether a user is online or not. Subscribe to these updates for +

    Returns void

    unrecoverable_error: ((code, tag, message) => void)

    Type declaration

      • (code, tag, message): void
      • Parameters

        • code: number
        • tag: string
        • message: string

        Returns void

    user/jwt: ((jwt) => void)

    Update the user's JWT token

    +

    Type declaration

      • (jwt): void
      • Parameters

        • jwt: string

        Returns void

    user/state: ((data) => void)

    Updates whether a user is online or not. Subscribe to these updates for particular users using the user/monitor command.

    -

    Type declaration

      • (data): void
      • Parameters

        • data: {
              [player_id: number]: boolean;
          }
          • [player_id: number]: boolean

        Returns void

    user/update: ((user) => void)

    Update user information. For other players, this has the standard User +

    Type declaration

      • (data): void
      • Parameters

        • data: {
              [player_id: number]: boolean;
          }
          • [player_id: number]: boolean

        Returns void

    user/update: ((user) => void)

    Update user information. For other players, this has the standard User fields, when this is the current user, it can have additional fields that are found in the ui/config

    -

    Type declaration

      • (user): void
      • Parameters

        • user: User & {
              [extra: string]: any;
          }

        Returns void

    \ No newline at end of file +

    Type declaration

    \ No newline at end of file diff --git a/docs/interfaces/GobanThemeBackgroundCSS.html b/docs/interfaces/GobanThemeBackgroundCSS.html index 9d0177f8..7dd723be 100644 --- a/docs/interfaces/GobanThemeBackgroundCSS.html +++ b/docs/interfaces/GobanThemeBackgroundCSS.html @@ -1,4 +1,4 @@ -GobanThemeBackgroundCSS | goban

    Interface GobanThemeBackgroundCSS

    interface GobanThemeBackgroundCSS {
        background-color?: string;
        background-image?: string;
        background-size?: string;
    }

    Properties

    background-color? +GobanThemeBackgroundCSS | goban

    Interface GobanThemeBackgroundCSS

    interface GobanThemeBackgroundCSS {
        background-color?: string;
        background-image?: string;
        background-size?: string;
    }

    Properties

    background-color?: string
    background-image?: string
    background-size?: string
    \ No newline at end of file +

    Properties

    background-color?: string
    background-image?: string
    background-size?: string
    \ No newline at end of file diff --git a/docs/interfaces/GobanThemeBackgroundReactStyles.html b/docs/interfaces/GobanThemeBackgroundReactStyles.html index 93ce68d4..a679ed78 100644 --- a/docs/interfaces/GobanThemeBackgroundReactStyles.html +++ b/docs/interfaces/GobanThemeBackgroundReactStyles.html @@ -1,4 +1,4 @@ -GobanThemeBackgroundReactStyles | goban

    Interface GobanThemeBackgroundReactStyles

    interface GobanThemeBackgroundReactStyles {
        backgroundColor?: string;
        backgroundImage?: string;
        backgroundSize?: string;
    }

    Properties

    backgroundColor? +GobanThemeBackgroundReactStyles | goban

    Interface GobanThemeBackgroundReactStyles

    interface GobanThemeBackgroundReactStyles {
        backgroundColor?: string;
        backgroundImage?: string;
        backgroundSize?: string;
    }

    Properties

    backgroundColor?: string
    backgroundImage?: string
    backgroundSize?: string
    \ No newline at end of file +

    Properties

    backgroundColor?: string
    backgroundImage?: string
    backgroundSize?: string
    \ No newline at end of file diff --git a/docs/interfaces/JGOF.html b/docs/interfaces/JGOF.html index 9cae393f..7180d752 100644 --- a/docs/interfaces/JGOF.html +++ b/docs/interfaces/JGOF.html @@ -1,14 +1,14 @@ JGOF | goban

    Interface JGOF

    JGOF (JSON Go Format) is an attempt at normalizing the AdHocFormat.

    -
    interface JGOF {
        ai_reviews?: {
            [id: string]: JGOFAIReview;
        };
        black?: JGOFPlayer | JGOFPlayer[];
        clock?: JGOFClock;
        jgof: 1;
        time_control?: JGOFTimeControl;
        white?: JGOFPlayer | JGOFPlayer[];
    }

    Properties

    interface JGOF {
        ai_reviews?: {
            [id: string]: JGOFAIReview;
        };
        black?: JGOFPlayer | JGOFPlayer[];
        clock?: JGOFClock;
        jgof: 1;
        time_control?: JGOFTimeControl;
        white?: JGOFPlayer | JGOFPlayer[];
    }

    Properties

    ai_reviews?: {
        [id: string]: JGOFAIReview;
    }

    AI Review information computed for this game

    -

    Type declaration

    Player information for those playing Black

    -
    clock?: JGOFClock

    Current clock information, this is used for ongoing games

    -
    jgof: 1

    JGOF version number

    -
    time_control?: JGOFTimeControl

    Time control settings for the game

    -

    Player information for those playing White

    -
    \ No newline at end of file +

    Type declaration

    Player information for those playing Black

    +
    clock?: JGOFClock

    Current clock information, this is used for ongoing games

    +
    jgof: 1

    JGOF version number

    +
    time_control?: JGOFTimeControl

    Time control settings for the game

    +

    Player information for those playing White

    +
    \ No newline at end of file diff --git a/docs/interfaces/JGOFAIReview.html b/docs/interfaces/JGOFAIReview.html index f1f13bf3..24c44f88 100644 --- a/docs/interfaces/JGOFAIReview.html +++ b/docs/interfaces/JGOFAIReview.html @@ -1,5 +1,5 @@ JGOFAIReview | goban

    Interface JGOFAIReview


    -
    interface JGOFAIReview {
        analyzed_variations?: {
            [var_key: string]: JGOFAIReviewMove;
        };
        date: number;
        engine: string;
        engine_version: string;
        error?: {
            coords: string;
            message_id: GobanMoveErrorMessageId;
            move_number: number;
        };
        id: string;
        moves: {
            [move_number: string]: JGOFAIReviewMove;
        };
        network: string;
        network_size: string;
        scores?: number[];
        strength: number;
        type: "fast" | "full";
        uuid: string;
        win_rate: number;
        win_rates?: number[];
    }

    Properties

    interface JGOFAIReview {
        analyzed_variations?: {
            [var_key: string]: JGOFAIReviewMove;
        };
        date: number;
        engine: string;
        engine_version: string;
        error?: {
            coords: string;
            message_id: GobanMoveErrorMessageId;
            move_number: number;
        };
        id: string;
        moves: {
            [move_number: string]: JGOFAIReviewMove;
        };
        network: string;
        network_size: string;
        scores?: number[];
        strength: number;
        type: "fast" | "full";
        uuid: string;
        win_rate: number;
        win_rates?: number[];
    }

    Properties

    analyzed_variations?: {
        [var_key: string]: JGOFAIReviewMove;
    }

    Analysis of variations in the game.

    -

    Type declaration

    date: number

    millisecond epoch time (ms from 1970 UTC)

    -
    engine: string
    engine_version: string
    error?: {
        coords: string;
        message_id: GobanMoveErrorMessageId;
        move_number: number;
    }

    If there was an error processing the review, it can be stored here

    -

    Type declaration

    id: string
    moves: {
        [move_number: string]: JGOFAIReviewMove;
    }

    Analysis of moves in the game.

    -

    Type declaration

    network: string
    network_size: string
    scores?: number[]

    predicted scores that black will win or lose by (negative for loss) for all moves

    -
    strength: number
    type: "fast" | "full"

    A fast review typically only has a few moves reviewed, whereas a full +

    Type declaration

    date: number

    millisecond epoch time (ms from 1970 UTC)

    +
    engine: string
    engine_version: string
    error?: {
        coords: string;
        message_id: GobanMoveErrorMessageId;
        move_number: number;
    }

    If there was an error processing the review, it can be stored here

    +

    Type declaration

    id: string
    moves: {
        [move_number: string]: JGOFAIReviewMove;
    }

    Analysis of moves in the game.

    +

    Type declaration

    network: string
    network_size: string
    scores?: number[]

    predicted scores that black will win or lose by (negative for loss) for all moves

    +
    strength: number
    type: "fast" | "full"

    A fast review typically only has a few moves reviewed, whereas a full review is expected to have every move reviewed. Note that this sets an expectation but not a requirement on what values are stored in moves, and while games are being reviewed these objects will have zero or more entries in moves regardless of the type.

    -
    uuid: string
    win_rate: number

    predicted probability that black will win the last move

    -
    win_rates?: number[]

    predicted probability that black will win for all moves

    -
    \ No newline at end of file +
    uuid: string
    win_rate: number

    predicted probability that black will win the last move

    +
    win_rates?: number[]

    predicted probability that black will win for all moves

    +
    \ No newline at end of file diff --git a/docs/interfaces/JGOFAIReviewMove.html b/docs/interfaces/JGOFAIReviewMove.html index 8ce11bd1..62de47fb 100644 --- a/docs/interfaces/JGOFAIReviewMove.html +++ b/docs/interfaces/JGOFAIReviewMove.html @@ -1,13 +1,13 @@ -JGOFAIReviewMove | goban

    Interface JGOFAIReviewMove

    interface JGOFAIReviewMove {
        branches: JGOFAIReviewMoveVariation[];
        move: JGOFIntersection;
        move_number: number;
        ownership?: number[][];
        score?: number;
        win_rate: number;
    }

    Properties

    branches +JGOFAIReviewMove | goban

    Interface JGOFAIReviewMove

    interface JGOFAIReviewMove {
        branches: JGOFAIReviewMoveVariation[];
        move: JGOFIntersection;
        move_number: number;
        ownership?: number[][];
        score?: number;
        win_rate: number;
    }

    Properties

    Followup move branches explored

    -

    The move that was played.

    -
    move_number: number

    The move number. This is 1 indexed.

    -
    ownership?: number[][]

    A width*height array of ownership values

    -
    score?: number

    How many points black is predicted to win by (if positive, lose by if negative)

    -
    win_rate: number

    Probability of black winning after this move was made

    -
    \ No newline at end of file +

    The move that was played.

    +
    move_number: number

    The move number. This is 1 indexed.

    +
    ownership?: number[][]

    A width*height array of ownership values

    +
    score?: number

    How many points black is predicted to win by (if positive, lose by if negative)

    +
    win_rate: number

    Probability of black winning after this move was made

    +
    \ No newline at end of file diff --git a/docs/interfaces/JGOFAIReviewMoveVariation.html b/docs/interfaces/JGOFAIReviewMoveVariation.html index f23131ae..7aa3112c 100644 --- a/docs/interfaces/JGOFAIReviewMoveVariation.html +++ b/docs/interfaces/JGOFAIReviewMoveVariation.html @@ -1,4 +1,4 @@ -JGOFAIReviewMoveVariation | goban

    Interface JGOFAIReviewMoveVariation

    interface JGOFAIReviewMoveVariation {
        lcb?: number;
        moves: JGOFIntersection[];
        policy?: number;
        score?: number;
        score_mean?: number;
        score_stdev?: number;
        utility?: number;
        utility_lcb?: number;
        visits: number;
        win_rate: number;
    }

    Properties

    lcb? +JGOFAIReviewMoveVariation | goban

    Interface JGOFAIReviewMoveVariation

    interface JGOFAIReviewMoveVariation {
        lcb?: number;
        moves: JGOFIntersection[];
        policy?: number;
        score?: number;
        score_mean?: number;
        score_stdev?: number;
        utility?: number;
        utility_lcb?: number;
        visits: number;
        win_rate: number;
    }

    Properties

    lcb? moves policy? score? @@ -9,13 +9,13 @@ visits win_rate

    Properties

    lcb?: number

    lower confidence bound, both KataGo and LeelaZero provide this

    -

    Followup predicted moves by the AI

    -
    policy?: number

    From Leela Zero

    -
    score?: number

    How many points black is predicted to win for this variation (or lose by if negative)

    -
    score_mean?: number

    From KataGo

    -
    score_stdev?: number

    From KataGo

    -
    utility?: number

    From KataGo

    -
    utility_lcb?: number

    From KataGo

    -
    visits: number

    Number of times the AI considered the first move of this variation

    -
    win_rate: number

    Probability of black wining to report for this variation

    -
    \ No newline at end of file +

    Followup predicted moves by the AI

    +
    policy?: number

    From Leela Zero

    +
    score?: number

    How many points black is predicted to win for this variation (or lose by if negative)

    +
    score_mean?: number

    From KataGo

    +
    score_stdev?: number

    From KataGo

    +
    utility?: number

    From KataGo

    +
    utility_lcb?: number

    From KataGo

    +
    visits: number

    Number of times the AI considered the first move of this variation

    +
    win_rate: number

    Probability of black wining to report for this variation

    +
    \ No newline at end of file diff --git a/docs/interfaces/JGOFAbsoluteTimeControl.html b/docs/interfaces/JGOFAbsoluteTimeControl.html index ba344955..78289b52 100644 --- a/docs/interfaces/JGOFAbsoluteTimeControl.html +++ b/docs/interfaces/JGOFAbsoluteTimeControl.html @@ -1,5 +1,5 @@ -JGOFAbsoluteTimeControl | goban

    Interface JGOFAbsoluteTimeControl

    interface JGOFAbsoluteTimeControl {
        pause_on_weekends: boolean;
        speed: JGOFTimeControlSpeed;
        system: "absolute";
        total_time: number;
    }

    Properties

    pause_on_weekends +JGOFAbsoluteTimeControl | goban

    Interface JGOFAbsoluteTimeControl

    interface JGOFAbsoluteTimeControl {
        pause_on_weekends: boolean;
        speed: JGOFTimeControlSpeed;
        system: "absolute";
        total_time: number;
    }

    Properties

    pause_on_weekends: boolean
    system: "absolute"
    total_time: number
    \ No newline at end of file +

    Properties

    pause_on_weekends: boolean
    system: "absolute"
    total_time: number
    \ No newline at end of file diff --git a/docs/interfaces/JGOFByoYomiTimeControl.html b/docs/interfaces/JGOFByoYomiTimeControl.html index 7c8c7684..a283db76 100644 --- a/docs/interfaces/JGOFByoYomiTimeControl.html +++ b/docs/interfaces/JGOFByoYomiTimeControl.html @@ -1,7 +1,7 @@ -JGOFByoYomiTimeControl | goban

    Interface JGOFByoYomiTimeControl

    interface JGOFByoYomiTimeControl {
        main_time: number;
        pause_on_weekends: boolean;
        period_time: number;
        periods: number;
        speed: JGOFTimeControlSpeed;
        system: "byoyomi";
    }

    Properties

    main_time +JGOFByoYomiTimeControl | goban

    Interface JGOFByoYomiTimeControl

    interface JGOFByoYomiTimeControl {
        main_time: number;
        pause_on_weekends: boolean;
        period_time: number;
        periods: number;
        speed: JGOFTimeControlSpeed;
        system: "byoyomi";
    }

    Properties

    main_time: number
    pause_on_weekends: boolean
    period_time: number
    periods: number
    system: "byoyomi"
    \ No newline at end of file +

    Properties

    main_time: number
    pause_on_weekends: boolean
    period_time: number
    periods: number
    system: "byoyomi"
    \ No newline at end of file diff --git a/docs/interfaces/JGOFCanadianTimeControl.html b/docs/interfaces/JGOFCanadianTimeControl.html index 841a44ed..71543440 100644 --- a/docs/interfaces/JGOFCanadianTimeControl.html +++ b/docs/interfaces/JGOFCanadianTimeControl.html @@ -1,7 +1,7 @@ -JGOFCanadianTimeControl | goban

    Interface JGOFCanadianTimeControl

    interface JGOFCanadianTimeControl {
        main_time: number;
        pause_on_weekends: boolean;
        period_time: number;
        speed: JGOFTimeControlSpeed;
        stones_per_period: number;
        system: "canadian";
    }

    Properties

    main_time +JGOFCanadianTimeControl | goban

    Interface JGOFCanadianTimeControl

    interface JGOFCanadianTimeControl {
        main_time: number;
        pause_on_weekends: boolean;
        period_time: number;
        speed: JGOFTimeControlSpeed;
        stones_per_period: number;
        system: "canadian";
    }

    Properties

    main_time: number
    pause_on_weekends: boolean
    period_time: number
    stones_per_period: number
    system: "canadian"
    \ No newline at end of file +

    Properties

    main_time: number
    pause_on_weekends: boolean
    period_time: number
    stones_per_period: number
    system: "canadian"
    \ No newline at end of file diff --git a/docs/interfaces/JGOFClock.html b/docs/interfaces/JGOFClock.html index 44b611ea..9b9bc676 100644 --- a/docs/interfaces/JGOFClock.html +++ b/docs/interfaces/JGOFClock.html @@ -1,5 +1,5 @@ JGOFClock | goban

    Interface JGOFClock


    -
    interface JGOFClock {
        black_clock: JGOFPlayerClock;
        current_player: "black" | "white";
        current_player_id: string;
        pause_state?: JGOFPauseState;
        paused_since?: number;
        start_mode?: boolean;
        start_time_left?: number;
        stone_removal_time_left?: number;
        time_of_last_move: number;
        white_clock: JGOFPlayerClock;
    }

    Hierarchy (view full)

    Properties

    interface JGOFClock {
        black_clock: JGOFPlayerClock;
        current_player: "black" | "white";
        current_player_id: string;
        pause_state?: JGOFPauseState;
        paused_since?: number;
        start_mode?: boolean;
        start_time_left?: number;
        stone_removal_time_left?: number;
        time_of_last_move: number;
        white_clock: JGOFPlayerClock;
    }

    Hierarchy (view full)

    Properties

    black_clock: JGOFPlayerClock

    Time left on blacks clock.

    -
    current_player: "black" | "white"

    Player to move, and thus player whose clock is running.

    -
    current_player_id: string

    Player ID of player to move

    -
    pause_state?: JGOFPauseState

    If this field is set, the game clocks are paused for one or more reasons.

    -
    paused_since?: number

    Time the game was paused, in milliseconds since 1970, as observed by the server

    -
    start_mode?: boolean

    True if the game has not begun yet and we are waiting for the first +

    current_player: "black" | "white"

    Player to move, and thus player whose clock is running.

    +
    current_player_id: string

    Player ID of player to move

    +
    pause_state?: JGOFPauseState

    If this field is set, the game clocks are paused for one or more reasons.

    +
    paused_since?: number

    Time the game was paused, in milliseconds since 1970, as observed by the server

    +
    start_mode?: boolean

    True if the game has not begun yet and we are waiting for the first move to be played. If this is true, start_time_left will be set.

    -
    start_time_left?: number

    If start_mode is true, this is the number of milliseconds left +

    start_time_left?: number

    If start_mode is true, this is the number of milliseconds left on the start clock, when the clock reaches zero the game will be canceled.

    -
    stone_removal_time_left?: number

    If pause_State.stone_removal is true, this is the number of +

    stone_removal_time_left?: number

    If pause_State.stone_removal is true, this is the number of milliseconds left before the result is automatically accepted.

    -
    time_of_last_move: number

    Time the last move was made, in milliseconds since 1970, as observed by the server.

    -
    white_clock: JGOFPlayerClock

    Time left on whites clock.

    -
    \ No newline at end of file +
    time_of_last_move: number

    Time the last move was made, in milliseconds since 1970, as observed by the server.

    +
    white_clock: JGOFPlayerClock

    Time left on whites clock.

    +
    \ No newline at end of file diff --git a/docs/interfaces/JGOFClockWithTransmitting.html b/docs/interfaces/JGOFClockWithTransmitting.html index 0735af4f..f08d48cb 100644 --- a/docs/interfaces/JGOFClockWithTransmitting.html +++ b/docs/interfaces/JGOFClockWithTransmitting.html @@ -1,5 +1,5 @@ JGOFClockWithTransmitting | goban

    Interface JGOFClockWithTransmitting


    -
    interface JGOFClockWithTransmitting {
        black_clock: JGOFPlayerClock;
        black_move_transmitting: number;
        current_player: "black" | "white";
        current_player_id: string;
        pause_state?: JGOFPauseState;
        paused_since?: number;
        start_mode?: boolean;
        start_time_left?: number;
        stone_removal_time_left?: number;
        time_of_last_move: number;
        white_clock: JGOFPlayerClock;
        white_move_transmitting: number;
    }

    Hierarchy (view full)

    Properties

    interface JGOFClockWithTransmitting {
        black_clock: JGOFPlayerClock;
        black_move_transmitting: number;
        current_player: "black" | "white";
        current_player_id: string;
        pause_state?: JGOFPauseState;
        paused_since?: number;
        start_mode?: boolean;
        start_time_left?: number;
        stone_removal_time_left?: number;
        time_of_last_move: number;
        white_clock: JGOFPlayerClock;
        white_move_transmitting: number;
    }

    Hierarchy (view full)

    Properties

    black_clock: JGOFPlayerClock

    Time left on blacks clock.

    -
    black_move_transmitting: number
    current_player: "black" | "white"

    Player to move, and thus player whose clock is running.

    -
    current_player_id: string

    Player ID of player to move

    -
    pause_state?: JGOFPauseState

    If this field is set, the game clocks are paused for one or more reasons.

    -
    paused_since?: number

    Time the game was paused, in milliseconds since 1970, as observed by the server

    -
    start_mode?: boolean

    True if the game has not begun yet and we are waiting for the first +

    black_move_transmitting: number
    current_player: "black" | "white"

    Player to move, and thus player whose clock is running.

    +
    current_player_id: string

    Player ID of player to move

    +
    pause_state?: JGOFPauseState

    If this field is set, the game clocks are paused for one or more reasons.

    +
    paused_since?: number

    Time the game was paused, in milliseconds since 1970, as observed by the server

    +
    start_mode?: boolean

    True if the game has not begun yet and we are waiting for the first move to be played. If this is true, start_time_left will be set.

    -
    start_time_left?: number

    If start_mode is true, this is the number of milliseconds left +

    start_time_left?: number

    If start_mode is true, this is the number of milliseconds left on the start clock, when the clock reaches zero the game will be canceled.

    -
    stone_removal_time_left?: number

    If pause_State.stone_removal is true, this is the number of +

    stone_removal_time_left?: number

    If pause_State.stone_removal is true, this is the number of milliseconds left before the result is automatically accepted.

    -
    time_of_last_move: number

    Time the last move was made, in milliseconds since 1970, as observed by the server.

    -
    white_clock: JGOFPlayerClock

    Time left on whites clock.

    -
    white_move_transmitting: number
    \ No newline at end of file +
    time_of_last_move: number

    Time the last move was made, in milliseconds since 1970, as observed by the server.

    +
    white_clock: JGOFPlayerClock

    Time left on whites clock.

    +
    white_move_transmitting: number
    \ No newline at end of file diff --git a/docs/interfaces/JGOFFischerTimeControl.html b/docs/interfaces/JGOFFischerTimeControl.html index 71680990..286d71e4 100644 --- a/docs/interfaces/JGOFFischerTimeControl.html +++ b/docs/interfaces/JGOFFischerTimeControl.html @@ -1,7 +1,7 @@ -JGOFFischerTimeControl | goban

    Interface JGOFFischerTimeControl

    interface JGOFFischerTimeControl {
        initial_time: number;
        max_time: number;
        pause_on_weekends: boolean;
        speed: JGOFTimeControlSpeed;
        system: "fischer";
        time_increment: number;
    }

    Properties

    initial_time +JGOFFischerTimeControl | goban

    Interface JGOFFischerTimeControl

    interface JGOFFischerTimeControl {
        initial_time: number;
        max_time: number;
        pause_on_weekends: boolean;
        speed: JGOFTimeControlSpeed;
        system: "fischer";
        time_increment: number;
    }

    Properties

    initial_time: number
    max_time: number
    pause_on_weekends: boolean
    system: "fischer"
    time_increment: number
    \ No newline at end of file +

    Properties

    initial_time: number
    max_time: number
    pause_on_weekends: boolean
    system: "fischer"
    time_increment: number
    \ No newline at end of file diff --git a/docs/interfaces/JGOFIntersection.html b/docs/interfaces/JGOFIntersection.html index 44ea30a8..3d303134 100644 --- a/docs/interfaces/JGOFIntersection.html +++ b/docs/interfaces/JGOFIntersection.html @@ -1,5 +1,5 @@ -JGOFIntersection | goban

    Interface JGOFIntersection

    interface JGOFIntersection {
        x: number;
        y: number;
    }

    Hierarchy (view full)

    Properties

    x +JGOFIntersection | goban

    Interface JGOFIntersection

    interface JGOFIntersection {
        x: number;
        y: number;
    }

    Hierarchy (view full)

    Properties

    x y

    Properties

    x: number

    Horizontal coordinate, counting left to right, starting with zero

    -
    y: number

    Vertical coordinate, counting top to bottom, starting with zero

    -
    \ No newline at end of file +
    y: number

    Vertical coordinate, counting top to bottom, starting with zero

    +
    \ No newline at end of file diff --git a/docs/interfaces/JGOFMove.html b/docs/interfaces/JGOFMove.html index c829fb5a..9d9183ab 100644 --- a/docs/interfaces/JGOFMove.html +++ b/docs/interfaces/JGOFMove.html @@ -1,4 +1,4 @@ -JGOFMove | goban

    Interface JGOFMove

    interface JGOFMove {
        blur?: number;
        color?: JGOFNumericPlayerColor;
        edited?: boolean;
        played_by?: number;
        player_update?: JGOFPlayerSummary;
        removal_reason?: string;
        sgf_downloaded_by?: number[];
        timedelta?: number;
        x: number;
        y: number;
    }

    Hierarchy (view full)

    Properties

    blur? +JGOFMove | goban

    Interface JGOFMove

    interface JGOFMove {
        blur?: number;
        color?: JGOFNumericPlayerColor;
        edited?: boolean;
        played_by?: number;
        player_update?: JGOFPlayerSummary;
        removal_reason?: string;
        sgf_downloaded_by?: number[];
        timedelta?: number;
        x: number;
        y: number;
    }

    Hierarchy (view full)

    Properties

    Properties

    blur?: number
    edited?: boolean
    played_by?: number
    player_update?: JGOFPlayerSummary
    removal_reason?: string

    Stone removal reasoning, primarily for debugging

    -
    sgf_downloaded_by?: number[]
    timedelta?: number
    x: number

    Horizontal coordinate, counting left to right, starting with zero

    -
    y: number

    Vertical coordinate, counting top to bottom, starting with zero

    -
    \ No newline at end of file +

    Properties

    blur?: number
    edited?: boolean
    played_by?: number
    player_update?: JGOFPlayerSummary
    removal_reason?: string

    Stone removal reasoning, primarily for debugging

    +
    sgf_downloaded_by?: number[]
    timedelta?: number
    x: number

    Horizontal coordinate, counting left to right, starting with zero

    +
    y: number

    Vertical coordinate, counting top to bottom, starting with zero

    +
    \ No newline at end of file diff --git a/docs/interfaces/JGOFNoneTimeControl.html b/docs/interfaces/JGOFNoneTimeControl.html index 80766ae2..a521886c 100644 --- a/docs/interfaces/JGOFNoneTimeControl.html +++ b/docs/interfaces/JGOFNoneTimeControl.html @@ -1,4 +1,4 @@ -JGOFNoneTimeControl | goban

    Interface JGOFNoneTimeControl

    interface JGOFNoneTimeControl {
        pause_on_weekends: boolean;
        speed: "correspondence";
        system: "none";
    }

    Properties

    pause_on_weekends +JGOFNoneTimeControl | goban

    Interface JGOFNoneTimeControl

    interface JGOFNoneTimeControl {
        pause_on_weekends: boolean;
        speed: "correspondence";
        system: "none";
    }

    Properties

    pause_on_weekends: boolean
    speed: "correspondence"
    system: "none"
    \ No newline at end of file +

    Properties

    pause_on_weekends: boolean
    speed: "correspondence"
    system: "none"
    \ No newline at end of file diff --git a/docs/interfaces/JGOFPauseState.html b/docs/interfaces/JGOFPauseState.html index a5057b40..adcc3152 100644 --- a/docs/interfaces/JGOFPauseState.html +++ b/docs/interfaces/JGOFPauseState.html @@ -1,16 +1,16 @@ -JGOFPauseState | goban

    Interface JGOFPauseState

    interface JGOFPauseState {
        moderator?: string;
        player?: {
            pauses_left: number;
            player_id: string;
        };
        server?: true;
        stone_removal?: true;
        vacation?: {
            [player_id: string]: true;
        };
        weekend?: true;
    }

    Properties

    moderator? +JGOFPauseState | goban

    Interface JGOFPauseState

    interface JGOFPauseState {
        moderator?: string;
        player?: {
            pauses_left: number;
            player_id: string;
        };
        server?: true;
        stone_removal?: true;
        vacation?: {
            [player_id: string]: true;
        };
        weekend?: true;
    }

    Properties

    moderator?: string

    Paused by a moderator, value of this field is the moderator's id

    -
    player?: {
        pauses_left: number;
        player_id: string;
    }

    Paused by a player. The game can only be paused by one player at a time.

    +
    player?: {
        pauses_left: number;
        player_id: string;
    }

    Paused by a player. The game can only be paused by one player at a time.

    Type declaration

    • pauses_left: number

      Number of pauses left for the pausing player.

    • player_id: string

      Player id of the player who paused the game.

      -
    server?: true

    Paused by the server

    -
    stone_removal?: true

    Paused because the game is in the stone removal phase

    -
    vacation?: {
        [player_id: string]: true;
    }

    Paused because one or more players is on vacation

    +
    server?: true

    Paused by the server

    +
    stone_removal?: true

    Paused because the game is in the stone removal phase

    +
    vacation?: {
        [player_id: string]: true;
    }

    Paused because one or more players is on vacation

    Type declaration

    • [player_id: string]: true

      Player id that is on vacation

      -
    weekend?: true

    Paused because it is the weekend

    -
    \ No newline at end of file +
    weekend?: true

    Paused because it is the weekend

    +
    \ No newline at end of file diff --git a/docs/interfaces/JGOFPlayer.html b/docs/interfaces/JGOFPlayer.html index 723ee038..9c6e8fd9 100644 --- a/docs/interfaces/JGOFPlayer.html +++ b/docs/interfaces/JGOFPlayer.html @@ -1,5 +1,5 @@ -JGOFPlayer | goban

    Interface JGOFPlayer

    interface JGOFPlayer {
        id?: string;
        name: string;
    }

    Properties

    id? +JGOFPlayer | goban

    Interface JGOFPlayer

    interface JGOFPlayer {
        id?: string;
        name: string;
    }

    Properties

    Properties

    id?: string

    Identifier for the player

    -
    name: string

    Name or username of the player

    -
    \ No newline at end of file +
    name: string

    Name or username of the player

    +
    \ No newline at end of file diff --git a/docs/interfaces/JGOFPlayerClock.html b/docs/interfaces/JGOFPlayerClock.html index 530c7cb7..e7eaa9f8 100644 --- a/docs/interfaces/JGOFPlayerClock.html +++ b/docs/interfaces/JGOFPlayerClock.html @@ -1,13 +1,13 @@ -JGOFPlayerClock | goban

    Interface JGOFPlayerClock

    interface JGOFPlayerClock {
        block_time_left?: number;
        main_time: number;
        moves_left?: number;
        period_time_left?: number;
        periods_left?: number;
    }

    Hierarchy (view full)

    Properties

    block_time_left? +JGOFPlayerClock | goban

    Interface JGOFPlayerClock

    interface JGOFPlayerClock {
        block_time_left?: number;
        main_time: number;
        moves_left?: number;
        period_time_left?: number;
        periods_left?: number;
    }

    Hierarchy (view full)

    Properties

    block_time_left?: number

    Used with canadian time control. Time left in milliseconds to make the remainder of your moves in the current block

    -
    main_time: number

    Main time left on the clock, in milliseconds.

    -
    moves_left?: number

    Used with canadian time control. Number of moves left before a new +

    main_time: number

    Main time left on the clock, in milliseconds.

    +
    moves_left?: number

    Used with canadian time control. Number of moves left before a new block of time.

    -
    period_time_left?: number

    Used with byo-yomi time control. Time left on the period time, in milliseconds.

    -
    periods_left?: number

    Used with byo-yomi time control. Number of periods left.

    -
    \ No newline at end of file +
    period_time_left?: number

    Used with byo-yomi time control. Time left on the period time, in milliseconds.

    +
    periods_left?: number

    Used with byo-yomi time control. Number of periods left.

    +
    \ No newline at end of file diff --git a/docs/interfaces/JGOFPlayerSummary.html b/docs/interfaces/JGOFPlayerSummary.html index 01f1174b..5cfae94f 100644 --- a/docs/interfaces/JGOFPlayerSummary.html +++ b/docs/interfaces/JGOFPlayerSummary.html @@ -1,4 +1,4 @@ -JGOFPlayerSummary | goban

    Interface JGOFPlayerSummary

    interface JGOFPlayerSummary {
        dropped_players?: {
            black?: number[];
            white?: number[];
        };
        players: {
            black: number;
            white: number;
        };
        rengo_teams: {
            black: number[];
            white: number[];
        };
    }

    Properties

    dropped_players? +JGOFPlayerSummary | goban

    Interface JGOFPlayerSummary

    interface JGOFPlayerSummary {
        dropped_players?: {
            black?: number[];
            white?: number[];
        };
        players: {
            black: number;
            white: number;
        };
        rengo_teams: {
            black: number[];
            white: number[];
        };
    }

    Properties

    dropped_players?: {
        black?: number[];
        white?: number[];
    }

    Type declaration

    • Optional black?: number[]
    • Optional white?: number[]
    players: {
        black: number;
        white: number;
    }

    Type declaration

    • black: number
    • white: number
    rengo_teams: {
        black: number[];
        white: number[];
    }

    Type declaration

    • black: number[]
    • white: number[]
    \ No newline at end of file +

    Properties

    dropped_players?: {
        black?: number[];
        white?: number[];
    }

    Type declaration

    • Optional black?: number[]
    • Optional white?: number[]
    players: {
        black: number;
        white: number;
    }

    Type declaration

    • black: number
    • white: number
    rengo_teams: {
        black: number[];
        white: number[];
    }

    Type declaration

    • black: number[]
    • white: number[]
    \ No newline at end of file diff --git a/docs/interfaces/JGOFSealingIntersection.html b/docs/interfaces/JGOFSealingIntersection.html index 73dc87c0..b2430364 100644 --- a/docs/interfaces/JGOFSealingIntersection.html +++ b/docs/interfaces/JGOFSealingIntersection.html @@ -1,8 +1,8 @@ -JGOFSealingIntersection | goban

    Interface JGOFSealingIntersection

    interface JGOFSealingIntersection {
        color: JGOFNumericPlayerColor;
        x: number;
        y: number;
    }

    Hierarchy (view full)

    Properties

    color +JGOFSealingIntersection | goban

    Interface JGOFSealingIntersection

    interface JGOFSealingIntersection {
        color: JGOFNumericPlayerColor;
        x: number;
        y: number;
    }

    Hierarchy (view full)

    Properties

    Properties

    Color the intersection is probably presumed to be by the players, but is in fact empty.

    -
    x: number

    Horizontal coordinate, counting left to right, starting with zero

    -
    y: number

    Vertical coordinate, counting top to bottom, starting with zero

    -
    \ No newline at end of file +
    x: number

    Horizontal coordinate, counting left to right, starting with zero

    +
    y: number

    Vertical coordinate, counting top to bottom, starting with zero

    +
    \ No newline at end of file diff --git a/docs/interfaces/JGOFSimpleTimeControl.html b/docs/interfaces/JGOFSimpleTimeControl.html index 9da36b38..893d3852 100644 --- a/docs/interfaces/JGOFSimpleTimeControl.html +++ b/docs/interfaces/JGOFSimpleTimeControl.html @@ -1,5 +1,5 @@ -JGOFSimpleTimeControl | goban

    Interface JGOFSimpleTimeControl

    interface JGOFSimpleTimeControl {
        pause_on_weekends: boolean;
        per_move: number;
        speed: JGOFTimeControlSpeed;
        system: "simple";
    }

    Properties

    pause_on_weekends +JGOFSimpleTimeControl | goban

    Interface JGOFSimpleTimeControl

    interface JGOFSimpleTimeControl {
        pause_on_weekends: boolean;
        per_move: number;
        speed: JGOFTimeControlSpeed;
        system: "simple";
    }

    Properties

    pause_on_weekends: boolean
    per_move: number
    system: "simple"
    \ No newline at end of file +

    Properties

    pause_on_weekends: boolean
    per_move: number
    system: "simple"
    \ No newline at end of file diff --git a/docs/interfaces/MarkInterface.html b/docs/interfaces/MarkInterface.html index e55b522f..21a99692 100644 --- a/docs/interfaces/MarkInterface.html +++ b/docs/interfaces/MarkInterface.html @@ -1,4 +1,4 @@ -MarkInterface | goban

    Interface MarkInterface

    interface MarkInterface {
        black?: boolean;
        blue_move?: boolean;
        chat_triangle?: boolean;
        circle?: boolean;
        color?: string;
        cross?: boolean;
        hint?: boolean;
        letter?: string;
        mark_x?: boolean;
        needs_sealing?: boolean;
        remove?: boolean;
        score?: string;
        square?: boolean;
        stone_removed?: boolean;
        sub_triangle?: boolean;
        subscript?: string;
        transient_letter?: string;
        triangle?: boolean;
        white?: boolean;
        [label: string]: string | boolean | undefined;
    }

    Indexable

    [label: string]: string | boolean | undefined

    Properties

    black? +MarkInterface | goban

    Interface MarkInterface

    interface MarkInterface {
        black?: boolean;
        blue_move?: boolean;
        chat_triangle?: boolean;
        circle?: boolean;
        color?: string;
        cross?: boolean;
        hint?: boolean;
        letter?: string;
        mark_x?: boolean;
        needs_sealing?: boolean;
        remove?: boolean;
        score?: string;
        square?: boolean;
        stone_removed?: boolean;
        sub_triangle?: boolean;
        subscript?: string;
        transient_letter?: string;
        triangle?: boolean;
        white?: boolean;
        [label: string]: string | boolean | undefined;
    }

    Indexable

    [label: string]: string | boolean | undefined

    Properties

    black?: boolean
    blue_move?: boolean
    chat_triangle?: boolean
    circle?: boolean
    color?: string
    cross?: boolean
    hint?: boolean
    letter?: string
    mark_x?: boolean
    needs_sealing?: boolean
    remove?: boolean
    score?: string
    square?: boolean
    stone_removed?: boolean
    sub_triangle?: boolean
    subscript?: string
    transient_letter?: string
    triangle?: boolean
    white?: boolean
    \ No newline at end of file +

    Properties

    black?: boolean
    blue_move?: boolean
    chat_triangle?: boolean
    circle?: boolean
    color?: string
    cross?: boolean
    hint?: boolean
    letter?: string
    mark_x?: boolean
    needs_sealing?: boolean
    remove?: boolean
    score?: string
    square?: boolean
    stone_removed?: boolean
    sub_triangle?: boolean
    subscript?: string
    transient_letter?: string
    triangle?: boolean
    white?: boolean
    \ No newline at end of file diff --git a/docs/interfaces/MoveCommand.html b/docs/interfaces/MoveCommand.html index f9878a04..01d9ec75 100644 --- a/docs/interfaces/MoveCommand.html +++ b/docs/interfaces/MoveCommand.html @@ -1,5 +1,5 @@ -MoveCommand | goban

    Interface MoveCommand

    interface MoveCommand {
        blur?: number;
        clock?: JGOFPlayerClock;
        game_id: number;
        move: string;
    }

    Properties

    blur? +MoveCommand | goban

    Interface MoveCommand

    interface MoveCommand {
        blur?: number;
        clock?: JGOFPlayerClock;
        game_id: number;
        move: string;
    }

    Properties

    Properties

    blur?: number
    game_id: number
    move: string
    \ No newline at end of file +

    Properties

    blur?: number
    game_id: number
    move: string
    \ No newline at end of file diff --git a/docs/interfaces/MoveTreeChatLine.html b/docs/interfaces/MoveTreeChatLine.html index c72ed26f..5d3f3fcf 100644 --- a/docs/interfaces/MoveTreeChatLine.html +++ b/docs/interfaces/MoveTreeChatLine.html @@ -1,3 +1,3 @@ -MoveTreeChatLine | goban

    Interface MoveTreeChatLine

    interface MoveTreeChatLine {
        body: MoveTreeChatLineBody;
        username: string;
    }

    Properties

    body +MoveTreeChatLine | goban

    Interface MoveTreeChatLine

    interface MoveTreeChatLine {
        body: MoveTreeChatLineBody;
        username: string;
    }

    Properties

    Properties

    username: string
    \ No newline at end of file +

    Properties

    username: string
    \ No newline at end of file diff --git a/docs/interfaces/MoveTreeChatLineBody.html b/docs/interfaces/MoveTreeChatLineBody.html index 02a1ab3a..191cd1d3 100644 --- a/docs/interfaces/MoveTreeChatLineBody.html +++ b/docs/interfaces/MoveTreeChatLineBody.html @@ -1,5 +1,5 @@ -MoveTreeChatLineBody | goban

    Interface MoveTreeChatLineBody

    interface MoveTreeChatLineBody {
        from: number;
        moves: string | AdHocPackedMove;
        name: string;
        type: "analysis";
    }

    Properties

    from +MoveTreeChatLineBody | goban

    Interface MoveTreeChatLineBody

    interface MoveTreeChatLineBody {
        from: number;
        moves: string | AdHocPackedMove;
        name: string;
        type: "analysis";
    }

    Properties

    Properties

    from: number
    moves: string | AdHocPackedMove
    name: string
    type: "analysis"
    \ No newline at end of file +

    Properties

    from: number
    moves: string | AdHocPackedMove
    name: string
    type: "analysis"
    \ No newline at end of file diff --git a/docs/interfaces/MoveTreeJson.html b/docs/interfaces/MoveTreeJson.html index 800a6166..a94ddaad 100644 --- a/docs/interfaces/MoveTreeJson.html +++ b/docs/interfaces/MoveTreeJson.html @@ -1,4 +1,4 @@ -MoveTreeJson | goban

    Interface MoveTreeJson

    interface MoveTreeJson {
        branches?: MoveTreeJson[];
        correct_answer?: boolean;
        marks?: {
            marks: MarkInterface;
            x: number;
            y: number;
        }[];
        pen_marks?: MoveTreePenMarks;
        text?: string;
        trunk_next?: MoveTreeJson;
        wrong_answer?: boolean;
        x: number;
        y: number;
    }

    Properties

    branches? +MoveTreeJson | goban

    Interface MoveTreeJson

    interface MoveTreeJson {
        branches?: MoveTreeJson[];
        correct_answer?: boolean;
        marks?: {
            marks: MarkInterface;
            x: number;
            y: number;
        }[];
        pen_marks?: MoveTreePenMarks;
        text?: string;
        trunk_next?: MoveTreeJson;
        wrong_answer?: boolean;
        x: number;
        y: number;
    }

    Properties

    branches?: MoveTreeJson[]
    correct_answer?: boolean
    marks?: {
        marks: MarkInterface;
        x: number;
        y: number;
    }[]

    Type declaration

    pen_marks?: MoveTreePenMarks
    text?: string
    trunk_next?: MoveTreeJson
    wrong_answer?: boolean
    x: number
    y: number
    \ No newline at end of file +

    Properties

    branches?: MoveTreeJson[]
    correct_answer?: boolean
    marks?: {
        marks: MarkInterface;
        x: number;
        y: number;
    }[]

    Type declaration

    pen_marks?: MoveTreePenMarks
    text?: string
    trunk_next?: MoveTreeJson
    wrong_answer?: boolean
    x: number
    y: number
    \ No newline at end of file diff --git a/docs/interfaces/PlayerScore.html b/docs/interfaces/PlayerScore.html index 4fae693b..7482488f 100644 --- a/docs/interfaces/PlayerScore.html +++ b/docs/interfaces/PlayerScore.html @@ -1,8 +1,8 @@ -PlayerScore | goban

    Interface PlayerScore

    interface PlayerScore {
        handicap: number;
        komi: number;
        prisoners: number;
        scoring_positions: string;
        stones: number;
        territory: number;
        total: number;
    }

    Properties

    handicap +PlayerScore | goban

    Interface PlayerScore

    interface PlayerScore {
        handicap: number;
        komi: number;
        prisoners: number;
        scoring_positions: string;
        stones: number;
        territory: number;
        total: number;
    }

    Properties

    handicap: number
    komi: number
    prisoners: number
    scoring_positions: string
    stones: number
    territory: number
    total: number
    \ No newline at end of file +

    Properties

    handicap: number
    komi: number
    prisoners: number
    scoring_positions: string
    stones: number
    territory: number
    total: number
    \ No newline at end of file diff --git a/docs/interfaces/PuzzleConfig.html b/docs/interfaces/PuzzleConfig.html index 932ac4f0..2240e942 100644 --- a/docs/interfaces/PuzzleConfig.html +++ b/docs/interfaces/PuzzleConfig.html @@ -1,4 +1,4 @@ -PuzzleConfig | goban

    Interface PuzzleConfig

    interface PuzzleConfig {
        black_prisoners?: number;
        board?: JGOFNumericPlayerColor[][];
        board_is_repeating?: boolean;
        height?: number;
        initial_player?: PlayerColor;
        initial_state?: GobanEngineInitialState;
        isobranch_hash?: string;
        marks?: {
            [mark: string]: string;
        };
        mode?: string;
        move_tree?: MoveTreeJson;
        name?: string;
        player?: JGOFNumericPlayerColor;
        puzzle_autoplace_delay?: number;
        puzzle_collection?: number;
        puzzle_description?: string;
        puzzle_opponent_move_mode?: PuzzleOpponentMoveMode;
        puzzle_player_move_mode?: PuzzlePlayerMoveMode;
        puzzle_rank?: number;
        puzzle_type?: string;
        removal?: boolean[][];
        white_prisoners?: number;
        width?: number;
    }

    Hierarchy (view full)

    Properties

    black_prisoners? +PuzzleConfig | goban

    Interface PuzzleConfig

    interface PuzzleConfig {
        black_prisoners?: number;
        board?: JGOFNumericPlayerColor[][];
        board_is_repeating?: boolean;
        height?: number;
        initial_player?: PlayerColor;
        initial_state?: GobanEngineInitialState;
        isobranch_hash?: string;
        marks?: {
            [mark: string]: string;
        };
        mode?: string;
        move_tree?: MoveTreeJson;
        name?: string;
        player?: JGOFNumericPlayerColor;
        puzzle_autoplace_delay?: number;
        puzzle_collection?: number;
        puzzle_description?: string;
        puzzle_opponent_move_mode?: PuzzleOpponentMoveMode;
        puzzle_player_move_mode?: PuzzlePlayerMoveMode;
        puzzle_rank?: number;
        puzzle_type?: string;
        removal?: boolean[][];
        white_prisoners?: number;
        width?: number;
    }

    Hierarchy (view full)

    Properties

    black_prisoners?: number
    board_is_repeating?: boolean
    height?: number
    initial_player?: PlayerColor
    initial_state?: GobanEngineInitialState
    isobranch_hash?: string
    marks?: {
        [mark: string]: string;
    }

    Type declaration

    • [mark: string]: string
    mode?: string
    move_tree?: MoveTreeJson
    name?: string
    puzzle_autoplace_delay?: number
    puzzle_collection?: number
    puzzle_description?: string
    puzzle_opponent_move_mode?: PuzzleOpponentMoveMode
    puzzle_player_move_mode?: PuzzlePlayerMoveMode
    puzzle_rank?: number
    puzzle_type?: string
    removal?: boolean[][]
    white_prisoners?: number
    width?: number
    \ No newline at end of file +

    Properties

    black_prisoners?: number
    board_is_repeating?: boolean
    height?: number
    initial_player?: PlayerColor
    initial_state?: GobanEngineInitialState
    isobranch_hash?: string
    marks?: {
        [mark: string]: string;
    }

    Type declaration

    • [mark: string]: string
    mode?: string
    move_tree?: MoveTreeJson
    name?: string
    puzzle_autoplace_delay?: number
    puzzle_collection?: number
    puzzle_description?: string
    puzzle_opponent_move_mode?: PuzzleOpponentMoveMode
    puzzle_player_move_mode?: PuzzlePlayerMoveMode
    puzzle_rank?: number
    puzzle_type?: string
    removal?: boolean[][]
    white_prisoners?: number
    width?: number
    \ No newline at end of file diff --git a/docs/interfaces/ReviewMessage.html b/docs/interfaces/ReviewMessage.html index 8ca26320..6ef37b1c 100644 --- a/docs/interfaces/ReviewMessage.html +++ b/docs/interfaces/ReviewMessage.html @@ -1,7 +1,7 @@ ReviewMessage | goban

    Interface ReviewMessage

    Reviews are constructed by a stream of modifications messages, this interface describes the format of those modification messages. A message can contain any number of the fields listed.

    -
    interface ReviewMessage {
        chat?: {
            channel: string;
            chat_id: string;
            date: number;
            from: number;
            moves: string | AdHocPackedMove;
            player_id: number;
        };
        clearpen?: boolean;
        controller?: number | {
            id: number;
            username: string;
        };
        delete?: number;
        f?: number;
        gamedata?: GobanEngineConfig;
        k?: {
            [mark: string]: string;
        };
        m?: string;
        om?: [number, number, number];
        owner?: number | {
            id: number;
            username: string;
        };
        pen?: string;
        player_update?: JGOFPlayerSummary;
        pp?: [number, number];
        remove-chat?: string;
        review_id?: number;
        t?: string;
        t+?: string;
        ts?: number;
        undo?: boolean;
    }

    Properties

    interface ReviewMessage {
        chat?: {
            channel: string;
            chat_id: string;
            date: number;
            from: number;
            moves: string | AdHocPackedMove;
            player_id: number;
        };
        clearpen?: boolean;
        controller?: number | {
            id: number;
            username: string;
        };
        delete?: number;
        f?: number;
        gamedata?: GobanEngineConfig;
        k?: {
            [mark: string]: string;
        };
        m?: string;
        om?: [number, number, number];
        owner?: number | {
            id: number;
            username: string;
        };
        pen?: string;
        player_update?: JGOFPlayerSummary;
        pp?: [number, number];
        remove-chat?: string;
        review_id?: number;
        t?: string;
        t+?: string;
        ts?: number;
        undo?: boolean;
    }

    Properties

    chat? clearpen? controller? delete? @@ -23,24 +23,24 @@

    Properties

    chat?: {
        channel: string;
        chat_id: string;
        date: number;
        from: number;
        moves: string | AdHocPackedMove;
        player_id: number;
    }

    Chat message

    Type declaration

    • channel: string
    • chat_id: string
    • date: number
    • from: number

      Turn number

    • moves: string | AdHocPackedMove

      this might just be "string", i'm not entirely sure

      -
    • player_id: number
    clearpen?: boolean

    Clears the pen drawings on the node

    -
    controller?: number | {
        id: number;
        username: string;
    }

    Sets the controller of the review

    -

    Type declaration

    • id: number
    • username: string
    delete?: number

    Delete

    -
    f?: number

    from (move number)

    -

    Initial gamedata to review

    -
    k?: {
        [mark: string]: string;
    }

    Marks made

    -

    Type declaration

    • [mark: string]: string
    m?: string

    Moves made

    -
    om?: [number, number, number]

    official move [reviewing live game]

    -
    owner?: number | {
        id: number;
        username: string;
    }

    Sets the owner of the review

    -

    Type declaration

    • id: number
    • username: string
    pen?: string

    pen color / pen start

    -
    player_update?: JGOFPlayerSummary

    Updated information about the players, such as name etc.

    -
    pp?: [number, number]

    pen point

    -
    remove-chat?: string

    Remove's the given chat by id

    -
    review_id?: number

    The review ID. This is used when sending from the client to the server, +

  • player_id: number
  • clearpen?: boolean

    Clears the pen drawings on the node

    +
    controller?: number | {
        id: number;
        username: string;
    }

    Sets the controller of the review

    +

    Type declaration

    • id: number
    • username: string
    delete?: number

    Delete

    +
    f?: number

    from (move number)

    +

    Initial gamedata to review

    +
    k?: {
        [mark: string]: string;
    }

    Marks made

    +

    Type declaration

    • [mark: string]: string
    m?: string

    Moves made

    +
    om?: [number, number, number]

    official move [reviewing live game]

    +
    owner?: number | {
        id: number;
        username: string;
    }

    Sets the owner of the review

    +

    Type declaration

    • id: number
    • username: string
    pen?: string

    pen color / pen start

    +
    player_update?: JGOFPlayerSummary

    Updated information about the players, such as name etc.

    +
    pp?: [number, number]

    pen point

    +
    remove-chat?: string

    Remove's the given chat by id

    +
    review_id?: number

    The review ID. This is used when sending from the client to the server, but is not sent by the server back to the client (as the id is encoded in the message event name)

    -
    t?: string

    text note for the current node

    -
    t+?: string

    text append to the current node

    -
    ts?: number

    timestamp (ms)

    -
    undo?: boolean

    official undo [reviewing live game]

    -
    \ No newline at end of file +
    t?: string

    text note for the current node

    +
    t+?: string

    text append to the current node

    +
    ts?: number

    timestamp (ms)

    +
    undo?: boolean

    official undo [reviewing live game]

    +
    \ No newline at end of file diff --git a/docs/interfaces/SVGRendererGobanConfig.html b/docs/interfaces/SVGRendererGobanConfig.html index da4f866b..3bc4ae1e 100644 --- a/docs/interfaces/SVGRendererGobanConfig.html +++ b/docs/interfaces/SVGRendererGobanConfig.html @@ -1,4 +1,4 @@ -SVGRendererGobanConfig | goban

    Interface SVGRendererGobanConfig

    interface SVGRendererGobanConfig {
        aga_handicap_scoring?: boolean;
        allow_ko?: boolean;
        allow_self_capture?: boolean;
        allow_superko?: boolean;
        auth?: string;
        automatic_stone_removal?: boolean;
        black_player_id?: number;
        black_prisoners?: number;
        board?: JGOFNumericPlayerColor[][];
        board_div?: HTMLElement;
        board_is_repeating?: boolean;
        bounds?: GobanBounds;
        chat_log?: GobanChatLog;
        circle_radius?: number;
        clock?: GameClock;
        connect_to_chat?: number | boolean;
        disable_analysis?: boolean;
        display_width?: number;
        dont_draw_last_move?: boolean;
        dont_show_messages?: boolean;
        double_click_submit?: boolean;
        draw_bottom_labels?: boolean;
        draw_left_labels?: boolean;
        draw_right_labels?: boolean;
        draw_top_labels?: boolean;
        end_time?: number;
        errors?: {
            error: string;
            stack: any;
        }[];
        free_handicap_placement?: boolean;
        game_date?: string;
        game_id?: string | number;
        game_name?: string;
        game_type?: "temporary";
        getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting);
        group_ids?: number[];
        handicap?: number;
        handicap_rank_difference?: number;
        height?: number;
        initial_player?: PlayerColor;
        initial_state?: GobanEngineInitialState;
        interactive?: boolean;
        isInPushedAnalysis?: (() => boolean);
        isPlayerController?: (() => boolean);
        isPlayerOwner?: (() => boolean);
        is_game_record?: boolean;
        isobranch_hash?: string;
        komi?: number;
        ladder?: number;
        ladder_id?: number;
        last_move_opacity?: number;
        last_move_radius?: number;
        latencies?: {
            [player_id: string]: number;
        };
        leavePushedAnalysis?: (() => void);
        malkovich_log?: GobanChatLog;
        marks?: {
            [mark: string]: string;
        };
        mode?: GobanModes;
        move_tree?: MoveTreeJson;
        move_tree_container?: HTMLElement;
        moves?: GobanMovesArray;
        name?: string;
        needs_sealing?: JGOFSealingIntersection[];
        ogs?: {
            black_dead_stones: string;
            black_seki_eyes: string;
            black_stones: string;
            black_territory: string;
            white_dead_stones: string;
            white_seki_eyes: string;
            white_stones: string;
            white_territory: string;
        };
        ogs_import?: boolean;
        onError?: ((err) => void);
        onScoreEstimationUpdated?: ((winning_color, points) => void);
        one_click_submit?: boolean;
        opponent_plays_first_after_resume?: boolean;
        original_disable_analysis?: boolean;
        original_sgf?: string;
        outcome?: string;
        pause_control?: AdHocPauseControl;
        paused_since?: number;
        phase?: GobanEnginePhase;
        player?: JGOFNumericPlayerColor;
        player_id?: number;
        player_pool?: {
            [id: number]: GobanEnginePlayerEntry;
        };
        players?: {
            black: GobanEnginePlayerEntry;
            white: GobanEnginePlayerEntry;
        };
        puzzle_autoplace_delay?: number;
        puzzle_collection?: number;
        puzzle_description?: string;
        puzzle_opponent_move_mode?: PuzzleOpponentMoveMode;
        puzzle_player_move_mode?: PuzzlePlayerMoveMode;
        puzzle_rank?: number;
        puzzle_type?: string;
        ranked?: boolean;
        removal?: boolean[][];
        removed?: string | JGOFMove[];
        rengo?: boolean;
        rengo_casual_mode?: boolean;
        rengo_teams?: {
            black: GobanEnginePlayerEntry[];
            white: GobanEnginePlayerEntry[];
        };
        review_id?: number;
        reviews?: {
            [review_id: number]: GobanEnginePlayerEntry;
        };
        rules?: GobanEngineRules;
        score?: Score;
        score_handicap?: boolean;
        score_passes?: boolean;
        score_prisoners?: boolean;
        score_stones?: boolean;
        score_territory?: boolean;
        score_territory_in_seki?: boolean;
        server_socket?: GobanSocket<ClientToServer, ServerToClient>;
        spectator_log?: GobanChatLog;
        square_size?: number | "auto" | ((goban) => number);
        stalling_score_estimate?: StallingScoreEstimate;
        start_time?: number;
        stone_font_scale?: number;
        strict_seki_mode?: boolean;
        superko_algorithm?: GobanEngineSuperKoAlgorithm;
        throw_all_errors?: boolean;
        time_control?: JGOFTimeControl;
        time_per_move?: number;
        title_div?: HTMLElement;
        tournament_id?: number;
        username?: string;
        variation_stone_opacity?: number;
        white_must_pass_last?: boolean;
        white_player_id?: number;
        white_prisoners?: number;
        width?: number;
        winner?: number | "black" | "white";
    }

    Hierarchy (view full)

    Properties

    aga_handicap_scoring? +SVGRendererGobanConfig | goban

    Interface SVGRendererGobanConfig

    interface SVGRendererGobanConfig {
        aga_handicap_scoring?: boolean;
        allow_ko?: boolean;
        allow_self_capture?: boolean;
        allow_superko?: boolean;
        auth?: string;
        automatic_stone_removal?: boolean;
        black_player_id?: number;
        black_prisoners?: number;
        board?: JGOFNumericPlayerColor[][];
        board_div?: HTMLElement;
        board_is_repeating?: boolean;
        bounds?: GobanBounds;
        chat_log?: GobanChatLog;
        circle_radius?: number;
        clock?: GameClock;
        connect_to_chat?: number | boolean;
        disable_analysis?: boolean;
        display_width?: number;
        dont_draw_last_move?: boolean;
        dont_show_messages?: boolean;
        double_click_submit?: boolean;
        draw_bottom_labels?: boolean;
        draw_left_labels?: boolean;
        draw_right_labels?: boolean;
        draw_top_labels?: boolean;
        end_time?: number;
        errors?: {
            error: string;
            stack: any;
        }[];
        free_handicap_placement?: boolean;
        game_date?: string;
        game_id?: string | number;
        game_name?: string;
        game_type?: "temporary";
        getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting);
        group_ids?: number[];
        handicap?: number;
        handicap_rank_difference?: number;
        height?: number;
        initial_player?: PlayerColor;
        initial_state?: GobanEngineInitialState;
        interactive?: boolean;
        isInPushedAnalysis?: (() => boolean);
        isPlayerController?: (() => boolean);
        isPlayerOwner?: (() => boolean);
        is_game_record?: boolean;
        isobranch_hash?: string;
        komi?: number;
        ladder?: number;
        ladder_id?: number;
        last_move_opacity?: number;
        last_move_radius?: number;
        latencies?: {
            [player_id: string]: number;
        };
        leavePushedAnalysis?: (() => void);
        malkovich_log?: GobanChatLog;
        marks?: {
            [mark: string]: string;
        };
        mode?: GobanModes;
        move_tree?: MoveTreeJson;
        move_tree_container?: HTMLElement;
        moves?: GobanMovesArray;
        name?: string;
        needs_sealing?: JGOFSealingIntersection[];
        ogs?: {
            black_dead_stones: string;
            black_seki_eyes: string;
            black_stones: string;
            black_territory: string;
            white_dead_stones: string;
            white_seki_eyes: string;
            white_stones: string;
            white_territory: string;
        };
        ogs_import?: boolean;
        onError?: ((err) => void);
        onScoreEstimationUpdated?: ((winning_color, points) => void);
        one_click_submit?: boolean;
        opponent_plays_first_after_resume?: boolean;
        original_disable_analysis?: boolean;
        original_sgf?: string;
        outcome?: string;
        pause_control?: AdHocPauseControl;
        paused_since?: number;
        phase?: GobanEnginePhase;
        player?: JGOFNumericPlayerColor;
        player_id?: number;
        player_pool?: {
            [id: number]: GobanEnginePlayerEntry;
        };
        players?: {
            black: GobanEnginePlayerEntry;
            white: GobanEnginePlayerEntry;
        };
        puzzle_autoplace_delay?: number;
        puzzle_collection?: number;
        puzzle_description?: string;
        puzzle_opponent_move_mode?: PuzzleOpponentMoveMode;
        puzzle_player_move_mode?: PuzzlePlayerMoveMode;
        puzzle_rank?: number;
        puzzle_type?: string;
        ranked?: boolean;
        removal?: boolean[][];
        removed?: string | JGOFMove[];
        rengo?: boolean;
        rengo_casual_mode?: boolean;
        rengo_teams?: {
            black: GobanEnginePlayerEntry[];
            white: GobanEnginePlayerEntry[];
        };
        review_id?: number;
        reviews?: {
            [review_id: number]: GobanEnginePlayerEntry;
        };
        rules?: GobanEngineRules;
        score?: Score;
        score_handicap?: boolean;
        score_passes?: boolean;
        score_prisoners?: boolean;
        score_stones?: boolean;
        score_territory?: boolean;
        score_territory_in_seki?: boolean;
        server_socket?: GobanSocket<ClientToServer, ServerToClient>;
        spectator_log?: GobanChatLog;
        square_size?: number | "auto" | ((goban) => number);
        stalling_score_estimate?: StallingScoreEstimate;
        start_time?: number;
        stone_font_scale?: number;
        strict_seki_mode?: boolean;
        superko_algorithm?: GobanEngineSuperKoAlgorithm;
        throw_all_errors?: boolean;
        time_control?: JGOFTimeControl;
        time_per_move?: number;
        title_div?: HTMLElement;
        tournament_id?: number;
        username?: string;
        variation_stone_opacity?: number;
        white_must_pass_last?: boolean;
        white_player_id?: number;
        white_prisoners?: number;
        width?: number;
        winner?: number | "black" | "white";
    }

    Hierarchy (view full)

    Properties

    aga_handicap_scoring?: boolean
    allow_ko?: boolean
    allow_self_capture?: boolean
    allow_superko?: boolean
    auth?: string
    automatic_stone_removal?: boolean
    black_player_id?: number
    black_prisoners?: number
    board_div?: HTMLElement
    board_is_repeating?: boolean
    bounds?: GobanBounds
    chat_log?: GobanChatLog
    circle_radius?: number
    clock?: GameClock
    connect_to_chat?: number | boolean
    disable_analysis?: boolean
    display_width?: number
    dont_draw_last_move?: boolean
    dont_show_messages?: boolean
    double_click_submit?: boolean
    draw_bottom_labels?: boolean
    draw_left_labels?: boolean
    draw_right_labels?: boolean
    draw_top_labels?: boolean
    end_time?: number
    errors?: {
        error: string;
        stack: any;
    }[]

    Type declaration

    • error: string
    • stack: any
    free_handicap_placement?: boolean
    game_date?: string
    game_id?: string | number
    game_name?: string
    game_type?: "temporary"
    getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting)
    group_ids?: number[]
    handicap?: number
    handicap_rank_difference?: number
    height?: number
    initial_player?: PlayerColor
    initial_state?: GobanEngineInitialState
    interactive?: boolean
    isInPushedAnalysis?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerController?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerOwner?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    is_game_record?: boolean
    isobranch_hash?: string
    komi?: number
    ladder?: number
    ladder_id?: number
    last_move_opacity?: number
    last_move_radius?: number
    latencies?: {
        [player_id: string]: number;
    }

    Type declaration

    • [player_id: string]: number
    leavePushedAnalysis?: (() => void)

    Type declaration

      • (): void
      • Returns void

    malkovich_log?: GobanChatLog
    marks?: {
        [mark: string]: string;
    }

    Type declaration

    • [mark: string]: string
    mode?: GobanModes
    move_tree?: MoveTreeJson
    move_tree_container?: HTMLElement
    name?: string
    needs_sealing?: JGOFSealingIntersection[]

    Intersections that need to be sealed before scoring should happen

    -
    ogs?: {
        black_dead_stones: string;
        black_seki_eyes: string;
        black_stones: string;
        black_territory: string;
        white_dead_stones: string;
        white_seki_eyes: string;
        white_stones: string;
        white_territory: string;
    }

    Type declaration

    • black_dead_stones: string
    • black_seki_eyes: string
    • black_stones: string
    • black_territory: string
    • white_dead_stones: string
    • white_seki_eyes: string
    • white_stones: string
    • white_territory: string
    ogs_import?: boolean

    Deprecated, I don't think we need this anymore, but need to be sure

    -
    onError?: ((err) => void)

    Type declaration

      • (err): void
      • Parameters

        • err: Error

        Returns void

    onScoreEstimationUpdated?: ((winning_color, points) => void)

    Type declaration

      • (winning_color, points): void
      • Parameters

        • winning_color: "black" | "white"
        • points: number

        Returns void

    one_click_submit?: boolean
    opponent_plays_first_after_resume?: boolean
    original_disable_analysis?: boolean
    original_sgf?: string
    outcome?: string
    pause_control?: AdHocPauseControl
    paused_since?: number
    player_id?: number
    player_pool?: {
        [id: number]: GobanEnginePlayerEntry;
    }

    Type declaration

    players?: {
        black: GobanEnginePlayerEntry;
        white: GobanEnginePlayerEntry;
    }

    Type declaration

    puzzle_autoplace_delay?: number
    puzzle_collection?: number
    puzzle_description?: string
    puzzle_opponent_move_mode?: PuzzleOpponentMoveMode
    puzzle_player_move_mode?: PuzzlePlayerMoveMode
    puzzle_rank?: number
    puzzle_type?: string
    ranked?: boolean
    removal?: boolean[][]
    removed?: string | JGOFMove[]

    Removed stones in stone removal phase +

    Properties

    aga_handicap_scoring?: boolean
    allow_ko?: boolean
    allow_self_capture?: boolean
    allow_superko?: boolean
    auth?: string
    automatic_stone_removal?: boolean
    black_player_id?: number
    black_prisoners?: number
    board_div?: HTMLElement
    board_is_repeating?: boolean
    bounds?: GobanBounds
    chat_log?: GobanChatLog
    circle_radius?: number
    clock?: GameClock
    connect_to_chat?: number | boolean
    disable_analysis?: boolean
    display_width?: number
    dont_draw_last_move?: boolean
    dont_show_messages?: boolean
    double_click_submit?: boolean
    draw_bottom_labels?: boolean
    draw_left_labels?: boolean
    draw_right_labels?: boolean
    draw_top_labels?: boolean
    end_time?: number
    errors?: {
        error: string;
        stack: any;
    }[]

    Type declaration

    • error: string
    • stack: any
    free_handicap_placement?: boolean
    game_date?: string
    game_id?: string | number
    game_name?: string
    game_type?: "temporary"
    getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting)
    group_ids?: number[]
    handicap?: number
    handicap_rank_difference?: number
    height?: number
    initial_player?: PlayerColor
    initial_state?: GobanEngineInitialState
    interactive?: boolean
    isInPushedAnalysis?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerController?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerOwner?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    is_game_record?: boolean
    isobranch_hash?: string
    komi?: number
    ladder?: number
    ladder_id?: number
    last_move_opacity?: number
    last_move_radius?: number
    latencies?: {
        [player_id: string]: number;
    }

    Type declaration

    • [player_id: string]: number
    leavePushedAnalysis?: (() => void)

    Type declaration

      • (): void
      • Returns void

    malkovich_log?: GobanChatLog
    marks?: {
        [mark: string]: string;
    }

    Type declaration

    • [mark: string]: string
    mode?: GobanModes
    move_tree?: MoveTreeJson
    move_tree_container?: HTMLElement
    name?: string
    needs_sealing?: JGOFSealingIntersection[]

    Intersections that need to be sealed before scoring should happen

    +
    ogs?: {
        black_dead_stones: string;
        black_seki_eyes: string;
        black_stones: string;
        black_territory: string;
        white_dead_stones: string;
        white_seki_eyes: string;
        white_stones: string;
        white_territory: string;
    }

    Type declaration

    • black_dead_stones: string
    • black_seki_eyes: string
    • black_stones: string
    • black_territory: string
    • white_dead_stones: string
    • white_seki_eyes: string
    • white_stones: string
    • white_territory: string
    ogs_import?: boolean

    Deprecated, I don't think we need this anymore, but need to be sure

    +
    onError?: ((err) => void)

    Type declaration

      • (err): void
      • Parameters

        • err: Error

        Returns void

    onScoreEstimationUpdated?: ((winning_color, points) => void)

    Type declaration

      • (winning_color, points): void
      • Parameters

        • winning_color: "black" | "white"
        • points: number

        Returns void

    one_click_submit?: boolean
    opponent_plays_first_after_resume?: boolean
    original_disable_analysis?: boolean
    original_sgf?: string
    outcome?: string
    pause_control?: AdHocPauseControl
    paused_since?: number
    player_id?: number
    player_pool?: {
        [id: number]: GobanEnginePlayerEntry;
    }

    Type declaration

    players?: {
        black: GobanEnginePlayerEntry;
        white: GobanEnginePlayerEntry;
    }

    Type declaration

    puzzle_autoplace_delay?: number
    puzzle_collection?: number
    puzzle_description?: string
    puzzle_opponent_move_mode?: PuzzleOpponentMoveMode
    puzzle_player_move_mode?: PuzzlePlayerMoveMode
    puzzle_rank?: number
    puzzle_type?: string
    ranked?: boolean
    removal?: boolean[][]
    removed?: string | JGOFMove[]

    Removed stones in stone removal phase Passing an array of JGOFMove objects is preferred, the string format exists for historical backwards compatibility. It is an encoded move string, e.g. "aa" for A19

    -
    rengo?: boolean
    rengo_casual_mode?: boolean
    rengo_teams?: {
        black: GobanEnginePlayerEntry[];
        white: GobanEnginePlayerEntry[];
    }

    Type declaration

    review_id?: number
    reviews?: {
        [review_id: number]: GobanEnginePlayerEntry;
    }

    Type declaration

    score?: Score
    score_handicap?: boolean
    score_passes?: boolean
    score_prisoners?: boolean
    score_stones?: boolean
    score_territory?: boolean
    score_territory_in_seki?: boolean
    spectator_log?: GobanChatLog
    square_size?: number | "auto" | ((goban) => number)

    Type declaration

      • (goban): number
      • Parameters

        Returns number

    stalling_score_estimate?: StallingScoreEstimate
    start_time?: number
    stone_font_scale?: number
    strict_seki_mode?: boolean
    superko_algorithm?: GobanEngineSuperKoAlgorithm
    throw_all_errors?: boolean

    When loading initial state or moves, by default GobanEngine will try and +

    rengo?: boolean
    rengo_casual_mode?: boolean
    rengo_teams?: {
        black: GobanEnginePlayerEntry[];
        white: GobanEnginePlayerEntry[];
    }

    Type declaration

    review_id?: number
    reviews?: {
        [review_id: number]: GobanEnginePlayerEntry;
    }

    Type declaration

    score?: Score
    score_handicap?: boolean
    score_passes?: boolean
    score_prisoners?: boolean
    score_stones?: boolean
    score_territory?: boolean
    score_territory_in_seki?: boolean
    spectator_log?: GobanChatLog
    square_size?: number | "auto" | ((goban) => number)

    Type declaration

      • (goban): number
      • Parameters

        Returns number

    stalling_score_estimate?: StallingScoreEstimate
    start_time?: number
    stone_font_scale?: number
    strict_seki_mode?: boolean
    superko_algorithm?: GobanEngineSuperKoAlgorithm
    throw_all_errors?: boolean

    When loading initial state or moves, by default GobanEngine will try and handle bad data by just resorting to 'edit placing' moves. If this is true, then those errors are thrown instead.

    -
    time_control?: JGOFTimeControl
    time_per_move?: number
    title_div?: HTMLElement
    tournament_id?: number
    username?: string
    variation_stone_opacity?: number
    white_must_pass_last?: boolean
    white_player_id?: number
    white_prisoners?: number
    width?: number
    winner?: number | "black" | "white"
    \ No newline at end of file +
    time_control?: JGOFTimeControl
    time_per_move?: number
    title_div?: HTMLElement
    tournament_id?: number
    username?: string
    variation_stone_opacity?: number
    white_must_pass_last?: boolean
    white_player_id?: number
    white_prisoners?: number
    width?: number
    winner?: number | "black" | "white"
    \ No newline at end of file diff --git a/docs/interfaces/SVGStoneParameters.html b/docs/interfaces/SVGStoneParameters.html index c2f4f82c..32e7eba1 100644 --- a/docs/interfaces/SVGStoneParameters.html +++ b/docs/interfaces/SVGStoneParameters.html @@ -1,7 +1,7 @@ -SVGStoneParameters | goban

    Interface SVGStoneParameters

    interface SVGStoneParameters {
        fill?: string;
        gradient?: {
            cx?: number;
            cy?: number;
            fx?: number;
            fy?: number;
            r?: number;
            stops: SVGStop[];
            type?: "radial" | "linear";
            x1?: number;
            x2?: number;
            y1?: number;
            y2?: number;
        };
        id: string;
        stroke?: string;
        stroke_scale?: number;
        url?: string;
    }

    Properties

    fill? +SVGStoneParameters | goban

    Interface SVGStoneParameters

    interface SVGStoneParameters {
        fill?: string;
        gradient?: {
            cx?: number;
            cy?: number;
            fx?: number;
            fy?: number;
            r?: number;
            stops: SVGStop[];
            type?: "radial" | "linear";
            x1?: number;
            x2?: number;
            y1?: number;
            y2?: number;
        };
        id: string;
        stroke?: string;
        stroke_scale?: number;
        url?: string;
    }

    Properties

    fill?: string
    gradient?: {
        cx?: number;
        cy?: number;
        fx?: number;
        fy?: number;
        r?: number;
        stops: SVGStop[];
        type?: "radial" | "linear";
        x1?: number;
        x2?: number;
        y1?: number;
        y2?: number;
    }

    Type declaration

    • Optional cx?: number
    • Optional cy?: number
    • Optional fx?: number
    • Optional fy?: number
    • Optional r?: number
    • stops: SVGStop[]
    • Optional type?: "radial" | "linear"
    • Optional x1?: number
    • Optional x2?: number
    • Optional y1?: number
    • Optional y2?: number
    id: string
    stroke?: string
    stroke_scale?: number
    url?: string
    \ No newline at end of file +

    Properties

    fill?: string
    gradient?: {
        cx?: number;
        cy?: number;
        fx?: number;
        fy?: number;
        r?: number;
        stops: SVGStop[];
        type?: "radial" | "linear";
        x1?: number;
        x2?: number;
        y1?: number;
        y2?: number;
    }

    Type declaration

    • Optional cx?: number
    • Optional cy?: number
    • Optional fx?: number
    • Optional fy?: number
    • Optional r?: number
    • stops: SVGStop[]
    • Optional type?: "radial" | "linear"
    • Optional x1?: number
    • Optional x2?: number
    • Optional y1?: number
    • Optional y2?: number
    id: string
    stroke?: string
    stroke_scale?: number
    url?: string
    \ No newline at end of file diff --git a/docs/interfaces/SVGStop.html b/docs/interfaces/SVGStop.html index 1ff84e42..22373fb0 100644 --- a/docs/interfaces/SVGStop.html +++ b/docs/interfaces/SVGStop.html @@ -1,3 +1,3 @@ -SVGStop | goban

    Interface SVGStop

    interface SVGStop {
        color: string;
        offset: number;
    }

    Properties

    color +SVGStop | goban

    Interface SVGStop

    interface SVGStop {
        color: string;
        offset: number;
    }

    Properties

    Properties

    color: string
    offset: number
    \ No newline at end of file +

    Properties

    color: string
    offset: number
    \ No newline at end of file diff --git a/docs/interfaces/Score.html b/docs/interfaces/Score.html index ef990c78..6f406111 100644 --- a/docs/interfaces/Score.html +++ b/docs/interfaces/Score.html @@ -1,3 +1,3 @@ -Score | goban

    Interface Score

    interface Score {
        black: PlayerScore;
        white: PlayerScore;
    }

    Properties

    black +Score | goban

    Interface Score

    interface Score {
        black: PlayerScore;
        white: PlayerScore;
    }

    Properties

    Properties

    \ No newline at end of file +

    Properties

    \ No newline at end of file diff --git a/docs/interfaces/ScoreEstimateRequest.html b/docs/interfaces/ScoreEstimateRequest.html index 4bb4fd4d..eeae9e89 100644 --- a/docs/interfaces/ScoreEstimateRequest.html +++ b/docs/interfaces/ScoreEstimateRequest.html @@ -1,4 +1,4 @@ -ScoreEstimateRequest | goban

    Interface ScoreEstimateRequest

    interface ScoreEstimateRequest {
        autoscore?: boolean;
        black_prisoners?: number;
        board_state: JGOFNumericPlayerColor[][];
        height: number;
        jwt: string;
        komi?: number;
        player_to_move: "black" | "white";
        rules: GobanEngineRules;
        white_prisoners?: number;
        width: number;
    }

    Properties

    autoscore? +ScoreEstimateRequest | goban

    Interface ScoreEstimateRequest

    interface ScoreEstimateRequest {
        autoscore?: boolean;
        black_prisoners?: number;
        board_state: JGOFNumericPlayerColor[][];
        height: number;
        jwt: string;
        komi?: number;
        player_to_move: "black" | "white";
        rules: GobanEngineRules;
        white_prisoners?: number;
        width: number;
    }

    Properties

    Properties

    autoscore?: boolean

    Whether to run autoscoring logic. If true, player_to_move is essentially ignored as we compute estimates with each player moving first in turn.

    -
    black_prisoners?: number
    board_state: JGOFNumericPlayerColor[][]
    height: number
    jwt: string
    komi?: number
    player_to_move: "black" | "white"
    white_prisoners?: number
    width: number
    \ No newline at end of file +
    black_prisoners?: number
    board_state: JGOFNumericPlayerColor[][]
    height: number
    jwt: string
    komi?: number
    player_to_move: "black" | "white"
    white_prisoners?: number
    width: number
    \ No newline at end of file diff --git a/docs/interfaces/ScoreEstimateResponse.html b/docs/interfaces/ScoreEstimateResponse.html index 452f012f..14eb9978 100644 --- a/docs/interfaces/ScoreEstimateResponse.html +++ b/docs/interfaces/ScoreEstimateResponse.html @@ -1,13 +1,13 @@ -ScoreEstimateResponse | goban

    Interface ScoreEstimateResponse

    interface ScoreEstimateResponse {
        autoscored_board_state?: JGOFNumericPlayerColor[][];
        autoscored_needs_sealing?: JGOFSealingIntersection[];
        autoscored_removed?: JGOFMove[];
        ownership: number[][];
        score?: number;
        win_rate?: number;
    }

    Properties

    autoscored_board_state? +ScoreEstimateResponse | goban

    Interface ScoreEstimateResponse

    interface ScoreEstimateResponse {
        autoscored_board_state?: JGOFNumericPlayerColor[][];
        autoscored_needs_sealing?: JGOFSealingIntersection[];
        autoscored_removed?: JGOFMove[];
        ownership: number[][];
        score?: number;
        win_rate?: number;
    }

    Properties

    autoscored_board_state?: JGOFNumericPlayerColor[][]

    Board state after autoscoring logic has been run. Only defined if autoscore was true in the request.

    -
    autoscored_needs_sealing?: JGOFSealingIntersection[]

    Coordinates that still need sealing

    -
    autoscored_removed?: JGOFMove[]

    Intersections that are dead or dame. Only defined if autoscore was true in the request.

    -
    ownership: number[][]

    Matrix of ownership estimates ranged from -1 (white) to 1 (black)

    -
    score?: number

    Estimated score

    -
    win_rate?: number

    Estimated win rate

    -
    \ No newline at end of file +
    autoscored_needs_sealing?: JGOFSealingIntersection[]

    Coordinates that still need sealing

    +
    autoscored_removed?: JGOFMove[]

    Intersections that are dead or dame. Only defined if autoscore was true in the request.

    +
    ownership: number[][]

    Matrix of ownership estimates ranged from -1 (white) to 1 (black)

    +
    score?: number

    Estimated score

    +
    win_rate?: number

    Estimated win rate

    +
    \ No newline at end of file diff --git a/docs/interfaces/ScoringLocations.html b/docs/interfaces/ScoringLocations.html index cd0e1c8c..9142025d 100644 --- a/docs/interfaces/ScoringLocations.html +++ b/docs/interfaces/ScoringLocations.html @@ -1,3 +1,3 @@ -ScoringLocations | goban

    Interface ScoringLocations

    interface ScoringLocations {
        black: {
            locations: JGOFIntersection[];
            stones: number;
            territory: number;
        };
        white: {
            locations: JGOFIntersection[];
            stones: number;
            territory: number;
        };
    }

    Properties

    black +ScoringLocations | goban

    Interface ScoringLocations

    interface ScoringLocations {
        black: {
            locations: JGOFIntersection[];
            stones: number;
            territory: number;
        };
        white: {
            locations: JGOFIntersection[];
            stones: number;
            territory: number;
        };
    }

    Properties

    Properties

    black: {
        locations: JGOFIntersection[];
        stones: number;
        territory: number;
    }

    Type declaration

    white: {
        locations: JGOFIntersection[];
        stones: number;
        territory: number;
    }

    Type declaration

    \ No newline at end of file +

    Properties

    black: {
        locations: JGOFIntersection[];
        stones: number;
        territory: number;
    }

    Type declaration

    white: {
        locations: JGOFIntersection[];
        stones: number;
        territory: number;
    }

    Type declaration

    \ No newline at end of file diff --git a/docs/interfaces/StateUpdateEvents.html b/docs/interfaces/StateUpdateEvents.html index e83e1577..b3d726cd 100644 --- a/docs/interfaces/StateUpdateEvents.html +++ b/docs/interfaces/StateUpdateEvents.html @@ -1,4 +1,4 @@ -StateUpdateEvents | goban

    Interface StateUpdateEvents

    interface StateUpdateEvents {
        analyze_subtool: ((d) => void);
        analyze_tool: ((d) => void);
        cur_move: ((d) => void);
        cur_review_move: ((d) => void);
        last_official_move: ((d) => void);
        mode: ((d) => void);
        outcome: ((d) => void);
        paused: ((d) => void);
        phase: ((d) => void);
        review_controller_id: ((d) => void);
        review_owner_id: ((d) => void);
        rules: ((d) => void);
        score_estimate: ((d) => void);
        stalling_score_estimate: ((data?) => void);
        strict_seki_mode: ((d) => void);
        submit_move: ((d) => void);
        title: ((d) => void);
        undo_canceled: (() => void);
        undo_requested: ((d) => void);
        winner: ((d) => void);
    }

    Hierarchy (view full)

    Properties

    analyze_subtool +StateUpdateEvents | goban

    Interface StateUpdateEvents

    interface StateUpdateEvents {
        analyze_subtool: ((d) => void);
        analyze_tool: ((d) => void);
        cur_move: ((d) => void);
        cur_review_move: ((d) => void);
        last_official_move: ((d) => void);
        mode: ((d) => void);
        outcome: ((d) => void);
        paused: ((d) => void);
        phase: ((d) => void);
        review_controller_id: ((d) => void);
        review_owner_id: ((d) => void);
        rules: ((d) => void);
        score_estimate: ((d) => void);
        stalling_score_estimate: ((data?) => void);
        strict_seki_mode: ((d) => void);
        submit_move: ((d) => void);
        title: ((d) => void);
        undo_canceled: (() => void);
        undo_requested: ((d) => void);
        winner: ((d) => void);
    }

    Hierarchy (view full)

    Properties

    analyze_subtool: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: string

        Returns void

    analyze_tool: ((d) => void)

    Type declaration

    cur_move: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        Returns void

    cur_review_move: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        Returns void

    last_official_move: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        Returns void

    mode: ((d) => void)

    Type declaration

    outcome: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: string

        Returns void

    paused: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: boolean

        Returns void

    phase: ((d) => void)

    Type declaration

    review_controller_id: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: undefined | number

        Returns void

    review_owner_id: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: undefined | number

        Returns void

    rules: ((d) => void)

    Type declaration

    score_estimate: ((d) => void)

    Type declaration

    stalling_score_estimate: ((data?) => void)

    Type declaration

    strict_seki_mode: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: boolean

        Returns void

    submit_move: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: undefined | (() => void)

        Returns void

    title: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: string

        Returns void

    undo_canceled: (() => void)

    Type declaration

      • (): void
      • Returns void

    undo_requested: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: undefined | number

        Returns void

    winner: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: undefined | number

        Returns void

    \ No newline at end of file +

    Properties

    analyze_subtool: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: string

        Returns void

    analyze_tool: ((d) => void)

    Type declaration

    cur_move: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        Returns void

    cur_review_move: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        Returns void

    last_official_move: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        Returns void

    mode: ((d) => void)

    Type declaration

    outcome: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: string

        Returns void

    paused: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: boolean

        Returns void

    phase: ((d) => void)

    Type declaration

    review_controller_id: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: undefined | number

        Returns void

    review_owner_id: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: undefined | number

        Returns void

    rules: ((d) => void)

    Type declaration

    score_estimate: ((d) => void)

    Type declaration

    stalling_score_estimate: ((data?) => void)

    Type declaration

    strict_seki_mode: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: boolean

        Returns void

    submit_move: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: undefined | (() => void)

        Returns void

    title: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: string

        Returns void

    undo_canceled: (() => void)

    Type declaration

      • (): void
      • Returns void

    undo_requested: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: undefined | number

        Returns void

    winner: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: undefined | number

        Returns void

    \ No newline at end of file diff --git a/docs/interfaces/ThemesInterface.html b/docs/interfaces/ThemesInterface.html index d4471fee..55faa1b5 100644 --- a/docs/interfaces/ThemesInterface.html +++ b/docs/interfaces/ThemesInterface.html @@ -1,4 +1,4 @@ -ThemesInterface | goban

    Interface ThemesInterface

    interface ThemesInterface {
        black: {
            [name: string]: typeof GobanTheme;
        };
        board: {
            [name: string]: typeof GobanTheme;
        };
        white: {
            [name: string]: typeof GobanTheme;
        };
        [key: string]: {
            [name: string]: typeof GobanTheme;
        };
    }

    Indexable

    [key: string]: {
        [name: string]: typeof GobanTheme;
    }

    Properties

    black +ThemesInterface | goban

    Interface ThemesInterface

    interface ThemesInterface {
        black: {
            [name: string]: typeof GobanTheme;
        };
        board: {
            [name: string]: typeof GobanTheme;
        };
        white: {
            [name: string]: typeof GobanTheme;
        };
        [key: string]: {
            [name: string]: typeof GobanTheme;
        };
    }

    Indexable

    [key: string]: {
        [name: string]: typeof GobanTheme;
    }

    Properties

    Properties

    black: {
        [name: string]: typeof GobanTheme;
    }

    Type declaration

    board: {
        [name: string]: typeof GobanTheme;
    }

    Type declaration

    white: {
        [name: string]: typeof GobanTheme;
    }

    Type declaration

    \ No newline at end of file +

    Properties

    black: {
        [name: string]: typeof GobanTheme;
    }

    Type declaration

    board: {
        [name: string]: typeof GobanTheme;
    }

    Type declaration

    white: {
        [name: string]: typeof GobanTheme;
    }

    Type declaration

    \ No newline at end of file diff --git a/docs/interfaces/_internal_.AbsoluteClock.html b/docs/interfaces/_internal_.AbsoluteClock.html index 38752ed6..4329a686 100644 --- a/docs/interfaces/_internal_.AbsoluteClock.html +++ b/docs/interfaces/_internal_.AbsoluteClock.html @@ -1,2 +1,2 @@ -AbsoluteClock | goban

    Interface AbsoluteClock

    interface AbsoluteClock {
        thinking_time: number;
    }

    Properties

    Properties

    thinking_time: number
    \ No newline at end of file +AbsoluteClock | goban

    Interface AbsoluteClock

    interface AbsoluteClock {
        thinking_time: number;
    }

    Properties

    Properties

    thinking_time: number
    \ No newline at end of file diff --git a/docs/interfaces/_internal_.AnalysisComment.html b/docs/interfaces/_internal_.AnalysisComment.html index 950842f2..83d5d0d9 100644 --- a/docs/interfaces/_internal_.AnalysisComment.html +++ b/docs/interfaces/_internal_.AnalysisComment.html @@ -1,8 +1,8 @@ -AnalysisComment | goban

    Interface AnalysisComment

    interface AnalysisComment {
        branch_move?: number;
        from?: number;
        marks?: {
            [mark: string]: string;
        };
        moves?: string;
        name?: string;
        pen_marks?: unknown[];
        type: "analysis";
    }

    Properties

    branch_move? +AnalysisComment | goban

    Interface AnalysisComment

    interface AnalysisComment {
        branch_move?: number;
        from?: number;
        marks?: {
            [mark: string]: string;
        };
        moves?: string;
        name?: string;
        pen_marks?: unknown[];
        type: "analysis";
    }

    Properties

    branch_move?: number
    from?: number
    marks?: {
        [mark: string]: string;
    }

    Type declaration

    • [mark: string]: string
    moves?: string
    name?: string
    pen_marks?: unknown[]
    type: "analysis"
    \ No newline at end of file +

    Properties

    branch_move?: number
    from?: number
    marks?: {
        [mark: string]: string;
    }

    Type declaration

    • [mark: string]: string
    moves?: string
    name?: string
    pen_marks?: unknown[]
    type: "analysis"
    \ No newline at end of file diff --git a/docs/interfaces/_internal_.AutoscoreResults.html b/docs/interfaces/_internal_.AutoscoreResults.html index 2f982aec..44b40cdb 100644 --- a/docs/interfaces/_internal_.AutoscoreResults.html +++ b/docs/interfaces/_internal_.AutoscoreResults.html @@ -1,5 +1,5 @@ -AutoscoreResults | goban

    Interface AutoscoreResults

    interface AutoscoreResults {
        needs_sealing: JGOFSealingIntersection[];
        removed: JGOFMove[];
        result: JGOFNumericPlayerColor[][];
        sealed_result: JGOFNumericPlayerColor[][];
    }

    Properties

    needs_sealing +AutoscoreResults | goban

    Interface AutoscoreResults

    interface AutoscoreResults {
        needs_sealing: JGOFSealingIntersection[];
        removed: JGOFMove[];
        result: JGOFNumericPlayerColor[][];
        sealed_result: JGOFNumericPlayerColor[][];
    }

    Properties

    needs_sealing: JGOFSealingIntersection[]
    removed: JGOFMove[]
    sealed_result: JGOFNumericPlayerColor[][]
    \ No newline at end of file +

    Properties

    needs_sealing: JGOFSealingIntersection[]
    removed: JGOFMove[]
    sealed_result: JGOFNumericPlayerColor[][]
    \ No newline at end of file diff --git a/docs/interfaces/_internal_.BoardStateWithIsobranchHash.html b/docs/interfaces/_internal_.BoardStateWithIsobranchHash.html index f2d792ec..30c0bf7d 100644 --- a/docs/interfaces/_internal_.BoardStateWithIsobranchHash.html +++ b/docs/interfaces/_internal_.BoardStateWithIsobranchHash.html @@ -1,4 +1,4 @@ -BoardStateWithIsobranchHash | goban

    Interface BoardStateWithIsobranchHash

    interface BoardStateWithIsobranchHash {
        black_prisoners: number;
        board: JGOFNumericPlayerColor[][];
        board_is_repeating: boolean;
        goban_callback?: GobanBase;
        height: number;
        isobranch_hash?: string;
        player: JGOFNumericPlayerColor;
        removal: boolean[][];
        white_prisoners: number;
        width: number;
        boardEquals(other): boolean;
        clearRemoved(): void;
        cloneBoard(): JGOFNumericPlayerColor[][];
        cloneBoardState(): BoardState;
        computeScoringLocations(area_scoring): ScoringLocations;
        countLiberties(raw_stone_string): number;
        foreachNeighbor(pt_or_raw_stone_string, callback): void;
        getNeighboringRawStoneStrings(raw_stone_string): RawStoneString[];
        getRawStoneString(x, y, clearMarks): RawStoneString;
        setRemoved(x, y, removed, emit_stone_removal_updated?): void;
        toggleSingleGroupRemoval(x, y, force_removal?): {
            group: RawStoneString;
            removed: boolean;
        };
    }

    Hierarchy (view full)

    Properties

    black_prisoners +BoardStateWithIsobranchHash | goban

    Interface BoardStateWithIsobranchHash

    interface BoardStateWithIsobranchHash {
        black_prisoners: number;
        board: JGOFNumericPlayerColor[][];
        board_is_repeating: boolean;
        goban_callback?: GobanBase;
        height: number;
        isobranch_hash?: string;
        player: JGOFNumericPlayerColor;
        removal: boolean[][];
        white_prisoners: number;
        width: number;
        boardEquals(other): boolean;
        clearRemoved(): void;
        cloneBoard(): JGOFNumericPlayerColor[][];
        cloneBoardState(): BoardState;
        computeScoringLocations(area_scoring): ScoringLocations;
        countLiberties(raw_stone_string): number;
        foreachNeighbor(pt_or_raw_stone_string, callback): void;
        getNeighboringRawStoneStrings(raw_stone_string): RawStoneString[];
        getRawStoneString(x, y, clearMarks): RawStoneString;
        setRemoved(x, y, removed, emit_stone_removal_updated?): void;
        toggleSingleGroupRemoval(x, y, force_removal?): {
            group: RawStoneString;
            removed: boolean;
        };
    }

    Hierarchy (view full)

    Properties

    black_prisoners: number
    board_is_repeating: boolean
    goban_callback?: GobanBase
    height: number = 19
    isobranch_hash?: string

    The isobranch hash is a hash of the board state. This field is used by +

    Properties

    black_prisoners: number
    board_is_repeating: boolean
    goban_callback?: GobanBase
    height: number = 19
    isobranch_hash?: string

    The isobranch hash is a hash of the board state. This field is used by the move tree to detect isomorphic branches. This field is populated when recomputeIsoBranches is called.

    -
    removal: boolean[][]
    white_prisoners: number
    width: number = 19

    Methods

    removal: boolean[][]
    white_prisoners: number
    width: number = 19

    Methods

    • Sets a position as being removed or not removed. If emit_stone_removal_updated is set to false, the "stone-removal.updated" event will not be emitted, and it is up to the caller to emit this event appropriately.

      -

      Parameters

      • x: number
      • y: number
      • removed: boolean
      • emit_stone_removal_updated: boolean = true

      Returns void

    • Toggles a group of stones for removal or restoration.

      +

      Parameters

      • x: number
      • y: number
      • removed: boolean
      • emit_stone_removal_updated: boolean = true

      Returns void

    • Toggles a group of stones for removal or restoration.

      By default, if we are marking a group for removal but the group is almost certainly alive (two eyes, etc), this will result in a no-op, unless force_removal is set to true.

      -

      Parameters

      • x: number
      • y: number
      • force_removal: boolean = false

      Returns {
          group: RawStoneString;
          removed: boolean;
      }

    \ No newline at end of file +

    Parameters

    Returns {
        group: RawStoneString;
        removed: boolean;
    }

    \ No newline at end of file diff --git a/docs/interfaces/_internal_.ByoYomiClock.html b/docs/interfaces/_internal_.ByoYomiClock.html index 6b1d5fc7..c18d5bd5 100644 --- a/docs/interfaces/_internal_.ByoYomiClock.html +++ b/docs/interfaces/_internal_.ByoYomiClock.html @@ -1,5 +1,5 @@ -ByoYomiClock | goban

    Interface ByoYomiClock

    interface ByoYomiClock {
        period_time: number;
        period_time_left?: number;
        periods: number;
        thinking_time: number;
    }

    Properties

    period_time +ByoYomiClock | goban

    Interface ByoYomiClock

    interface ByoYomiClock {
        period_time: number;
        period_time_left?: number;
        periods: number;
        thinking_time: number;
    }

    Properties

    period_time: number
    period_time_left?: number
    periods: number
    thinking_time: number
    \ No newline at end of file +

    Properties

    period_time: number
    period_time_left?: number
    periods: number
    thinking_time: number
    \ No newline at end of file diff --git a/docs/interfaces/_internal_.CanadianClock.html b/docs/interfaces/_internal_.CanadianClock.html index 7e7a10c5..0fd6bbe4 100644 --- a/docs/interfaces/_internal_.CanadianClock.html +++ b/docs/interfaces/_internal_.CanadianClock.html @@ -1,4 +1,4 @@ -CanadianClock | goban

    Interface CanadianClock

    interface CanadianClock {
        block_time: number;
        moves_left: number;
        thinking_time: number;
    }

    Properties

    block_time +CanadianClock | goban

    Interface CanadianClock

    interface CanadianClock {
        block_time: number;
        moves_left: number;
        thinking_time: number;
    }

    Properties

    block_time: number
    moves_left: number
    thinking_time: number
    \ No newline at end of file +

    Properties

    block_time: number
    moves_left: number
    thinking_time: number
    \ No newline at end of file diff --git a/docs/interfaces/_internal_.ErrorResponse.html b/docs/interfaces/_internal_.ErrorResponse.html index 2ed245e3..c694ce72 100644 --- a/docs/interfaces/_internal_.ErrorResponse.html +++ b/docs/interfaces/_internal_.ErrorResponse.html @@ -1,3 +1,3 @@ -ErrorResponse | goban

    Interface ErrorResponse

    interface ErrorResponse {
        code: string;
        message: string;
    }

    Properties

    code +ErrorResponse | goban

    Interface ErrorResponse

    interface ErrorResponse {
        code: string;
        message: string;
    }

    Properties

    Properties

    code: string
    message: string
    \ No newline at end of file +

    Properties

    code: string
    message: string
    \ No newline at end of file diff --git a/docs/interfaces/_internal_.FischerClock.html b/docs/interfaces/_internal_.FischerClock.html index 06b4a243..bc07c056 100644 --- a/docs/interfaces/_internal_.FischerClock.html +++ b/docs/interfaces/_internal_.FischerClock.html @@ -1,3 +1,3 @@ -FischerClock | goban

    Interface FischerClock

    interface FischerClock {
        skip_bonus: boolean;
        thinking_time: number;
    }

    Properties

    skip_bonus +FischerClock | goban

    Interface FischerClock

    interface FischerClock {
        skip_bonus: boolean;
        thinking_time: number;
    }

    Properties

    skip_bonus: boolean
    thinking_time: number
    \ No newline at end of file +

    Properties

    skip_bonus: boolean
    thinking_time: number
    \ No newline at end of file diff --git a/docs/interfaces/_internal_.GameListPlayer.html b/docs/interfaces/_internal_.GameListPlayer.html index 1d165796..ad1bbd9a 100644 --- a/docs/interfaces/_internal_.GameListPlayer.html +++ b/docs/interfaces/_internal_.GameListPlayer.html @@ -1,7 +1,7 @@ -GameListPlayer | goban

    Interface GameListPlayer

    interface GameListPlayer {
        accepted: boolean;
        id: number;
        professional: boolean;
        rank: number;
        ratings: {
            overall: {
                deviation: number;
                rating: number;
                volatility: number;
            };
            version: number;
        };
        username: string;
    }

    Properties

    accepted +GameListPlayer | goban

    Interface GameListPlayer

    interface GameListPlayer {
        accepted: boolean;
        id: number;
        professional: boolean;
        rank: number;
        ratings: {
            overall: {
                deviation: number;
                rating: number;
                volatility: number;
            };
            version: number;
        };
        username: string;
    }

    Properties

    accepted: boolean
    id: number
    professional: boolean
    rank: number
    ratings: {
        overall: {
            deviation: number;
            rating: number;
            volatility: number;
        };
        version: number;
    }

    Type declaration

    • overall: {
          deviation: number;
          rating: number;
          volatility: number;
      }
      • deviation: number
      • rating: number
      • volatility: number
    • version: number
    username: string
    \ No newline at end of file +

    Properties

    accepted: boolean
    id: number
    professional: boolean
    rank: number
    ratings: {
        overall: {
            deviation: number;
            rating: number;
            volatility: number;
        };
        version: number;
    }

    Type declaration

    • overall: {
          deviation: number;
          rating: number;
          volatility: number;
      }
      • deviation: number
      • rating: number
      • volatility: number
    • version: number
    username: string
    \ No newline at end of file diff --git a/docs/interfaces/_internal_.GobanSVGInterface.html b/docs/interfaces/_internal_.GobanSVGInterface.html index 9fc232b3..8f8c73aa 100644 --- a/docs/interfaces/_internal_.GobanSVGInterface.html +++ b/docs/interfaces/_internal_.GobanSVGInterface.html @@ -1,4 +1,4 @@ -GobanSVGInterface | goban

    Interface GobanSVGInterface

    interface GobanSVGInterface {
        engine: GobanEngine;
        move_tree_container?: HTMLElement;
        clearAnalysisDrawing(): void;
        clearMessage(): void;
        destroy(): void;
        disablePen(): void;
        drawPenMarks(pen_marks): void;
        drawSquare(i, j): void;
        enablePen(): void;
        move_tree_bindEvents(svg): void;
        move_tree_redraw(no_warp?): void;
        setByoYomiLabel(label): void;
        setLastMoveOpacity(opacity): void;
        setMoveTreeContainer(container): void;
        showMessage(message_id_or_error, parameters?, timeout?): void;
    }

    Implemented by

    Properties

    engine +GobanSVGInterface | goban

    Interface GobanSVGInterface

    interface GobanSVGInterface {
        engine: GobanEngine;
        move_tree_container?: HTMLElement;
        clearAnalysisDrawing(): void;
        clearMessage(): void;
        destroy(): void;
        disablePen(): void;
        drawPenMarks(pen_marks): void;
        drawSquare(i, j): void;
        enablePen(): void;
        move_tree_bindEvents(svg): void;
        move_tree_redraw(no_warp?): void;
        setByoYomiLabel(label): void;
        setLastMoveOpacity(opacity): void;
        setMoveTreeContainer(container): void;
        showMessage(message_id_or_error, parameters?, timeout?): void;
    }

    Implemented by

    Properties

    engine: GobanEngine
    move_tree_container?: HTMLElement

    Methods

    • Parameters

      • message_id_or_error: MessageID
      • Optional parameters: {
            [key: string]: any;
        }
        • [key: string]: any
      • Optional timeout: number

      Returns void

    \ No newline at end of file +

    Properties

    engine: GobanEngine
    move_tree_container?: HTMLElement

    Methods

    • Parameters

      • message_id_or_error: MessageID
      • Optional parameters: {
            [key: string]: any;
        }
        • [key: string]: any
      • Optional timeout: number

      Returns void

    \ No newline at end of file diff --git a/docs/interfaces/_internal_.GobanSocketOptions.html b/docs/interfaces/_internal_.GobanSocketOptions.html index b9933a80..b42295ae 100644 --- a/docs/interfaces/_internal_.GobanSocketOptions.html +++ b/docs/interfaces/_internal_.GobanSocketOptions.html @@ -1,7 +1,7 @@ -GobanSocketOptions | goban

    Interface GobanSocketOptions

    interface GobanSocketOptions {
        dont_ping?: boolean;
        ping_interval?: number;
        quiet?: boolean;
        timeout_delay?: number;
    }

    Properties

    dont_ping? +GobanSocketOptions | goban

    Interface GobanSocketOptions

    interface GobanSocketOptions {
        dont_ping?: boolean;
        ping_interval?: number;
        quiet?: boolean;
        timeout_delay?: number;
    }

    Properties

    dont_ping?: boolean

    Don't automatically send pings

    -
    ping_interval?: number
    quiet?: boolean

    Don't log connection/disconnect things

    -
    timeout_delay?: number
    \ No newline at end of file +
    ping_interval?: number
    quiet?: boolean

    Don't log connection/disconnect things

    +
    timeout_delay?: number
    \ No newline at end of file diff --git a/docs/interfaces/_internal_.JGOFPlayerClockWithTimedOut.html b/docs/interfaces/_internal_.JGOFPlayerClockWithTimedOut.html index adc8abbd..878a0670 100644 --- a/docs/interfaces/_internal_.JGOFPlayerClockWithTimedOut.html +++ b/docs/interfaces/_internal_.JGOFPlayerClockWithTimedOut.html @@ -1,4 +1,4 @@ -JGOFPlayerClockWithTimedOut | goban

    Interface JGOFPlayerClockWithTimedOut

    interface JGOFPlayerClockWithTimedOut {
        block_time_left?: number;
        main_time: number;
        moves_left?: number;
        period_time_left?: number;
        periods_left?: number;
        timed_out: boolean;
    }

    Hierarchy (view full)

    Properties

    block_time_left? +JGOFPlayerClockWithTimedOut | goban

    Interface JGOFPlayerClockWithTimedOut

    interface JGOFPlayerClockWithTimedOut {
        block_time_left?: number;
        main_time: number;
        moves_left?: number;
        period_time_left?: number;
        periods_left?: number;
        timed_out: boolean;
    }

    Hierarchy (view full)

    Properties

    block_time_left?: number

    Used with canadian time control. Time left in milliseconds to make the remainder of your moves in the current block

    -
    main_time: number

    Main time left on the clock, in milliseconds.

    -
    moves_left?: number

    Used with canadian time control. Number of moves left before a new +

    main_time: number

    Main time left on the clock, in milliseconds.

    +
    moves_left?: number

    Used with canadian time control. Number of moves left before a new block of time.

    -
    period_time_left?: number

    Used with byo-yomi time control. Time left on the period time, in milliseconds.

    -
    periods_left?: number

    Used with byo-yomi time control. Number of periods left.

    -
    timed_out: boolean
    \ No newline at end of file +
    period_time_left?: number

    Used with byo-yomi time control. Time left on the period time, in milliseconds.

    +
    periods_left?: number

    Used with byo-yomi time control. Number of periods left.

    +
    timed_out: boolean
    \ No newline at end of file diff --git a/docs/interfaces/_internal_.MoveTreeViewPortInterface.html b/docs/interfaces/_internal_.MoveTreeViewPortInterface.html index 8fe3497c..eba15a9b 100644 --- a/docs/interfaces/_internal_.MoveTreeViewPortInterface.html +++ b/docs/interfaces/_internal_.MoveTreeViewPortInterface.html @@ -1,7 +1,7 @@ -MoveTreeViewPortInterface | goban

    Interface MoveTreeViewPortInterface

    interface MoveTreeViewPortInterface {
        maxx: number;
        maxy: number;
        minx: number;
        miny: number;
        offset_x: number;
        offset_y: number;
    }

    Properties

    maxx +MoveTreeViewPortInterface | goban

    Interface MoveTreeViewPortInterface

    interface MoveTreeViewPortInterface {
        maxx: number;
        maxy: number;
        minx: number;
        miny: number;
        offset_x: number;
        offset_y: number;
    }

    Properties

    maxx: number
    maxy: number
    minx: number
    miny: number
    offset_x: number
    offset_y: number
    \ No newline at end of file +

    Properties

    maxx: number
    maxy: number
    minx: number
    miny: number
    offset_x: number
    offset_y: number
    \ No newline at end of file diff --git a/docs/interfaces/_internal_.ReviewComment.html b/docs/interfaces/_internal_.ReviewComment.html index 54e4c46e..0580d89e 100644 --- a/docs/interfaces/_internal_.ReviewComment.html +++ b/docs/interfaces/_internal_.ReviewComment.html @@ -1,3 +1,3 @@ -ReviewComment | goban

    Interface ReviewComment

    interface ReviewComment {
        review_id: number;
        type: "review";
    }

    Properties

    review_id +ReviewComment | goban

    Interface ReviewComment

    interface ReviewComment {
        review_id: number;
        type: "review";
    }

    Properties

    Properties

    review_id: number
    type: "review"
    \ No newline at end of file +

    Properties

    review_id: number
    type: "review"
    \ No newline at end of file diff --git a/docs/interfaces/_internal_.ViewPortInterface.html b/docs/interfaces/_internal_.ViewPortInterface.html index dbf89781..bf3238b9 100644 --- a/docs/interfaces/_internal_.ViewPortInterface.html +++ b/docs/interfaces/_internal_.ViewPortInterface.html @@ -1,7 +1,7 @@ -ViewPortInterface | goban

    Interface ViewPortInterface

    interface ViewPortInterface {
        maxx: number;
        maxy: number;
        minx: number;
        miny: number;
        offset_x: number;
        offset_y: number;
    }

    Properties

    maxx +ViewPortInterface | goban

    Interface ViewPortInterface

    interface ViewPortInterface {
        maxx: number;
        maxy: number;
        minx: number;
        miny: number;
        offset_x: number;
        offset_y: number;
    }

    Properties

    maxx: number
    maxy: number
    minx: number
    miny: number
    offset_x: number
    offset_y: number
    \ No newline at end of file +

    Properties

    maxx: number
    maxy: number
    minx: number
    miny: number
    offset_x: number
    offset_y: number
    \ No newline at end of file diff --git a/docs/interfaces/protocol.AIServerToClient.html b/docs/interfaces/protocol.AIServerToClient.html index 276396c3..bd2dd2dc 100644 --- a/docs/interfaces/protocol.AIServerToClient.html +++ b/docs/interfaces/protocol.AIServerToClient.html @@ -1,6 +1,6 @@ AIServerToClient | goban

    Interface AIServerToClient

    interface AIServerToClient {
        net/pong: ((data) => void);
        [uuid: string]: ((data) => void);
    }

    Indexable

    [uuid: string]: ((data) => void)

    AI review messages are streamed back to the AI review UUID.

    -
      • (data): void
      • Parameters

        • data: any

        Returns void

    Properties

      • (data): void
      • Parameters

        • data: any

        Returns void

    Properties

    Properties

    net/pong: ((data) => void)

    Pong response from a ping

    Type declaration

      • (data): void
      • Parameters

        • data: {
              client: number;
              server: number;
          }
          • client: number

            Client timestamp that was sent

          • server: number

            Server timestamp when it was received

            -

        Returns void

    \ No newline at end of file +

    Returns void

    \ No newline at end of file diff --git a/docs/interfaces/protocol.AutomatchPreferences.html b/docs/interfaces/protocol.AutomatchPreferences.html index cd4388f5..b569f25c 100644 --- a/docs/interfaces/protocol.AutomatchPreferences.html +++ b/docs/interfaces/protocol.AutomatchPreferences.html @@ -1,4 +1,4 @@ -AutomatchPreferences | goban

    Interface AutomatchPreferences

    interface AutomatchPreferences {
        handicap: {
            condition: AutomatchCondition;
            value: "enabled" | "disabled";
        };
        lower_rank_diff: number;
        rules: {
            condition: AutomatchCondition;
            value: "chinese" | "aga" | "japanese" | "korean" | "ing" | "nz";
        };
        size_speed_options: {
            size: Size;
            speed: Speed;
        }[];
        time_control: {
            condition: AutomatchCondition;
            value: {
                initial_time?: number;
                main_time?: number;
                max_time?: number;
                pause_on_weekends?: boolean;
                per_move?: number;
                period_time?: number;
                periods?: number;
                stones_per_period?: number;
                system: "fischer" | "byoyomi" | "canadian" | "simple";
                time_increment?: number;
            };
        };
        timestamp?: number;
        upper_rank_diff: number;
        uuid: string;
    }

    Properties

    handicap +AutomatchPreferences | goban

    Interface AutomatchPreferences

    interface AutomatchPreferences {
        handicap: {
            condition: AutomatchCondition;
            value: "enabled" | "disabled";
        };
        lower_rank_diff: number;
        rules: {
            condition: AutomatchCondition;
            value: "chinese" | "aga" | "japanese" | "korean" | "ing" | "nz";
        };
        size_speed_options: {
            size: Size;
            speed: Speed;
        }[];
        time_control: {
            condition: AutomatchCondition;
            value: {
                initial_time?: number;
                main_time?: number;
                max_time?: number;
                pause_on_weekends?: boolean;
                per_move?: number;
                period_time?: number;
                periods?: number;
                stones_per_period?: number;
                system: "fischer" | "byoyomi" | "canadian" | "simple";
                time_increment?: number;
            };
        };
        timestamp?: number;
        upper_rank_diff: number;
        uuid: string;
    }

    Properties

    handicap: {
        condition: AutomatchCondition;
        value: "enabled" | "disabled";
    }

    Type declaration

    lower_rank_diff: number
    rules: {
        condition: AutomatchCondition;
        value: "chinese" | "aga" | "japanese" | "korean" | "ing" | "nz";
    }

    Type declaration

    • condition: AutomatchCondition
    • value: "chinese" | "aga" | "japanese" | "korean" | "ing" | "nz"
    size_speed_options: {
        size: Size;
        speed: Speed;
    }[]

    Type declaration

    time_control: {
        condition: AutomatchCondition;
        value: {
            initial_time?: number;
            main_time?: number;
            max_time?: number;
            pause_on_weekends?: boolean;
            per_move?: number;
            period_time?: number;
            periods?: number;
            stones_per_period?: number;
            system: "fischer" | "byoyomi" | "canadian" | "simple";
            time_increment?: number;
        };
    }

    Type declaration

    • condition: AutomatchCondition
    • value: {
          initial_time?: number;
          main_time?: number;
          max_time?: number;
          pause_on_weekends?: boolean;
          per_move?: number;
          period_time?: number;
          periods?: number;
          stones_per_period?: number;
          system: "fischer" | "byoyomi" | "canadian" | "simple";
          time_increment?: number;
      }
      • Optional initial_time?: number
      • Optional main_time?: number
      • Optional max_time?: number
      • Optional pause_on_weekends?: boolean
      • Optional per_move?: number
      • Optional period_time?: number
      • Optional periods?: number
      • Optional stones_per_period?: number
      • system: "fischer" | "byoyomi" | "canadian" | "simple"
      • Optional time_increment?: number
    timestamp?: number
    upper_rank_diff: number
    uuid: string
    \ No newline at end of file +

    Properties

    handicap: {
        condition: AutomatchCondition;
        value: "enabled" | "disabled";
    }

    Type declaration

    lower_rank_diff: number
    rules: {
        condition: AutomatchCondition;
        value: "chinese" | "aga" | "japanese" | "korean" | "ing" | "nz";
    }

    Type declaration

    • condition: AutomatchCondition
    • value: "chinese" | "aga" | "japanese" | "korean" | "ing" | "nz"
    size_speed_options: {
        size: Size;
        speed: Speed;
    }[]

    Type declaration

    time_control: {
        condition: AutomatchCondition;
        value: {
            initial_time?: number;
            main_time?: number;
            max_time?: number;
            pause_on_weekends?: boolean;
            per_move?: number;
            period_time?: number;
            periods?: number;
            stones_per_period?: number;
            system: "fischer" | "byoyomi" | "canadian" | "simple";
            time_increment?: number;
        };
    }

    Type declaration

    • condition: AutomatchCondition
    • value: {
          initial_time?: number;
          main_time?: number;
          max_time?: number;
          pause_on_weekends?: boolean;
          per_move?: number;
          period_time?: number;
          periods?: number;
          stones_per_period?: number;
          system: "fischer" | "byoyomi" | "canadian" | "simple";
          time_increment?: number;
      }
      • Optional initial_time?: number
      • Optional main_time?: number
      • Optional max_time?: number
      • Optional pause_on_weekends?: boolean
      • Optional per_move?: number
      • Optional period_time?: number
      • Optional periods?: number
      • Optional stones_per_period?: number
      • system: "fischer" | "byoyomi" | "canadian" | "simple"
      • Optional time_increment?: number
    timestamp?: number
    upper_rank_diff: number
    uuid: string
    \ No newline at end of file diff --git a/docs/interfaces/protocol.ClientToAIServer.html b/docs/interfaces/protocol.ClientToAIServer.html index cb776859..bc6f7aaf 100644 --- a/docs/interfaces/protocol.ClientToAIServer.html +++ b/docs/interfaces/protocol.ClientToAIServer.html @@ -1,6 +1,6 @@ ClientToAIServer | goban

    Interface ClientToAIServer

    This is an exhaustive list of the messages that the client can send to the AI servers.

    -
    interface ClientToAIServer {
        ai-analyze-position: ((data) => any);
        ai-analyze-subscribe: ((data) => void);
        ai-analyze-unsubscribe: ((data) => void);
        ai-analyze-variation: ((data) => void);
        ai-relay-analyzed-position: ((data) => any);
        ai-review-connect: ((data) => void);
        ai-review-disconnect: ((data) => void);
        authenticate: ((data) => undefined | {
            id: number;
            username: string;
        });
        net/ping: ((data) => void);
    }

    Hierarchy (view full)

    Properties

    interface ClientToAIServer {
        ai-analyze-position: ((data) => any);
        ai-analyze-subscribe: ((data) => void);
        ai-analyze-unsubscribe: ((data) => void);
        ai-analyze-variation: ((data) => void);
        ai-relay-analyzed-position: ((data) => any);
        ai-review-connect: ((data) => void);
        ai-review-disconnect: ((data) => void);
        authenticate: ((data) => undefined | {
            id: number;
            username: string;
        });
        net/ping: ((data) => void);
    }

    Hierarchy (view full)

    Properties

  • rules: RuleSet

    Ruleset to use

  • uuid: string

    UUID identifying the request

  • white_prisoners: number

    Number of captures white has

    -
  • Returns any

    ai-analyze-subscribe: ((data) => void)

    Subscribers to analyze position calls

    -

    Type declaration

      • (data): void
      • Parameters

        • data: {
              channel_id: string;
          }
          • channel_id: string

        Returns void

    ai-analyze-unsubscribe: ((data) => void)

    Un-subscribers to analyze position calls

    -

    Type declaration

      • (data): void
      • Parameters

        • data: {
              channel_id: string;
          }
          • channel_id: string

        Returns void

    ai-analyze-variation: ((data) => void)

    Type declaration

      • (data): void
      • Parameters

        • data: {
              ai_review_id: string | number;
              from: number;
              game_id: string | number;
              uuid: string;
              variation: string;
          }
          • ai_review_id: string | number

            The AI review id we're basing our analysis off of

            +

        Returns any

    ai-analyze-subscribe: ((data) => void)

    Subscribers to analyze position calls

    +

    Type declaration

      • (data): void
      • Parameters

        • data: {
              channel_id: string;
          }
          • channel_id: string

        Returns void

    ai-analyze-unsubscribe: ((data) => void)

    Un-subscribers to analyze position calls

    +

    Type declaration

      • (data): void
      • Parameters

        • data: {
              channel_id: string;
          }
          • channel_id: string

        Returns void

    ai-analyze-variation: ((data) => void)

    Type declaration

      • (data): void
      • Parameters

        • data: {
              ai_review_id: string | number;
              from: number;
              game_id: string | number;
              uuid: string;
              variation: string;
          }
          • ai_review_id: string | number

            The AI review id we're basing our analysis off of

          • from: number

            The move number we're branching from

          • game_id: string | number

            The game id we're analyzing

          • uuid: string

            AI UUID

          • variation: string

            Move string

            -

        Returns void

    ai-relay-analyzed-position: ((data) => any)

    Relay an already analyzed position out to any other viewers

    +

    Returns void

    ai-relay-analyzed-position: ((data) => any)

    Relay an already analyzed position out to any other viewers

    Type declaration

      • (data): any
      • Parameters

        • data: {
              channel_id: string;
              data: any;
          }
          • channel_id: string

            Channel identifier, for instance ai-position-analysis-stream-review-

            -
          • data: any

        Returns any

    ai-review-connect: ((data) => void)

    Type declaration

      • (data): void
      • Parameters

        • data: {
              ai_review_id: string | number;
              game_id: string | number;
              uuid: string;
          }
          • ai_review_id: string | number

            The AI review id we're basing our analysis off of

            +
          • data: any

        Returns any

    ai-review-connect: ((data) => void)

    Type declaration

      • (data): void
      • Parameters

        • data: {
              ai_review_id: string | number;
              game_id: string | number;
              uuid: string;
          }
          • ai_review_id: string | number

            The AI review id we're basing our analysis off of

          • game_id: string | number

            The game id we're reviewing

          • uuid: string

            AI UUID

            -

        Returns void

    ai-review-disconnect: ((data) => void)

    Type declaration

      • (data): void
      • Parameters

        • data: {
              uuid: string;
          }
          • uuid: string

            AI UUID

            -

        Returns void

    authenticate: ((data) => undefined | {
        id: number;
        username: string;
    })

    Authenticate with the server.

    +

    Returns void

    ai-review-disconnect: ((data) => void)

    Type declaration

      • (data): void
      • Parameters

        • data: {
              uuid: string;
          }
          • uuid: string

            AI UUID

            +

        Returns void

    authenticate: ((data) => undefined | {
        id: number;
        username: string;
    })

    Authenticate with the server.

    Prior to authentication, you should perform a GET request to /api/v1/ui/config to get the current configuration. Within the returned JSON @@ -47,7 +47,7 @@

  • Optional language?: string

    ISO 639-1 language code used on this device.

  • Optional language_version?: string

    The version of the translation dictionary.

  • Optional user_agent?: string

    Browser user agent (or websocket library)

    -
  • Returns undefined | {
        id: number;
        username: string;
    }

    net/ping: ((data) => void)

    Sends a ping to the server. This message should be +

    Returns undefined | {
        id: number;
        username: string;
    }

    net/ping: ((data) => void)

    Sends a ping to the server. This message should be sent regularly. The default interval is 10 seconds. This keeps the connection alive and allows a client to measure clock drift and latency, both of which @@ -55,4 +55,4 @@

    Type declaration

      • (data): void
      • Parameters

        • data: {
              client: number;
              drift: number;
              latency: number;
          }
          • client: number

            Client timestamp - milliseconds since epoch

          • drift: number

            Last clock drift measurement, or 0

          • latency: number

            Last latency measurement, or 0

            -

        Returns void

    \ No newline at end of file +

    Returns void

    \ No newline at end of file diff --git a/docs/interfaces/protocol.ClientToServer.html b/docs/interfaces/protocol.ClientToServer.html index 0111521c..013c4f44 100644 --- a/docs/interfaces/protocol.ClientToServer.html +++ b/docs/interfaces/protocol.ClientToServer.html @@ -11,7 +11,9 @@
     {
    bot_apikey?: string;
    bot_username?: string;
    client?: string;
    client_version?: string;
    device_id?: string;
    jwt: string;
    language?: string;
    language_version?: string;
    user_agent?: string;
    }

    and you can expect to receive back either undefined or {id: number, username: string}

    -
    interface ClientToServer {
        authenticate: ((data) => undefined | {
            id: number;
            username: string;
        });
        automatch/cancel: ((data) => void);
        automatch/find_match: ((data) => void);
        automatch/list: ((data) => void);
        bot/config: ((config) => void);
        bot/status: ((data) => void);
        challenge/keepalive: ((data) => void);
        chat/join: ((data) => void);
        chat/part: ((data) => void);
        chat/pm: ((data) => undefined | {
            from: User;
            message: {
                i: string;
                m: string;
                t: number;
            };
            to: {
                id: number;
                username: string;
            };
        });
        chat/pm/close: ((data) => void);
        chat/pm/load: ((data) => void);
        chat/pm/superchat: ((data) => void);
        chat/remove: ((data) => void);
        chat/remove_all: ((data) => void);
        chat/send: ((data) => void);
        chat/topic: ((data) => void);
        game/annul: ((data) => void);
        game/cancel: ((data) => void);
        game/chat: ((data) => void);
        game/chat/remove: ((data) => void);
        game/clear_delayed_resign: ((data) => void);
        game/conditional_moves/set: ((data) => void);
        game/connect: ((data) => void);
        game/delayed_resign: ((data) => void);
        game/disconnect: ((data) => void);
        game/latency: ((data) => void);
        game/log: ((data) => {
            data: any;
            event: string;
            timestamp: string;
        }[]);
        game/move: ((data) => void);
        game/pause: ((data) => void);
        game/prevent_escaping: ((data) => void);
        game/prevent_stalling: ((data) => void);
        game/removed_stones/accept: ((data) => void);
        game/removed_stones/reject: ((data) => void);
        game/removed_stones/set: ((data) => void);
        game/resign: ((data) => void);
        game/resume: ((data) => void);
        game/timed_out: ((data) => void);
        game/undo/accept: ((data) => void);
        game/undo/cancel: ((data) => void);
        game/undo/request: ((data) => void);
        gamelist/count/subscribe: ((data) => void);
        gamelist/count/unsubscribe: ((data) => void);
        gamelist/query: ((data) => undefined | {
            by: string;
            from: number;
            limit: number;
            list: string;
            results: GameListEntry[];
            size: number;
            where: GameListWhere;
        });
        hostinfo: ((data) => {
            clients: number;
            ggs-version: string;
            hostname: string;
            uptime: number;
        });
        itc: ((data) => void);
        net/ping: ((data) => void);
        notification/delete: ((data) => void);
        remote_storage/remove: ((data) => {
            error?: string;
            retry?: boolean;
        } | {
            success: true;
        });
        remote_storage/set: ((data) => {
            error?: string;
            retry?: boolean;
        } | {
            success: true;
        });
        remote_storage/sync: ((data) => {
            error?: string;
            retry?: boolean;
        } | {
            success: true;
        });
        review/append: ((data) => void);
        review/chat: ((data) => void);
        review/chat/remove: ((data) => void);
        review/connect: ((data) => void);
        review/disconnect: ((data) => void);
        seek_graph/connect: ((data) => void);
        seek_graph/disconnect: ((data) => void);
        stats/online: ((data) => number);
        ui-pushes/subscribe: ((data) => void);
        ui-pushes/unsubscribe: ((data) => void);
        user/monitor: ((data) => void);
    }

    Hierarchy (view full)

    Properties

    interface ClientToServer {
        authenticate: ((data) => undefined | {
            id: number;
            username: string;
        });
        automatch/available/subscribe: (() => void);
        automatch/available/unsubscribe: (() => void);
        automatch/cancel: ((data) => void);
        automatch/find_match: ((data) => void);
        automatch/list: ((data) => void);
        bot/config: ((config) => void);
        bot/status: ((data) => void);
        challenge/keepalive: ((data) => void);
        chat/join: ((data) => void);
        chat/part: ((data) => void);
        chat/pm: ((data) => undefined | {
            from: User;
            message: {
                i: string;
                m: string;
                t: number;
            };
            to: {
                id: number;
                username: string;
            };
        });
        chat/pm/close: ((data) => void);
        chat/pm/load: ((data) => void);
        chat/pm/superchat: ((data) => void);
        chat/remove: ((data) => void);
        chat/remove_all: ((data) => void);
        chat/send: ((data) => void);
        chat/topic: ((data) => void);
        game/annul: ((data) => void);
        game/cancel: ((data) => void);
        game/chat: ((data) => void);
        game/chat/remove: ((data) => void);
        game/clear_delayed_resign: ((data) => void);
        game/conditional_moves/set: ((data) => void);
        game/connect: ((data) => void);
        game/delayed_resign: ((data) => void);
        game/disconnect: ((data) => void);
        game/latency: ((data) => void);
        game/log: ((data) => {
            data: any;
            event: string;
            timestamp: string;
        }[]);
        game/move: ((data) => void);
        game/pause: ((data) => void);
        game/prevent_escaping: ((data) => void);
        game/prevent_stalling: ((data) => void);
        game/removed_stones/accept: ((data) => void);
        game/removed_stones/reject: ((data) => void);
        game/removed_stones/set: ((data) => void);
        game/resign: ((data) => void);
        game/resume: ((data) => void);
        game/timed_out: ((data) => void);
        game/undo/accept: ((data) => void);
        game/undo/cancel: ((data) => void);
        game/undo/request: ((data) => void);
        gamelist/count/subscribe: ((data) => void);
        gamelist/count/unsubscribe: ((data) => void);
        gamelist/query: ((data) => undefined | {
            by: string;
            from: number;
            limit: number;
            list: string;
            results: GameListEntry[];
            size: number;
            where: GameListWhere;
        });
        hostinfo: ((data) => {
            clients: number;
            ggs-version: string;
            hostname: string;
            uptime: number;
        });
        itc: ((data) => void);
        net/ping: ((data) => void);
        notification/delete: ((data) => void);
        remote_storage/remove: ((data) => {
            error?: string;
            retry?: boolean;
        } | {
            success: true;
        });
        remote_storage/set: ((data) => {
            error?: string;
            retry?: boolean;
        } | {
            success: true;
        });
        remote_storage/sync: ((data) => {
            error?: string;
            retry?: boolean;
        } | {
            success: true;
        });
        review/append: ((data) => void);
        review/chat: ((data) => void);
        review/chat/remove: ((data) => void);
        review/connect: ((data) => void);
        review/disconnect: ((data) => void);
        seek_graph/connect: ((data) => void);
        seek_graph/disconnect: ((data) => void);
        stats/online: ((data) => number);
        ui-pushes/subscribe: ((data) => void);
        ui-pushes/unsubscribe: ((data) => void);
        user/monitor: ((data) => void);
    }

    Hierarchy (view full)

    Properties

  • Optional language?: string

    ISO 639-1 language code used on this device.

  • Optional language_version?: string

    The version of the translation dictionary.

  • Optional user_agent?: string

    Browser user agent (or websocket library)

    -
  • Returns undefined | {
        id: number;
        username: string;
    }

    automatch/cancel: ((data) => void)

    Cancel a match request

    -

    Type declaration

      • (data): void
      • Parameters

        • data: {
              uuid: string;
          }
          • uuid: string

        Returns void

    automatch/find_match: ((data) => void)

    Request a match via the automatch system

    -

    Type declaration

    automatch/list: ((data) => void)

    Get active automatch entries for the current user

    -

    Type declaration

      • (data): void
      • Parameters

        • data: {}

          Returns void

      bot/config: ((config) => void)

      Updates the config for the bot

      -

      Type declaration

        • (config): void
        • Parameters

          • config: any

          Returns void

      bot/status: ((data) => void)

      Update the number of games that the bot is currently playing

      -

      Type declaration

        • (data): void
        • Parameters

          • data: {
                ongoing_blitz_count: number;
                ongoing_correspondence_count: number;
                ongoing_live_count: number;
            }
            • ongoing_blitz_count: number
            • ongoing_correspondence_count: number
            • ongoing_live_count: number

          Returns void

      challenge/keepalive: ((data) => void)

      Message to let the server know the client is still interested +

      Returns undefined | {
          id: number;
          username: string;
      }

      automatch/available/subscribe: (() => void)

      Subscribe to automatch offers

      +

      Type declaration

        • (): void
        • Returns void

      automatch/available/unsubscribe: (() => void)

      Unsubscribe from automatch offers

      +

      Type declaration

        • (): void
        • Returns void

      automatch/cancel: ((data) => void)

      Cancel a match request

      +

      Type declaration

        • (data): void
        • Parameters

          • data: {
                uuid: string;
            }
            • uuid: string

          Returns void

      automatch/find_match: ((data) => void)

      Request a match via the automatch system

      +

      Type declaration

      automatch/list: ((data) => void)

      Get active automatch entries for the current user

      +

      Type declaration

        • (data): void
        • Parameters

          • data: {}

            Returns void

        bot/config: ((config) => void)

        Updates the config for the bot

        +

        Type declaration

          • (config): void
          • Parameters

            • config: any

            Returns void

        bot/status: ((data) => void)

        Update the number of games that the bot is currently playing

        +

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  ongoing_blitz_count: number;
                  ongoing_correspondence_count: number;
                  ongoing_live_count: number;
              }
              • ongoing_blitz_count: number
              • ongoing_correspondence_count: number
              • ongoing_live_count: number

            Returns void

        challenge/keepalive: ((data) => void)

        Message to let the server know the client is still interested in the specified blitz or live challenge. These should be sent about once a second to prevent the server from canceling the challenge.

        -

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  challenge_id: number;
                  game_id: number;
              }
              • challenge_id: number
              • game_id: number

            Returns void

        chat/join: ((data) => void)

        Join a chat channel

        -

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  channel: string;
              }
              • channel: string

                Channel to join

                -

            Returns void

        chat/part: ((data) => void)

        Leave a channel

        -

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  channel: string;
              }
              • channel: string

                Channel to leave

                -

            Returns void

        chat/pm: ((data) => undefined | {
            from: User;
            message: {
                i: string;
                m: string;
                t: number;
            };
            to: {
                id: number;
                username: string;
            };
        })

        Send a private message to another user

        -

        Type declaration

          • (data): undefined | {
                from: User;
                message: {
                    i: string;
                    m: string;
                    t: number;
                };
                to: {
                    id: number;
                    username: string;
                };
            }
          • Parameters

            • data: {
                  as_system?: true;
                  message: string;
                  player_id: number;
                  uid: string;
                  username: string;
              }
              • Optional as_system?: true

                Moderator option to send the chat from the system not from their personal PM

                +

                Type declaration

                  • (data): void
                  • Parameters

                    • data: {
                          challenge_id: number;
                          game_id: number;
                      }
                      • challenge_id: number
                      • game_id: number

                    Returns void

        chat/join: ((data) => void)

        Join a chat channel

        +

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  channel: string;
              }
              • channel: string

                Channel to join

                +

            Returns void

        chat/part: ((data) => void)

        Leave a channel

        +

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  channel: string;
              }
              • channel: string

                Channel to leave

                +

            Returns void

        chat/pm: ((data) => undefined | {
            from: User;
            message: {
                i: string;
                m: string;
                t: number;
            };
            to: {
                id: number;
                username: string;
            };
        })

        Send a private message to another user

        +

        Type declaration

          • (data): undefined | {
                from: User;
                message: {
                    i: string;
                    m: string;
                    t: number;
                };
                to: {
                    id: number;
                    username: string;
                };
            }
          • Parameters

            • data: {
                  as_system?: true;
                  message: string;
                  player_id: number;
                  uid: string;
                  username: string;
              }
              • Optional as_system?: true

                Moderator option to send the chat from the system not from their personal PM

              • message: string

                Message text

              • player_id: number

                Player ID of the recipient

              • uid: string

                UUID for the message

              • username: string

                Username of the recipient

                -

            Returns undefined | {
                from: User;
                message: {
                    i: string;
                    m: string;
                    t: number;
                };
                to: {
                    id: number;
                    username: string;
                };
            }

        chat/pm/close: ((data) => void)

        Closes the current user's private message session with the given player id

        -

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  player_id: number;
              }
              • player_id: number

            Returns void

        chat/pm/load: ((data) => void)

        Loads the current user's private message session history with the given player id

        -

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  player_id: number;
              }
              • player_id: number

            Returns void

        chat/pm/superchat: ((data) => void)

        Begins a "super chat" session with the given player id, which creates an +

        Returns undefined | {
            from: User;
            message: {
                i: string;
                m: string;
                t: number;
            };
            to: {
                id: number;
                username: string;
            };
        }

        chat/pm/close: ((data) => void)

        Closes the current user's private message session with the given player id

        +

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  player_id: number;
              }
              • player_id: number

            Returns void

        chat/pm/load: ((data) => void)

        Loads the current user's private message session history with the given player id

        +

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  player_id: number;
              }
              • player_id: number

            Returns void

        chat/pm/superchat: ((data) => void)

        Begins a "super chat" session with the given player id, which creates an unclosable dialog if enable is true, and makes the dialog closable again if enable is false. This is only available to moderators.

        -

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  enable: boolean;
                  player_id: number;
                  username: string;
              }
              • enable: boolean

                Set to true if you want the modal to be unclosable, false if you want +

                Type declaration

                  • (data): void
                  • Parameters

                    • data: {
                          enable: boolean;
                          player_id: number;
                          username: string;
                      }
                      • enable: boolean

                        Set to true if you want the modal to be unclosable, false if you want the modal to be closable again

                      • player_id: number
                      • username: string

                        Username of the recipient

                        -

                    Returns void

        chat/remove: ((data) => void)

        Moderator only command to remove a single chat message

        -

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  uuid: string;
              }
              • uuid: string

            Returns void

        chat/remove_all: ((data) => void)

        Moderator only command to remove all chat messages for a given player

        -

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  player_id: number;
              }
              • player_id: number

                Player id to remove all messages for

                -

            Returns void

        chat/send: ((data) => void)

        Sends a chat message to the given channel

        -

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  channel: string;
                  message: string;
                  uuid: string;
              }
              • channel: string

                Channel to send the message to

                +

            Returns void

        chat/remove: ((data) => void)

        Moderator only command to remove a single chat message

        +

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  uuid: string;
              }
              • uuid: string

            Returns void

        chat/remove_all: ((data) => void)

        Moderator only command to remove all chat messages for a given player

        +

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  player_id: number;
              }
              • player_id: number

                Player id to remove all messages for

                +

            Returns void

        chat/send: ((data) => void)

        Sends a chat message to the given channel

        +

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  channel: string;
                  message: string;
                  uuid: string;
              }
              • channel: string

                Channel to send the message to

              • message: string

                Message text

              • uuid: string

                ID for the message

                -

            Returns void

        chat/topic: ((data) => void)

        Sets a channel topic

        -

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  channel: string;
                  topic: string;
              }
              • channel: string
              • topic: string

            Returns void

        game/annul: ((data) => void)

        In Japanese rules, if the game is found to be repeating, the players +

        Returns void

        chat/topic: ((data) => void)

        Sets a channel topic

        +

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  channel: string;
                  topic: string;
              }
              • channel: string
              • topic: string

            Returns void

        game/annul: ((data) => void)

        In Japanese rules, if the game is found to be repeating, the players may opt to annul the entire game and start over.

        This is largely undesired in an online setting and support for this will probably be removed in the future, dont' bother implementing this.

        -

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
              }
              • game_id: number

                The game id

                -

            Returns void

        game/cancel: ((data) => void)

        Cancels a game. This is effectively the same as resign, except the +

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
              }
              • game_id: number

                The game id

                +

            Returns void

        game/cancel: ((data) => void)

        Cancels a game. This is effectively the same as resign, except the game will not be ranked. This is only allowed within the first few moves of the game. (See GobanEngine.gameCanBeCancelled for cancellation )

        -

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
              }
              • game_id: number

                The game id

                -

            Returns void

        game/chat: ((data) => void)

        Sends a chat message to a game

        -

        Type declaration

        game/chat: ((data) => void)

        Sends a chat message to a game

        +

        Type declaration

        game/chat/remove: ((data) => void)

        Moderator only command to remove a single chat message from a game

        -

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  channel: string;
                  chat_id: string;
                  game_id: number;
              }
              • channel: string
              • chat_id: string
              • game_id: number

            Returns void

        game/clear_delayed_resign: ((data) => void)

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
              }
              • game_id: number

                The game id

                -

            Returns void

        game/conditional_moves/set: ((data) => void)

        Sets conditional moves to be made on behalf of the player in response +

        Returns void

        game/chat/remove: ((data) => void)

        Moderator only command to remove a single chat message from a game

        +

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  channel: string;
                  chat_id: string;
                  game_id: number;
              }
              • channel: string
              • chat_id: string
              • game_id: number

            Returns void

        game/clear_delayed_resign: ((data) => void)

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
              }
              • game_id: number

                The game id

                +

            Returns void

        game/conditional_moves/set: ((data) => void)

        Sets conditional moves to be made on behalf of the player in response to a move by the opponent.

        -

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  conditional_moves: ConditionalMoveResponse;
                  game_id: number;
                  move_number: number;
              }
              • conditional_moves: ConditionalMoveResponse

                The conditional moves. The top level should be an array that looks +

                Type declaration

                  • (data): void
                  • Parameters

                    • data: {
                          conditional_moves: ConditionalMoveResponse;
                          game_id: number;
                          move_number: number;
                      }
                      • conditional_moves: ConditionalMoveResponse

                        The conditional moves. The top level should be an array that looks like [null, { ... }] where the second element contains the responses to the opponent's move.

                      • game_id: number

                        The game id

                      • move_number: number

                        The move number from which the conditional moves are rooted in

                        -

                    Returns void

        game/connect: ((data) => void)

        Connect to a game. Once connected, the client will receive game +

        Returns void

        game/connect: ((data) => void)

        Connect to a game. Once connected, the client will receive game updates relevant to the game.

        -

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  chat?: boolean;
                  game_id: number;
              }
              • Optional chat?: boolean

                If true, the client will receive the game chat log and new chat events

                +

                Type declaration

                  • (data): void
                  • Parameters

                    • data: {
                          chat?: boolean;
                          game_id: number;
                      }
                      • Optional chat?: boolean

                        If true, the client will receive the game chat log and new chat events

                      • game_id: number

                        The game id to connect to

                        -

                    Returns void

        game/delayed_resign: ((data) => void)

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
              }
              • game_id: number

                The game id

                -

            Returns void

        game/disconnect: ((data) => void)

        Disconnect from a game. This will stop game updates for a particular game.

        -

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
              }
              • game_id: number

            Returns void

        game/latency: ((data) => void)

        Update your latency information for a particular game. This is used +

        Returns void

        game/delayed_resign: ((data) => void)

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
              }
              • game_id: number

                The game id

                +

            Returns void

        game/disconnect: ((data) => void)

        Disconnect from a game. This will stop game updates for a particular game.

        +

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
              }
              • game_id: number

            Returns void

        game/latency: ((data) => void)

        Update your latency information for a particular game. This is used for clock synchronization. It is not strictly required, however strongly suggested for live games.

        -

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
                  latency: number;
              }
              • game_id: number

                The game id

                +

                Type declaration

                  • (data): void
                  • Parameters

                    • data: {
                          game_id: number;
                          latency: number;
                      }
                      • game_id: number

                        The game id

                      • latency: number

                        Network latency, measured in milliseconds. See net/ping to measure this.

                        -

                    Returns void

        game/log: ((data) => {
            data: any;
            event: string;
            timestamp: string;
        }[])

        Returns an event log for the given game. This is primarily +

        Returns void

        game/log: ((data) => {
            data: any;
            event: string;
            timestamp: string;
        }[])

        Returns an event log for the given game. This is primarily for moderation purposes, although the endpoint is generally available to all users.

        -

        Type declaration

          • (data): {
                data: any;
                event: string;
                timestamp: string;
            }[]
          • Parameters

            • data: {
                  game_id: number;
              }
              • game_id: number

            Returns {
                data: any;
                event: string;
                timestamp: string;
            }[]

        game/move: ((data) => void)

        Submit a move for a game

        -

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  blur?: number;
                  clock?: JGOFPlayerClock;
                  game_id: number;
                  move: string;
              }
              • Optional blur?: number

                Maximum number of milliseconds the client was out of focus between +

                Type declaration

                  • (data): {
                        data: any;
                        event: string;
                        timestamp: string;
                    }[]
                  • Parameters

                    • data: {
                          game_id: number;
                      }
                      • game_id: number

                    Returns {
                        data: any;
                        event: string;
                        timestamp: string;
                    }[]

        game/move: ((data) => void)

        Submit a move for a game

        +

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  blur?: number;
                  clock?: JGOFPlayerClock;
                  game_id: number;
                  move: string;
              }
              • Optional blur?: number

                Maximum number of milliseconds the client was out of focus between the last move and this move

              • Optional clock?: JGOFPlayerClock

                Clock according to the client. If this is within the margin of error of the server's clock, the server will accept the new clock value. If not provided, the server clock will be used.

              • game_id: number

                The game id

              • move: string

                The move number to play at

                -

            Returns void

        game/pause: ((data) => void)

        Pauses the game clocks

        -

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
              }
              • game_id: number

                The game id

                -

            Returns void

        game/prevent_escaping: ((data) => void)

        Request the server end a game that someone has left without resigning +

        Returns void

        game/pause: ((data) => void)

        Pauses the game clocks

        +

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
              }
              • game_id: number

                The game id

                +

            Returns void

        game/prevent_escaping: ((data) => void)

        Request the server end a game that someone has left without resigning from

        -

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  annul: boolean;
                  game_id: number;
                  winner: "black" | "white";
              }
              • annul: boolean

                Request that the game be annulled or not

                +

                Type declaration

                  • (data): void
                  • Parameters

                    • data: {
                          annul: boolean;
                          game_id: number;
                          winner: "black" | "white";
                      }
                      • annul: boolean

                        Request that the game be annulled or not

                      • game_id: number

                        The game id

                      • winner: "black" | "white"

                        The proposed winner

                        -

                    Returns void

        game/prevent_stalling: ((data) => void)

        Request the server end a game that is being stalled by one of the +

        Returns void

        game/prevent_stalling: ((data) => void)

        Request the server end a game that is being stalled by one of the players. This will only work if the server agrees in the outcome.

        -

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
                  winner: "black" | "white";
              }
              • game_id: number

                The game id

                +

                Type declaration

                  • (data): void
                  • Parameters

                    • data: {
                          game_id: number;
                          winner: "black" | "white";
                      }
                      • game_id: number

                        The game id

                      • winner: "black" | "white"

                        The proposed winner

                        -

                    Returns void

        game/removed_stones/accept: ((data) => void)

        Accepts the stones as removed. Once both players have accepted the same +

        Returns void

        game/removed_stones/accept: ((data) => void)

        Accepts the stones as removed. Once both players have accepted the same stones, the stone removal phase will conclude and the game will finish.

        -

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
                  stones: string;
                  strict_seki_mode: boolean;
              }
              • game_id: number

                The game id

                +

                Type declaration

                  • (data): void
                  • Parameters

                    • data: {
                          game_id: number;
                          stones: string;
                          strict_seki_mode: boolean;
                      }
                      • game_id: number

                        The game id

                      • stones: string

                        All of the stones that are accepted as removed, and all intersections marked as dame

                      • strict_seki_mode: boolean

                        Japanese rules technically have some special scoring rules about @@ -190,10 +194,10 @@ era of the game, the official client no longer displays this as an option to the user as it was very largely unused and was a large source of confusion.

                        -

                    Returns void

        game/removed_stones/reject: ((data) => void)

        Rejects the removed stones and resumes the game from the stone removal phase

        -

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
              }
              • game_id: number

                The game id

                -

            Returns void

        game/removed_stones/set: ((data) => void)

        Sets removed stones in the stone removal phase.

        -

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
                  needs_sealing?: JGOFSealingIntersection[];
                  removed: boolean;
                  stones: string | JGOFMove[];
                  strict_seki_mode?: boolean;
              }
              • game_id: number

                The game id

                +

            Returns void

        game/removed_stones/reject: ((data) => void)

        Rejects the removed stones and resumes the game from the stone removal phase

        +

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
              }
              • game_id: number

                The game id

                +

            Returns void

        game/removed_stones/set: ((data) => void)

        Sets removed stones in the stone removal phase.

        +

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
                  needs_sealing?: JGOFSealingIntersection[];
                  removed: boolean;
                  stones: string | JGOFMove[];
                  strict_seki_mode?: boolean;
              }
              • game_id: number

                The game id

              • Optional needs_sealing?: JGOFSealingIntersection[]

                List of intersections that need to be sealed before the game can be correctly scored. Note, if this is undefined, the value will not be changed on the server side. To specify there are no more intersections @@ -208,85 +212,85 @@ option to the user as it was very largely unused and was a large source of confusion. This field is deprecated and will likely be removed in the future.

                -

            Returns void

        game/resign: ((data) => void)

        Resigns from the game

        -

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
              }
              • game_id: number

                The game id

                -

            Returns void

        game/resume: ((data) => void)

        Resumes the game clocks

        -

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
              }
              • game_id: number

                The game id

                -

            Returns void

        game/timed_out: ((data) => void)

        Inform the server that the client believes it's clock has timed out +

        Returns void

        game/resign: ((data) => void)

        Resigns from the game

        +

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
              }
              • game_id: number

                The game id

                +

            Returns void

        game/resume: ((data) => void)

        Resumes the game clocks

        +

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
              }
              • game_id: number

                The game id

                +

            Returns void

        game/timed_out: ((data) => void)

        Inform the server that the client believes it's clock has timed out and the game should be ended in a timeout. This is not strictly necessary to implement as the server will also timeout games, however there is a grace period to account for network latency, so well behaved clients can (and should) send this message to be very exact with timeouts.

        -

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
              }
              • game_id: number

                The game id

                -

            Returns void

        game/undo/accept: ((data) => void)

        Accepts an undo

        -

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
                  move_number: number;
              }
              • game_id: number

                The game id

                +

                Type declaration

                  • (data): void
                  • Parameters

                    • data: {
                          game_id: number;
                      }
                      • game_id: number

                        The game id

                        +

                    Returns void

        game/undo/accept: ((data) => void)

        Accepts an undo

        +

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
                  move_number: number;
              }
              • game_id: number

                The game id

              • move_number: number

                The current move number

                -

            Returns void

        game/undo/cancel: ((data) => void)

        Cancels an undo request

        -

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
                  move_number: number;
              }
              • game_id: number

                The game id

                +

            Returns void

        game/undo/cancel: ((data) => void)

        Cancels an undo request

        +

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
                  move_number: number;
              }
              • game_id: number

                The game id

              • move_number: number

                The current move number

                -

            Returns void

        game/undo/request: ((data) => void)

        Requests an undo

        -

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
                  move_number: number;
              }
              • game_id: number

                The game id

                +

            Returns void

        game/undo/request: ((data) => void)

        Requests an undo

        +

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
                  move_number: number;
              }
              • game_id: number

                The game id

              • move_number: number

                The current move number

                -

            Returns void

        gamelist/count/subscribe: ((data) => void)

        Connects to the game list count. +

        Returns void

        gamelist/count/subscribe: ((data) => void)

        Connects to the game list count. Once connected you'll start receiving gamelist-count or gamelist-count-${channel} messages.

        -

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  channel?: string;
              }
              • Optional channel?: string

                The group or tournament channel to subscribe to. If no +

                Type declaration

                  • (data): void
                  • Parameters

                    • data: {
                          channel?: string;
                      }
                      • Optional channel?: string

                        The group or tournament channel to subscribe to. If no channel is provided, the global server counts will be sent

                        -

                    Returns void

        gamelist/count/unsubscribe: ((data) => void)

        Disconnects from the game list count

        -

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  channel?: string;
              }
              • Optional channel?: string

                The group or tournament channel to unsubscribe from. If no +

            Returns void

        gamelist/count/unsubscribe: ((data) => void)

        Disconnects from the game list count

        +

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  channel?: string;
              }
              • Optional channel?: string

                The group or tournament channel to unsubscribe from. If no channel is provided, the global server counts will be unsubscribed from

                -

            Returns void

        gamelist/query: ((data) => undefined | {
            by: string;
            from: number;
            limit: number;
            list: string;
            results: GameListEntry[];
            size: number;
            where: GameListWhere;
        })

        Queries the server for a list of games

        -

        Type declaration

          • (data): undefined | {
                by: string;
                from: number;
                limit: number;
                list: string;
                results: GameListEntry[];
                size: number;
                where: GameListWhere;
            }
          • Parameters

            • data: {
                  channel?: string;
                  from: number;
                  limit: number;
                  list: "live" | "corr" | "kidsgo";
                  sort_by: "rank";
                  where: GameListWhere;
              }
              • Optional channel?: string

                The group or tournament channel to query

                +

            Returns void

        gamelist/query: ((data) => undefined | {
            by: string;
            from: number;
            limit: number;
            list: string;
            results: GameListEntry[];
            size: number;
            where: GameListWhere;
        })

        Queries the server for a list of games

        +

        Type declaration

          • (data): undefined | {
                by: string;
                from: number;
                limit: number;
                list: string;
                results: GameListEntry[];
                size: number;
                where: GameListWhere;
            }
          • Parameters

            • data: {
                  channel?: string;
                  from: number;
                  limit: number;
                  list: "live" | "corr" | "kidsgo";
                  sort_by: "rank";
                  where: GameListWhere;
              }
              • Optional channel?: string

                The group or tournament channel to query

              • from: number

                The number of games to skip before returning results

              • limit: number

                Number of games to return, between 1 and 300

              • list: "live" | "corr" | "kidsgo"
              • sort_by: "rank"
              • where: GameListWhere

                Filtering options

                -

            Returns undefined | {
                by: string;
                from: number;
                limit: number;
                list: string;
                results: GameListEntry[];
                size: number;
                where: GameListWhere;
            }

        hostinfo: ((data) => {
            clients: number;
            ggs-version: string;
            hostname: string;
            uptime: number;
        })

        Retrieve host information for the termination server you are connected to

        -

        Type declaration

          • (data): {
                clients: number;
                ggs-version: string;
                hostname: string;
                uptime: number;
            }
          • Parameters

            • data: {}

              Returns {
                  clients: number;
                  ggs-version: string;
                  hostname: string;
                  uptime: number;
              }

              • clients: number
              • ggs-version: string
              • hostname: string
              • uptime: number
          itc: ((data) => void)

          Sends an "Inter Tab Communication" message to all other connected +

          Returns undefined | {
              by: string;
              from: number;
              limit: number;
              list: string;
              results: GameListEntry[];
              size: number;
              where: GameListWhere;
          }

          hostinfo: ((data) => {
              clients: number;
              ggs-version: string;
              hostname: string;
              uptime: number;
          })

          Retrieve host information for the termination server you are connected to

          +

          Type declaration

            • (data): {
                  clients: number;
                  ggs-version: string;
                  hostname: string;
                  uptime: number;
              }
            • Parameters

              • data: {}

                Returns {
                    clients: number;
                    ggs-version: string;
                    hostname: string;
                    uptime: number;
                }

                • clients: number
                • ggs-version: string
                • hostname: string
                • uptime: number
            itc: ((data) => void)

            Sends an "Inter Tab Communication" message to all other connected clients for the current user. This includes other devices, so the "Tab" part is a bit of a misnomer.

            -

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      data: any;
                      event: string;
                  }
                  • data: any

                    User defined data

                    +

                    Type declaration

                      • (data): void
                      • Parameters

                        • data: {
                              data: any;
                              event: string;
                          }
                          • data: any

                            User defined data

                          • event: string

                            User defined event string

                            -

                        Returns void

            net/ping: ((data) => void)

            Sends a ping to the server. This message should be +

            Returns void

            net/ping: ((data) => void)

            Sends a ping to the server. This message should be sent regularly. The default interval is 10 seconds. This keeps the connection alive and allows a client to measure clock drift and latency, both of which are vital to adjusting the client's game clock displays.

            -

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      client: number;
                      drift: number;
                      latency: number;
                  }
                  • client: number

                    Client timestamp - milliseconds since epoch

                    +

                    Type declaration

                      • (data): void
                      • Parameters

                        • data: {
                              client: number;
                              drift: number;
                              latency: number;
                          }
                          • client: number

                            Client timestamp - milliseconds since epoch

                          • drift: number

                            Last clock drift measurement, or 0

                          • latency: number

                            Last latency measurement, or 0

                            -

                        Returns void

            notification/delete: ((data) => void)

            Deletes a notification

            -

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      notification_id: string;
                  }
                  • notification_id: string

                Returns void

            remote_storage/remove: ((data) => {
                error?: string;
                retry?: boolean;
            } | {
                success: true;
            })

            Remove the given key from remote storage system for this user

            +

            Returns void

            notification/delete: ((data) => void)

            Deletes a notification

            +

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      notification_id: string;
                  }
                  • notification_id: string

                Returns void

            remote_storage/remove: ((data) => {
                error?: string;
                retry?: boolean;
            } | {
                success: true;
            })

            Remove the given key from remote storage system for this user

            For more details on the remote storage replication system see: https://github.com/online-go/online-go.com/blob/devel/src/lib/data.ts

            -

            Type declaration

              • (data): {
                    error?: string;
                    retry?: boolean;
                } | {
                    success: true;
                }
              • Parameters

                Returns {
                    error?: string;
                    retry?: boolean;
                } | {
                    success: true;
                }

            remote_storage/set: ((data) => {
                error?: string;
                retry?: boolean;
            } | {
                success: true;
            })

            Set the given key in the remote storage system for this user

            +

            Type declaration

              • (data): {
                    error?: string;
                    retry?: boolean;
                } | {
                    success: true;
                }
              • Parameters

                Returns {
                    error?: string;
                    retry?: boolean;
                } | {
                    success: true;
                }

            remote_storage/set: ((data) => {
                error?: string;
                retry?: boolean;
            } | {
                success: true;
            })

            Set the given key in the remote storage system for this user

            For more details on the remote storage replication system see: https://github.com/online-go/online-go.com/blob/devel/src/lib/data.ts

            -

            Type declaration

              • (data): {
                    error?: string;
                    retry?: boolean;
                } | {
                    success: true;
                }
              • Parameters

                Returns {
                    error?: string;
                    retry?: boolean;
                } | {
                    success: true;
                }

            remote_storage/sync: ((data) => {
                error?: string;
                retry?: boolean;
            } | {
                success: true;
            })

            Requests all updated key/value pairs for this user since the +

            Type declaration

              • (data): {
                    error?: string;
                    retry?: boolean;
                } | {
                    success: true;
                }
              • Parameters

                Returns {
                    error?: string;
                    retry?: boolean;
                } | {
                    success: true;
                }

            remote_storage/sync: ((data) => {
                error?: string;
                retry?: boolean;
            } | {
                success: true;
            })

            Requests all updated key/value pairs for this user since the provided timestamp (as as ISO 8601 string).

            For more details on the remote storage replication system see: https://github.com/online-go/online-go.com/blob/devel/src/lib/data.ts

            -

            Type declaration

              • (data): {
                    error?: string;
                    retry?: boolean;
                } | {
                    success: true;
                }
              • Parameters

                • data: {
                      since: string;
                  }
                  • since: string

                    ISO 8601 timestamp. Updates made after this timestamp will be sent to the client.

                    -

                Returns {
                    error?: string;
                    retry?: boolean;
                } | {
                    success: true;
                }

            review/append: ((data) => void)

            Append a review action to the review log.

            -

            Type declaration

            review/chat: ((data) => void)

            Sends a chat message to a review

            -

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      body: string;
                      from: number;
                      moves: string;
                      review_id: number;
                  }
                  • body: string

                    The chat message

                    +

                    Type declaration

                      • (data): {
                            error?: string;
                            retry?: boolean;
                        } | {
                            success: true;
                        }
                      • Parameters

                        • data: {
                              since: string;
                          }
                          • since: string

                            ISO 8601 timestamp. Updates made after this timestamp will be sent to the client.

                            +

                        Returns {
                            error?: string;
                            retry?: boolean;
                        } | {
                            success: true;
                        }

            review/append: ((data) => void)

            Append a review action to the review log.

            +

            Type declaration

            review/chat: ((data) => void)

            Sends a chat message to a review

            +

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      body: string;
                      from: number;
                      moves: string;
                      review_id: number;
                  }
                  • body: string

                    The chat message

                  • from: number

                    The root of the branch the user is viewing

                  • moves: string

                    The analysis branch the user is viewing

                  • review_id: number

                    The review id

                    -

                Returns void

            review/chat/remove: ((data) => void)

            Moderator only command to remove a single chat message from a game

            -

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      channel: string;
                      chat_id: string;
                      review_id: number;
                  }
                  • channel: string
                  • chat_id: string
                  • review_id: number

                Returns void

            review/connect: ((data) => void)

            Connects to a review

            -

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      review_id: number;
                  }
                  • review_id: number

                    The review id

                    -

                Returns void

            review/disconnect: ((data) => void)

            Disconnects from a review

            -

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      review_id: number;
                  }
                  • review_id: number

                    The review id

                    -

                Returns void

            seek_graph/connect: ((data) => void)

            Subscribes to the seek graph events. The channel is required to be "global" +

            Returns void

            review/chat/remove: ((data) => void)

            Moderator only command to remove a single chat message from a game

            +

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      channel: string;
                      chat_id: string;
                      review_id: number;
                  }
                  • channel: string
                  • chat_id: string
                  • review_id: number

                Returns void

            review/connect: ((data) => void)

            Connects to a review

            +

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      review_id: number;
                  }
                  • review_id: number

                    The review id

                    +

                Returns void

            review/disconnect: ((data) => void)

            Disconnects from a review

            +

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      review_id: number;
                  }
                  • review_id: number

                    The review id

                    +

                Returns void

            seek_graph/connect: ((data) => void)

            Subscribes to the seek graph events. The channel is required to be "global" for now and the foreseeable future.

            -

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      channel: "global";
                  }
                  • channel: "global"

                Returns void

            seek_graph/disconnect: ((data) => void)

            Un-Subscribes to the seek graph events. The channel is required to be "global" +

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      channel: "global";
                  }
                  • channel: "global"

                Returns void

            seek_graph/disconnect: ((data) => void)

            Un-Subscribes to the seek graph events. The channel is required to be "global" for now and the foreseeable future.

            -

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      channel: "global";
                  }
                  • channel: "global"

                Returns void

            stats/online: ((data) => number)

            Request the number of unique authenticated players +

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      channel: "global";
                  }
                  • channel: "global"

                Returns void

            stats/online: ((data) => number)

            Request the number of unique authenticated players online within the given interval

            -

            Type declaration

              • (data): number
              • Parameters

                • data: {
                      interval: number;
                  }
                  • interval: number

                    Interval in seconds

                    -

                Returns number

            ui-pushes/subscribe: ((data) => void)

            Subscribes to UI related push event messages sent to a particular channel

            -

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      channel: string;
                  }
                  • channel: string

                Returns void

            ui-pushes/unsubscribe: ((data) => void)

            Un-Subscribes to UI related push event messages sent to a particular channel

            -

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      channel: string;
                  }
                  • channel: string

                Returns void

            user/monitor: ((data) => void)

            Subscribes to online status updates for the given player ids

            -

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      user_ids: number[];
                  }
                  • user_ids: number[]

                Returns void

            \ No newline at end of file +

            Type declaration

            ui-pushes/subscribe: ((data) => void)

            Subscribes to UI related push event messages sent to a particular channel

            +

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      channel: string;
                  }
                  • channel: string

                Returns void

            ui-pushes/unsubscribe: ((data) => void)

            Un-Subscribes to UI related push event messages sent to a particular channel

            +

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      channel: string;
                  }
                  • channel: string

                Returns void

            user/monitor: ((data) => void)

            Subscribes to online status updates for the given player ids

            +

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      user_ids: number[];
                  }
                  • user_ids: number[]

                Returns void

            \ No newline at end of file diff --git a/docs/interfaces/protocol.ClientToServerBase.html b/docs/interfaces/protocol.ClientToServerBase.html index 1af4c62c..51c146bb 100644 --- a/docs/interfaces/protocol.ClientToServerBase.html +++ b/docs/interfaces/protocol.ClientToServerBase.html @@ -1,5 +1,5 @@ ClientToServerBase | goban

            Interface ClientToServerBase

            Messages that clients send, regardless of target server

            -
            interface ClientToServerBase {
                authenticate: ((data) => undefined | {
                    id: number;
                    username: string;
                });
                net/ping: ((data) => void);
            }

            Hierarchy (view full)

            Properties

            interface ClientToServerBase {
                authenticate: ((data) => undefined | {
                    id: number;
                    username: string;
                });
                net/ping: ((data) => void);
            }

            Hierarchy (view full)

            Properties

            authenticate: ((data) => undefined | {
                id: number;
                username: string;
            })

            Authenticate with the server.

            Prior to authentication, you should perform a GET request to @@ -16,7 +16,7 @@

          • Optional language?: string

            ISO 639-1 language code used on this device.

          • Optional language_version?: string

            The version of the translation dictionary.

          • Optional user_agent?: string

            Browser user agent (or websocket library)

            -
          • Returns undefined | {
                id: number;
                username: string;
            }

            net/ping: ((data) => void)

            Sends a ping to the server. This message should be +

            Returns undefined | {
                id: number;
                username: string;
            }

            net/ping: ((data) => void)

            Sends a ping to the server. This message should be sent regularly. The default interval is 10 seconds. This keeps the connection alive and allows a client to measure clock drift and latency, both of which @@ -24,4 +24,4 @@

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      client: number;
                      drift: number;
                      latency: number;
                  }
                  • client: number

                    Client timestamp - milliseconds since epoch

                  • drift: number

                    Last clock drift measurement, or 0

                  • latency: number

                    Last latency measurement, or 0

                    -

                Returns void

            \ No newline at end of file +

            Returns void

            \ No newline at end of file diff --git a/docs/interfaces/protocol.GameChatAnalysisMessage.html b/docs/interfaces/protocol.GameChatAnalysisMessage.html index f92e5bad..8da3835c 100644 --- a/docs/interfaces/protocol.GameChatAnalysisMessage.html +++ b/docs/interfaces/protocol.GameChatAnalysisMessage.html @@ -1,4 +1,4 @@ -GameChatAnalysisMessage | goban

            Interface GameChatAnalysisMessage

            interface GameChatAnalysisMessage {
                branch_move?: number;
                engine_analysis?: {
                    score?: number;
                    visits?: number;
                    win_rate: number;
                    [key: string]: number | undefined;
                };
                from?: number;
                marks?: {
                    [mark: string]: string;
                };
                moves?: string;
                name?: string;
                pen_marks?: unknown[];
                type: "analysis";
            }

            Properties

            branch_move? +GameChatAnalysisMessage | goban

            Interface GameChatAnalysisMessage

            interface GameChatAnalysisMessage {
                branch_move?: number;
                engine_analysis?: {
                    score?: number;
                    visits?: number;
                    win_rate: number;
                    [key: string]: number | undefined;
                };
                from?: number;
                marks?: {
                    [mark: string]: string;
                };
                moves?: string;
                name?: string;
                pen_marks?: unknown[];
                type: "analysis";
            }

            Properties

            branch_move?: number
            engine_analysis?: {
                score?: number;
                visits?: number;
                win_rate: number;
                [key: string]: number | undefined;
            }

            Type declaration

            • [key: string]: number | undefined
            • Optional score?: number
            • Optional visits?: number
            • win_rate: number
            from?: number
            marks?: {
                [mark: string]: string;
            }

            Type declaration

            • [mark: string]: string
            moves?: string
            name?: string
            pen_marks?: unknown[]
            type: "analysis"
            \ No newline at end of file +

            Properties

            branch_move?: number
            engine_analysis?: {
                score?: number;
                visits?: number;
                win_rate: number;
                [key: string]: number | undefined;
            }

            Type declaration

            • [key: string]: number | undefined
            • Optional score?: number
            • Optional visits?: number
            • win_rate: number
            from?: number
            marks?: {
                [mark: string]: string;
            }

            Type declaration

            • [mark: string]: string
            moves?: string
            name?: string
            pen_marks?: unknown[]
            type: "analysis"
            \ No newline at end of file diff --git a/docs/interfaces/protocol.GameChatLine.html b/docs/interfaces/protocol.GameChatLine.html index 1b57a938..54292449 100644 --- a/docs/interfaces/protocol.GameChatLine.html +++ b/docs/interfaces/protocol.GameChatLine.html @@ -1,4 +1,4 @@ -GameChatLine | goban

            Interface GameChatLine

            interface GameChatLine {
                body: string | AnalysisComment | ReviewComment;
                channel: string;
                chat_id: string;
                date: number;
                from?: number;
                move_number: number;
                moves?: string;
                player_id: number;
                username?: string;
            }

            Properties

            body +GameChatLine | goban

            Interface GameChatLine

            interface GameChatLine {
                body: string | AnalysisComment | ReviewComment;
                channel: string;
                chat_id: string;
                date: number;
                from?: number;
                move_number: number;
                moves?: string;
                player_id: number;
                username?: string;
            }

            Properties

            Properties

            channel: string
            chat_id: string
            date: number
            from?: number
            move_number: number
            moves?: string
            player_id: number
            username?: string
            \ No newline at end of file +

            Properties

            channel: string
            chat_id: string
            date: number
            from?: number
            move_number: number
            moves?: string
            player_id: number
            username?: string
            \ No newline at end of file diff --git a/docs/interfaces/protocol.GameChatMessage.html b/docs/interfaces/protocol.GameChatMessage.html index 46040eb7..1a0643c7 100644 --- a/docs/interfaces/protocol.GameChatMessage.html +++ b/docs/interfaces/protocol.GameChatMessage.html @@ -1,3 +1,3 @@ -GameChatMessage | goban

            Interface GameChatMessage

            interface GameChatMessage {
                channel: "main" | "malkovich" | "hidden" | "personal" | "spectator" | "shadowban";
                line: GameChatLine;
            }

            Properties

            channel +GameChatMessage | goban

            Interface GameChatMessage

            interface GameChatMessage {
                channel: "main" | "malkovich" | "hidden" | "personal" | "spectator" | "shadowban";
                line: GameChatLine;
            }

            Properties

            Properties

            channel: "main" | "malkovich" | "hidden" | "personal" | "spectator" | "shadowban"
            \ No newline at end of file +

            Properties

            channel: "main" | "malkovich" | "hidden" | "personal" | "spectator" | "shadowban"
            \ No newline at end of file diff --git a/docs/interfaces/protocol.GameChatReviewMessage.html b/docs/interfaces/protocol.GameChatReviewMessage.html index cc565faa..05d4c5e6 100644 --- a/docs/interfaces/protocol.GameChatReviewMessage.html +++ b/docs/interfaces/protocol.GameChatReviewMessage.html @@ -1,3 +1,3 @@ -GameChatReviewMessage | goban

            Interface GameChatReviewMessage

            interface GameChatReviewMessage {
                review_id: number;
                type: "review";
            }

            Properties

            review_id +GameChatReviewMessage | goban

            Interface GameChatReviewMessage

            interface GameChatReviewMessage {
                review_id: number;
                type: "review";
            }

            Properties

            Properties

            review_id: number
            type: "review"
            \ No newline at end of file +

            Properties

            review_id: number
            type: "review"
            \ No newline at end of file diff --git a/docs/interfaces/protocol.GameChatTranslatedMessage.html b/docs/interfaces/protocol.GameChatTranslatedMessage.html index 2f7bd3e1..64e0af53 100644 --- a/docs/interfaces/protocol.GameChatTranslatedMessage.html +++ b/docs/interfaces/protocol.GameChatTranslatedMessage.html @@ -1,3 +1,3 @@ -GameChatTranslatedMessage | goban

            Interface GameChatTranslatedMessage

            interface GameChatTranslatedMessage {
                en: string;
                type: "translated";
                [lang: string]: string;
            }

            Indexable

            [lang: string]: string

            Properties

            en +GameChatTranslatedMessage | goban

            Interface GameChatTranslatedMessage

            interface GameChatTranslatedMessage {
                en: string;
                type: "translated";
                [lang: string]: string;
            }

            Indexable

            [lang: string]: string

            Properties

            Properties

            en: string
            type: "translated"
            \ No newline at end of file +

            Properties

            en: string
            type: "translated"
            \ No newline at end of file diff --git a/docs/interfaces/protocol.GameClock.html b/docs/interfaces/protocol.GameClock.html index 74e22eb0..c9dcd46a 100644 --- a/docs/interfaces/protocol.GameClock.html +++ b/docs/interfaces/protocol.GameClock.html @@ -1,4 +1,4 @@ -GameClock | goban

            Interface GameClock

            interface GameClock {
                black_player_id: number;
                black_time?: ClockTime;
                current_player: number;
                expiration: number;
                expiration_delta?: number;
                game_id: number;
                last_move: number;
                now?: number;
                pause?: {
                    pause_control?: {
                        [key: string]: boolean;
                    };
                    paused?: boolean;
                    paused_since?: number;
                };
                pause_delta?: number;
                paused_since?: number;
                start_mode?: boolean;
                stone_removal_expiration?: number;
                stone_removal_mode?: boolean;
                title: string;
                white_player_id: number;
                white_time?: ClockTime;
            }

            Properties

            black_player_id +GameClock | goban

            Interface GameClock

            interface GameClock {
                black_player_id: number;
                black_time?: ClockTime;
                current_player: number;
                expiration: number;
                expiration_delta?: number;
                game_id: number;
                last_move: number;
                now?: number;
                pause?: {
                    pause_control?: {
                        [key: string]: boolean;
                    };
                    paused?: boolean;
                    paused_since?: number;
                };
                pause_delta?: number;
                paused_since?: number;
                start_mode?: boolean;
                stone_removal_expiration?: number;
                stone_removal_mode?: boolean;
                title: string;
                white_player_id: number;
                white_time?: ClockTime;
            }

            Properties

            black_player_id: number
            black_time?: ClockTime
            current_player: number
            expiration: number
            expiration_delta?: number
            game_id: number
            last_move: number
            now?: number
            pause?: {
                pause_control?: {
                    [key: string]: boolean;
                };
                paused?: boolean;
                paused_since?: number;
            }

            Type declaration

            • Optional pause_control?: {
                  [key: string]: boolean;
              }
              • [key: string]: boolean
            • Optional paused?: boolean
            • Optional paused_since?: number
            pause_delta?: number
            paused_since?: number
            start_mode?: boolean
            stone_removal_expiration?: number
            stone_removal_mode?: boolean
            title: string
            white_player_id: number
            white_time?: ClockTime
            \ No newline at end of file +

            Properties

            black_player_id: number
            black_time?: ClockTime
            current_player: number
            expiration: number
            expiration_delta?: number
            game_id: number
            last_move: number
            now?: number
            pause?: {
                pause_control?: {
                    [key: string]: boolean;
                };
                paused?: boolean;
                paused_since?: number;
            }

            Type declaration

            • Optional pause_control?: {
                  [key: string]: boolean;
              }
              • [key: string]: boolean
            • Optional paused?: boolean
            • Optional paused_since?: number
            pause_delta?: number
            paused_since?: number
            start_mode?: boolean
            stone_removal_expiration?: number
            stone_removal_mode?: boolean
            title: string
            white_player_id: number
            white_time?: ClockTime
            \ No newline at end of file diff --git a/docs/interfaces/protocol.GameListEntry.html b/docs/interfaces/protocol.GameListEntry.html index 7455b5c2..5f6c85cc 100644 --- a/docs/interfaces/protocol.GameListEntry.html +++ b/docs/interfaces/protocol.GameListEntry.html @@ -1,4 +1,4 @@ -GameListEntry | goban

            Interface GameListEntry

            interface GameListEntry {
                _participants?: number[];
                black: GameListPlayer;
                bot_game?: boolean;
                clock_expiration: number;
                dropped_player: number;
                group_ids?: number[];
                group_ids_map?: {
                    [id: string]: boolean;
                };
                handicap?: number;
                height: number;
                id: number;
                in_beginning?: boolean;
                in_end?: boolean;
                in_middle?: boolean;
                kidsgo_game?: boolean;
                komi?: number;
                ladder_id?: number;
                malkovich_present?: boolean;
                move_number: number;
                name: string;
                paused: boolean;
                phase: string;
                player_to_move: number;
                private: boolean;
                ranked?: boolean;
                rengo: boolean;
                rengo_casual_mode: boolean;
                rengo_teams: {
                    black: User[];
                    white: User[];
                };
                socket_id?: any;
                time_per_move: number;
                tournament_id?: number;
                white: GameListPlayer;
                width: number;
            }

            Properties

            _participants? +GameListEntry | goban

            Interface GameListEntry

            interface GameListEntry {
                _participants?: number[];
                black: GameListPlayer;
                bot_game?: boolean;
                clock_expiration: number;
                dropped_player: number;
                group_ids?: number[];
                group_ids_map?: {
                    [id: string]: boolean;
                };
                handicap?: number;
                height: number;
                id: number;
                in_beginning?: boolean;
                in_end?: boolean;
                in_middle?: boolean;
                kidsgo_game?: boolean;
                komi?: number;
                ladder_id?: number;
                malkovich_present?: boolean;
                move_number: number;
                name: string;
                paused: boolean;
                phase: string;
                player_to_move: number;
                private: boolean;
                ranked?: boolean;
                rengo: boolean;
                rengo_casual_mode: boolean;
                rengo_teams: {
                    black: User[];
                    white: User[];
                };
                socket_id?: any;
                time_per_move: number;
                tournament_id?: number;
                white: GameListPlayer;
                width: number;
            }

            Properties

            _participants?: number[]
            bot_game?: boolean
            clock_expiration: number
            dropped_player: number
            group_ids?: number[]
            group_ids_map?: {
                [id: string]: boolean;
            }

            Type declaration

            • [id: string]: boolean
            handicap?: number
            height: number
            id: number
            in_beginning?: boolean
            in_end?: boolean
            in_middle?: boolean
            kidsgo_game?: boolean
            komi?: number
            ladder_id?: number
            malkovich_present?: boolean
            move_number: number
            name: string
            paused: boolean
            phase: string
            player_to_move: number
            private: boolean
            ranked?: boolean
            rengo: boolean
            rengo_casual_mode: boolean
            rengo_teams: {
                black: User[];
                white: User[];
            }

            Type declaration

            socket_id?: any
            time_per_move: number
            tournament_id?: number
            width: number
            \ No newline at end of file +

            Properties

            _participants?: number[]
            bot_game?: boolean
            clock_expiration: number
            dropped_player: number
            group_ids?: number[]
            group_ids_map?: {
                [id: string]: boolean;
            }

            Type declaration

            • [id: string]: boolean
            handicap?: number
            height: number
            id: number
            in_beginning?: boolean
            in_end?: boolean
            in_middle?: boolean
            kidsgo_game?: boolean
            komi?: number
            ladder_id?: number
            malkovich_present?: boolean
            move_number: number
            name: string
            paused: boolean
            phase: string
            player_to_move: number
            private: boolean
            ranked?: boolean
            rengo: boolean
            rengo_casual_mode: boolean
            rengo_teams: {
                black: User[];
                white: User[];
            }

            Type declaration

            socket_id?: any
            time_per_move: number
            tournament_id?: number
            width: number
            \ No newline at end of file diff --git a/docs/interfaces/protocol.GameListWhere.html b/docs/interfaces/protocol.GameListWhere.html index d2e36911..9ab34f1b 100644 --- a/docs/interfaces/protocol.GameListWhere.html +++ b/docs/interfaces/protocol.GameListWhere.html @@ -1,5 +1,5 @@ GameListWhere | goban

            Interface GameListWhere

            Parameters for the gamelist/query message

            -
            interface GameListWhere {
                hide_13x13?: boolean;
                hide_19x19?: boolean;
                hide_9x9?: boolean;
                hide_beginning?: boolean;
                hide_bot_games?: boolean;
                hide_end?: boolean;
                hide_even?: boolean;
                hide_handicap?: boolean;
                hide_ladder?: boolean;
                hide_middle?: boolean;
                hide_open?: boolean;
                hide_other?: boolean;
                hide_ranked?: boolean;
                hide_tournament?: boolean;
                hide_unranked?: boolean;
                ladder_id?: number;
                malk_only?: boolean;
                players?: number[];
                rengo_only?: boolean;
                tournament_id?: number;
            }

            Properties

            interface GameListWhere {
                hide_13x13?: boolean;
                hide_19x19?: boolean;
                hide_9x9?: boolean;
                hide_beginning?: boolean;
                hide_bot_games?: boolean;
                hide_end?: boolean;
                hide_even?: boolean;
                hide_handicap?: boolean;
                hide_ladder?: boolean;
                hide_middle?: boolean;
                hide_open?: boolean;
                hide_other?: boolean;
                hide_ranked?: boolean;
                hide_tournament?: boolean;
                hide_unranked?: boolean;
                ladder_id?: number;
                malk_only?: boolean;
                players?: number[];
                rengo_only?: boolean;
                tournament_id?: number;
            }

            Properties

            hide_13x13?: boolean
            hide_19x19?: boolean
            hide_9x9?: boolean
            hide_beginning?: boolean
            hide_bot_games?: boolean
            hide_end?: boolean
            hide_even?: boolean
            hide_handicap?: boolean
            hide_ladder?: boolean
            hide_middle?: boolean
            hide_open?: boolean
            hide_other?: boolean
            hide_ranked?: boolean
            hide_tournament?: boolean
            hide_unranked?: boolean
            ladder_id?: number
            malk_only?: boolean
            players?: number[]
            rengo_only?: boolean
            tournament_id?: number
            \ No newline at end of file +

            Properties

            hide_13x13?: boolean
            hide_19x19?: boolean
            hide_9x9?: boolean
            hide_beginning?: boolean
            hide_bot_games?: boolean
            hide_end?: boolean
            hide_even?: boolean
            hide_handicap?: boolean
            hide_ladder?: boolean
            hide_middle?: boolean
            hide_open?: boolean
            hide_other?: boolean
            hide_ranked?: boolean
            hide_tournament?: boolean
            hide_unranked?: boolean
            ladder_id?: number
            malk_only?: boolean
            players?: number[]
            rengo_only?: boolean
            tournament_id?: number
            \ No newline at end of file diff --git a/docs/interfaces/protocol.Glicko2.html b/docs/interfaces/protocol.Glicko2.html index 7862be9a..a2346f82 100644 --- a/docs/interfaces/protocol.Glicko2.html +++ b/docs/interfaces/protocol.Glicko2.html @@ -1,5 +1,5 @@ -Glicko2 | goban

            Interface Glicko2

            interface Glicko2 {
                deviation: number;
                games_played?: number;
                rating: number;
                volatility: number;
            }

            Properties

            deviation +Glicko2 | goban

            Interface Glicko2

            interface Glicko2 {
                deviation: number;
                games_played?: number;
                rating: number;
                volatility: number;
            }

            Properties

            deviation: number
            games_played?: number
            rating: number
            volatility: number
            \ No newline at end of file +

            Properties

            deviation: number
            games_played?: number
            rating: number
            volatility: number
            \ No newline at end of file diff --git a/docs/interfaces/protocol.SeekgraphChallengeMessage.html b/docs/interfaces/protocol.SeekgraphChallengeMessage.html index 2164464f..b0a54471 100644 --- a/docs/interfaces/protocol.SeekgraphChallengeMessage.html +++ b/docs/interfaces/protocol.SeekgraphChallengeMessage.html @@ -1,4 +1,4 @@ -SeekgraphChallengeMessage | goban

            Interface SeekgraphChallengeMessage

            interface SeekgraphChallengeMessage {
                challenge_id: number;
                challenger_color: "black" | "white" | "automatic";
                disable_analysis: boolean;
                game_id: number;
                handicap: null | number;
                height: number;
                invite_only: boolean;
                komi: null | number;
                max_rank: number;
                min_rank: number;
                name: string;
                professional: boolean;
                ranked: boolean;
                ranking: number;
                rengo: boolean;
                rengo_auto_start: boolean;
                rengo_black_team: number[];
                rengo_casual_mode: boolean;
                rengo_nominees: number[];
                rengo_participants: number[];
                rengo_white_team: number[];
                rules: string;
                time_control: string;
                time_control_parameters: JGOFTimeControl;
                time_per_move: number;
                user_id: number;
                username: string;
                uuid: string;
                width: number;
            }

            Properties

            challenge_id +SeekgraphChallengeMessage | goban

            Interface SeekgraphChallengeMessage

            interface SeekgraphChallengeMessage {
                challenge_id: number;
                challenger_color: "black" | "white" | "automatic";
                disable_analysis: boolean;
                game_id: number;
                handicap: null | number;
                height: number;
                invite_only: boolean;
                komi: null | number;
                max_rank: number;
                min_rank: number;
                name: string;
                professional: boolean;
                ranked: boolean;
                ranking: number;
                rengo: boolean;
                rengo_auto_start: boolean;
                rengo_black_team: number[];
                rengo_casual_mode: boolean;
                rengo_nominees: number[];
                rengo_participants: number[];
                rengo_white_team: number[];
                rules: string;
                time_control: string;
                time_control_parameters: JGOFTimeControl;
                time_per_move: number;
                user_id: number;
                username: string;
                uuid: string;
                width: number;
            }

            Properties

            challenge_id: number

            The ID of the challenge

            -
            challenger_color: "black" | "white" | "automatic"

            Color the accepting player will be

            -
            disable_analysis: boolean

            If analysis is disabled

            -
            game_id: number

            The game ID

            -
            handicap: null | number

            The game handicap

            -
            height: number

            Board height

            -
            invite_only: boolean

            If the game is only joinable by invitation

            -
            komi: null | number

            Komi

            -
            max_rank: number

            Maximum rank allowed to accept the game

            -
            min_rank: number

            Minimum rank allowed to accept the game

            -
            name: string

            Game name

            -
            professional: boolean

            If they are a professional player

            -
            ranked: boolean

            If the game is ranked

            -
            ranking: number

            Their ranking *

            -
            rengo: boolean

            If it's a rengo game

            -
            rengo_auto_start: boolean

            If the rengo game will automatically start

            -
            rengo_black_team: number[]

            Player ids of the players on the Black team

            -
            rengo_casual_mode: boolean

            If the game is a casual rengo game

            -
            rengo_nominees: number[]

            Player ids of people that have been nominated to play

            -
            rengo_participants: number[]

            All player ids involved in the game

            -
            rengo_white_team: number[]

            Player ids of the players on the White team

            -
            rules: string

            Rules being used

            -
            time_control: string

            Time control system type

            -
            time_control_parameters: JGOFTimeControl

            Time control parameters

            -
            time_per_move: number

            Average time per move

            -
            user_id: number

            User id of the player who is looking for a game

            -
            username: string

            Username of the player looking for the game

            -
            uuid: string

            A UUID for the invitation

            -
            width: number

            Board width

            -
            \ No newline at end of file +
            challenger_color: "black" | "white" | "automatic"

            Color the accepting player will be

            +
            disable_analysis: boolean

            If analysis is disabled

            +
            game_id: number

            The game ID

            +
            handicap: null | number

            The game handicap

            +
            height: number

            Board height

            +
            invite_only: boolean

            If the game is only joinable by invitation

            +
            komi: null | number

            Komi

            +
            max_rank: number

            Maximum rank allowed to accept the game

            +
            min_rank: number

            Minimum rank allowed to accept the game

            +
            name: string

            Game name

            +
            professional: boolean

            If they are a professional player

            +
            ranked: boolean

            If the game is ranked

            +
            ranking: number

            Their ranking *

            +
            rengo: boolean

            If it's a rengo game

            +
            rengo_auto_start: boolean

            If the rengo game will automatically start

            +
            rengo_black_team: number[]

            Player ids of the players on the Black team

            +
            rengo_casual_mode: boolean

            If the game is a casual rengo game

            +
            rengo_nominees: number[]

            Player ids of people that have been nominated to play

            +
            rengo_participants: number[]

            All player ids involved in the game

            +
            rengo_white_team: number[]

            Player ids of the players on the White team

            +
            rules: string

            Rules being used

            +
            time_control: string

            Time control system type

            +
            time_control_parameters: JGOFTimeControl

            Time control parameters

            +
            time_per_move: number

            Average time per move

            +
            user_id: number

            User id of the player who is looking for a game

            +
            username: string

            Username of the player looking for the game

            +
            uuid: string

            A UUID for the invitation

            +
            width: number

            Board width

            +
            \ No newline at end of file diff --git a/docs/interfaces/protocol.SeekgraphDeleteMessage.html b/docs/interfaces/protocol.SeekgraphDeleteMessage.html index 0eb7f69e..41907694 100644 --- a/docs/interfaces/protocol.SeekgraphDeleteMessage.html +++ b/docs/interfaces/protocol.SeekgraphDeleteMessage.html @@ -1,5 +1,5 @@ -SeekgraphDeleteMessage | goban

            Interface SeekgraphDeleteMessage

            interface SeekgraphDeleteMessage {
                challenge_id: number;
                delete: true;
            }

            Properties

            challenge_id +SeekgraphDeleteMessage | goban

            Interface SeekgraphDeleteMessage

            interface SeekgraphDeleteMessage {
                challenge_id: number;
                delete: true;
            }

            Properties

            Properties

            challenge_id: number

            The ID of the challenge

            -
            delete: true

            The entry should be deleted if this field exists and is true

            -
            \ No newline at end of file +
            delete: true

            The entry should be deleted if this field exists and is true

            +
            \ No newline at end of file diff --git a/docs/interfaces/protocol.SeekgraphStartedMessage.html b/docs/interfaces/protocol.SeekgraphStartedMessage.html index d69be6e6..a3be3667 100644 --- a/docs/interfaces/protocol.SeekgraphStartedMessage.html +++ b/docs/interfaces/protocol.SeekgraphStartedMessage.html @@ -1,4 +1,4 @@ -SeekgraphStartedMessage | goban

            Interface SeekgraphStartedMessage

            interface SeekgraphStartedMessage {
                black: User;
                challenge_id: number;
                creator: number;
                game_id: number;
                game_started?: true;
                rengo?: true;
                rengo_auto_start?: boolean;
                rengo_black_team?: number[];
                rengo_casual_mode?: boolean;
                rengo_white_team?: number[];
                time_control: string;
                time_control_parameters: JGOFTimeControl;
                white: User;
            }

            Properties

            black +SeekgraphStartedMessage | goban

            Interface SeekgraphStartedMessage

            interface SeekgraphStartedMessage {
                black: User;
                challenge_id: number;
                creator: number;
                game_id: number;
                game_started?: true;
                rengo?: true;
                rengo_auto_start?: boolean;
                rengo_black_team?: number[];
                rengo_casual_mode?: boolean;
                rengo_white_team?: number[];
                time_control: string;
                time_control_parameters: JGOFTimeControl;
                white: User;
            }

            Properties

            black: User

            Black player

            -
            challenge_id: number

            The ID of the challenge

            -
            creator: number

            Player ID of the creator

            -
            game_id: number

            The game id

            -
            game_started?: true

            If exists and is true, the game has been started and the entry should be removed from the seek graph

            -
            rengo?: true

            Rengo game if true

            -
            rengo_auto_start?: boolean

            Whether the rengo game with automatically start

            -
            rengo_black_team?: number[]

            Player ids of the players on the Black team

            -
            rengo_casual_mode?: boolean

            Wether it's a Casual mode rengo game

            -
            rengo_white_team?: number[]

            Player ids of the players on the White team

            -
            time_control: string

            Time control system

            -
            time_control_parameters: JGOFTimeControl

            Time control parameters

            -
            white: User

            White player

            -
            \ No newline at end of file +
            challenge_id: number

            The ID of the challenge

            +
            creator: number

            Player ID of the creator

            +
            game_id: number

            The game id

            +
            game_started?: true

            If exists and is true, the game has been started and the entry should be removed from the seek graph

            +
            rengo?: true

            Rengo game if true

            +
            rengo_auto_start?: boolean

            Whether the rengo game with automatically start

            +
            rengo_black_team?: number[]

            Player ids of the players on the Black team

            +
            rengo_casual_mode?: boolean

            Wether it's a Casual mode rengo game

            +
            rengo_white_team?: number[]

            Player ids of the players on the White team

            +
            time_control: string

            Time control system

            +
            time_control_parameters: JGOFTimeControl

            Time control parameters

            +
            white: User

            White player

            +
            \ No newline at end of file diff --git a/docs/interfaces/protocol.ServerToClient.html b/docs/interfaces/protocol.ServerToClient.html index 5e4cac48..38f91e93 100644 --- a/docs/interfaces/protocol.ServerToClient.html +++ b/docs/interfaces/protocol.ServerToClient.html @@ -1,8 +1,10 @@ -ServerToClient | goban

            Interface ServerToClient

            interface ServerToClient {
                ERROR: ((data) => void);
                HUP: (() => void);
                active-bots: ((data) => void);
                active_game: ((data) => void);
                automatch/cancel: ((data) => void);
                automatch/entry: ((data) => void);
                automatch/start: ((data) => void);
                chat-join: ((data) => void);
                chat-message: ((data) => void);
                chat-message-removed: ((data) => void);
                chat-part: ((data) => void);
                chat-topic: ((data) => void);
                chat-update-user: ((data) => void);
                game/:id/auto_resign: ((data) => void);
                game/:id/chat: ((data) => void);
                game/:id/chat/remove: ((data) => void);
                game/:id/clear_auto_resign: ((data) => void);
                game/:id/clock: ((data) => void);
                game/:id/conditional_moves: ((data) => void);
                game/:id/error: ((data) => void);
                game/:id/gamedata: ((data) => void);
                game/:id/latency: ((data) => void);
                game/:id/phase: ((data) => void);
                game/:id/removed_stones: ((data) => void);
                game/:id/removed_stones_accepted: ((data) => void);
                game/:id/reset-chats: (() => void);
                game/:id/stalling_score_estimate: ((data?) => void);
                game/:id/undo_accepted: ((data) => void);
                game/:id/undo_canceled: ((data) => void);
                game/:id/undo_requested: ((data) => void);
                gamelist-count: ((data) => void);
                gamelist-count-:channel: ((data) => void);
                hostinfo: ((data) => void);
                incident-report: ((data) => void);
                itc: ((data) => void);
                net/pong: ((data) => void);
                notification: ((data) => void);
                private-message: ((data) => void);
                private-superchat: ((data) => void);
                remote_storage/sync_complete: (() => void);
                remote_storage/update: ((data) => void);
                review/:id/full_state: ((data) => void);
                review/:id/r: ((data) => void);
                score-estimator-enabled-state: ((data) => void);
                seekgraph/global: ((messages) => void);
                ui-push: ((data) => void);
                user/jwt: ((jwt) => void);
                user/state: ((data) => void);
                user/update: ((user) => void);
                [k: `gamelist-count-${string}`]: ServerToClient["gamelist-count-:channel"];
            }

            Hierarchy (view full)

            Indexable

            [k: `gamelist-count-${string}`]: ServerToClient["gamelist-count-:channel"]

            A move was made on a game

            -

            Properties

            ERROR +ServerToClient | goban

            Interface ServerToClient

            interface ServerToClient {
                ERROR: ((data) => void);
                HUP: (() => void);
                active-bots: ((data) => void);
                active_game: ((data) => void);
                automatch/available/add: ((data) => void);
                automatch/available/remove: ((uuid) => void);
                automatch/cancel: ((data) => void);
                automatch/entry: ((data) => void);
                automatch/start: ((data) => void);
                chat-join: ((data) => void);
                chat-message: ((data) => void);
                chat-message-removed: ((data) => void);
                chat-part: ((data) => void);
                chat-topic: ((data) => void);
                chat-update-user: ((data) => void);
                game/:id/auto_resign: ((data) => void);
                game/:id/chat: ((data) => void);
                game/:id/chat/remove: ((data) => void);
                game/:id/clear_auto_resign: ((data) => void);
                game/:id/clock: ((data) => void);
                game/:id/conditional_moves: ((data) => void);
                game/:id/error: ((data) => void);
                game/:id/gamedata: ((data) => void);
                game/:id/latency: ((data) => void);
                game/:id/phase: ((data) => void);
                game/:id/removed_stones: ((data) => void);
                game/:id/removed_stones_accepted: ((data) => void);
                game/:id/reset-chats: (() => void);
                game/:id/stalling_score_estimate: ((data?) => void);
                game/:id/undo_accepted: ((data) => void);
                game/:id/undo_canceled: ((data) => void);
                game/:id/undo_requested: ((data) => void);
                gamelist-count: ((data) => void);
                gamelist-count-:channel: ((data) => void);
                hostinfo: ((data) => void);
                incident-report: ((data) => void);
                itc: ((data) => void);
                net/pong: ((data) => void);
                notification: ((data) => void);
                private-message: ((data) => void);
                private-superchat: ((data) => void);
                remote_storage/sync_complete: (() => void);
                remote_storage/update: ((data) => void);
                review/:id/full_state: ((data) => void);
                review/:id/r: ((data) => void);
                score-estimator-enabled-state: ((data) => void);
                seekgraph/global: ((messages) => void);
                ui-push: ((data) => void);
                user/jwt: ((jwt) => void);
                user/state: ((data) => void);
                user/update: ((user) => void);
                [k: `gamelist-count-${string}`]: ServerToClient["gamelist-count-:channel"];
            }

            Hierarchy (view full)

            Indexable

            [k: `gamelist-count-${string}`]: ServerToClient["gamelist-count-:channel"]

            A move was made on a game

            +

            Properties

            ERROR: ((data) => void)

            An error occurred, the message string should be displayed to the user. For a list of errcode's used, see https://github.com/online-go/online-go.com/blob/devel/src/components/Errcode/Errcode.tsx

            -

            Type declaration

              • (data): void
              • Parameters

                • data: string | {
                      errcode: string;
                  }

                Returns void

            HUP: (() => void)

            The client should reload

            -

            Type declaration

              • (): void
              • Returns void

            active-bots: ((data) => void)

            Updates the list of bots that are connected and ready to the server

            -

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      [id: number]: User;
                  }

                Returns void

            active_game: ((data) => void)

            Message to inform the client of an active game, or a change to an existing game

            -

            Type declaration

            automatch/cancel: ((data) => void)

            An automatch request was canceled

            -

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      uuid: string;
                  }
                  • uuid: string

                Returns void

            automatch/entry: ((data) => void)

            An automatch request is active

            -

            Type declaration

            automatch/start: ((data) => void)

            An automatch request was started

            -

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      game_id: number;
                      uuid: string;
                  }
                  • game_id: number
                  • uuid: string

                Returns void

            chat-join: ((data) => void)

            User(s) joined a chat channel

            -

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      channel: string;
                      users: User[];
                  }
            HUP: (() => void)

            The client should reload

            +

            Type declaration

              • (): void
              • Returns void

            active-bots: ((data) => void)

            Updates the list of bots that are connected and ready to the server

            +

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      [id: number]: User;
                  }

                Returns void

            active_game: ((data) => void)

            Message to inform the client of an active game, or a change to an existing game

            +

            Type declaration

            automatch/available/add: ((data) => void)

            An automatch offer was added

            +

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      created: number;
                      player: {
                          id: number;
                          username: string;
                      };
                      preferences: AutomatchPreferences;
                      uuid: string;
                  }
                  • created: number
                  • player: {
                        id: number;
                        username: string;
                    }
                    • id: number
                    • username: string
                  • preferences: AutomatchPreferences
                  • uuid: string

                Returns void

            automatch/available/remove: ((uuid) => void)

            An automatch offer was removed

            +

            Type declaration

              • (uuid): void
              • Parameters

                • uuid: string

                Returns void

            automatch/cancel: ((data) => void)

            An automatch request was canceled

            +

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      uuid: string;
                  }
                  • uuid: string

                Returns void

            automatch/entry: ((data) => void)

            An automatch request is active

            +

            Type declaration

            automatch/start: ((data) => void)

            An automatch request was started

            +

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      game_id: number;
                      uuid: string;
                  }
                  • game_id: number
                  • uuid: string

                Returns void

            chat-join: ((data) => void)

            User(s) joined a chat channel

            +

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      channel: string;
                      users: User[];
                  }
                  • channel: string

                    The channel

                  • users: User[]

                    List of users that joined

                    -

                Returns void

            chat-message: ((data) => void)

            Chat message was received

            -

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      channel: string;
                      country?: string;
                      id: number;
                      message: {
                          i?: string;
                          m: string;
                          t: number;
                      };
                      professional: boolean;
                      ranking: number;
                      system?: true;
                      system_message_type?: "flood";
                      ui_class: string;
                      username: string;
                  }
                  • channel: string

                    The channel

                    +

                Returns void

            chat-message: ((data) => void)

            Chat message was received

            +

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      channel: string;
                      country?: string;
                      id: number;
                      message: {
                          i?: string;
                          m: string;
                          t: number;
                      };
                      professional: boolean;
                      ranking: number;
                      system?: true;
                      system_message_type?: "flood";
                      ui_class: string;
                      username: string;
                  }
                  • channel: string

                    The channel

                  • Optional country?: string

                    Country the user is from

                  • id: number

                    User id of the sender

                  • message: {
                        i?: string;
                        m: string;
                        t: number;
                    }

                    The message received

                    @@ -73,15 +77,15 @@
                  • Optional system?: true

                    Whether it's a system message or not

                  • Optional system_message_type?: "flood"
                  • ui_class: string

                    UI class of the sender

                  • username: string

                    Username of the sender

                    -

                Returns void

            chat-message-removed: ((data) => void)

            A chat message should be removed from the display

            -

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      channel: string;
                      uuid: string;
                  }
                  • channel: string

                    The channel

                    +

                Returns void

            chat-message-removed: ((data) => void)

            A chat message should be removed from the display

            +

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      channel: string;
                      uuid: string;
                  }
                  • channel: string

                    The channel

                  • uuid: string

                    Message id. Note, despite the name, I don't think this is always a uuid in uuid format, just treat it as a string.

                    -

                Returns void

            chat-part: ((data) => void)

            User left a chat channel

            -

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      channel: string;
                      user: User;
                  }
                  • channel: string

                    The channel

                    +

                Returns void

            chat-part: ((data) => void)

            User left a chat channel

            +

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      channel: string;
                      user: User;
                  }
                  • channel: string

                    The channel

                  • user: User

                    User that left

                    -

                Returns void

            chat-topic: ((data) => void)

            Channel topic was updated

            -

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      channel: string;
                      country?: string;
                      id: number;
                      professional: boolean;
                      ranking: number;
                      timestamp: number;
                      topic: string;
                      ui_class: string;
                      username: string;
                  }
                  • channel: string

                    The channel

                    +

                Returns void

            chat-topic: ((data) => void)

            Channel topic was updated

            +

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      channel: string;
                      country?: string;
                      id: number;
                      professional: boolean;
                      ranking: number;
                      timestamp: number;
                      topic: string;
                      ui_class: string;
                      username: string;
                  }
                  • channel: string

                    The channel

                  • Optional country?: string

                    Country of the user that changed the topic

                  • id: number

                    User id of the user that changed the topic

                  • professional: boolean

                    If the user that changed the topic was a professional

                    @@ -90,43 +94,43 @@
                  • topic: string

                    The new topic

                  • ui_class: string

                    UI class of the user that changed the topic

                  • username: string

                    Username of the user that changed the topic

                    -

                Returns void

            chat-update-user: ((data) => void)

            A user's profile was updated

            -

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      channel: string;
                      old_player_id: number;
                      user: User;
                  }
                  • channel: string

                    The channel

                    +

                Returns void

            chat-update-user: ((data) => void)

            A user's profile was updated

            +

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      channel: string;
                      old_player_id: number;
                      user: User;
                  }
                  • channel: string

                    The channel

                  • old_player_id: number

                    Player id entry that was update. This might change in the case of a guest logging in, in this case this will switch from being a negative (guest) id, to some positive id. It is not expected that a non guest id should change using this system.

                  • user: User

                    New user details

                    -

                Returns void

            game/:id/auto_resign: ((data) => void)

            Informs the client the player is scheduled to resign if not cleared

            -

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      expiration: number;
                      game_id: number;
                      player_id: number;
                  }
                  • expiration: number

                    When the auto resign will happen

                    +

                Returns void

            game/:id/auto_resign: ((data) => void)

            Informs the client the player is scheduled to resign if not cleared

            +

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      expiration: number;
                      game_id: number;
                      player_id: number;
                  }
                  • expiration: number

                    When the auto resign will happen

                  • game_id: number

                    The game id

                  • player_id: number

                    The player id

                    -

                Returns void

            game/:id/chat: ((data) => void)

            A game chat message

            -

            Type declaration

            game/:id/chat/remove: ((data) => void)

            Game chat lines should be removed

            -

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      chat_ids: string[];
                      game_id: number;
                  }
                  • chat_ids: string[]

                    The chat ids

                    +

                Returns void

            game/:id/chat: ((data) => void)

            A game chat message

            +

            Type declaration

            game/:id/chat/remove: ((data) => void)

            Game chat lines should be removed

            +

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      chat_ids: string[];
                      game_id: number;
                  }
                  • chat_ids: string[]

                    The chat ids

                  • game_id: number

                    The game id

                    -

                Returns void

            game/:id/clear_auto_resign: ((data) => void)

            The auto resign for the given player has been cleared

            -

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      game_id: number;
                      player_id: number;
                  }
                  • game_id: number

                    The game id

                    +

                Returns void

            game/:id/clear_auto_resign: ((data) => void)

            The auto resign for the given player has been cleared

            +

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      game_id: number;
                      player_id: number;
                  }
                  • game_id: number

                    The game id

                  • player_id: number

                    The player id

                    -

                Returns void

            game/:id/clock: ((data) => void)

            Game clock update

            -

            Type declaration

              • (data): void
              • Parameters

                Returns void

            game/:id/conditional_moves: ((data) => void)

            Update the conditional moves currently active

            -

            Type declaration

              • (data): void
              • Parameters

                Returns void

            game/:id/clock: ((data) => void)

            Game clock update

            +

            Type declaration

              • (data): void
              • Parameters

                Returns void

            game/:id/conditional_moves: ((data) => void)

            Update the conditional moves currently active

            +

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      conditional_moves: ConditionalMoveResponse;
                      game_id: number;
                      move_number: number;
                  }
                  • conditional_moves: ConditionalMoveResponse

                    The conditional moves. The top level should be an array that looks like [null, { ... }] where the second element contains the responses to the opponent's move.

                  • game_id: number

                    The game id

                  • move_number: number

                    The move number from which the conditional moves are rooted in

                    -

                Returns void

            game/:id/error: ((data) => void)

            Error that should be displayed to the user

            -

            Type declaration

              • (data): void
              • Parameters

                • data: string

                Returns void

            game/:id/gamedata: ((data) => void)

            Update the entire game state

            -

            Type declaration

            game/:id/latency: ((data) => void)

            Update latency information for a player

            -

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      game_id: number;
                      latency: number;
                      player_id: number;
                  }
                  • game_id: number

                    The game id

                    +

                Returns void

            game/:id/error: ((data) => void)

            Error that should be displayed to the user

            +

            Type declaration

              • (data): void
              • Parameters

                • data: string

                Returns void

            game/:id/gamedata: ((data) => void)

            Update the entire game state

            +

            Type declaration

            game/:id/latency: ((data) => void)

            Update latency information for a player

            +

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      game_id: number;
                      latency: number;
                      player_id: number;
                  }
                  • game_id: number

                    The game id

                  • latency: number

                    The latency in milliseconds

                  • player_id: number

                    The player id

                    -

                Returns void

            game/:id/phase: ((data) => void)

            The phase has changed for the game

            -

            Type declaration

              • (data): void
              • Parameters

                • data: "play" | "stone removal" | "finished"

                Returns void

            game/:id/removed_stones: ((data) => void)

            Update the state of the stone removal phase

            -

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      all_removed: string;
                      removed: boolean;
                      stones: string;
                  } | {
                      strict_seki_mode: boolean;
                  }

                Returns void

            game/:id/removed_stones_accepted: ((data) => void)

            The stone removal phase has been completed, this is the final state and +

            Returns void

            game/:id/phase: ((data) => void)

            The phase has changed for the game

            +

            Type declaration

              • (data): void
              • Parameters

                • data: "play" | "stone removal" | "finished"

                Returns void

            game/:id/removed_stones: ((data) => void)

            Update the state of the stone removal phase

            +

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      all_removed: string;
                      removed: boolean;
                      stones: string;
                  } | {
                      strict_seki_mode: boolean;
                  }

                Returns void

            game/:id/removed_stones_accepted: ((data) => void)

            The stone removal phase has been completed, this is the final state and indicates a phase change to the given phase (should always be "finished")

            -

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      end_time: number;
                      outcome: string;
                      phase: "finished";
                      player_id: number;
                      players: {
                          black: User | {
                              accepted_stones: string;
                              accepted_strict_seki_mode: boolean;
                          };
                          white: User | {
                              accepted_stones: string;
                              accepted_strict_seki_mode: boolean;
                          };
                      };
                      score: Score;
                      stones: string;
                      strict_seki_mode: boolean;
                      winner: number;
                  }
                  • end_time: number

                    Timestamp in ms

                    +

                    Type declaration

                      • (data): void
                      • Parameters

                        • data: {
                              end_time: number;
                              outcome: string;
                              phase: "finished";
                              player_id: number;
                              players: {
                                  black: User | {
                                      accepted_stones: string;
                                      accepted_strict_seki_mode: boolean;
                                  };
                                  white: User | {
                                      accepted_stones: string;
                                      accepted_strict_seki_mode: boolean;
                                  };
                              };
                              score: Score;
                              stones: string;
                              strict_seki_mode: boolean;
                              winner: number;
                          }
                          • end_time: number

                            Timestamp in ms

                          • outcome: string

                            Outcome of the game

                          • phase: "finished"

                            Game phase (finished

                          • player_id: number
                          • players: {
                                black: User | {
                                    accepted_stones: string;
                                    accepted_strict_seki_mode: boolean;
                                };
                                white: User | {
                                    accepted_stones: string;
                                    accepted_strict_seki_mode: boolean;
                                };
                            }

                            Current players and their accepted stone statuses

                            @@ -135,46 +139,46 @@
                          • stones: string
                          • strict_seki_mode: boolean

                            True if Japanese strict seki mode was true. This will probably always be false and may be removed in the future.

                          • winner: number

                            Player id of the winner

                            -

                        Returns void

            game/:id/reset-chats: (() => void)

            The chat log should be reset.

            -

            Type declaration

              • (): void
              • Returns void

            game/:id/stalling_score_estimate: ((data?) => void)

            A score estimation result has been broadcast, this is used for avoiding game stalling

            -

            Type declaration

            game/:id/undo_accepted: ((data) => void)

            Undo move has been accepted, the parameter is the new move number

            -

            Type declaration

              • (data): void
              • Parameters

                • data: number

                Returns void

            game/:id/undo_canceled: ((data) => void)

            Undo request has been canceled, the parameter is the move number of the original request

            -

            Type declaration

              • (data): void
              • Parameters

                • data: number

                Returns void

            game/:id/undo_requested: ((data) => void)

            Undo request has been requested, the parameter is the move number that we want to go back to

            -

            Type declaration

              • (data): void
              • Parameters

                • data: number

                Returns void

            gamelist-count: ((data) => void)

            Update number of live and correspondence games are currently being +

            Returns void

            game/:id/reset-chats: (() => void)

            The chat log should be reset.

            +

            Type declaration

              • (): void
              • Returns void

            game/:id/stalling_score_estimate: ((data?) => void)

            A score estimation result has been broadcast, this is used for avoiding game stalling

            +

            Type declaration

            game/:id/undo_accepted: ((data) => void)

            Undo move has been accepted, the parameter is the new move number

            +

            Type declaration

              • (data): void
              • Parameters

                • data: number

                Returns void

            game/:id/undo_canceled: ((data) => void)

            Undo request has been canceled, the parameter is the move number of the original request

            +

            Type declaration

              • (data): void
              • Parameters

                • data: number

                Returns void

            game/:id/undo_requested: ((data) => void)

            Undo request has been requested, the parameter is the move number that we want to go back to

            +

            Type declaration

              • (data): void
              • Parameters

                • data: number

                Returns void

            gamelist-count: ((data) => void)

            Update number of live and correspondence games are currently being played

            -

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      correspondence: number;
                      live: number;
                  }
                  • correspondence: number

                    Number of correspondence games

                    +

                    Type declaration

                      • (data): void
                      • Parameters

                        • data: {
                              correspondence: number;
                              live: number;
                          }
                          • correspondence: number

                            Number of correspondence games

                          • live: number

                            Number of live games

                            -

                        Returns void

            gamelist-count-:channel: ((data) => void)

            Update number of live and correspondence games are currently being +

            Returns void

            gamelist-count-:channel: ((data) => void)

            Update number of live and correspondence games are currently being played in a particular channel

            -

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      correspondence: number;
                      live: number;
                  }
                  • correspondence: number

                    Number of correspondence games

                    +

                    Type declaration

                      • (data): void
                      • Parameters

                        • data: {
                              correspondence: number;
                              live: number;
                          }
                          • correspondence: number

                            Number of correspondence games

                          • live: number

                            Number of live games

                            -

                        Returns void

            hostinfo: ((data) => void)

            General host information for the termination server you +

            Returns void

            hostinfo: ((data) => void)

            General host information for the termination server you are connected to. This is a response to the hostinfo client message.

            -

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      clients: number;
                      hostname: string;
                      uptime: number;
                  }
                  • clients: number

                    Number of clients connected, if available

                    +

                    Type declaration

                      • (data): void
                      • Parameters

                        • data: {
                              clients: number;
                              hostname: string;
                              uptime: number;
                          }
                          • clients: number

                            Number of clients connected, if available

                          • hostname: string

                            The hostname of the server

                          • uptime: number

                            Number of seconds the server has been running

                            -

                        Returns void

            incident-report: ((data) => void)

            Incident report update

            -

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      cleared_by_user?: boolean;
                      created: string;
                      id: number;
                      moderator?: User;
                      moderator_note: string;
                      report_type: string;
                      reported_conversation?: string;
                      reported_game?: number;
                      reported_review?: number;
                      reported_user?: User;
                      reporter_note: string;
                      reporter_note_translation: {
                          source_language: string;
                          source_text: string;
                          target_language: string;
                          target_text: string;
                      };
                      reporting_user?: User;
                      source: string;
                      state: "pending" | "claimed" | "resolved";
                      system_note: string;
                      updated: string;
                      url: string;
                      was_helpful: boolean;
                  }
                  • Optional cleared_by_user?: boolean
                  • created: string
                  • id: number
                  • Optional moderator?: User
                  • moderator_note: string
                  • report_type: string
                  • Optional reported_conversation?: string
                  • Optional reported_game?: number
                  • Optional reported_review?: number
                  • Optional reported_user?: User
                  • reporter_note: string
                  • reporter_note_translation: {
                        source_language: string;
                        source_text: string;
                        target_language: string;
                        target_text: string;
                    }
                    • source_language: string
                    • source_text: string
                    • target_language: string
                    • target_text: string
                  • Optional reporting_user?: User
                  • source: string
                  • state: "pending" | "claimed" | "resolved"
                  • system_note: string
                  • updated: string
                  • url: string
                  • was_helpful: boolean

                Returns void

            itc: ((data) => void)

            "Inter Tab Communication" message. This is a client utility to enable +

            Returns void

            incident-report: ((data) => void)

            Incident report update

            +

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      cleared_by_user?: boolean;
                      created: string;
                      id: number;
                      moderator?: User;
                      moderator_note: string;
                      report_type: string;
                      reported_conversation?: string;
                      reported_game?: number;
                      reported_review?: number;
                      reported_user?: User;
                      reporter_note: string;
                      reporter_note_translation: {
                          source_language: string;
                          source_text: string;
                          target_language: string;
                          target_text: string;
                      };
                      reporting_user?: User;
                      source: string;
                      state: "pending" | "claimed" | "resolved";
                      system_note: string;
                      updated: string;
                      url: string;
                      was_helpful: boolean;
                  }
                  • Optional cleared_by_user?: boolean
                  • created: string
                  • id: number
                  • Optional moderator?: User
                  • moderator_note: string
                  • report_type: string
                  • Optional reported_conversation?: string
                  • Optional reported_game?: number
                  • Optional reported_review?: number
                  • Optional reported_user?: User
                  • reporter_note: string
                  • reporter_note_translation: {
                        source_language: string;
                        source_text: string;
                        target_language: string;
                        target_text: string;
                    }
                    • source_language: string
                    • source_text: string
                    • target_language: string
                    • target_text: string
                  • Optional reporting_user?: User
                  • source: string
                  • state: "pending" | "claimed" | "resolved"
                  • system_note: string
                  • updated: string
                  • url: string
                  • was_helpful: boolean

                Returns void

            itc: ((data) => void)

            "Inter Tab Communication" message. This is a client utility to enable relaying of messages between devices - the event and data are application defined, the server blindly relays to all connected devices for the sending user. Note this is relayed to all devices regardless of client, so your application should be prepared to handle ITC messages from other applications, not just your own application. (For instance, the web client sending this will arrive on an android and ios instance)

            -

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      data: any;
                      event: string;
                  }
                  • data: any

                    User defined data

                    +

                    Type declaration

                      • (data): void
                      • Parameters

                        • data: {
                              data: any;
                              event: string;
                          }
                          • data: any

                            User defined data

                          • event: string

                            User defined event string

                            -

                        Returns void

            net/pong: ((data) => void)

            Pong response from a ping

            -

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      client: number;
                      server: number;
                  }
                  • client: number

                    Client timestamp that was sent

                    +

                Returns void

            net/pong: ((data) => void)

            Pong response from a ping

            +

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      client: number;
                      server: number;
                  }
                  • client: number

                    Client timestamp that was sent

                  • server: number

                    Server timestamp when it was received

                    -

                Returns void

            notification: ((data) => void)

            A notification that should be displayed to the user +

            Returns void

            notification: ((data) => void)

            A notification that should be displayed to the user These are not strongly modeled, see https://github.com/online-go/online-go.com/blob/devel/src/components/Notifications/Notifications.tsx as a reference for what types there are and what data they contain

            -

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      id: string;
                      type: string;
                      [key: string]: any;
                  }
                  • [key: string]: any

                    There are often more fields here

                    +

                    Type declaration

                      • (data): void
                      • Parameters

                        • data: {
                              id: string;
                              type: string;
                              [key: string]: any;
                          }
                          • [key: string]: any

                            There are often more fields here

                          • id: string

                            The notification id

                          • type: string

                            The notification type

                            -

                        Returns void

            private-message: ((data) => void)

            A private message was received

            -

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      from: User;
                      message: {
                          i: string;
                          m: string;
                          t: number;
                      };
                      superchat_enabled?: boolean;
                      to: User;
                  }
                  • from: User

                    Who sent the message

                    +

                Returns void

            private-message: ((data) => void)

            A private message was received

            +

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      from: User;
                      message: {
                          i: string;
                          m: string;
                          t: number;
                      };
                      superchat_enabled?: boolean;
                      to: User;
                  }
                  • from: User

                    Who sent the message

                  • message: {
                        i: string;
                        m: string;
                        t: number;
                    }

                    The message received

                    • i: string

                      Message id.

                    • m: string

                      Message text

                      @@ -183,41 +187,41 @@ is when a moderator needs to talk with a player and ignoring the moderator is not suitable thing to do.

                    • to: User

                      Your user id

                      -

                Returns void

            private-superchat: ((data) => void)

            Notify the client that a private message "super chat" has started. A +

            Returns void

            private-superchat: ((data) => void)

            Notify the client that a private message "super chat" has started. A super chat is an undismissable chat sent by a moderator. It should take all focus and not let the client do anything until the conversation is resolved (the enable flag is set to false)

            -

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      enable: boolean;
                      moderator_id: number;
                      moderator_username: string;
                      player_id: number;
                      player_username: string;
                  }
                  • enable: boolean

                    Whether the superchat is enabled or not. When true, the client +

                    Type declaration

                      • (data): void
                      • Parameters

                        • data: {
                              enable: boolean;
                              moderator_id: number;
                              moderator_username: string;
                              player_id: number;
                              player_username: string;
                          }
                          • enable: boolean

                            Whether the superchat is enabled or not. When true, the client should make an undismissable chat window, when false the window can be dismissed.

                          • moderator_id: number

                            The moderator id contacting the player

                          • moderator_username: string

                            The moderator username contacting the player

                          • player_id: number

                            Your id

                          • player_username: string

                            Your username

                            -

                        Returns void

            remote_storage/sync_complete: (() => void)

            Notification that the server has completed sending all remote storage +

            Returns void

            remote_storage/sync_complete: (() => void)

            Notification that the server has completed sending all remote storage data and the client should now be up to date.

            -

            Type declaration

              • (): void
              • Returns void

            remote_storage/update: ((data) => void)

            Updates a key value pair

            -

            Type declaration

            remote_storage/update: ((data) => void)

            Updates a key value pair

            +

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      key: string;
                      modified: string;
                      replication: RemoteStorageReplication;
                      value: any;
                  }
                  • key: string

                    Key for the k/v pair

                  • modified: string

                    Timestamp of the update

                  • replication: RemoteStorageReplication

                    Replication mode

                  • value: any

                    Value of of the k/v pair

                    -

                Returns void

            review/:id/full_state: ((data) => void)

            Replay of the entire full state of the review

            -

            Type declaration

            review/:id/r: ((data) => void)

            An incremental modification to the review stream

            -

            Type declaration

            score-estimator-enabled-state: ((data) => void)

            Notifies the client whether the the client shares an IP with one of the +

            Returns void

            review/:id/full_state: ((data) => void)

            Replay of the entire full state of the review

            +

            Type declaration

            review/:id/r: ((data) => void)

            An incremental modification to the review stream

            +

            Type declaration

            score-estimator-enabled-state: ((data) => void)

            Notifies the client whether the the client shares an IP with one of the players of the game. This is used to disable the score estimator in anonymous browsing windows for players of a game when the score estimator is disabled for the game.

            -

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      game_id: number;
                      shared_ip_with_player: boolean;
                  }
                  • game_id: number

                    The game ID

                    +

                    Type declaration

                      • (data): void
                      • Parameters

                        • data: {
                              game_id: number;
                              shared_ip_with_player: boolean;
                          }
                          • game_id: number

                            The game ID

                          • shared_ip_with_player: boolean

                            True if the client shares an IP with one of the players of the game

                            -

                        Returns void

            seekgraph/global: ((messages) => void)

            Type declaration

            ui-push: ((data) => void)

            A UI Push notification. The event and data are not well defined here, +

            Returns void

            seekgraph/global: ((messages) => void)

            Type declaration

            ui-push: ((data) => void)

            A UI Push notification. The event and data are not well defined here, they come as a result to subscribing to ui push channels with ui-pushes/subscribe.

            -

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      data: string;
                      event: string;
                  }
                  • data: string

                    UI Push data

                    +

                    Type declaration

                      • (data): void
                      • Parameters

                        • data: {
                              data: string;
                              event: string;
                          }
                          • data: string

                            UI Push data

                          • event: string

                            UI Push event

                            -

                        Returns void

            user/jwt: ((jwt) => void)

            Update the user's JWT token

            -

            Type declaration

              • (jwt): void
              • Parameters

                • jwt: string

                Returns void

            user/state: ((data) => void)

            Updates whether a user is online or not. Subscribe to these updates for +

            Returns void

            user/jwt: ((jwt) => void)

            Update the user's JWT token

            +

            Type declaration

              • (jwt): void
              • Parameters

                • jwt: string

                Returns void

            user/state: ((data) => void)

            Updates whether a user is online or not. Subscribe to these updates for particular users using the user/monitor command.

            -

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      [player_id: number]: boolean;
                  }
                  • [player_id: number]: boolean

                Returns void

            user/update: ((user) => void)

            Update user information. For other players, this has the standard User +

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      [player_id: number]: boolean;
                  }
                  • [player_id: number]: boolean

                Returns void

            user/update: ((user) => void)

            Update user information. For other players, this has the standard User fields, when this is the current user, it can have additional fields that are found in the ui/config

            -

            Type declaration

              • (user): void
              • Parameters

                • user: User & {
                      [extra: string]: any;
                  }

                Returns void

            \ No newline at end of file +

            Type declaration

            \ No newline at end of file diff --git a/docs/interfaces/protocol.StallingScoreEstimate.html b/docs/interfaces/protocol.StallingScoreEstimate.html index d555d397..d6dacf63 100644 --- a/docs/interfaces/protocol.StallingScoreEstimate.html +++ b/docs/interfaces/protocol.StallingScoreEstimate.html @@ -1,8 +1,8 @@ -StallingScoreEstimate | goban

            Interface StallingScoreEstimate

            interface StallingScoreEstimate {
                game_id: number;
                move_number: number;
                ownership: any[];
                predicted_winner: "black" | "white";
                removed: string;
                score: number;
                win_rate: number;
            }

            Properties

            game_id +StallingScoreEstimate | goban

            Interface StallingScoreEstimate

            interface StallingScoreEstimate {
                game_id: number;
                move_number: number;
                ownership: any[];
                predicted_winner: "black" | "white";
                removed: string;
                score: number;
                win_rate: number;
            }

            Properties

            game_id: number
            move_number: number
            ownership: any[]
            predicted_winner: "black" | "white"
            removed: string
            score: number
            win_rate: number
            \ No newline at end of file +

            Properties

            game_id: number
            move_number: number
            ownership: any[]
            predicted_winner: "black" | "white"
            removed: string
            score: number
            win_rate: number
            \ No newline at end of file diff --git a/docs/interfaces/protocol.User.html b/docs/interfaces/protocol.User.html index a41d4093..5fa88feb 100644 --- a/docs/interfaces/protocol.User.html +++ b/docs/interfaces/protocol.User.html @@ -1,8 +1,8 @@ -User | goban

            Interface User

            interface User {
                country?: string;
                id: number;
                professional?: boolean;
                ranking?: number;
                ratings?: {
                    [speed_size: string]: Glicko2;
                };
                ui_class?: string;
                username: string;
            }

            Properties

            country? +User | goban

            Interface User

            interface User {
                country?: string;
                id: number;
                professional?: boolean;
                ranking?: number;
                ratings?: {
                    [speed_size: string]: Glicko2;
                };
                ui_class?: string;
                username: string;
            }

            Properties

            country?: string
            id: number
            professional?: boolean
            ranking?: number
            ratings?: {
                [speed_size: string]: Glicko2;
            }

            Type declaration

            ui_class?: string
            username: string
            \ No newline at end of file +

            Properties

            country?: string
            id: number
            professional?: boolean
            ranking?: number
            ratings?: {
                [speed_size: string]: Glicko2;
            }

            Type declaration

            ui_class?: string
            username: string
            \ No newline at end of file diff --git a/docs/interfaces/translate.GobanStrings.html b/docs/interfaces/translate.GobanStrings.html index 6c4944d1..eda00c62 100644 --- a/docs/interfaces/translate.GobanStrings.html +++ b/docs/interfaces/translate.GobanStrings.html @@ -1,4 +1,4 @@ -GobanStrings | goban

            Interface GobanStrings

            interface GobanStrings {
                %sd: string;
                %sh: string;
                %sm: string;
                %ss: string;
                %swk: string;
                A stone has already been placed here: string;
                Anime: string;
                Black: string;
                Black Walnut: string;
                Black to move: string;
                Book: string;
                Bright Kaya: string;
                Control passed to %s: string;
                Custom: string;
                Enter the label you want to add to the board: string;
                Error: string;
                Error submitting move: string;
                Game Finished: string;
                Glass: string;
                Granite: string;
                HNG: string;
                HNG Night: string;
                Illegal Ko Move: string;
                Illegal board repetition: string;
                Kaya: string;
                Loading...: string;
                Move is suicidal: string;
                Night: string;
                Night Play: string;
                Persimmon: string;
                Plain: string;
                Processing...: string;
                Red Oak: string;
                Review: string;
                Self-capture is not allowed: string;
                Shell: string;
                Slate: string;
                Stone Removal: string;
                Stone Removal Phase: string;
                Submitting...: string;
                Synchronization error, reloading: string;
                The game would be repeating with that move, please play somewhere else first: string;
                White: string;
                White to move: string;
                Worn Glass: string;
                Your move: string;
                Your move - opponent passed: string;
            }

            Properties

            %sd +GobanStrings | goban

            Interface GobanStrings

            interface GobanStrings {
                %sd: string;
                %sh: string;
                %sm: string;
                %ss: string;
                %swk: string;
                A stone has already been placed here: string;
                Anime: string;
                Black: string;
                Black Walnut: string;
                Black to move: string;
                Book: string;
                Bright Kaya: string;
                Control passed to %s: string;
                Custom: string;
                Enter the label you want to add to the board: string;
                Error: string;
                Error submitting move: string;
                Game Finished: string;
                Glass: string;
                Granite: string;
                HNG: string;
                HNG Night: string;
                Illegal Ko Move: string;
                Illegal board repetition: string;
                Kaya: string;
                Loading...: string;
                Move is suicidal: string;
                Night: string;
                Night Play: string;
                Persimmon: string;
                Plain: string;
                Processing...: string;
                Red Oak: string;
                Review: string;
                Self-capture is not allowed: string;
                Shell: string;
                Slate: string;
                Stone Removal: string;
                Stone Removal Phase: string;
                Submitting...: string;
                Synchronization error, reloading: string;
                The game would be repeating with that move, please play somewhere else first: string;
                White: string;
                White to move: string;
                Worn Glass: string;
                Your move: string;
                Your move - opponent passed: string;
            }

            Properties

            %sd: string
            %sh: string
            %sm: string
            %ss: string
            %swk: string
            A stone has already been placed here: string
            Anime: string
            Black: string
            Black Walnut: string
            Black to move: string
            Book: string
            Bright Kaya: string
            Control passed to %s: string
            Custom: string
            Enter the label you want to add to the board: string
            Error: string
            Error submitting move: string
            Game Finished: string
            Glass: string
            Granite: string
            HNG: string
            HNG Night: string
            Illegal Ko Move: string
            Illegal board repetition: string
            Kaya: string
            Loading...: string
            Move is suicidal: string
            Night: string
            Night Play: string
            Persimmon: string
            Plain: string
            Processing...: string
            Red Oak: string
            Review: string
            Self-capture is not allowed: string
            Shell: string
            Slate: string
            Stone Removal: string
            Stone Removal Phase: string
            Submitting...: string
            Synchronization error, reloading: string
            The game would be repeating with that move, please play somewhere else first: string
            White: string
            White to move: string
            Worn Glass: string
            Your move: string
            Your move - opponent passed: string
            \ No newline at end of file +

            Properties

            %sd: string
            %sh: string
            %sm: string
            %ss: string
            %swk: string
            A stone has already been placed here: string
            Anime: string
            Black: string
            Black Walnut: string
            Black to move: string
            Book: string
            Bright Kaya: string
            Control passed to %s: string
            Custom: string
            Enter the label you want to add to the board: string
            Error: string
            Error submitting move: string
            Game Finished: string
            Glass: string
            Granite: string
            HNG: string
            HNG Night: string
            Illegal Ko Move: string
            Illegal board repetition: string
            Kaya: string
            Loading...: string
            Move is suicidal: string
            Night: string
            Night Play: string
            Persimmon: string
            Plain: string
            Processing...: string
            Red Oak: string
            Review: string
            Self-capture is not allowed: string
            Shell: string
            Slate: string
            Stone Removal: string
            Stone Removal Phase: string
            Submitting...: string
            Synchronization error, reloading: string
            The game would be repeating with that move, please play somewhere else first: string
            White: string
            White to move: string
            Worn Glass: string
            Your move: string
            Your move - opponent passed: string
            \ No newline at end of file diff --git a/docs/modules/protocol.html b/docs/modules/protocol.html index d2be0600..a5ee6aab 100644 --- a/docs/modules/protocol.html +++ b/docs/modules/protocol.html @@ -59,7 +59,7 @@ for backwards compatibility.

            -

            Index

            Enumerations

            Index

            Enumerations

            Interfaces

            AIServerToClient AutomatchPreferences ClientToAIServer diff --git a/docs/modules/translate.html b/docs/modules/translate.html index f71fadda..def33e47 100644 --- a/docs/modules/translate.html +++ b/docs/modules/translate.html @@ -1,4 +1,4 @@ -translate | goban

            Namespace translate

            Index

            Interfaces

            GobanStrings +translate | goban

            Namespace translate

            Index

            Interfaces

            Functions

            _ interpolate setGobanTranslations diff --git a/docs/types/AdHocPackedMove.html b/docs/types/AdHocPackedMove.html index 1b915610..ccedb097 100644 --- a/docs/types/AdHocPackedMove.html +++ b/docs/types/AdHocPackedMove.html @@ -1 +1 @@ -AdHocPackedMove | goban

            Type alias AdHocPackedMove

            AdHocPackedMove: [number, number, number?, JGOFNumericPlayerColor?, {
                [index: string]: any;
            }?]
            \ No newline at end of file +AdHocPackedMove | goban

            Type alias AdHocPackedMove

            AdHocPackedMove: [number, number, number?, JGOFNumericPlayerColor?, {
                [index: string]: any;
            }?]
            \ No newline at end of file diff --git a/docs/types/AnalysisSubTool.html b/docs/types/AnalysisSubTool.html index 5159f509..42d1dcf8 100644 --- a/docs/types/AnalysisSubTool.html +++ b/docs/types/AnalysisSubTool.html @@ -1 +1 @@ -AnalysisSubTool | goban

            Type alias AnalysisSubTool

            AnalysisSubTool: "black" | "white" | "alternate" | "letters" | "numbers" | string
            \ No newline at end of file +AnalysisSubTool | goban

            Type alias AnalysisSubTool

            AnalysisSubTool: "black" | "white" | "alternate" | "letters" | "numbers" | string
            \ No newline at end of file diff --git a/docs/types/AnalysisTool.html b/docs/types/AnalysisTool.html index d6849191..34daa088 100644 --- a/docs/types/AnalysisTool.html +++ b/docs/types/AnalysisTool.html @@ -1 +1 @@ -AnalysisTool | goban

            Type alias AnalysisTool

            AnalysisTool: "stone" | "draw" | "label" | "score" | "removal"
            \ No newline at end of file +AnalysisTool | goban

            Type alias AnalysisTool

            AnalysisTool: "stone" | "draw" | "label" | "score" | "removal"
            \ No newline at end of file diff --git a/docs/types/BoardTransform.html b/docs/types/BoardTransform.html index 0792ed72..5bcbacbe 100644 --- a/docs/types/BoardTransform.html +++ b/docs/types/BoardTransform.html @@ -9,4 +9,4 @@

            The "easy to understand" part is that the id can be compared visually to the board position

            The downside is that the id string can be moderately long for boards with lots of stones

            -

            Type declaration

              • (x, y): {
                    x: number;
                    y: number;
                }
              • Parameters

                • x: number
                • y: number

                Returns {
                    x: number;
                    y: number;
                }

                • x: number
                • y: number
            \ No newline at end of file +

            Type declaration

              • (x, y): {
                    x: number;
                    y: number;
                }
              • Parameters

                • x: number
                • y: number

                Returns {
                    x: number;
                    y: number;
                }

                • x: number
                • y: number
            \ No newline at end of file diff --git a/docs/types/ConditionalMoveResponse.html b/docs/types/ConditionalMoveResponse.html index 85d608d4..7bb27238 100644 --- a/docs/types/ConditionalMoveResponse.html +++ b/docs/types/ConditionalMoveResponse.html @@ -1,3 +1,3 @@ ConditionalMoveResponse | goban

            Type alias ConditionalMoveResponse

            ConditionalMoveResponse: [string | null, ConditionalMoveResponseTree]

            A branch in the conditional move tree, consists of the response move and the sub-tree of the next possible moves

            -
            \ No newline at end of file +
            \ No newline at end of file diff --git a/docs/types/DataArgument.html b/docs/types/DataArgument.html index 63112a47..021ad986 100644 --- a/docs/types/DataArgument.html +++ b/docs/types/DataArgument.html @@ -1 +1 @@ -DataArgument | goban

            Type alias DataArgument<Entry>

            DataArgument<Entry>: Entry extends ((...args) => void)
                ? A[0]
                : never

            Type Parameters

            • Entry
            \ No newline at end of file +DataArgument | goban

            Type alias DataArgument<Entry>

            DataArgument<Entry>: Entry extends ((...args) => void)
                ? A[0]
                : never

            Type Parameters

            • Entry
            \ No newline at end of file diff --git a/docs/types/GobanChatLog.html b/docs/types/GobanChatLog.html index 3e6cd701..3f358fbb 100644 --- a/docs/types/GobanChatLog.html +++ b/docs/types/GobanChatLog.html @@ -1 +1 @@ -GobanChatLog | goban

            Type alias GobanChatLog

            GobanChatLog: GameChatLine[]
            \ No newline at end of file +GobanChatLog | goban

            Type alias GobanChatLog

            GobanChatLog: GameChatLine[]
            \ No newline at end of file diff --git a/docs/types/GobanEnginePhase.html b/docs/types/GobanEnginePhase.html index 82c8ba16..377db8fa 100644 --- a/docs/types/GobanEnginePhase.html +++ b/docs/types/GobanEnginePhase.html @@ -1 +1 @@ -GobanEnginePhase | goban

            Type alias GobanEnginePhase

            GobanEnginePhase: "play" | "stone removal" | "finished"
            \ No newline at end of file +GobanEnginePhase | goban

            Type alias GobanEnginePhase

            GobanEnginePhase: "play" | "stone removal" | "finished"
            \ No newline at end of file diff --git a/docs/types/GobanEngineRules.html b/docs/types/GobanEngineRules.html index ce243039..804e4090 100644 --- a/docs/types/GobanEngineRules.html +++ b/docs/types/GobanEngineRules.html @@ -1 +1 @@ -GobanEngineRules | goban

            Type alias GobanEngineRules

            GobanEngineRules: "chinese" | "aga" | "japanese" | "korean" | "ing" | "nz"
            \ No newline at end of file +GobanEngineRules | goban

            Type alias GobanEngineRules

            GobanEngineRules: "chinese" | "aga" | "japanese" | "korean" | "ing" | "nz"
            \ No newline at end of file diff --git a/docs/types/GobanEngineSuperKoAlgorithm.html b/docs/types/GobanEngineSuperKoAlgorithm.html index ecf1f140..9c043392 100644 --- a/docs/types/GobanEngineSuperKoAlgorithm.html +++ b/docs/types/GobanEngineSuperKoAlgorithm.html @@ -1 +1 @@ -GobanEngineSuperKoAlgorithm | goban

            Type alias GobanEngineSuperKoAlgorithm

            GobanEngineSuperKoAlgorithm: "psk" | "csk" | "ssk" | "noresult" | "ing"
            \ No newline at end of file +GobanEngineSuperKoAlgorithm | goban

            Type alias GobanEngineSuperKoAlgorithm

            GobanEngineSuperKoAlgorithm: "psk" | "csk" | "ssk" | "noresult" | "ing"
            \ No newline at end of file diff --git a/docs/types/GobanErrorMessageId.html b/docs/types/GobanErrorMessageId.html index f96dff84..92da86ab 100644 --- a/docs/types/GobanErrorMessageId.html +++ b/docs/types/GobanErrorMessageId.html @@ -1 +1 @@ -GobanErrorMessageId | goban

            Type alias GobanErrorMessageId

            \ No newline at end of file +GobanErrorMessageId | goban

            Type alias GobanErrorMessageId

            \ No newline at end of file diff --git a/docs/types/GobanErrorMessageObject.html b/docs/types/GobanErrorMessageObject.html index 0e918276..10837b56 100644 --- a/docs/types/GobanErrorMessageObject.html +++ b/docs/types/GobanErrorMessageObject.html @@ -1 +1 @@ -GobanErrorMessageObject | goban

            Type alias GobanErrorMessageObject

            \ No newline at end of file +GobanErrorMessageObject | goban

            Type alias GobanErrorMessageObject

            \ No newline at end of file diff --git a/docs/types/GobanIOErrorMessageId.html b/docs/types/GobanIOErrorMessageId.html index 5939f68e..37bfb125 100644 --- a/docs/types/GobanIOErrorMessageId.html +++ b/docs/types/GobanIOErrorMessageId.html @@ -1 +1 @@ -GobanIOErrorMessageId | goban

            Type alias GobanIOErrorMessageId

            GobanIOErrorMessageId: "failed_to_load_sgf"
            \ No newline at end of file +GobanIOErrorMessageId | goban

            Type alias GobanIOErrorMessageId

            GobanIOErrorMessageId: "failed_to_load_sgf"
            \ No newline at end of file diff --git a/docs/types/GobanModes.html b/docs/types/GobanModes.html index f3683f05..b65e9fbe 100644 --- a/docs/types/GobanModes.html +++ b/docs/types/GobanModes.html @@ -1 +1 @@ -GobanModes | goban

            Type alias GobanModes

            GobanModes: "play" | "puzzle" | "score estimation" | "analyze" | "conditional"
            \ No newline at end of file +GobanModes | goban

            Type alias GobanModes

            GobanModes: "play" | "puzzle" | "score estimation" | "analyze" | "conditional"
            \ No newline at end of file diff --git a/docs/types/GobanMoveErrorMessageId.html b/docs/types/GobanMoveErrorMessageId.html index 45a25d86..de0fe4dd 100644 --- a/docs/types/GobanMoveErrorMessageId.html +++ b/docs/types/GobanMoveErrorMessageId.html @@ -1 +1 @@ -GobanMoveErrorMessageId | goban

            Type alias GobanMoveErrorMessageId

            GobanMoveErrorMessageId: "stone_already_placed_here" | "illegal_self_capture" | "illegal_ko_move" | "illegal_board_repetition" | "move_error"
            \ No newline at end of file +GobanMoveErrorMessageId | goban

            Type alias GobanMoveErrorMessageId

            GobanMoveErrorMessageId: "stone_already_placed_here" | "illegal_self_capture" | "illegal_ko_move" | "illegal_board_repetition" | "move_error"
            \ No newline at end of file diff --git a/docs/types/GobanMovesArray.html b/docs/types/GobanMovesArray.html index f67c6ef7..de06a0b9 100644 --- a/docs/types/GobanMovesArray.html +++ b/docs/types/GobanMovesArray.html @@ -1 +1 @@ -GobanMovesArray | goban

            Type alias GobanMovesArray

            GobanMovesArray: AdHocPackedMove[] | JGOFMove[]
            \ No newline at end of file +GobanMovesArray | goban

            Type alias GobanMovesArray

            GobanMovesArray: AdHocPackedMove[] | JGOFMove[]
            \ No newline at end of file diff --git a/docs/types/GobanRenderer.html b/docs/types/GobanRenderer.html index 83d4e732..c0f6f852 100644 --- a/docs/types/GobanRenderer.html +++ b/docs/types/GobanRenderer.html @@ -1 +1 @@ -GobanRenderer | goban

            Type alias GobanRenderer

            GobanRenderer: GobanCanvas | SVGRenderer
            \ No newline at end of file +GobanRenderer | goban

            Type alias GobanRenderer

            GobanRenderer: GobanCanvas | SVGRenderer
            \ No newline at end of file diff --git a/docs/types/GobanRendererConfig.html b/docs/types/GobanRendererConfig.html index a2af2d7a..3f27fb31 100644 --- a/docs/types/GobanRendererConfig.html +++ b/docs/types/GobanRendererConfig.html @@ -1 +1 @@ -GobanRendererConfig | goban

            Type alias GobanRendererConfig

            \ No newline at end of file +GobanRendererConfig | goban

            Type alias GobanRendererConfig

            \ No newline at end of file diff --git a/docs/types/JGOFTimeControl.html b/docs/types/JGOFTimeControl.html index 6937fffd..c41d5244 100644 --- a/docs/types/JGOFTimeControl.html +++ b/docs/types/JGOFTimeControl.html @@ -1 +1 @@ -JGOFTimeControl | goban
            \ No newline at end of file +JGOFTimeControl | goban
            \ No newline at end of file diff --git a/docs/types/JGOFTimeControlSpeed.html b/docs/types/JGOFTimeControlSpeed.html index d9598b05..0e652d5c 100644 --- a/docs/types/JGOFTimeControlSpeed.html +++ b/docs/types/JGOFTimeControlSpeed.html @@ -1 +1 @@ -JGOFTimeControlSpeed | goban

            Type alias JGOFTimeControlSpeed

            JGOFTimeControlSpeed: "blitz" | "rapid" | "live" | "correspondence"
            \ No newline at end of file +JGOFTimeControlSpeed | goban

            Type alias JGOFTimeControlSpeed

            JGOFTimeControlSpeed: "blitz" | "rapid" | "live" | "correspondence"
            \ No newline at end of file diff --git a/docs/types/JGOFTimeControlSystem.html b/docs/types/JGOFTimeControlSystem.html index 3b54e1b3..937f911b 100644 --- a/docs/types/JGOFTimeControlSystem.html +++ b/docs/types/JGOFTimeControlSystem.html @@ -1 +1 @@ -JGOFTimeControlSystem | goban

            Type alias JGOFTimeControlSystem

            JGOFTimeControlSystem: "fischer" | "byoyomi" | "canadian" | "simple" | "absolute" | "none"
            \ No newline at end of file +JGOFTimeControlSystem | goban

            Type alias JGOFTimeControlSystem

            JGOFTimeControlSystem: "fischer" | "byoyomi" | "canadian" | "simple" | "absolute" | "none"
            \ No newline at end of file diff --git a/docs/types/LabelPosition.html b/docs/types/LabelPosition.html index e6462f1a..ec526cb1 100644 --- a/docs/types/LabelPosition.html +++ b/docs/types/LabelPosition.html @@ -1 +1 @@ -LabelPosition | goban

            Type alias LabelPosition

            LabelPosition: "all" | "none" | "top-left" | "top-right" | "bottom-right" | "bottom-left"
            \ No newline at end of file +LabelPosition | goban

            Type alias LabelPosition

            LabelPosition: "all" | "none" | "top-left" | "top-right" | "bottom-right" | "bottom-left"
            \ No newline at end of file diff --git a/docs/types/Matrix.html b/docs/types/Matrix.html index 744a35e4..a63fcccd 100644 --- a/docs/types/Matrix.html +++ b/docs/types/Matrix.html @@ -1 +1 @@ -Matrix | goban

            Type alias Matrix<T>

            Matrix<T>: T[][]

            Type Parameters

            • T
            \ No newline at end of file +Matrix | goban

            Type alias Matrix<T>

            Matrix<T>: T[][]

            Type Parameters

            • T
            \ No newline at end of file diff --git a/docs/types/MoveTreePenMarks.html b/docs/types/MoveTreePenMarks.html index 3a58967b..d427d409 100644 --- a/docs/types/MoveTreePenMarks.html +++ b/docs/types/MoveTreePenMarks.html @@ -1 +1 @@ -MoveTreePenMarks | goban

            Type alias MoveTreePenMarks

            MoveTreePenMarks: {
                color: string;
                points: number[];
            }[]

            Type declaration

            • color: string
            • points: number[]
            \ No newline at end of file +MoveTreePenMarks | goban

            Type alias MoveTreePenMarks

            MoveTreePenMarks: {
                color: string;
                points: number[];
            }[]

            Type declaration

            • color: string
            • points: number[]
            \ No newline at end of file diff --git a/docs/types/NumberMatrix.html b/docs/types/NumberMatrix.html index a067d182..68043bc9 100644 --- a/docs/types/NumberMatrix.html +++ b/docs/types/NumberMatrix.html @@ -1 +1 @@ -NumberMatrix | goban

            Type alias NumberMatrix

            NumberMatrix: Matrix<number>
            \ No newline at end of file +NumberMatrix | goban

            Type alias NumberMatrix

            NumberMatrix: Matrix<number>
            \ No newline at end of file diff --git a/docs/types/PlayerColor.html b/docs/types/PlayerColor.html index fac7dda5..29bd9bfb 100644 --- a/docs/types/PlayerColor.html +++ b/docs/types/PlayerColor.html @@ -1 +1 @@ -PlayerColor | goban

            Type alias PlayerColor

            PlayerColor: "black" | "white"
            \ No newline at end of file +PlayerColor | goban

            Type alias PlayerColor

            PlayerColor: "black" | "white"
            \ No newline at end of file diff --git a/docs/types/ProtocolResponseType.html b/docs/types/ProtocolResponseType.html index f3674709..c19f05a2 100644 --- a/docs/types/ProtocolResponseType.html +++ b/docs/types/ProtocolResponseType.html @@ -1 +1 @@ -ProtocolResponseType | goban

            Type alias ProtocolResponseType<Entry>

            ProtocolResponseType<Entry>: Entry extends ((...args) => infer R)
                ? R
                : never

            Type Parameters

            • Entry
            \ No newline at end of file +ProtocolResponseType | goban

            Type alias ProtocolResponseType<Entry>

            ProtocolResponseType<Entry>: Entry extends ((...args) => infer R)
                ? R
                : never

            Type Parameters

            • Entry
            \ No newline at end of file diff --git a/docs/types/PuzzleOpponentMoveMode.html b/docs/types/PuzzleOpponentMoveMode.html index f14745d1..241b0de9 100644 --- a/docs/types/PuzzleOpponentMoveMode.html +++ b/docs/types/PuzzleOpponentMoveMode.html @@ -1 +1 @@ -PuzzleOpponentMoveMode | goban

            Type alias PuzzleOpponentMoveMode

            PuzzleOpponentMoveMode: "manual" | "automatic"
            \ No newline at end of file +PuzzleOpponentMoveMode | goban

            Type alias PuzzleOpponentMoveMode

            PuzzleOpponentMoveMode: "manual" | "automatic"
            \ No newline at end of file diff --git a/docs/types/PuzzlePlacementSetting.html b/docs/types/PuzzlePlacementSetting.html index 63b597ca..51e37338 100644 --- a/docs/types/PuzzlePlacementSetting.html +++ b/docs/types/PuzzlePlacementSetting.html @@ -1 +1 @@ -PuzzlePlacementSetting | goban

            Type alias PuzzlePlacementSetting

            PuzzlePlacementSetting: {
                mode: "play";
            } | {
                color: JGOFNumericPlayerColor;
                mode: "setup";
            } | {
                color: 0;
                mode: "place";
            }

            Type declaration

            • mode: "play"

            Type declaration

            Type declaration

            • color: 0
            • mode: "place"
            \ No newline at end of file +PuzzlePlacementSetting | goban

            Type alias PuzzlePlacementSetting

            PuzzlePlacementSetting: {
                mode: "play";
            } | {
                color: JGOFNumericPlayerColor;
                mode: "setup";
            } | {
                color: 0;
                mode: "place";
            }

            Type declaration

            • mode: "play"

            Type declaration

            Type declaration

            • color: 0
            • mode: "place"
            \ No newline at end of file diff --git a/docs/types/PuzzlePlayerMoveMode.html b/docs/types/PuzzlePlayerMoveMode.html index 8e0cb32c..3b18f861 100644 --- a/docs/types/PuzzlePlayerMoveMode.html +++ b/docs/types/PuzzlePlayerMoveMode.html @@ -1 +1 @@ -PuzzlePlayerMoveMode | goban

            Type alias PuzzlePlayerMoveMode

            PuzzlePlayerMoveMode: "free" | "fixed"
            \ No newline at end of file +PuzzlePlayerMoveMode | goban

            Type alias PuzzlePlayerMoveMode

            PuzzlePlayerMoveMode: "free" | "fixed"
            \ No newline at end of file diff --git a/docs/types/RawStoneString.html b/docs/types/RawStoneString.html index fde6b0e2..0e20beea 100644 --- a/docs/types/RawStoneString.html +++ b/docs/types/RawStoneString.html @@ -1,2 +1,2 @@ RawStoneString | goban

            Type alias RawStoneString

            RawStoneString: JGOFIntersection[]

            A raw stone string is simply an array of intersections

            -
            \ No newline at end of file +
            \ No newline at end of file diff --git a/docs/types/StringMatrix.html b/docs/types/StringMatrix.html index fb1f5d69..bd4088db 100644 --- a/docs/types/StringMatrix.html +++ b/docs/types/StringMatrix.html @@ -1 +1 @@ -StringMatrix | goban

            Type alias StringMatrix

            StringMatrix: Matrix<string>
            \ No newline at end of file +StringMatrix | goban

            Type alias StringMatrix

            StringMatrix: Matrix<string>
            \ No newline at end of file diff --git a/docs/types/_internal_.ClockTime.html b/docs/types/_internal_.ClockTime.html index 238ce899..375b954b 100644 --- a/docs/types/_internal_.ClockTime.html +++ b/docs/types/_internal_.ClockTime.html @@ -1 +1 @@ -ClockTime | goban
            \ No newline at end of file +ClockTime | goban
            \ No newline at end of file diff --git a/docs/types/_internal_.DebugOutput.html b/docs/types/_internal_.DebugOutput.html index ac9b3128..34046128 100644 --- a/docs/types/_internal_.DebugOutput.html +++ b/docs/types/_internal_.DebugOutput.html @@ -1,2 +1,2 @@ DebugOutput | goban

            Type alias DebugOutput

            DebugOutput: string

            -
            \ No newline at end of file +
            \ No newline at end of file diff --git a/docs/types/_internal_.LocalEstimator.html b/docs/types/_internal_.LocalEstimator.html index c4f9e6e4..196c7abc 100644 --- a/docs/types/_internal_.LocalEstimator.html +++ b/docs/types/_internal_.LocalEstimator.html @@ -5,4 +5,4 @@
          • trials: number

            number of playouts. Not applicable to all estimators, but higher generally means higher accuracy and higher compute cost

          • tolerance: number

            (0.0-1.0) confidence required to mark an intersection not neutral.

            -
          • Returns NumberMatrix

            \ No newline at end of file +

            Returns NumberMatrix

            \ No newline at end of file diff --git a/docs/types/_internal_.MessageID.html b/docs/types/_internal_.MessageID.html index 7c4aea2b..0f564aa2 100644 --- a/docs/types/_internal_.MessageID.html +++ b/docs/types/_internal_.MessageID.html @@ -1 +1 @@ -MessageID | goban

            Type alias MessageID

            MessageID: GobanMoveErrorMessageId | "error" | "error_submitting_move" | "loading" | "processing" | "self_capture_not_allowed" | "server_message" | "illegal_ko_move" | "synchronization_error"
            \ No newline at end of file +MessageID | goban

            Type alias MessageID

            MessageID: GobanMoveErrorMessageId | "error" | "error_submitting_move" | "loading" | "processing" | "self_capture_not_allowed" | "server_message" | "illegal_ko_move" | "synchronization_error"
            \ No newline at end of file diff --git a/docs/types/_internal_.NoneClock.html b/docs/types/_internal_.NoneClock.html index 5face263..33026a2d 100644 --- a/docs/types/_internal_.NoneClock.html +++ b/docs/types/_internal_.NoneClock.html @@ -1 +1 @@ -NoneClock | goban

            Type alias NoneClock

            NoneClock: undefined
            \ No newline at end of file +NoneClock | goban

            Type alias NoneClock

            NoneClock: undefined
            \ No newline at end of file diff --git a/docs/types/_internal_.SimpleClock.html b/docs/types/_internal_.SimpleClock.html index e1c443bd..ff1c9b69 100644 --- a/docs/types/_internal_.SimpleClock.html +++ b/docs/types/_internal_.SimpleClock.html @@ -1 +1 @@ -SimpleClock | goban

            Type alias SimpleClock

            SimpleClock: number
            \ No newline at end of file +SimpleClock | goban

            Type alias SimpleClock

            SimpleClock: number
            \ No newline at end of file diff --git a/docs/types/_internal_.StoneType.html b/docs/types/_internal_.StoneType.html index 8e1c122c..65f9190f 100644 --- a/docs/types/_internal_.StoneType.html +++ b/docs/types/_internal_.StoneType.html @@ -1 +1 @@ -StoneType | goban

            Type alias StoneType

            StoneType: {
                shadow: HTMLCanvasElement;
                stone: HTMLCanvasElement;
            }

            Type declaration

            • shadow: HTMLCanvasElement
            • stone: HTMLCanvasElement
            \ No newline at end of file +StoneType | goban

            Type alias StoneType

            StoneType: {
                shadow: HTMLCanvasElement;
                stone: HTMLCanvasElement;
            }

            Type declaration

            • shadow: HTMLCanvasElement
            • stone: HTMLCanvasElement
            \ No newline at end of file diff --git a/docs/types/_internal_.StoneTypeArray.html b/docs/types/_internal_.StoneTypeArray.html index e4e3879a..3f6b0baf 100644 --- a/docs/types/_internal_.StoneTypeArray.html +++ b/docs/types/_internal_.StoneTypeArray.html @@ -1 +1 @@ -StoneTypeArray | goban

            Type alias StoneTypeArray

            StoneTypeArray: StoneType[]
            \ No newline at end of file +StoneTypeArray | goban

            Type alias StoneTypeArray

            StoneTypeArray: StoneType[]
            \ No newline at end of file diff --git a/docs/types/protocol.AutomatchCondition.html b/docs/types/protocol.AutomatchCondition.html index 558559f6..7682a198 100644 --- a/docs/types/protocol.AutomatchCondition.html +++ b/docs/types/protocol.AutomatchCondition.html @@ -1 +1 @@ -AutomatchCondition | goban

            Type alias AutomatchCondition

            AutomatchCondition: "required" | "preferred" | "no-preference"
            \ No newline at end of file +AutomatchCondition | goban

            Type alias AutomatchCondition

            AutomatchCondition: "required" | "preferred" | "no-preference"
            \ No newline at end of file diff --git a/docs/types/protocol.RuleSet.html b/docs/types/protocol.RuleSet.html index d7ec445b..066a5bb3 100644 --- a/docs/types/protocol.RuleSet.html +++ b/docs/types/protocol.RuleSet.html @@ -1 +1 @@ -RuleSet | goban

            Type alias RuleSet

            RuleSet: "japanese" | "chinese" | "aga" | "korean" | "nz" | "ing"
            \ No newline at end of file +RuleSet | goban

            Type alias RuleSet

            RuleSet: "japanese" | "chinese" | "aga" | "korean" | "nz" | "ing"
            \ No newline at end of file diff --git a/docs/types/protocol.Size.html b/docs/types/protocol.Size.html index 1c2375a0..485ecc5e 100644 --- a/docs/types/protocol.Size.html +++ b/docs/types/protocol.Size.html @@ -1 +1 @@ -Size | goban

            Type alias Size

            Size: "9x9" | "13x13" | "19x19"
            \ No newline at end of file +Size | goban

            Type alias Size

            Size: "9x9" | "13x13" | "19x19"
            \ No newline at end of file diff --git a/docs/types/protocol.Speed.html b/docs/types/protocol.Speed.html index 046d1e62..532109fd 100644 --- a/docs/types/protocol.Speed.html +++ b/docs/types/protocol.Speed.html @@ -1 +1 @@ -Speed | goban

            Type alias Speed

            Speed: "blitz" | "rapid" | "live" | "correspondence"
            \ No newline at end of file +Speed | goban

            Type alias Speed

            Speed: "blitz" | "rapid" | "live" | "correspondence"
            \ No newline at end of file diff --git a/docs/variables/AUTOSCORE_TOLERANCE.html b/docs/variables/AUTOSCORE_TOLERANCE.html index a01078d6..1814e73f 100644 --- a/docs/variables/AUTOSCORE_TOLERANCE.html +++ b/docs/variables/AUTOSCORE_TOLERANCE.html @@ -1 +1 @@ -AUTOSCORE_TOLERANCE | goban

            Variable AUTOSCORE_TOLERANCEConst

            AUTOSCORE_TOLERANCE: 0.1 = 0.1
            \ No newline at end of file +AUTOSCORE_TOLERANCE | goban

            Variable AUTOSCORE_TOLERANCEConst

            AUTOSCORE_TOLERANCE: 0.1 = 0.1
            \ No newline at end of file diff --git a/docs/variables/AUTOSCORE_TRIALS.html b/docs/variables/AUTOSCORE_TRIALS.html index aa178a08..5e4f2225 100644 --- a/docs/variables/AUTOSCORE_TRIALS.html +++ b/docs/variables/AUTOSCORE_TRIALS.html @@ -1 +1 @@ -AUTOSCORE_TRIALS | goban

            Variable AUTOSCORE_TRIALSConst

            AUTOSCORE_TRIALS: 1000 = 1000
            \ No newline at end of file +AUTOSCORE_TRIALS | goban

            Variable AUTOSCORE_TRIALSConst

            AUTOSCORE_TRIALS: 1000 = 1000
            \ No newline at end of file diff --git a/docs/variables/GOBAN_FONT.html b/docs/variables/GOBAN_FONT.html index c0e980a2..87a8a57a 100644 --- a/docs/variables/GOBAN_FONT.html +++ b/docs/variables/GOBAN_FONT.html @@ -1 +1 @@ -GOBAN_FONT | goban

            Variable GOBAN_FONTConst

            GOBAN_FONT: "Verdana,Arial,sans-serif" = "Verdana,Arial,sans-serif"
            \ No newline at end of file +GOBAN_FONT | goban

            Variable GOBAN_FONTConst

            GOBAN_FONT: "Verdana,Arial,sans-serif" = "Verdana,Arial,sans-serif"
            \ No newline at end of file diff --git a/docs/variables/MARK_TYPES.html b/docs/variables/MARK_TYPES.html index 414f2f47..c35d7962 100644 --- a/docs/variables/MARK_TYPES.html +++ b/docs/variables/MARK_TYPES.html @@ -1 +1 @@ -MARK_TYPES | goban

            Variable MARK_TYPESConst

            MARK_TYPES: (keyof MarkInterface)[] = ...
            \ No newline at end of file +MARK_TYPES | goban

            Variable MARK_TYPESConst

            MARK_TYPES: (keyof MarkInterface)[] = ...
            \ No newline at end of file diff --git a/docs/variables/SCORE_ESTIMATION_TOLERANCE.html b/docs/variables/SCORE_ESTIMATION_TOLERANCE.html index 9e4ac771..620e743a 100644 --- a/docs/variables/SCORE_ESTIMATION_TOLERANCE.html +++ b/docs/variables/SCORE_ESTIMATION_TOLERANCE.html @@ -1 +1 @@ -SCORE_ESTIMATION_TOLERANCE | goban

            Variable SCORE_ESTIMATION_TOLERANCEConst

            SCORE_ESTIMATION_TOLERANCE: 0.3 = 0.3
            \ No newline at end of file +SCORE_ESTIMATION_TOLERANCE | goban

            Variable SCORE_ESTIMATION_TOLERANCEConst

            SCORE_ESTIMATION_TOLERANCE: 0.3 = 0.3
            \ No newline at end of file diff --git a/docs/variables/SCORE_ESTIMATION_TRIALS.html b/docs/variables/SCORE_ESTIMATION_TRIALS.html index 62697a64..bb5f4d6b 100644 --- a/docs/variables/SCORE_ESTIMATION_TRIALS.html +++ b/docs/variables/SCORE_ESTIMATION_TRIALS.html @@ -1 +1 @@ -SCORE_ESTIMATION_TRIALS | goban

            Variable SCORE_ESTIMATION_TRIALSConst

            SCORE_ESTIMATION_TRIALS: 1000 = 1000
            \ No newline at end of file +SCORE_ESTIMATION_TRIALS | goban

            Variable SCORE_ESTIMATION_TRIALSConst

            SCORE_ESTIMATION_TRIALS: 1000 = 1000
            \ No newline at end of file diff --git a/docs/variables/THEMES.html b/docs/variables/THEMES.html index 4024f077..72042731 100644 --- a/docs/variables/THEMES.html +++ b/docs/variables/THEMES.html @@ -1 +1 @@ -THEMES | goban

            Variable THEMESConst

            THEMES: ThemesInterface = ...
            \ No newline at end of file +THEMES | goban

            Variable THEMESConst

            THEMES: ThemesInterface = ...
            \ No newline at end of file diff --git a/docs/variables/THEMES_SORTED.html b/docs/variables/THEMES_SORTED.html index d02c39cf..8445793e 100644 --- a/docs/variables/THEMES_SORTED.html +++ b/docs/variables/THEMES_SORTED.html @@ -1 +1 @@ -THEMES_SORTED | goban

            Variable THEMES_SORTEDConst

            THEMES_SORTED: {
                black: GobanTheme[];
                board: GobanTheme[];
                white: GobanTheme[];
                [key: string]: GobanTheme[];
            } = ...

            Type declaration

            \ No newline at end of file +THEMES_SORTED | goban

            Variable THEMES_SORTEDConst

            THEMES_SORTED: {
                black: GobanTheme[];
                board: GobanTheme[];
                white: GobanTheme[];
                [key: string]: GobanTheme[];
            } = ...

            Type declaration

            \ No newline at end of file diff --git a/docs/variables/callbacks.html b/docs/variables/callbacks.html index 1a0c8191..74864514 100644 --- a/docs/variables/callbacks.html +++ b/docs/variables/callbacks.html @@ -1 +1 @@ -callbacks | goban

            Variable callbacksConst

            callbacks: GobanCallbacks = ...
            \ No newline at end of file +callbacks | goban

            Variable callbacksConst

            callbacks: GobanCallbacks = ...
            \ No newline at end of file diff --git a/docs/variables/remote_estimate_ownership.html b/docs/variables/remote_estimate_ownership.html index 88ebf478..0b67905b 100644 --- a/docs/variables/remote_estimate_ownership.html +++ b/docs/variables/remote_estimate_ownership.html @@ -1 +1 @@ -remote_estimate_ownership | goban

            Variable remote_estimate_ownership

            remote_estimate_ownership: ((req) => Promise<ScoreEstimateResponse>) | undefined

            Type declaration

            \ No newline at end of file +remote_estimate_ownership | goban

            Variable remote_estimate_ownership

            remote_estimate_ownership: ((req) => Promise<ScoreEstimateResponse>) | undefined

            Type declaration

            \ No newline at end of file