Get information from the Riot API, and the Champion.gg API, parse and send to matrix rooms on request. This can be bridged to other services such as discord and twitter.

lolbot.py 7.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. from matrix_bot_api.matrix_bot_api import MatrixBotAPI
  2. from matrix_bot_api.mhandler import MHandler
  3. from matrix_bot_api.mregex_handler import MRegexHandler
  4. from matrix_bot_api.mcommand_handler import MCommandHandler
  5. import configparser
  6. import math
  7. import operator
  8. import cassiopeia as cass
  9. from cassiopeia import Summoner, Match, Item, Items, Champion, Role
  10. from cassiopeia.data import Season, Queue
  11. from itemshortener import renamer
  12. from collections import Counter
  13. def history_callback(room,event):
  14. args = event['content']['body'].split(" ",1)[1]
  15. return_str = ""
  16. summoner = Summoner(name = args, region ="NA")
  17. match_history = summoner.match_history
  18. match_history(seasons={Season.season_8}, queues={Queue.ranked_solo_fives})
  19. champion_id_to_name_mapping = {champion.id: champion.name for champion in cass.get_champions(region="NA")}
  20. for x in range(0,20):
  21. champ_id = match_history[x].participants[summoner.name].champion.id
  22. player = match_history[x].participants[summoner.name]
  23. kills = player.stats.kills
  24. deaths = player.stats.deaths
  25. assists = player.stats.assists
  26. return_str += champion_id_to_name_mapping[champ_id]
  27. for x in range(0,14 - len(champion_id_to_name_mapping[champ_id])):
  28. return_str += " "
  29. return_str += "\t"
  30. return_str += str(kills) + "/" + str(deaths)+ "/" + str(assists) + "\t"
  31. return_str += "Win " if player.stats.win else "Loss "
  32. return_str += "\t"
  33. return_str += player.summoner_spell_d.name + " / " + player.summoner_spell_f.name
  34. for x in range(0,10 - len(player.summoner_spell_f.name)):
  35. return_str +=" "
  36. return_str += "\t"
  37. for item in player.stats.items:
  38. if item is not None:
  39. try:
  40. return_str += str(renamer(item.name))
  41. except KeyError:
  42. return_str += str(item.name)
  43. return_str += ", "
  44. return_str += "\n"
  45. room.send_notice(return_str)
  46. def mains_callback(room, event):
  47. args = event['content']['body'].split(" ",1)[1]
  48. #names can have spaces
  49. #summoner = Summoner(name="Kalturi", account=34718348, id=21359666, region="NA")
  50. name = "Kalturi"
  51. #account = 34718348
  52. #id = 21359666
  53. region = "NA"
  54. summoner = Summoner(name=args,region=region)
  55. match_history = summoner.match_history
  56. match_history(seasons={Season.season_8}, queues={Queue.ranked_solo_fives})
  57. champion_id_to_name_mapping = {champion.id: champion.name for champion in cass.get_champions(region="NA")}
  58. played = Counter()
  59. for match in match_history:
  60. champion_id = match.participants[summoner.name].champion.id
  61. champion_name = champion_id_to_name_mapping[champion_id]
  62. played[champion_name] += 1
  63. return_str = ""
  64. room.send_notice("Top 5 champions {} played:".format(summoner.name))
  65. for champion_name, count in played.most_common(5):
  66. return_str += champion_name +" "+str(count) + "\n"
  67. room.send_notice(return_str)
  68. def rank_callback(room,event):
  69. args = event['content']['body'].split(" ",1)[1].rsplit(" ",1)[0]
  70. tiers = {'Tier.diamond':'D', 'Tier.master':'M', 'Tier.challenger':'C', 'Tier.platinum':'P', 'Tier.gold':'G', 'Tier.silver':'S','Tier.bronze':'B'}
  71. divisions = {'Division.one':'1','Division.two':'2','Division.three':'3','Division.four':'4','Division.five':'5'}
  72. return_str = ""
  73. summoner = Summoner(name=args,region="NA")
  74. positions = summoner.league_positions
  75. try:
  76. if positions.fives.promos is not None:
  77. return_str += "Promos: "
  78. for match in positions.fives.promos.progress:
  79. return_str += ("W-" if match else "L-")
  80. return_str += "\n"
  81. league = positions.fives
  82. return_str += tiers[str(league.tier)] + divisions[str(league.division)] + " " + str(league.league_points) + "LP " + str(league.wins) + "W " + str(league.losses) + "L"
  83. ratio = '{0:.2f}'.format(100 * league.wins / (league.wins + league.losses))
  84. return_str += " " + str(ratio) + "% WR"
  85. except Exception:
  86. return_str += "unranked"
  87. room.send_notice(return_str)
  88. def opgg_callback(room,event):
  89. args = event['content']['body'].split(" ",1)[1]
  90. room.send_notice("http://na.op.gg/summoner/userName="+args)
  91. def lolhelp_callback(room,event):
  92. help_str = "!history - Returns past 20 games and some data on them. \n"
  93. help_str += "!mains - Return most played champions of past several games. \n"
  94. help_str += "!op.gg - Posts an op.gg link if you want more info. \n"
  95. help_str += "!winrate - Returns highest winrate champion of a role. \n"
  96. help_str += "!lolhelp - Prints this."
  97. room.send_notice(help_str)
  98. def winrate_callback(room,event):
  99. argz = event['content']['body'].split()
  100. if len(argz) == 1:
  101. room.send_notice("Need a role (top/jungle/mid/adc/support)")
  102. return
  103. argz.pop(0)
  104. args = argz[0]
  105. if len(argz) == 1:
  106. sorter = True
  107. if len(argz) == 2:
  108. sorter = (True if argz[1] == "worst" else False)
  109. else:
  110. room.send_notice("error")
  111. return
  112. roles = {"top","jungle","mid","adc","support"}
  113. if args not in roles:
  114. room.send_notice("invalid")
  115. return
  116. win_rates = {}
  117. role_converter = {}
  118. role_converter["top"] = Role.top
  119. role_converter["jungle"] = Role.jungle
  120. role_converter["mid"] = Role.middle
  121. role_converter["adc"] = Role.adc
  122. role_converter["support"] = Role.support
  123. champ_id_to_name_mapping = {champion.id: champion.name for champion in cass.get_champions(region="NA")}
  124. return_str = ""
  125. patcher = Champion(name="Annie", id=1,region="NA")
  126. #return_str += "Patch: " + str(patcher.championgg.championgg_metadata["patch"]) + "\n"
  127. for champ in cass.get_champions(region="NA"):
  128. win_rates[champ.id] = champ.championgg.win_rate[role_converter[args]]
  129. sorted_x = sorted(win_rates.items(),key=operator.itemgetter(1),reverse=True)
  130. for x in range(0,5):
  131. return_str += champ_id_to_name_mapping[sorted_x[x][0]] + "\t\t" + str('{0:.2f}'.format(100*sorted_x[x][1])) + "%\n"
  132. room.send_notice(return_str)
  133. def main():
  134. config = configparser.ConfigParser()
  135. config.read("config.ini")
  136. username = config.get("Matrix","Username")
  137. password = config.get("Matrix","Password")
  138. server = config.get("Matrix", "Homeserver")
  139. riot_key = config.get("Riot","API_key")
  140. #cass.set_default_region("NA")
  141. championgg_api_key = "b53dd758c723794046a42f669e83bbf0"
  142. config = cass.get_default_config()
  143. config["pipeline"]["ChampionGG"] = {
  144. "package": "cassiopeia_championgg",
  145. "api_key": championgg_api_key
  146. }
  147. cass.apply_settings(config)
  148. cass.set_riot_api_key("RGAPI-1f6885c3-cb39-4ab1-b61b-f2fa06dc6d1f")
  149. bot = MatrixBotAPI(username, password, server)
  150. m_history_handler = MCommandHandler('history', history_callback)
  151. bot.add_handler(m_history_handler)
  152. m_mains_handler = MCommandHandler('mains', mains_callback)
  153. bot.add_handler(m_mains_handler)
  154. m_rank_handler = MCommandHandler('rank', rank_callback)
  155. bot.add_handler(m_rank_handler)
  156. m_opgg_handler = MCommandHandler('opgg', opgg_callback)
  157. bot.add_handler(m_opgg_handler)
  158. m_winrate_handler = MCommandHandler('winrate',winrate_callback)
  159. bot.add_handler(m_winrate_handler)
  160. m_lolhelp_handler = MCommandHandler('lolhelp',lolhelp_callback)
  161. bot.add_handler(m_lolhelp_handler)
  162. bot.start_polling()
  163. while True:
  164. input()
  165. if __name__ == "__main__":
  166. main()