605 lines
19 KiB
JavaScript
605 lines
19 KiB
JavaScript
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(' ')
|
||
} |