Skip to content
This repository has been archived by the owner on Sep 3, 2019. It is now read-only.

Commit

Permalink
Merge pull request #15 from bayo-jsc/elo
Browse files Browse the repository at this point in the history
Elo
  • Loading branch information
theanht1 authored Jun 22, 2017
2 parents f6a963d + cca643f commit 4ce401b
Show file tree
Hide file tree
Showing 13 changed files with 364 additions and 83 deletions.
8 changes: 8 additions & 0 deletions gulpfile.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,12 @@ gulp.task('default', () => {
.pipe(uglify())
.pipe(concat('draw.min.js'))
.pipe(gulp.dest('static/js'))

gulp.src('static/js/elo.js')
.pipe(babel({
presets: ['env']
}))
.pipe(uglify())
.pipe(concat('elo.min.js'))
.pipe(gulp.dest('static/js'))
})
8 changes: 7 additions & 1 deletion main.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,10 @@ func main() {
c.HTML(200, "draw.tpl", gin.H{})
})

router.GET("/elo", func (c *gin.Context) {
c.HTML(200, "elo.tpl", gin.H{})
})

// API v2 routers
v2 := router.Group("/api/v2")
{
Expand All @@ -43,10 +47,12 @@ func main() {
v2.GET("/tournaments", listTournaments)
v2.POST("/tournaments", createTournament)

v2.GET("/last-tournament", lastTournament)
v2.GET("/tournaments/:id", getTournament)
v2.PATCH("/tournaments/:id/matches/:match_id", updateMatchScore)

v2.PATCH("/tournaments/:id/shuffle", shuffleMatch)

//v2.GET("/members/:id/matches", getMemberMatches)
}

router.Run(":" + BILAC_PORT)
Expand Down
163 changes: 94 additions & 69 deletions members_controller.go
Original file line number Diff line number Diff line change
@@ -1,91 +1,116 @@
package main

import (
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin"

"./models"
"bilac/models"
)

func listMembers(c *gin.Context) {
db := models.InitDB()
defer db.Close()
db := models.InitDB()
defer db.Close()

var mems []models.Member
db.Find(&mems)
sort := c.Query("sort")

c.JSON(200, mems)
var mems []models.Member
db.Order(sort).Find(&mems)

c.JSON(200, mems)
}

func createMember(c *gin.Context) {
db := models.InitDB()
defer db.Close()

var mem models.Member
c.Bind(&mem)

if mem.Username == "" {
c.JSON(400, gin.H{"error": "Name not appropriate"})
} else {
if err := db.Create(&mem).Error; err != nil {
c.JSON(500, gin.H{"error": err})
} else {
c.JSON(201, mem)
}
}
db := models.InitDB()
defer db.Close()

var mem models.Member
c.Bind(&mem)

if mem.Username == "" {
c.JSON(400, gin.H{"error": "Name not appropriate"})
} else {
if err := db.Create(&mem).Error; err != nil {
c.JSON(500, gin.H{"error": err})
} else {
c.JSON(201, mem)
}
}
}

func showMember(c *gin.Context) {
db := models.InitDB()
defer db.Close()

id := c.Params.ByName("id")
var mem models.Member

db.First(&mem, id)
if mem.ID != 0 {
c.JSON(200, mem)
} else {
c.JSON(404, gin.H{"error": "Member not found"})
}
db := models.InitDB()
defer db.Close()

id := c.Params.ByName("id")
var mem models.Member

db.First(&mem, id)
if mem.ID != 0 {
c.JSON(200, mem)
} else {
c.JSON(404, gin.H{"error": "Member not found"})
}
}

func updateMember(c *gin.Context) {
db := models.InitDB()
defer db.Close()

id := c.Params.ByName("id")
var mem models.Member

db.First(&mem, id)
if mem.ID == 0 {
c.JSON(404, gin.H{"error": "Member not found"})
} else {
var uMem models.Member
c.Bind(&uMem)

if err := db.Model(&mem).Update("username", uMem.Username).Error; err != nil {
c.JSON(400, gin.H{"error": err})
} else {
c.JSON(200, mem)
}
}
db := models.InitDB()
defer db.Close()

id := c.Params.ByName("id")
var mem models.Member

db.First(&mem, id)
if mem.ID == 0 {
c.JSON(404, gin.H{"error": "Member not found"})
} else {
var uMem models.Member
c.Bind(&uMem)

if err := db.Model(&mem).Update("username", uMem.Username).Error; err != nil {
c.JSON(400, gin.H{"error": err})
} else {
c.JSON(200, mem)
}
}
}

func destroyMember(c *gin.Context) {
db := models.InitDB()
defer db.Close()

id := c.Params.ByName("id")
var mem models.Member

db.First(&mem, id)
if mem.ID != 0 {
if err := db.Delete(&mem).Error; err != nil {
c.JSON(500, gin.H{"error": err})
} else {
c.Writer.WriteHeader(204)
}
} else {
c.JSON(404, gin.H{"error": "Member not found"})
}
db := models.InitDB()
defer db.Close()

id := c.Params.ByName("id")
var mem models.Member

db.First(&mem, id)
if mem.ID != 0 {
if err := db.Delete(&mem).Error; err != nil {
c.JSON(500, gin.H{"error": err})
} else {
c.Writer.WriteHeader(204)
}
} else {
c.JSON(404, gin.H{"error": "Member not found"})
}
}

//func getMemberMatches(c *gin.Context) {
// db := models.InitDB()
// defer db.Close()
//
// id := c.Params.ByName("id")
// var mem models.Member
// db.First(&mem, id)
//
// var teamIDs []int
// db.Table("teams").Where("member1_id = ? OR member2_id = ?", id, id).Pluck("ID", &teamIDs)
//
// var matches []models.Match
// //var matches []struct {
// // ID int
// //
// //}
// db.Where("team1_id in (?)", teamIDs).Or("team2_id in (?)", teamIDs).Find(&matches)
// for _, match := range matches {
//
// }
// c.JSON(200, matches)
//}
30 changes: 30 additions & 0 deletions models/match.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ package models

import (
"github.com/jinzhu/gorm"
"math"
//"fmt"
)

type Match struct {
Expand All @@ -28,3 +30,31 @@ func (match *Match) GetMatchInfo(newMatch Match) {
match.Team1Score = newMatch.Team1Score
match.Team2Score = newMatch.Team2Score
}

func (match Match) UpdateElo() {
db := InitDB()
defer db.Close()

var team1, team2 Team
db.Model(match).Related(&team1, "Team1ID")
db.Model(match).Related(&team2, "Team2ID")

elo1 := team1.AvgElo()
elo2 := team2.AvgElo()

exp1 := 1 / float64(1 + math.Pow(10, (elo2 - elo1) / 500))
exp2 := 1 / float64(1 + math.Pow(10, (elo1 - elo2) / 500))

var s1, s2 float64
if match.Team1Score >= match.Team2Score {
s1 = float64(match.Team1Score) / float64(match.Team1Score + match.Team2Score)
s2 = 1 - s1
} else {
s1 = 1 - float64(match.Team2Score) / float64(match.Team1Score + match.Team2Score)
s2 = 1 - s1
}

//fmt.Printf("%.3f : %.3f : %.3f : %.3f\n", exp1, s1, exp2, s2)
team1.UpdateElo(100 * (s1 - exp1))
team2.UpdateElo(100 * (s2 - exp2))
}
9 changes: 9 additions & 0 deletions models/member.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,13 @@ import (
type Member struct {
gorm.Model
Username string `gorm:"not null;unique" json:"username"`
Elo int `json:"elo" sql:"DEFAULT:1000"`
}

func (member Member) AddElo(amount int) {
db := InitDB()
defer db.Close()

member.Elo += amount
db.Save(&member)
}
46 changes: 43 additions & 3 deletions models/team.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ package models

import (
"github.com/jinzhu/gorm"
//"fmt"
"math"
)

type Team struct {
Expand All @@ -26,7 +28,7 @@ type TeamRequest struct {
} `json:"teams"`
}

func GetPoint(x, y int) int {
func getPoint(x, y int) int {
if x > y {
return 3
}
Expand All @@ -50,15 +52,53 @@ func (team Team) UpdateTeamScore() {
if team.ID == match.Team1ID {
team.GF += match.Team1Score
team.GA += match.Team2Score
team.Points += GetPoint(match.Team1Score, match.Team2Score)
team.Points += getPoint(match.Team1Score, match.Team2Score)
team.PlayedMatches += 1
} else if team.ID == match.Team2ID {
team.GF += match.Team2Score
team.GA += match.Team1Score
team.Points += GetPoint(match.Team2Score, match.Team1Score)
team.Points += getPoint(match.Team2Score, match.Team1Score)
team.PlayedMatches += 1
}
}
team.GD = team.GF - team.GA
db.Save(&team)
}

func (team Team) AvgElo() float64 {
db := InitDB()
defer db.Close()

db.Preload("Member1").Preload("Member2").Find(&team, team.ID)

return float64(team.Member1.Elo + team.Member2.Elo) / 2
}

func (team Team) UpdateElo(elo float64) {
db := InitDB()
defer db.Close()

db.Preload("Member1").Preload("Member2").Find(&team, team.ID)
smallRatio := math.Min(float64(team.Member1.Elo), float64(team.Member2.Elo)) /
float64(team.Member1.Elo + team.Member2.Elo)

var team1Ratio float64
if elo >= 0 {
if team.Member1.Elo >= team.Member2.Elo {
team1Ratio = smallRatio
} else {
team1Ratio = 1 - smallRatio
}
} else {
if team.Member1.Elo >= team.Member2.Elo {
team1Ratio = 1 - smallRatio
} else {
team1Ratio = smallRatio
}
}

//team1Ratio := 0.5
//fmt.Printf("%.2f %.2f\n", elo, team1Ratio)
team.Member1.AddElo(int(2 * elo * team1Ratio))
team.Member2.AddElo(int(2 * elo * (1 - team1Ratio)))
}
6 changes: 5 additions & 1 deletion static/js/draw.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,11 @@ new Vue({

methods: {
getMembers() {
axios.get('api/v2/members')
axios.get('api/v2/members', {
params: {
sort: "ID",
}
})
.then(res => {
this.members = res.data
}, err => {
Expand Down
30 changes: 30 additions & 0 deletions static/js/elo.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
new Vue({
el: "#tf",
delimiters: ['${', '}'],

data: {
members: [],
},

mounted() {
let loader = document.getElementById("preloader")
loader.outerHTML = ""

this.getMembers();
},

methods: {
getMembers() {
axios.get('api/v2/members',{
params: {
sort: "-elo"
}
})
.then(res => {
this.members = res.data
}, err => {
console.log(err)
})
}
}
})
Loading

0 comments on commit 4ce401b

Please sign in to comment.