<!-- source: docs/api/2_capi/onewaymatch/cancelmatch.md -->
<!-- url: https://docs.braincloudservers.com/api/capi/onewaymatch/cancelmatch -->

# CancelMatch

Cancels a match.

| Service | Operation |
| ------- | --------- |
| onewayMatch | CANCEL_MATCH |

## Method Parameters
Parameter | Description
--------- | -----------
playbackStreamId | The playback stream id returned in the start match

## Usage

**C#:**

```csharp
string playbackStreamId = "streamId";
SuccessCallback successCallback = (response, cbObject) =>
{
    Debug.Log(string.Format("Success | {0}", response));
};
FailureCallback failureCallback = (status, code, error, cbObject) =>
{
    Debug.Log(string.Format("Failed | {0}  {1}  {2}", status, code, error));
};

_bc.OnewayMatchService.CancelMatch(playbackStreamId, successCallback, failureCallback);
```

**C++:**

```cpp
const char *playbackStreamId = "streamId";
_bc->getOnewayMatchService()->cancelMatch(playbackStreamId, this);
```

**Obj-C:**

```objectivec
NSString *playbackStreamId = @"streamId";
BCCompletionBlock successBlock;      // define callback
BCErrorCompletionBlock failureBlock; // define callback

[[_bc onewayMatchService] cancelMatch:playbackStreamId
            completionBlock:successBlock
       errorCompletionBlock:failureBlock
                   cbObject:nil];
```

**Java:**

```java
String playbackStreamId = "streamId";
this; // implements IServerCallback

_bc.getOnewayMatchService().cancelMatch(playbackStreamId, this);

public void serverCallback(ServiceName serviceName, ServiceOperation serviceOperation, JSONObject jsonData)
{
    System.out.print(String.format("Success | %s", jsonData.toString()));
}
public void serverError(ServiceName serviceName, ServiceOperation serviceOperation, int statusCode, int reasonCode, String jsonError)
{
    System.out.print(String.format("Failed | %d %d %s", statusCode,  reasonCode, jsonError.toString()));
}
```

**JavaScript:**

```javascript
var playbackStreamId = "streamId";

_bc.onewayMatch.cancelMatch(playbackStreamId, result =>
{
    var status = result.status;
    console.log(status + " : " + JSON.stringify(result, null, 2));
});
```

**Dart:**

```dart
var  playbackStreamId = "streamId";

ServerResponse result = await _bc.onewayMatchService.cancelMatch(playbackStreamId:playbackStreamId);

if (result.statusCode == 200) {
    print("Success");
} else {
    print("Failed ${result.error['status_message'] ?? result.error}");
}
```

**Roblox:**

```lua
local playbackStreamId = "streamId"

local callback = function(success, response)
    if success then
        print("Success")
    else
        print("Failed | " .. tostring(response.status_message))
    end
end

_bc.oneWayMatch:cancelMatch(playbackStreamId, callback)
```

**GDScript:**

```gdscript
var playback_stream_id = "streamId"

var result = await _bc.one_way_match_service.cancel_match(playback_stream_id)

if result.status == 200:
	print("Success")
else:
	print("Failed: %s" % result.status_message)
```

**Lua:**

```lua
local playbackStreamId = "streamId"

local callback = function(success, response)
    if success then
        print("Success")
    else
        print("Failed | " .. tostring(response.status_message))
    end
end

_bc.oneWayMatch:cancelMatch(playbackStreamId, callback)
```

**Cloud Code:**

```cfscript
var playbackStreamId = "streamId";
var onewayMatchProxy = bridge.getOnewayMatchServiceProxy();

var postResult = onewayMatchProxy.cancelMatch(playbackStreamId);
if (postResult.status == 200) {
    // Success!
}
```

**Raw:**

```r
{
    "service": "onewayMatch",
    "operation": "CANCEL_MATCH",
    "data": {
        "playbackStreamId": "streamId"
    }
}
```

<details>
<summary>JSON Response</summary>

```json
{
    "status" : 200,
    "data" : null
}
```
</details>


---

<!-- source: docs/api/2_capi/onewaymatch/completematch.md -->
<!-- url: https://docs.braincloudservers.com/api/capi/onewaymatch/completematch -->

# CompleteMatch

Completes a match.

| Service | Operation |
| ------- | --------- |
| onewayMatch | COMPLETE_MATCH |

## Method Parameters
Parameter | Description
--------- | -----------
playbackStreamId | The playback stream id returned in the start match

## Usage

**C#:**

```csharp
string playbackStreamId = "streamId";
SuccessCallback successCallback = (response, cbObject) =>
{
    Debug.Log(string.Format("Success | {0}", response));
};
FailureCallback failureCallback = (status, code, error, cbObject) =>
{
    Debug.Log(string.Format("Failed | {0}  {1}  {2}", status, code, error));
};

_bc.OnewayMatchService.CompleteMatch(playbackStreamId, successCallback, failureCallback);
```

**C++:**

```cpp
const char *playbackStreamId = "streamId";
_bc->getOnewayMatchService()->completeMatch(playbackStreamId, this);
```

**Obj-C:**

```objectivec
NSString *playbackStreamId = @"streamId";
BCCompletionBlock successBlock;      // define callback
BCErrorCompletionBlock failureBlock; // define callback

[[_bc onewayMatchService] completeMatch:playbackStreamId
            completionBlock:successBlock
       errorCompletionBlock:failureBlock
                   cbObject:nil];
```

**Java:**

```java
String playbackStreamId = "streamId";
this; // implements IServerCallback

_bc.getOnewayMatchService().completeMatch(playbackStreamId, this);

public void serverCallback(ServiceName serviceName, ServiceOperation serviceOperation, JSONObject jsonData)
{
    System.out.print(String.format("Success | %s", jsonData.toString()));
}
public void serverError(ServiceName serviceName, ServiceOperation serviceOperation, int statusCode, int reasonCode, String jsonError)
{
    System.out.print(String.format("Failed | %d %d %s", statusCode,  reasonCode, jsonError.toString()));
}
```

**JavaScript:**

```javascript
var playbackStreamId = "streamId";

_bc.onewayMatch.completeMatch(playbackStreamId, result =>
{
    var status = result.status;
    console.log(status + " : " + JSON.stringify(result, null, 2));
});
```

**Dart:**

```dart
var  playbackStreamId = "streamId";

ServerResponse result = await _bc.onewayMatchService.completeMatch(playbackStreamId:playbackStreamId);

if (result.statusCode == 200) {
    print("Success");
} else {
    print("Failed ${result.error['status_message'] ?? result.error}");
}
```

**Roblox:**

```lua
local playbackStreamId = "streamId"

local callback = function(success, response)
    if success then
        print("Success")
    else
        print("Failed | " .. tostring(response.status_message))
    end
end

_bc.oneWayMatch:completeMatch(playbackStreamId, callback)
```

**GDScript:**

```gdscript
var playback_stream_id = "streamId"

var result = await _bc.one_way_match_service.complete_match(playback_stream_id)

if result.status == 200:
	print("Success")
else:
	print("Failed: %s" % result.status_message)
```

**Lua:**

```lua
local playbackStreamId = "streamId"

local callback = function(success, response)
    if success then
        print("Success")
    else
        print("Failed | " .. tostring(response.status_message))
    end
end

_bc.oneWayMatch:completeMatch(playbackStreamId, callback)
```

**Cloud Code:**

```cfscript
var playbackStreamId = "streamId";
var onewayMatchProxy = bridge.getOnewayMatchServiceProxy();

var postResult = onewayMatchProxy.completeMatch(playbackStreamId);
if (postResult.status == 200) {
    // Success!
}
```

**Raw:**

```r
{
    "service": "onewayMatch",
    "operation": "COMPLETE_MATCH",
    "data": {
        "playbackStreamId": "streamId"
    }
}
```

<details>
<summary>JSON Response</summary>

```json
{
    "status" : 200,
    "data" : null
}
```
</details>


---

<!-- source: docs/api/2_capi/onewaymatch/index.md -->
<!-- url: https://docs.braincloudservers.com/api/capi/onewaymatch -->

# One-Way Match

One-Way Offline Multiplayer is our name for Clash of Clans / Boom Beach-style multiplayer.  [And yes, we're looking for a better name – suggest one!]

In this very popular form of multiplayer, an Attacker attacks the settlement (base, camp, fort, etc.) of a Defender that is currently offline.  The Defender's settlement acts in accordance to how it's been configured – defending itself vigorously using guns, turrets, defencemen, etc. in accordance with the game's rules and the choices he/she has previously made in configuring their settlement.

The API's that work together to enable this form of multiplayer include:

- Finding an opponent to attack via MatchMaking or the Friends API
- Performing the attack using the StartMatch(), CompleteMatch() and CancelMatch() APIs described here
- Recording the events of the attack (so that they may be replayed) using the PlaybackStream API
- Finally, fixing up any opponent-related data after the match has completed (i.e. updating leaderboard positions, virtual currency balances, etc.) – using a custom cloud code script.


---

<!-- source: docs/api/2_capi/onewaymatch/startmatch.md -->
<!-- url: https://docs.braincloudservers.com/api/capi/onewaymatch/startmatch -->

# StartMatch

Starts a match.

| Service | Operation |
| ------- | --------- |
| onewayMatch | START_MATCH |

## Method Parameters

| Parameter  | Description                                                                                                                                                                                                  |
| ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| playerId   | The player to start a match with                                                                                                                                                                             |
| rangeDelta | The player rating range delta required for the match to start. If otherPlayerId has too high or low of a rating compared to the current player and range delta, a MATCH_RANGE_ERROR (40334) will be returned |

## Usage

**C#:**

```csharp
string playerId = "player";
int rangeDelta = 10;
SuccessCallback successCallback = (response, cbObject) =>
{
    Debug.Log(string.Format("Success | {0}", response));
};
FailureCallback failureCallback = (status, code, error, cbObject) =>
{
    Debug.Log(string.Format("Failed | {0}  {1}  {2}", status, code, error));
};

_bc.OnewayMatchService.StartMatch(playerId, rangeDelta, successCallback, failureCallback);
```

**C++:**

```cpp
const char *playerId = "player";
int rangeDelta = 10;
_bc->getOnewayMatchService()->startMatch(playerId, rangeDelta, this);
```

**Obj-C:**

```objectivec
NSString *playerId = @"player";
int rangeDelta = 10;
BCCompletionBlock successBlock;      // define callback
BCErrorCompletionBlock failureBlock; // define callback

[[_bc onewayMatchService] startMatch:playerId
                 rangeDelta:rangeDelta
            completionBlock:successBlock
       errorCompletionBlock:failureBlock
                   cbObject:nil];
```

**Java:**

```java
String playerId = "player";
int rangeDelta = 10;
this; // implements IServerCallback

_bc.getOnewayMatchService().startMatch(playerId, rangeDelta, this);

public void serverCallback(ServiceName serviceName, ServiceOperation serviceOperation, JSONObject jsonData)
{
    System.out.print(String.format("Success | %s", jsonData.toString()));
}
public void serverError(ServiceName serviceName, ServiceOperation serviceOperation, int statusCode, int reasonCode, String jsonError)
{
    System.out.print(String.format("Failed | %d %d %s", statusCode,  reasonCode, jsonError.toString()));
}
```

**JavaScript:**

```javascript
var playerId = "player";
var rangeDelta = 10;

_bc.onewayMatch.startMatch(playerId, rangeDelta, result =>
{
    var status = result.status;
    console.log(status + " : " + JSON.stringify(result, null, 2));
});
```

**Dart:**

```dart
var  playerId = "player";
var  rangeDelta = 10;

ServerResponse result = await _bc.onewayMatchService.startMatch(playerId:playerId, rangeDelta:rangeDelta);

if (result.statusCode == 200) {
    print("Success");
} else {
    print("Failed ${result.error['status_message'] ?? result.error}");
}
```

**Roblox:**

```lua
local playerId = "player"
local rangeDelta = 10

local callback = function(success, response)
    if success then
        print("Success")
    else
        print("Failed | " .. tostring(response.status_message))
    end
end

_bc.oneWayMatch:startMatch(playerId, rangeDelta, callback)
```

**GDScript:**

```gdscript
var player_id = "player"
var range_delta = 10

var result = await _bc.one_way_match_service.start_match(player_id, range_delta)

if result.status == 200:
	print("Success")
else:
	print("Failed: %s" % result.status_message)
```

**Lua:**

```lua
local otherPlayerId = "player"
local rangeDelta = 10

local callback = function(success, response)
    if success then
        print("Success")
    else
        print("Failed | " .. tostring(response.status_message))
    end
end

_bc.oneWayMatch:startMatch(otherPlayerId, rangeDelta, callback)
```

**Cloud Code:**

```cfscript
var playerId = "player";
var rangeDelta = 10;
var onewayMatchProxy = bridge.getOnewayMatchServiceProxy();

var postResult = onewayMatchProxy.startMatch(playerId, rangeDelta);
if (postResult.status == 200) {
    // Success!
}
```

**Raw:**

```r
{
    "service": "onewayMatch",
    "operation": "START_MATCH",
    "data": {
        "playerId": "player",
        "rangeDelta": 10
    }
}
```

<details>
<summary>JSON Response</summary>

```json
{
    "data": {
        "playbackStreamId": "860e3009-c7e7-4fd1-8c5c-cc932fd4ec4a",
        "initiatingPlayerId": "b67b2d73-1e8c-42e9-9be5-9c1879a48555",
        "targetPlayerId": "0da5ad24-2341-42f8-acb5-57aa2dd4ae94",
        "status": "STARTED",
        "summary": {},
        "initialSharedData": {
            "entities": [],
            "statistics": {}
        },
        "events": [],
        "expiryTime": 1472743059453,
        "createdAt": 1472742459459,
        "updatedAt": 1472742459459
    },
    "status": 200
}
```

</details>
