forked from palcu/macefash
-
Notifications
You must be signed in to change notification settings - Fork 0
/
voteSystem.py
executable file
·80 lines (64 loc) · 2.79 KB
/
voteSystem.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
"""
Modules provides functionality for vote processing
and spam detection
"""
from sqlalchemy import and_, or_
from settings import SETTINGS
from app import db
from models import *
from getIP import getIP
from ratingSystem import getNewEloRatings
from basher import sh
import datetime
def detectSpam(players):
who = getIP()
try:
lastVoteSameResult = db.session.query(Vote).filter(Vote.ip == who).filter(and_(Vote.winner == players[0].username, Vote.loser == players[1].username)).order_by(Vote.id.desc()).first()
except:
lastVoteSameResult = None
try:
lastVoteInvertedResult = db.session.query(Vote).filter(Vote.ip == who).filter(and_(Vote.winner == players[1].username, Vote.loser == players[0].username)).order_by(Vote.id.desc()).first()
except:
lastVoteInvertedResult = None
isSpam = False
lastWasSpam = False
now = datetime.datetime.now()
for lastVote in [lastVoteSameResult, lastVoteInvertedResult]:
if lastVote:
timeDiff = (now - lastVote.when).total_seconds()
if timeDiff < SETTINGS['minVoteWait']:
isSpam = True
if lastVote.spam:
lastWasSpam = True
#print "waited since last vote: %.2f" % timeDiff
if not isSpam or (isSpam and not lastWasSpam):
db.session.add(Vote(ip=who, winner=players[0].username, loser=players[1].username, when=now, spam=isSpam))
db.session.commit()
return isSpam
def processVote(form):
players = [
db.session.query(Person).get(int(form['winner'])),
db.session.query(Person).get(int(form['loser']))
]
if detectSpam(players):
#print "user <%s> is spamming votes for <%s>" % (getIP(), players[0].username)
return
print "vote:\n who: <%s>\n winner: <%s>\n loser: <%s>" % (getIP(), players[0].username, players[1].username)
if 'harababurel' in [players[0].username, players[1].username] or 'mihai.rus.777' in [players[0].username, players[1].username]:
try:
sh('sh beeper.sh')
except Exception, e:
print "tried to execute beeper.sh, but something went wrong (err: %s)" % e
newStats = {}
# firstly, get new ratings (without altering anything) for all players
for currentPlayer in players:
newStats[currentPlayer] = getNewEloRatings(currentPlayer, players)
# secondly, update all ratings based on computed values
for currentPlayer in players:
currentPlayer.rating = newStats[currentPlayer]['newRating']
currentPlayer.volatility = newStats[currentPlayer]['newVolatility']
currentPlayer.games += 1
if currentPlayer == players[0]:
currentPlayer.wins += 1
currentPlayer.maxRating = max(currentPlayer.maxRating, currentPlayer.rating)
db.session.commit()