1
0
Fork 0
mirror of synced 2024-05-20 04:22:29 +12:00

Add rating changes into the battle outcomes

This commit is contained in:
phxntxm 2017-06-27 20:57:19 -05:00
parent ab93c3f436
commit d1a1d5974d

View file

@ -1,3 +1,4 @@
import rethinkdb as r
from discord.ext import commands
from discord.ext.commands.cooldowns import BucketType
@ -84,6 +85,8 @@ class Interaction:
def __init__(self, bot):
self.bot = bot
self.battles = {}
self.bot.br = BattleRankings(self.bot.db)
bot.loop.create_task(self.bot.br.update())
def get_battle(self, player):
battles = self.battles.get(player.guild.id)
@ -130,7 +133,7 @@ class Interaction:
def battling_off(self, player1=None, player2=None):
if player1:
guild = player1.guild.id
elif player2:
else:
guild = player2.guild.id
battles = self.battles.get(guild, [])
# Create a new list, exactly the way the last one was setup
@ -227,10 +230,16 @@ class Interaction:
# Randomize the order of who is printed/sent to the update system
# All we need to do is change what order the challengers are printed/added as a paramater
if random.SystemRandom().randint(0, 1):
await ctx.send(fmt.format(battleP1.mention, battleP2.mention))
outcome = self.bot.br.simulate_differences(battleP1, battleP2)
fmt1 = "{} - {}".format(battleP1.mention, outcome.get('winner'))
fmt2 = "{} - {}".format(battleP2.mention, outcome.get('loser'))
await ctx.send(fmt.format(fmt1, fmt2))
await utils.update_records('battle_records', self.bot.db, battleP1, battleP2)
else:
await ctx.send(fmt.format(battleP2.mention, battleP1.mention))
outcome = self.bot.br.simulate_differences(battleP2, battleP1)
fmt1 = "{} - {}".format(battleP2.mention, outcome.get('winner'))
fmt2 = "{} - {}".format(battleP1.mention, outcome.get('loser'))
await ctx.send(fmt.format(fmt1, fmt2))
await utils.update_records('battle_records', self.bot.db, battleP2, battleP1)
@commands.command()
@ -302,5 +311,64 @@ class Interaction:
await ctx.send(fmt.format(booper, boopee, amount, message))
class BattleRankings:
def __init__(self, db):
self.db = db
self.ratings = None
async def update(self):
ratings = await self.db.query(r.table('battle_records').order_by('rating'))
# Create a dictionary so that we have something to "get" from easily
def build_dict(seq, key):
return dict((d[key], dict(d, rank=index + 1)) for (index, d) in enumerate(seq[::-1]))
self.ratings = build_dict(ratings, 'member_id')
def simulate_differences(self, winner, loser):
# Get our ratings and our difference
winner_stats = self.get(winner.id) or {}
loser_stats = self.get(loser.id) or {}
winner_rating = winner_stats.get('rating') or 1000
loser_rating = loser_stats.get('rating') or 1000
difference = abs(winner_rating - loser_rating)
# Calculate rating change based off this
rating_change = 0
count = 25
while count <= difference:
if count > 300:
break
rating_change += 1
count += 25
# Contstruct our dict to simulate the changes in rating
entry = {
'winner': "{} ( +{} )".format(winner_rating + rating_change, rating_change),
'loser': "{} ( -{} )".format(loser_rating - rating_change, rating_change),
}
return entry
def get(self, key):
return self.ratings.get(str(key))
def get_rating(self, member):
data = self.ratings.get(member.id, {})
return data.get('rating')
def get_rank(self, member):
data = self.ratings.get(member.id, {})
return data.get('rank'), len(self.ratings)
def get_server_rank(self, member):
server_ids = [str(m.id) for m in member.guild.members]
def build_dict(seq, key):
return dict((d[key], dict(d, rank=index + 1)) for (index, d) in enumerate(seq[::-1]))
server_ratings = build_dict([x for x in self.ratings.values() if x['member_id'] in server_ids], 'member_id')
return server_ratings.get(str(member.id), {}).get('rating'), len(server_ratings)
def setup(bot):
bot.add_cog(Interaction(bot))