1st
This commit is contained in:
605
static/tennis.js
Normal file
605
static/tennis.js
Normal file
@@ -0,0 +1,605 @@
|
||||
let u = new URL(location.href)
|
||||
urlPrivateAPI = u.origin + '/api'
|
||||
|
||||
api = new API({
|
||||
url: urlPrivateAPI,
|
||||
timeout: 10000, // 10 sec
|
||||
})
|
||||
|
||||
Football = 1
|
||||
Handball = 2
|
||||
Tennis = 3
|
||||
|
||||
OnexbetFootball = 1
|
||||
OnexbetHandball = 8
|
||||
OnexbetTennis = 4
|
||||
|
||||
onexbetWsURL = 'ws://195.189.227.88:7772/ws'
|
||||
tipperWsURL = 'ws://195.189.227.88:7768/ws'
|
||||
|
||||
document.addEventListener('DOMContentLoaded', ()=> {
|
||||
interesting = new ListModel({
|
||||
template: {
|
||||
id: 'interestingMatch',
|
||||
renders: {
|
||||
interestingMatch: (tags, match) => {
|
||||
//console.log('render', match)
|
||||
let radios = new RadioList({
|
||||
container: tags.candidates,
|
||||
templateId: 'candidate-item',
|
||||
setEmptyMessage: 'нет матчей кандидатов'
|
||||
})
|
||||
|
||||
tags.flashscoreLink.href= `https://www.flashscore.com/match/${match.matchID}/#match-summary/match-summary`
|
||||
|
||||
tags.search.addEventListener('click', () => {
|
||||
let teamName = tags.teamName.value.trim()
|
||||
|
||||
if (teamName == '') {
|
||||
return
|
||||
}
|
||||
|
||||
api.req({
|
||||
func: 'searchMatchCandidatesByTeamName',
|
||||
data: {
|
||||
sportID: Tennis,
|
||||
teamName: teamName,
|
||||
},
|
||||
onError: err => {
|
||||
console.log(err)
|
||||
tags.candidates.textContent = "FUCK: " + err
|
||||
},
|
||||
onSuccess: resp => {
|
||||
tags.submit.disabled = false
|
||||
radios.clear()
|
||||
|
||||
console.log(resp)
|
||||
if (Array.isArray(resp)) {
|
||||
resp.forEach(candidate => {
|
||||
candidate.startTimeStr = moment(candidate.startTime * 1000).format("MMM DD, HH:mm:ss")
|
||||
})
|
||||
}
|
||||
// show model + form
|
||||
radios.setList(resp)
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
tags.submit.addEventListener('click', () => {
|
||||
//console.log(radios.getSelected())
|
||||
let candidate = radios.getSelected()
|
||||
if (!candidate) {
|
||||
return
|
||||
}
|
||||
|
||||
let isReverse = tags.isReverse.checked
|
||||
|
||||
var home, away;
|
||||
|
||||
if (isReverse) {
|
||||
home = {
|
||||
teamID: match.home.teamID,
|
||||
name: candidate.away
|
||||
}
|
||||
away = {
|
||||
teamID: match.away.teamID,
|
||||
name: candidate.home
|
||||
}
|
||||
} else {
|
||||
home = {
|
||||
teamID: match.home.teamID,
|
||||
name: candidate.home
|
||||
}
|
||||
away = {
|
||||
teamID: match.away.teamID,
|
||||
name: candidate.away
|
||||
}
|
||||
}
|
||||
|
||||
console.log('home:', home);
|
||||
console.log('away:', away);
|
||||
|
||||
api.req({
|
||||
func: 'addTeamsAliases',
|
||||
data: {
|
||||
home: home,
|
||||
away: away
|
||||
},
|
||||
onError: err => {
|
||||
//tags.candidates.textContent = 'FUCK: ' + err
|
||||
console.log(err)
|
||||
},
|
||||
onSuccess: resp => {
|
||||
//console.log('ok')
|
||||
//tags.identification.click()
|
||||
radios.clear()
|
||||
tags.isReverse.checked = false
|
||||
tags.candidates.textContent = "Алиасы добавлены!"
|
||||
tags.submit.disabled = true
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
tags.identification.addEventListener('click', () => {
|
||||
//console.log('details:', tags.identification.open)
|
||||
//console.log(match)
|
||||
if (tags.identification.open) {
|
||||
//tags.candidates.innerHTML = ''
|
||||
} else {
|
||||
//tags.candidates.innerHTML = ''
|
||||
radios.clear()
|
||||
|
||||
//radios.setList([
|
||||
// {home: 'Arsenal', away: 'Mancity', sport: 'Football', champName: 'England. Premier League', startTimeStr: "Oct 06, 12:30:00"},
|
||||
// {home: 'Arsenal', away: 'Aston villa', sport: 'Football', champName: 'England. Premier League', startTimeStr: "Oct 06, 12:30:00"},
|
||||
//])
|
||||
|
||||
//tags.candidates.textContent = JSON.stringify(match)
|
||||
|
||||
api.req({
|
||||
func: 'searchMatchCandidates',
|
||||
data: {
|
||||
sportID: Tennis,
|
||||
home: match.home.canonicalName,
|
||||
away: match.away.canonicalName
|
||||
},
|
||||
onError: err => {
|
||||
console.log(err)
|
||||
tags.candidates.textContent = "FUCK: " + err
|
||||
},
|
||||
onSuccess: resp => {
|
||||
tags.submit.disabled = false
|
||||
console.log(resp)
|
||||
if (Array.isArray(resp)) {
|
||||
resp.forEach(candidate => {
|
||||
candidate.startTimeStr = moment(candidate.startTime * 1000).format("MMM DD, HH:mm:ss")
|
||||
})
|
||||
}
|
||||
// show model + form
|
||||
radios.setList(resp)
|
||||
}
|
||||
})
|
||||
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
},
|
||||
container: 'interesting',
|
||||
preFunc: modifyInterestingMatch,
|
||||
sort: {
|
||||
key: 'startTime',
|
||||
reverse: true
|
||||
}
|
||||
})
|
||||
|
||||
// ONEXBET
|
||||
|
||||
//1xbet
|
||||
bookLiveModel = new ListModel({
|
||||
template: {
|
||||
id: 'liveMatch',
|
||||
},
|
||||
container: 'book-live',
|
||||
preFunc: modifyLiveMatch,
|
||||
sort: {
|
||||
key: 'startTime',
|
||||
reverse: true
|
||||
}
|
||||
})
|
||||
|
||||
// tips
|
||||
|
||||
tipModel = new ListModel({
|
||||
template: {
|
||||
id: 'tip',
|
||||
renders: {
|
||||
tip: (tags, tip) => {
|
||||
//console.log('tags:', tags)
|
||||
//console.log('x:', x)
|
||||
if (tip.status == 1) {
|
||||
tags.matchName.classList.add('profit')
|
||||
} else if (tip.status == 2) {
|
||||
tags.matchName.classList.add('errmsg')
|
||||
} else if (tip.status == 3) {
|
||||
tags.matchName.classList.add('void')
|
||||
}
|
||||
|
||||
tags.flashscoreLink.href= `https://www.flashscore.com/match/${tip.matchID}/#match-summary/match-summary`
|
||||
|
||||
tags.setResultLink.addEventListener('click', () => {
|
||||
if (tags.setResultForm.hidden) {
|
||||
let f = new Form({
|
||||
formContainer: tags.setResultForm,
|
||||
schema: [
|
||||
{
|
||||
name: 'result',
|
||||
type: 'line',
|
||||
label: 'Результат',
|
||||
comment: 'например, 1й тайм: 1:1'
|
||||
},
|
||||
{
|
||||
name: 'status',
|
||||
type: 'radios',
|
||||
label: ' ',
|
||||
getName: x => x.name,
|
||||
data: [
|
||||
{name: 'Выигрыш', status: 1},
|
||||
{name: 'Проигрыш', status: 2},
|
||||
{name: 'Возврат', status: 3},
|
||||
]
|
||||
},
|
||||
]
|
||||
})
|
||||
|
||||
f.onSubmit((obj) => {
|
||||
obj.tipID = tip.tipID
|
||||
//console.log(obj)
|
||||
api.req({
|
||||
func: 'setTipResult',
|
||||
data: obj,
|
||||
onError: err => {
|
||||
f.showError(err)
|
||||
},
|
||||
onSuccess: () => {
|
||||
// Перезагружаем список
|
||||
api.req({
|
||||
func: 'listSportTips',
|
||||
data: Tennis,
|
||||
onSuccess: resp => {
|
||||
tipModel.setList(resp)
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
f.init()
|
||||
|
||||
tags.setResultForm.hidden = false
|
||||
} else {
|
||||
tags.setResultForm.hidden = true
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
},
|
||||
container: 'tips',
|
||||
preFunc: modifyTip,
|
||||
sort: {
|
||||
key: 'tipTime',
|
||||
//reverse: true
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
// strategies
|
||||
|
||||
strategiesModel = new ListModel({
|
||||
template: {
|
||||
id: 'strategy',
|
||||
},
|
||||
container: 'strategies',
|
||||
preFunc: (r) => {
|
||||
r.roi = Math.round(r.roi*100)/100
|
||||
r.profit = Math.round(r.profit*100)/100
|
||||
r.drawdown = Math.round(r.drawdown*100)/100
|
||||
r.accuracy = Math.round(r.accuracy*100)/100
|
||||
},
|
||||
})
|
||||
|
||||
totalsModel = new ListModel({
|
||||
template: {
|
||||
id: 'total',
|
||||
},
|
||||
container: 'totals',
|
||||
preFunc: (r) => {
|
||||
r.roi = Math.round(r.roi*100)/100
|
||||
r.profit = Math.round(r.profit*100)/100
|
||||
r.drawdown = Math.round(r.drawdown*100)/100
|
||||
r.accuracy = Math.round(r.accuracy*100)/100
|
||||
},
|
||||
})
|
||||
|
||||
|
||||
|
||||
let onexbetWs = new WebsocketClient({
|
||||
url: onexbetWsURL
|
||||
})
|
||||
|
||||
onexbetWs.handle('liveMatches', resp => {
|
||||
//console.log('liveMatches:', resp)
|
||||
|
||||
if (resp.sportID == OnexbetTennis) {
|
||||
if (Array.isArray(resp.matches)) {
|
||||
bookLiveModel.setList(resp.matches)
|
||||
|
||||
resp.matches.forEach(match => {
|
||||
//console.log('partialUpdateBy')
|
||||
interesting.partialUpdateBy(
|
||||
// update func
|
||||
(tags, obj) => {
|
||||
//console.log('SCORE: ', tennisScoreToString(match.scoreByPeriods))
|
||||
tags.livescore.textContent = tennisScoreToString(match.scoreByPeriods)
|
||||
tags.livescore.hidden = false
|
||||
},
|
||||
// key func
|
||||
(obj) => {
|
||||
//console.log('COMPARE:', obj.onexbetMatchID, '=', match.matchID)
|
||||
if (obj.onexbetMatchID == match.matchID) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
)
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
onexbetWs.handle('teamLiveMatchData', resp => {
|
||||
//console.log('teamLiveMatchData:', resp)
|
||||
})
|
||||
|
||||
|
||||
// tipper
|
||||
let tipperWs = new WebsocketClient({
|
||||
url: tipperWsURL
|
||||
})
|
||||
|
||||
tipperWs.onConnected = () => {
|
||||
tipperWs.send('subscribe', {channels: ['tennis']})
|
||||
}
|
||||
|
||||
tipperWs.handle('teamMatches', resp => {
|
||||
//console.log('reports:', resp)
|
||||
if (resp.sportID == Tennis) {
|
||||
if (Array.isArray(resp.matches)) {
|
||||
//console.log('set interesting:', resp.matches)
|
||||
interesting.setList(resp.matches)
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
tipperWs.handle('tipsChanged', resp => {
|
||||
//console.log('tip:', resp)
|
||||
|
||||
//tipModel.add(resp)
|
||||
|
||||
api.req({
|
||||
func: 'listSportTips',
|
||||
data: Tennis,
|
||||
onSuccess: resp => {
|
||||
tipModel.setList(resp)
|
||||
}
|
||||
})
|
||||
|
||||
api.req({
|
||||
func: 'listStrategiesReports',
|
||||
data: Tennis,
|
||||
onSuccess: resp => {
|
||||
strategiesModel.setList(filterStrategies(resp))
|
||||
showTotal(resp)
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
tipperWs.handle('whyNot', resp => {
|
||||
//console.log('whyNot:', resp.matchID, resp.comment)
|
||||
interesting.partialUpdateBy(
|
||||
(tags, obj) => {
|
||||
tags.comment.innerHTML = resp.comment
|
||||
tags.time.textContent = resp.time
|
||||
tags.score.textContent = `${resp.homeGoals} - ${resp.awayGoals}`
|
||||
//tags.gamePace.textContent = resp.gamePace
|
||||
//tags.gamePaceFrame.textContent = resp.gamePaceFrame + 1
|
||||
},
|
||||
(obj) => {
|
||||
if (obj.matchID == resp.matchID) {
|
||||
return true
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
tipperWs.handle('inplayStatusChanged', resp => {
|
||||
//console.log('inplayStatusChanged:', resp)
|
||||
interesting.partialUpdateBy(
|
||||
(tags, obj) => {
|
||||
if (resp.isInplay) {
|
||||
tags.isInplay.textContent = 'inplay'
|
||||
} else {
|
||||
tags.isInplay.textContent = ''
|
||||
}
|
||||
|
||||
if (resp.isLinkedToOnexbet) {
|
||||
tags.isLinked.textContent = 'linked to 1xBet'
|
||||
} else {
|
||||
tags.isLinked.textContent = ''
|
||||
}
|
||||
},
|
||||
(obj) => {
|
||||
if (obj.matchID == resp.matchID) {
|
||||
return true
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
|
||||
/*
|
||||
ws.handle('footballMatchReports', resp => {
|
||||
console.log('reports:', resp)
|
||||
updateChamp(resp)
|
||||
})
|
||||
*/
|
||||
|
||||
api.req({
|
||||
func: 'listSportTips',
|
||||
data: Tennis,
|
||||
onSuccess: resp => {
|
||||
tipModel.setList(resp)
|
||||
}
|
||||
})
|
||||
|
||||
api.req({
|
||||
func: 'listStrategiesReports',
|
||||
data: Tennis,
|
||||
onSuccess: resp => {
|
||||
strategiesModel.setList(filterStrategies(resp))
|
||||
showTotal(resp)
|
||||
}
|
||||
})
|
||||
|
||||
onexbetWs.connect()
|
||||
tipperWs.connect()
|
||||
|
||||
})
|
||||
|
||||
|
||||
function showTotal(reports) {
|
||||
// 1,2,3
|
||||
let allChampsTotal = {
|
||||
name: 'Все чемпионаты',
|
||||
wonTips: 0,
|
||||
lostTips: 0,
|
||||
accuracy: 0,
|
||||
profit: 0,
|
||||
turnover: 0,
|
||||
roi: 0
|
||||
}
|
||||
/*
|
||||
let topChampsTotal = {
|
||||
name: 'Топ чемпионаты',
|
||||
wonTips: 0,
|
||||
lostTips: 0,
|
||||
accuracy: 0,
|
||||
profit: 0,
|
||||
turnover: 0,
|
||||
roi: 0
|
||||
}
|
||||
|
||||
let myTotal = {
|
||||
name: 'Алгоритмы от Программиста',
|
||||
wonTips: 0,
|
||||
lostTips: 0,
|
||||
accuracy: 0,
|
||||
profit: 0,
|
||||
turnover: 0,
|
||||
roi: 0
|
||||
}
|
||||
*/
|
||||
let m = new Map()
|
||||
|
||||
m.set(15, allChampsTotal)
|
||||
m.set(16, allChampsTotal)
|
||||
m.set(17, allChampsTotal)
|
||||
m.set(18, allChampsTotal)
|
||||
|
||||
if (Array.isArray(reports)) {
|
||||
reports.forEach(r => {
|
||||
let total = m.get(r.strategyID)
|
||||
if (!total) {
|
||||
return
|
||||
}
|
||||
|
||||
total.wonTips += r.wonTips
|
||||
total.lostTips += r.lostTips
|
||||
total.profit += r.profit
|
||||
total.turnover += r.turnover
|
||||
})
|
||||
}
|
||||
|
||||
clacROIandAccuracy(allChampsTotal)
|
||||
//clacROIandAccuracy(topChampsTotal)
|
||||
//clacROIandAccuracy(myTotal)
|
||||
|
||||
|
||||
//totalsModel.setList([allChampsTotal, topChampsTotal, myTotal])
|
||||
totalsModel.setList([allChampsTotal])
|
||||
|
||||
//document.getElementById('total').textContent = 'Общий итог: ' + total + ' грн'
|
||||
}
|
||||
|
||||
function clacROIandAccuracy(total) {
|
||||
total.roi = (total.profit * 100) / total.turnover
|
||||
total.accuracy = (total.wonTips * 100) / (total.wonTips + total.lostTips)
|
||||
|
||||
//total.roi = Math.round(total.roi*100)/100
|
||||
//total.accuracy = Math.round(total.accuracy*100)/100
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
function modifyReport(report) {
|
||||
report.match = `${report.home.canonicalName} - ${report.away.canonicalName}`
|
||||
report.msg = JSON.stringify(report, null, 3)
|
||||
}
|
||||
|
||||
|
||||
function modifyInterestingMatch(report) {
|
||||
//console.log(report)
|
||||
|
||||
report.champName = `${report.zone.name}. ${report.champ.name}`
|
||||
report.startTimeStr = moment(report.startTime * 1000).format("MMM DD, HH:mm:ss")
|
||||
let home = report.home.canonicalName
|
||||
if (!report.home.wasLinked) {
|
||||
home = '*' + home
|
||||
}
|
||||
let away = report.away.canonicalName
|
||||
if (!report.away.wasLinked) {
|
||||
away = '*' + away
|
||||
}
|
||||
report.match = `${home} - ${away}`
|
||||
if (report.isLinkedToOnexbet) {
|
||||
report.isLinked = 'linked to 1xBet'
|
||||
}
|
||||
if (report.isInplay) {
|
||||
report.isInplay = 'inplay'
|
||||
} else {
|
||||
report.isInplay = ''
|
||||
}
|
||||
report.notes = JSON.stringify(report, null, 3)
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
function modifyLiveMatch(report) {
|
||||
if (!report.match) {
|
||||
report.champName = `${report.sportName}. ${report.champName}`
|
||||
}
|
||||
report.startTimeStr = moment(report.startTime * 1000).format("MMM DD, HH:mm:ss")
|
||||
report.match = `${report.home} - ${report.away}`
|
||||
}
|
||||
|
||||
function modifyTip(report) {
|
||||
report.msg = JSON.stringify(report, null, 3)
|
||||
}
|
||||
|
||||
function filterStrategies(src) {
|
||||
let list = []
|
||||
if (Array.isArray(src)) {
|
||||
src.forEach(s => {
|
||||
list.push(s)
|
||||
})
|
||||
}
|
||||
return list
|
||||
}
|
||||
|
||||
function tennisScoreToString(scoreByPeriods) {
|
||||
if (!scoreByPeriods) {
|
||||
return ''
|
||||
}
|
||||
|
||||
let list = []
|
||||
|
||||
for (var i=1; i <= 5; i++) {
|
||||
let p = scoreByPeriods[i]
|
||||
if (p) {
|
||||
list.push(`${p.home}:${p.away}`)
|
||||
} else {
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
return list.join(' ')
|
||||
}
|
||||
Reference in New Issue
Block a user