Advertisement
Guest User

Untitled

a guest
Apr 19th, 2018
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.31 KB | None | 0 0
  1. @bot.command(pass_context=True)
  2. async def ow_ru(ctx):
  3.     """Update Discord users' roles according to Overwatch SR"""
  4.     await bot.send_typing(ctx.message.channel)
  5.     squery = sql.select(overwatch_table)
  6.     # Because another query occurs in the loop, you have to put the data into an array first.
  7.     data = c.execute(squery).fetchall()
  8.     for row in data:
  9.         battle_tag = row[0]
  10.         sr = str(owh.get_sr(battle_tag))
  11.         log.info("Updating {} to SR: {}".format(battle_tag, sr))
  12.         uquery = sql.update(overwatch_table, {"SR":sr}, condition={"BattleTag":battle_tag})
  13.         c.execute(uquery)
  14.  
  15.     conn.commit()
  16.  
  17.     server = ctx.message.server
  18.     await update_roles(server)
  19.     await bot.say("Done updating roles!")
  20.  
  21.  
  22. # Update OW roles for given member in given server
  23. async def update_role(member, server):
  24.     """ Update a single role for the given member """
  25.     log.info("--- UPDATING ROLES for {} ---".format(member))
  26.     sr = 0
  27.     # Get a list of all entries for member
  28.     query = sql.select(overwatch_table, order="SR DESC", condition={"DiscordName":str(member)})
  29.     # Determine highest SR for member
  30.     data = c.execute(query).fetchall()
  31.     if len(data) < 1:
  32.         # Member doesn't exist in table
  33.         log.info("    Member " + str(member) + " doesn't exist in table!")
  34.         return
  35.     else:
  36.         log.info("    Using highest SR for {}".format(member))
  37.         sr = data[0][1]
  38.  
  39.     # Determine OW rank from SR
  40.     rank = get_rank(sr)
  41.     log.info("    SR: {0} -- Rank: {1}".format(sr, rank))
  42.  
  43.     # Replace roles implementation here    
  44.     new_roles = member.roles
  45.     # Remove all OW related roles from list of member's roles
  46.     for role in ow_roles[server]:
  47.         if role in new_roles:
  48.             log.info("    Removing role {0}".format(role))
  49.             new_roles.remove(role)
  50.  
  51.     # If player is unranked, don't assign any new roles, otherwise append the correct role
  52.     if rank == "unranked":
  53.         log.info("    Member {0} is unranked, no new role assigned.".format(str(member)))
  54.     else:
  55.         log.info("    Giving member role: {0}".format(rank))
  56.         new_roles.append(discord.utils.get(server.roles, name=rank))
  57.  
  58.     # Replace roles accordingly
  59.     await bot.replace_roles(member, *new_roles)
  60.  
  61. # Update OW roles in the given server
  62. async def update_roles(server):
  63.  
  64.     log.info("--- UPDATING ROLES PER SR ---")
  65.     # Grab distinct members from table
  66.     query = sql.select(overwatch_table, distinct=True, column_names=["DiscordName"])
  67.     data = c.execute(query).fetchall()
  68.     # Build list of the names for which to check
  69.     members = [u[0] for u in data]
  70.     log.info("MEMBERS: " + ','.join(members))
  71.     # Build list of requests to update_role
  72.     # Need to use server.get_member_named() because discord.utils.get doesn't work with
  73.     # discord member names if you pass in the # part. This way is more robust.
  74.     # If a person doesn't exist in the table, it pretty gracefully skips it.
  75.     # requests = [update_role(server.get_member_named(member), server) for member in members]
  76.     requests = []
  77.     for member in members:
  78.         discord_member = server.get_member_named(member)
  79.         if discord_member is None:
  80.             log.warning("Member {0} does not exist in server".format(member))
  81.         else:
  82.             # requests.append(update_role(discord_member, server))
  83.             await update_role(discord_member, server)
  84.     # Asynchronously perform all calls.
  85.     # await asyncio.wait(requests)
  86.  
  87. def get_rank(sr):
  88.     if sr >= 4000:
  89.         return "grandmaster"
  90.     elif sr >= 3500 and sr <= 3999:
  91.         return "master"
  92.     elif sr >= 3000 and sr <= 3499:
  93.         return "diamond"
  94.     elif sr >= 2500 and sr <= 2999:
  95.         return "platinum"
  96.     elif sr >= 2000 and sr <= 2499:
  97.         return "gold"
  98.     elif sr >= 1500 and sr <= 1999:
  99.         return "silver"
  100.     elif sr >= 1 and sr <= 1499:
  101.         return "bronze"
  102.     elif sr == 0:
  103.         return "unranked"
  104.  
  105. async def remove_other_ranks(server, rank, member):
  106.     log.info("    PASSED IN: {0}".format(rank))
  107.     ranks = ["grandmaster","master","diamond","platinum","gold","silver","bronze"]
  108.     # Build list to remove all rank roles.
  109.     roles = [discord.utils.get(server.roles, name=rank_name) for rank_name in ranks]
  110.     await bot.remove_roles(member, *roles)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement