io = require("socket.io").listen(9000) redis = require("redis") latestId = 0 io.sockets.on "connection", (conn) -> cli = redis.createClient() cli.get "MusicEq:IdCounter", (err, res) => return if HandleError err, conn latestId = res - 1 conn.emit "OnStart", { Id: res } conn.on "Submit", (evt) => cli.incr "MusicEq:IdCounter", (err, res) => return if HandleError err, conn evt.Id = latestId = res - 1 evt.Score = 0; cli.set "MusicEq:"+evt.Id+":Code", evt.Code cli.set "MusicEq:"+evt.Id+":Name", evt.Name cli.set "MusicEq:"+evt.Id+":Author", evt.Author cli.zadd "MusicEq:Scores", 0, evt.Id io.sockets.emit "Latest", evt conn.on "PlusOne", (evt) => cli.zincrby "MusicEq:Scores", 1, evt.Id conn.on "GetCode", (evt, res) => cli.get "MusicEq:"+evt.Id+":Code", (err, res) => return if HandleError err, conn conn.emit("Code", { Code: res }) conn.on "GetRanked", (evt) => cli.zrevrange "MusicEq:Scores", evt.begin, evt.end, (err, res) => return if HandleError err, conn return if res.length == 0 entries = [] multi = cli.multi() for i in [0..(res.length-1)] entries[i] = { Id: res[i] } do (i) -> id = res[i] multi.get "MusicEq:"+id+":Name", (err, res) -> return if HandleError err, conn entries[i].Name = res multi.get "MusicEq:"+id+":Author", (err, res) -> return if HandleError err, conn entries[i].Author = res multi.get "MusicEq:"+id+":Code", (err, res) -> return if HandleError err, conn entries[i].Code = res multi.zscore "MusicEq:Scores", id, (err, res) -> return if HandleError err, conn entries[i].Score = res multi.exec (err, res) -> return if HandleError err, conn conn.emit "Ranked", {Entries: entries} conn.on "GetHistory", (evt) => evt.begin = Math.max evt.begin, 0 evt.end = Math.max (evt.end - 1), 0 entries = [] multi = cli.multi() for i in [evt.begin..evt.end] entries[evt.end - i] = { Id: i } do (i) -> multi.get "MusicEq:"+i+":Name", (err, res) -> return if HandleError err, conn entries[evt.end - i].Name = res multi.get "MusicEq:"+i+":Author", (err, res) -> return if HandleError err, conn entries[evt.end - i].Author = res multi.get "MusicEq:"+i+":Code", (err, res) -> return if HandleError err, conn entries[evt.end - i].Code = res multi.zscore "MusicEq:Scores", i, (err, res) -> return if HandleError err, conn entries[evt.end - i].Score = res multi.exec (err, res) -> return if HandleError err, conn conn.emit("History", {Entries: entries}) HandleError = (err, conn) -> if err conn.emit "Error", { Message: "" + err } return true return false