Files
tipper/static/tipper.js
2026-07-21 05:29:37 +03:00

790 lines
21 KiB
JavaScript
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
let u = new URL(location.href)
urlPrivateAPI = u.origin + '/api'
api = new API({
url: urlPrivateAPI,
timeout: 10000, // 10 sec
})
Football = 1
Handball = 2
flashscoreWsURL = 'ws://195.189.227.88:5757/ws'
onexbetWsURL = 'ws://195.189.227.88:5758/ws'
tipperWsURL = 'ws://195.189.227.88:5759/ws'
document.addEventListener('DOMContentLoaded', ()=> {
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
},
})
spa = new ListModel({
template: {
id: 'report',
},
container: 'spa',
preFunc: modifyReport,
})
spa2 = new ListModel({
template: {
id: 'report',
},
container: 'spa2',
preFunc: modifyReport,
})
eng = new ListModel({
template: {
id: 'report',
},
container: 'eng',
preFunc: modifyReport,
})
eng2 = new ListModel({
template: {
id: 'report',
},
container: 'eng2',
preFunc: modifyReport,
})
ger = new ListModel({
template: {
id: 'report',
},
container: 'ger',
preFunc: modifyReport,
})
ita = new ListModel({
template: {
id: 'report',
},
container: 'ita',
preFunc: modifyReport,
})
ita2 = new ListModel({
template: {
id: 'report',
},
container: 'ita2',
preFunc: modifyReport,
})
por = new ListModel({
template: {
id: 'report',
},
container: 'por',
preFunc: modifyReport,
})
ukr = new ListModel({
template: {
id: 'report',
},
container: 'ukr',
preFunc: modifyReport,
})
swi = new ListModel({
template: {
id: 'report',
},
container: 'swi',
preFunc: modifyReport,
})
tur = new ListModel({
template: {
id: 'report',
},
container: 'tur',
preFunc: modifyReport,
})
rus = new ListModel({
template: {
id: 'report',
},
container: 'rus',
preFunc: modifyReport,
})
rom = new ListModel({
template: {
id: 'report',
},
container: 'rom',
preFunc: modifyReport,
})
mon = new ListModel({
template: {
id: 'report',
},
container: 'mon',
preFunc: modifyReport,
})
bel = new ListModel({
template: {
id: 'report',
},
container: 'bel',
preFunc: modifyReport,
})
gre = new ListModel({
template: {
id: 'report',
},
container: 'gre',
preFunc: modifyReport,
})
che = new ListModel({
template: {
id: 'report',
},
container: 'che',
preFunc: modifyReport,
})
cro = new ListModel({
template: {
id: 'report',
},
container: 'cro',
preFunc: modifyReport,
})
den = new ListModel({
template: {
id: 'report',
},
container: 'den',
preFunc: modifyReport,
})
/*
= new ListModel({
template: {
id: 'report',
},
container: '',
preFunc: modifyReport,
})
= new ListModel({
template: {
id: 'report',
},
container: '',
preFunc: modifyReport,
})
= new ListModel({
template: {
id: 'report',
},
container: '',
preFunc: modifyReport,
})
= new ListModel({
template: {
id: 'report',
},
container: '',
preFunc: modifyReport,
})
*/
//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')
}
}
}
},
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
},
})
// flashscore
let ws = new WebsocketClient({
//url: 'ws://localhost:5757/ws'
//url: 'ws://167.99.157.181:5757/ws'
url: flashscoreWsURL
})
//ws.onconnected =
ws.handle('footballChamps', resp => {
console.log('champs:', resp)
if (Array.isArray(resp.Champs)) {
//console.log('array')
resp.Champs.forEach(champ => {
console.log(champ)
updateChamp(champ)
})
}
})
ws.handle('footballMatchReports', resp => {
console.log('reports:', resp)
if (resp) {
updateChamp(resp)
}
})
interesting = new ListModel({
template: {
id: 'interestingMatch',
renders: {
interestingMatch: (tags, match) => {
let radios = new RadioList({
container: tags.candidates,
templateId: 'candidate-item',
setEmptyMessage: 'нет матчей кандидатов'
})
tags.search.addEventListener('click', () => {
let teamName = tags.teamName.value.trim()
if (teamName == '') {
return
}
api.req({
func: 'searchMatchCandidatesByTeamName',
data: {
sportID: Football,
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
}
api.req({
func: 'addTeamsAliases',
data: {
home: {
teamID: match.home.teamID,
name: candidate.home
},
away: {
teamID: match.away.teamID,
name: candidate.away
}
},
onError: err => {
//tags.candidates.textContent = 'FUCK: ' + err
console.log(err)
},
onSuccess: resp => {
//console.log('ok')
//tags.identification.click()
radios.clear()
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: Football,
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
}
})
// 1xbet
let onexbetWs = new WebsocketClient({
//url: 'ws://localhost:5758/ws'
//url: 'ws://167.99.157.181:5758/ws'
url: onexbetWsURL
})
onexbetWs.handle('liveMatches', resp => {
console.log('liveMatches:', resp)
if (Array.isArray(resp.matches)) {
bookLiveModel.setList(resp.matches)
}
})
onexbetWs.handle('liveMatchesUpdate', resp => {
//console.log('liveMatchesUpdate:', resp)
let list = bookLiveModel.getList()
let removeMap = {}
if (resp.removedMatchIDs) {
resp.removedMatchIDs.forEach(matchID => {
removeMap[matchID] = true
})
}
let newList = []
list.forEach(old => {
if (removeMap[old.matchID] === true) {
return
} else {
newList.push(old)
}
})
if (Array.isArray(resp.addedMatches)) {
resp.addedMatches.forEach(newMatch => {
newList.push(newMatch)
})
}
bookLiveModel.setList(newList)
})
onexbetWs.handle('footballLiveMatchData', resp => {
//console.log('footballLiveMatchData:', resp)
})
// tipper
let tipperWs = new WebsocketClient({
// url: 'ws://localhost:5759/ws'
// url: 'ws://167.99.157.181:5759/ws'
url: tipperWsURL
})
tipperWs.handle('interestingFootballMatches', resp => {
console.log('interesting matches:', resp)
if (Array.isArray(resp.matches)) {
interesting.setList(resp.matches)
}
})
tipperWs.handle('tipsChanged', resp => {
//console.log('tip:', resp)
//tipModel.add(resp)
api.req({
func: 'listTips',
onSuccess: resp => {
tipModel.setList(resp)
}
})
api.req({
func: 'listStrategiesReports',
onSuccess: resp => {
strategiesModel.setList(resp)
showTotal(resp)
}
})
})
/*
ws.handle('footballMatchReports', resp => {
console.log('reports:', resp)
updateChamp(resp)
})
*/
ws.connect()
onexbetWs.connect()
tipperWs.connect()
api.req({
func: 'listTips',
onSuccess: resp => {
tipModel.setList(resp)
}
})
api.req({
func: 'listStrategiesReports',
onSuccess: resp => {
strategiesModel.setList(resp)
showTotal(resp)
}
})
})
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(1, allChampsTotal)
m.set(2, allChampsTotal)
m.set(3, allChampsTotal)
/*
m.set(11, topChampsTotal)
m.set(22, topChampsTotal)
m.set(33, topChampsTotal)
m.set(701, myTotal)
m.set(702, myTotal)
m.set(703, myTotal)
*/
let total = 0
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 updateChamp(champ) {
if (!champ.Champ) {
return
}
let lastSync = moment(champ.LastSync * 1000).format("MMM DD, HH:mm:ss")
switch (champ.Champ.champID) {
case "/england/premier-league":
document.getElementById('engLastSync').textContent = lastSync
eng.setList(champ.Reports)
break
case "/germany/bundesliga":
document.getElementById('gerLastSync').textContent = lastSync
ger.setList(champ.Reports)
break
case "/italy/serie-a":
document.getElementById('itaLastSync').textContent = lastSync
ita.setList(champ.Reports)
break
case "/spain/laliga":
document.getElementById('spaLastSync').textContent = lastSync
spa.setList(champ.Reports)
break
case "/ukraine/premier-league":
document.getElementById('ukrLastSync').textContent = lastSync
ukr.setList(champ.Reports)
break
case "/portugal/primeira-liga":
document.getElementById('porLastSync').textContent = lastSync
por.setList(champ.Reports)
break
case "/switzerland/super-league":
document.getElementById('swiLastSync').textContent = lastSync
swi.setList(champ.Reports)
break
case "/turkey/super-lig":
document.getElementById('turLastSync').textContent = lastSync
tur.setList(champ.Reports)
break
case "/russia/premier-league":
document.getElementById('rusLastSync').textContent = lastSync
rus.setList(champ.Reports)
break
case "/belarus/vysshaya-liga":
document.getElementById('belLastSync').textContent = lastSync
bel.setList(champ.Reports)
break
case "/greece/super-league":
document.getElementById('greLastSync').textContent = lastSync
gre.setList(champ.Reports)
break
case "/montenegro/prva-crnogorska-liga":
document.getElementById('monLastSync').textContent = lastSync
mon.setList(champ.Reports)
break
case "/romania/liga-1":
document.getElementById('romLastSync').textContent = lastSync
rom.setList(champ.Reports)
break
case "/croatia/1-hnl":
document.getElementById('croLastSync').textContent = lastSync
cro.setList(champ.Reports)
break
case "/czech-republic/1-liga":
document.getElementById('cheLastSync').textContent = lastSync
che.setList(champ.Reports)
break
case "/denmark/superliga":
document.getElementById('denLastSync').textContent = lastSync
den.setList(champ.Reports)
break
case "/england/championship":
document.getElementById('eng2LastSync').textContent = lastSync
eng2.setList(champ.Reports)
break
case "/italy/serie-b":
document.getElementById('ita2LastSync').textContent = lastSync
ita2.setList(champ.Reports)
break
case "/spain/laliga2":
document.getElementById('spa2LastSync').textContent = lastSync
spa2.setList(champ.Reports)
break
}
}
function modifyReport(report) {
report.match = `${report.Home.canonicalName} - ${report.Away.canonicalName}`
report.msg = JSON.stringify(report, null, 3)
}
function modifyInterestingMatch(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.notes, 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)
}