betfair-sports-api
Version:
Betfair Sports API for Node
450 lines (410 loc) • 16 kB
JavaScript
// (C) 2012 Anton Zemlyanov
//
// Emulator allows test bots for "free" using real price data
//
var util = require('util');
var XMLWriter = require('xml-writer');
var betfairPrice = require('./betfair_price.js');
exports.encode = function(action, input) {
// Xml doc
var doc = new XMLWriter(false);
doc.startDocument();
if (input.soapFault) {
// SOAP Fault
encodeSoapFault(doc);
} else {
// Valid SOAP Response
encodeResponse(doc, action, input);
}
doc.endDocument();
var xml = doc.toString();
// console.log('response', xml);
return xml;
}
// fault response
function encodeSoapFault(doc) {
// Envelope
doc.startElement('soap:Envelope');
doc.writeAttribute('xmlns:soap', 'http://schemas.xmlsoap.org/soap/envelope/');
// Body
doc.startElement('soap:Body');
doc.writeAttribute('soap:encodingStyle', 'http://schemas.xmlsoap.org/soap/encoding/');
// Fault
doc.startElement('soap:Fault');
// faultcode & faultstring
doc.writeElement('faultcode', 'soap:Server');
doc.writeElement('faultstring', 'INTERNAL_ERROR');
doc.endElement(); // fault
doc.endElement(); // body
doc.endElement(); // envelope
}
// valid response
function encodeResponse(doc, action, input) {
// Envelope tag
doc.startElement('soap:Envelope');
doc.writeAttribute('xmlns:soap', 'http://schemas.xmlsoap.org/soap/envelope/');
doc.writeAttribute('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance');
doc.writeAttribute('xmlns:xsd', 'http://www.w3.org/');
doc.writeAttribute('xmlns:n2', 'http://www.betfair.com/publicapi/types/exchange/v5/');
// Body tag
doc.startElement('soap:Body');
// action tag
doc.startElement('n:' + action);
// schema is always exchange
doc.writeAttribute('xmlns:n',
"http://www.betfair.com/publicapi/v5/BFExchangeService/");
// request tag
doc.startElement('n:Result');
// header
encodeHeader(doc, input);
// errorCode
doc.startElement('errorCode').writeAttribute('xsi:type', 'n2:APIErrorEnum');
doc.text(input.errorCode);
doc.endElement();
// minorErrorCode
doc.startElement('minorErrorCode').writeAttribute('xsi:null', '1');
doc.endElement();
// request content (actual request data)
switch (action) {
case 'placeBets':
encodePlaceBets(doc, input);
break;
case 'updateBets':
encodePlaceBets(doc, input);
break;
case 'cancelBets':
encodeCancelBets(doc, input);
break;
case 'getMUBets':
encodeGetMUBets(doc, input);
break;
case 'getMarketProfitAndLoss':
encodeGetMarketProfitAndLoss(doc, input);
break;
}
doc.endElement(); // request
doc.endElement(); // action
doc.endElement(); // body
doc.endElement(); // envelope
}
// header
function encodeHeader(doc, result) {
doc.startElement('header').writeAttribute('xsi:type', 'n2:APIResponseHeader');
// errorCode
doc.startElement('errorCode').writeAttribute('xsi:type', 'n2:APIErrorEnum');
doc.text(result.header.errorCode);
doc.endElement();
// minorErrorCode
doc.startElement('minorErrorCode').writeAttribute('xsi:null', '1');
doc.endElement();
// sessionToken
doc.startElement('sessionToken').writeAttribute('xsi:type', 'xsd:string');
doc.text(result.header.sessionToken);
doc.endElement();
// timestamp
doc.startElement('timestamp').writeAttribute('xsi:type', 'xsd:dateTime');
doc.text(result.header.timestamp.toISOString());
doc.endElement();
doc.endElement(); // header
return;
}
// placeBets
function encodePlaceBets(doc, result) {
// betResults
if (!result.betResults) {
doc.startElement('betResults').writeAttribute('xsi:null', '1');
doc.endElement();
} else {
doc.startElement('betResults').writeAttribute('xsi:type',
'n2:ArrayOfPlaceBetsResult');
// encode bets
for ( var i = 0; i < result.betResults.length; ++i) {
var item = result.betResults[i];
doc.startElement('n2:PlaceBetsResult').writeAttribute('xsi:type',
'n2:PlaceBetsResult');
// averagePriceMatched
doc.startElement('averagePriceMatched').writeAttribute('xsi:type',
'xsd:double');
doc.text(item.averagePriceMatched + '');
doc.endElement();
// betId
doc.startElement('betId').writeAttribute('xsi:type', 'xsd:long');
doc.text(item.betId + '');
doc.endElement();
// resultCode
doc.startElement('resultCode').writeAttribute('xsi:type',
'n2:PlaceBetsResultEnum');
doc.text(item.resultCode);
doc.endElement();
// sizeMatched
doc.startElement('sizeMatched').writeAttribute('xsi:type', 'xsd:double');
doc.text(item.sizeMatched + '');
doc.endElement();
// success
doc.startElement('success').writeAttribute('xsi:type', 'xsd:boolean');
doc.text(item.success);
doc.endElement();
doc.endElement();
}
doc.endElement();
}
}
// updateBets
function encodeUpdateBets(doc, result) {
// betResults
if (!result.betResults) {
doc.startElement('betResults').writeAttribute('xsi:null', '1');
doc.endElement();
} else {
doc.startElement('betResults').writeAttribute('xsi:type',
'n2:ArrayOfUpdateBetsResult');
// encode bets
for ( var i = 0; i < result.betResults.length; ++i) {
var item = result.betResults[i];
doc.startElement('n2:UpdateBetsResult').writeAttribute('xsi:type',
'n2:UpdateBetsResult');
// betId
doc.startElement('betId').writeAttribute('xsi:type', 'xsd:long');
doc.text(item.betId + '');
doc.endElement();
// newBetId
doc.startElement('newBetId').writeAttribute('xsi:type', 'xsd:long');
doc.text(item.newBetId + '');
doc.endElement();
// sizeCancelled
doc.startElement('sizeCancelled').writeAttribute('xsi:type', 'xsd:double');
doc.text(item.sizeCancelled + '');
doc.endElement();
// newSize
doc.startElement('newSize').writeAttribute('xsi:type', 'xsd:double');
doc.text(item.newSize + '');
doc.endElement();
// newPrice
doc.startElement('newPrice').writeAttribute('xsi:type', 'xsd:double');
doc.text(item.newPrice + '');
doc.endElement();
// resultCode
doc.startElement('resultCode').writeAttribute('xsi:type',
'n2:UpdateBetsResultEnum');
doc.text(item.resultCode);
doc.endElement();
// success
doc.startElement('success').writeAttribute('xsi:type', 'xsd:boolean');
doc.text(item.success);
doc.endElement();
doc.endElement();
}
doc.endElement();
}
}
// cancelBets
function encodeCancelBets(doc, result) {
console.log(result);
// betResults
if (!result.betResults) {
doc.startElement('betResults').writeAttribute('xsi:null', '1');
doc.endElement();
} else {
doc.startElement('betResults').writeAttribute('xsi:type',
'n2:ArrayOfCancelBetsResult');
// encode bets
for ( var i = 0; i < result.betResults.length; ++i) {
var item = result.betResults[i];
doc.startElement('n2:CancelBetsResult').writeAttribute('xsi:type',
'n2:CancelBetsResult');
// betId
doc.startElement('betId').writeAttribute('xsi:type', 'xsd:long');
doc.text(item.betId + '');
doc.endElement();
// resultCode
doc.startElement('resultCode').writeAttribute('xsi:type',
'n2:CancelBetsResultEnum');
doc.text(item.resultCode);
doc.endElement();
// sizeCancelled
doc.startElement('sizeCancelled').writeAttribute('xsi:type', 'xsd:double');
doc.text(item.sizeCancelled + '');
doc.endElement();
// sizeMatched
doc.startElement('sizeMatched').writeAttribute('xsi:type', 'xsd:double');
doc.text(item.sizeMatched + '');
doc.endElement();
// success
doc.startElement('success').writeAttribute('xsi:type', 'xsd:boolean');
doc.text(item.success);
doc.endElement();
doc.endElement();
}
doc.endElement();
}
}
// getMUBets
function encodeGetMUBets(doc, result) {
// betResults
if (!result.bets) {
// bets
doc.startElement('bets').writeAttribute('xsi:null', '1');
doc.endElement();
// totalRecordCount
doc.startElement('totalRecordCount').writeAttribute('xsi:type', 'xsd:integer');
doc.text('0');
doc.endElement();
} else {
// bets
doc.startElement('bets').writeAttribute('xsi:type', 'n2:ArrayOfMUBet ');
for ( var i = 0; i < result.bets.length; ++i) {
var item = result.bets[i];
doc.startElement('n2:MUBet').writeAttribute('xsi:type', 'n2:MUBet');
// asianLineId
doc.startElement('asianLineId').writeAttribute('xsi:type', 'xsd:integer');
doc.text(item.asianLineId + '');
doc.endElement();
// betCategoryType
doc.startElement('betCategoryType').writeAttribute('xsi:type',
'n2:BetCategoryTypeEnum');
doc.text(item.betCategoryType);
doc.endElement();
// betId
doc.startElement('betId').writeAttribute('xsi:type', 'xsd:long');
doc.text(item.betId + '');
doc.endElement();
// betPersistenceType
doc.startElement('betPersistenceType').writeAttribute('xsi:type',
'n2:BetPersistenceTypeEnum');
doc.text(item.betPersistenceType);
doc.endElement();
// betStatus
doc.startElement('betStatus').writeAttribute('xsi:type', 'n2:BetStatusEnum');
doc.text(item.betStatus);
doc.endElement();
// betType
doc.startElement('betType').writeAttribute('xsi:type', 'n2:BetTypeEnum');
doc.text(item.betType);
doc.endElement();
// bspLiability
doc.startElement('bspLiability').writeAttribute('xsi:type', 'xsd:double');
doc.text(item.bspLiability);
doc.endElement();
// handicap
doc.startElement('handicap').writeAttribute('xsi:type', 'xsd:double');
doc.text('0.0');
doc.endElement();
// marketId
doc.startElement('marketId').writeAttribute('xsi:type', 'xsd:integer');
doc.text(item.marketId);
doc.endElement();
// matchedDate
if (!item.matchedDate) {
doc.startElement('matchedDate').writeAttribute('xsi:null', '');
doc.endElement();
} else {
doc.startElement('matchedDate')
.writeAttribute('xsi:type', 'xsd:dateTime');
doc.text(item.matchedDate.toISOString());
doc.endElement();
}
// placedDate
doc.startElement('placedDate').writeAttribute('xsi:type', 'xsd:dateTime');
doc.text(item.placedDate.toISOString());
doc.endElement();
// price
var price = betfairPrice.newBetfairPrice(item.price);
doc.startElement('price').writeAttribute('xsi:type', 'xsd:double');
doc.text(price.toString());
doc.endElement();
// selectionId
doc.startElement('selectionId').writeAttribute('xsi:type', 'xsd:double');
doc.text(item.selectionId);
doc.endElement();
// size
doc.startElement('size').writeAttribute('xsi:type', 'xsd:double');
doc.text((1 * item.size).toFixed(2));
doc.endElement();
// transactionId
doc.startElement('transactionId').writeAttribute('xsi:type', 'xsd:long');
doc.text(item.transactionId + '');
doc.endElement();
doc.endElement();
}
doc.endElement();
// totalRecordCount
doc.startElement('totalRecordCount').writeAttribute('xsi:type', 'xsd:integer');
doc.text(result.bets.length + '');
doc.endElement();
}
}
// getMarketProfitAndLoss
function encodeGetMarketProfitAndLoss(doc, result) {
// annotations
if (!result.annotations) {
// bets
doc.startElement('annotations').writeAttribute('xsi:null', '1');
doc.endElement();
} else {
doc.startElement('annotations').writeAttribute('xsi:type',
'n2:ArrayOfProfitAndLoss');
for ( var i = 0; i < result.annotations.length; ++i) {
var ann = result.annotations[i];
doc.startElement('n2:ProfitAndLoss').writeAttribute('xsi:type',
'n2:ProfitAndLoss');
// futureIfWin
doc.startElement('futureIfWin').writeAttribute('xsi:type', 'xsd:double');
doc.text(ann.futureIfWin + '');
doc.endElement();
// ifWin
doc.startElement('ifWin').writeAttribute('xsi:type', 'xsd:double');
doc.text((1 * ann.ifWin).toFixed(2));
doc.endElement();
// selectionID
doc.startElement('selectionId').writeAttribute('xsi:type', 'xsd:integer');
doc.text(ann.selectionId);
doc.endElement();
// selectionName
doc.startElement('selectionName').writeAttribute('xsi:type', 'xsd:string');
doc.text(ann.selectionName);
doc.endElement();
// worstCaseIfWin
doc.startElement('worstCaseIfWin').writeAttribute('xsi:type', 'xsd:double');
doc.text(ann.worstCaseIfWin + '');
doc.endElement();
// ifLoss
doc.startElement('ifLoss').writeAttribute('xsi:type', 'xsd:double');
doc.text((1 * ann.ifLoss).toFixed(2));
doc.endElement();
doc.endElement();
}
doc.endElement();
}
// commissionApplied
doc.startElement('commissionApplied').writeAttribute('xsi:type', 'xsd:double');
doc.text(result.commissionApplied + '');
doc.endElement();
// currencyCode
doc.startElement('currencyCode').writeAttribute('xsi:type', 'xsd:string');
doc.text(result.currencyCode);
doc.endElement();
// includesSettledBets
doc.startElement('includesSettledBets').writeAttribute('xsi:type', 'xsd:booleang');
doc.text(result.includesSettledBets ? "true" : "false");
doc.endElement();
// includesBspBets
doc.startElement('includesBspBets').writeAttribute('xsi:type', 'xsd:booleang');
doc.text(result.includesBspBets ? "true" : "false");
doc.endElement();
// marketId
doc.startElement('marketId').writeAttribute('xsi:type', 'xsd:integer');
doc.text(result.marketId);
doc.endElement();
// marketName
doc.startElement('marketName').writeAttribute('xsi:type', 'xsd:string');
doc.text(result.marketName);
doc.endElement();
// marketStatus
doc.startElement('marketStatus').writeAttribute('xsi:type', 'n2:MarketStatusEnum');
doc.text(result.marketStatus);
doc.endElement();
// unit
doc.startElement('unit').writeAttribute('xsi:type', 'xsd:string');
doc.text(result.unit || 'N/A');
doc.endElement();
}