Advertisement
Guest User

Untitled

a guest
Feb 17th, 2020
236
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 16.21 KB | None | 0 0
  1. import discord, aiohttp, asyncio, arrow, json, COC, datetime, sys, re, pymongo, time, traceback, logging
  2. from discord.ext import commands
  3. from motor.motor_asyncio import AsyncIOMotorClient
  4.  
  5. logger = logging.getLogger('discord')
  6. logger.setLevel(logging.ERROR)
  7. handler = logging.FileHandler(filename='discord.log', encoding='utf-8', mode='w')
  8. handler.setFormatter(logging.Formatter('%(asctime)s:%(levelname)s:%(name)s: %(message)s'))
  9. logger.addHandler(handler)
  10.  
  11. coc_token = "REDACTED"
  12. headers = {"Authorization": f"Bearer {coc_token}"}
  13. params = None
  14.    
  15. async def is_me(ctx):
  16.     return ctx.author.id == 148319665188372481
  17.  
  18. class WhoIsCog(commands.Cog,name="whois"):
  19.  
  20.     async def cog_check(self, ctx):
  21.         if ctx.message.author.bot ==  False: return True
  22.         else: return False
  23.  
  24.     def __init__(self,bot):
  25.         self.bot = bot
  26.         self.emoji_list = bot.emojis
  27.         self.th_list = [
  28.         'https://vignette.wikia.nocookie.net/clashofclans/images/f/fd/Town_Hall1.png/revision/latest/scale-to-width-down/100?cb=20170827034930',
  29.         'https://vignette.wikia.nocookie.net/clashofclans/images/7/7d/Town_Hall2.png/revision/latest/scale-to-width-down/100?cb=20170827050036',
  30.         'https://vignette.wikia.nocookie.net/clashofclans/images/d/dd/Town_Hall3.png/revision/latest/scale-to-width-down/100?cb=20170827050050',
  31.         'https://vignette.wikia.nocookie.net/clashofclans/images/e/e7/Town_Hall4.png/revision/latest/scale-to-width-down/100?cb=20170827050104',
  32.         'https://vignette.wikia.nocookie.net/clashofclans/images/a/a3/Town_Hall5.png/revision/latest/scale-to-width-down/100?cb=20170827050118',
  33.         'https://vignette.wikia.nocookie.net/clashofclans/images/5/52/Town_Hall6.png/revision/latest/scale-to-width-down/100?cb=20170827050220',
  34.         'https://vignette.wikia.nocookie.net/clashofclans/images/7/75/Town_Hall7.png/revision/latest/scale-to-width-down/100?cb=20170827051024',
  35.         'https://vignette.wikia.nocookie.net/clashofclans/images/f/fa/Town_Hall8.png/revision/latest/scale-to-width-down/100?cb=20170827051039',
  36.         'https://vignette.wikia.nocookie.net/clashofclans/images/e/e0/Town_Hall9.png/revision/latest/scale-to-width-down/100?cb=20170827045259',
  37.         'https://vignette.wikia.nocookie.net/clashofclans/images/5/5c/Town_Hall10.png/revision/latest/scale-to-width-down/100?cb=20170827040043',
  38.         'https://vignette.wikia.nocookie.net/clashofclans/images/9/96/Town_Hall11.png/revision/latest/scale-to-width-down/100?cb=20170110011314',
  39.         'https://vignette.wikia.nocookie.net/clashofclans/images/7/7c/Town_Hall12-5.png/revision/latest/scale-to-width-down/120?cb=20180603203336',
  40.         'https://vignette.wikia.nocookie.net/clashofclans/images/0/0f/Giga_Inferno5.png/revision/latest/scale-to-width-down/120?cb=20191212010936']
  41.    
  42.     @commands.command()
  43.     async def whois(self, ctx, user_input):
  44.         """Find information on a player given their player tag"""
  45.         await ctx.channel.trigger_typing()
  46.         if not ctx.message.raw_mentions: #search via playertag
  47.             info = await COC.Player(user_input).info
  48.             if not info:
  49.                 await ctx.message.channel.send('Enter a valid playertag.')
  50.                 return
  51.             else: player_info_list = [info]
  52.         else: #search via discord ID
  53.             pid = str(ctx.message.raw_mentions[0])
  54.             client = AsyncIOMotorClient("REDACTED")
  55.             db = client.Database
  56.             accounts = db.account_data
  57.             player_info_list = []
  58.             update_time_list = []
  59.             async for document in accounts.find({'discord_id':str(pid)}):
  60.                 player_info_list.append(document['player_info'])
  61.                 update_time_list.append(document['last_update'])
  62.             if player_info_list: pass
  63.             else:
  64.                 await ctx.message.channel.send('No tags are linked to that user.')
  65.                 return
  66.         embed_list = []
  67.  
  68.         pid = ctx.message.raw_mentions[0]
  69.         guild = ctx.message.guild
  70.         member = guild.get_member(pid)
  71.         embed = discord.Embed(title= member.name, description= f'Current activity: {member.activity}\n\nHighest role in server: {member.top_role}', color=discord.Colour(value=11735575))
  72.         embed.set_thumbnail(url=member.avatar_url)
  73.         embed.add_field(name=f'__Overall Stats__: \n:star: **War Stars**:', value='test', inline=False)
  74.         intro_string = ''
  75.         for index in range(len(player_info_list)):
  76.             print(player_info_list[index]["clan"]["name"])
  77.             # temp_string = f'{index}. {player_info_list[index]["name"]}\n:beginner: Current Clan: {player_info_list[index]["clan"]["name"]}\n\n'
  78.             # intro_string = intro_string + temp_string
  79.         embed.add_field(name=f'__Accounts__: **{len(player_info_list)}**', value=intro_string, inline=False)
  80.         embed_list.append(embed)
  81.         footer_index = 0
  82.        
  83.         for resp in player_info_list:
  84.             embed = discord.Embed(title=f"{resp['name']} - {resp['tag']}", description=f'[Go To Player Profile](https://link.clashofclans.com/?action=OpenPlayerProfile&tag={resp["tag"][1:]})', color=discord.Colour(value=11735575))
  85.             try:
  86.                 embed.set_footer(text=f'Updated on: {update_time_list[footer_index]}')
  87.             except: pass
  88.             experience_emoji = discord.utils.get(self.emoji_list, name='experience')
  89.             if 'clan' in resp:
  90.                 trophy_exp = f"**Current Clan**: {resp['clan']['name']}([Go To Clan](https://link.clashofclans.com/?action=OpenClanProfile&tag={resp['clan']['tag']})) \n \n :trophy:{resp['trophies']} / **{resp['bestTrophies']}**  \n {experience_emoji} `Level` {resp['expLevel']} \n :star: War Stars: `{resp['warStars']}` \n :small_red_triangle:Troops Donated: `{resp['donations']}` \n :small_red_triangle_down:Troops Received: `{resp['donationsReceived']}`"
  91.             elif 'clan' not in resp:
  92.                 trophy_exp = f"**Current Clan**: Not in Clan \n \n :trophy:{resp['trophies']} / **{resp['bestTrophies']}**  \n {experience_emoji} `Level` {resp['expLevel']} \n :star: War Stars: `{resp['warStars']}` \n :small_red_triangle:Troops Donated: `{resp['donations']}` \n :small_red_triangle_down:Troops Received: `{resp['donationsReceived']}`"
  93.             embed.add_field(name='Player Stats', value = trophy_exp, inline=False)
  94.            
  95.             for index in range(len(self.th_list)):
  96.                 if resp['townHallLevel'] == (index+1):
  97.                     embed.set_thumbnail(url=self.th_list[index])
  98.            
  99.             main_hero_iter = []
  100.             for index in range(len(resp['heroes'])): # iterates through heroes list in resp and appends only home vilage heroes
  101.                 if resp['heroes'][index]['village'] == 'home':
  102.                     main_hero_iter.append(resp['heroes'][index])
  103.             main_hero=[]
  104.             for index in range(len(main_hero_iter)):
  105.                 for emoji_index in range(len(self.emoji_list)):
  106.                     if re.sub(r'[?|$|.|!| |]',r'',main_hero_iter[index]['name']) == self.emoji_list[emoji_index].name:
  107.                         if resp['heroes'][index]['level'] == main_hero_iter[index]['maxLevel']: main_hero.append(f"{self.emoji_list[emoji_index]}***{resp['heroes'][index]['level']}*** ")
  108.                         else: main_hero.append(f"{self.emoji_list[emoji_index]}***{main_hero_iter[index]['level']}*** ")
  109.             if not main_hero: pass
  110.             else:
  111.                 embed.add_field(name='Main Village Heroes', value = ''.join(main_hero), inline=True)
  112.  
  113.             builder_hero_iter = []
  114.             builder_hero=[]
  115.             for index in range(len(resp['heroes'])): # iterates through heroes list in resp and appends only builder vilage heroes
  116.                 if resp['heroes'][index]['village'] == 'builderBase':
  117.                     builder_hero_iter.append(resp['heroes'][index])
  118.             for index in range(len(builder_hero_iter)):
  119.                 for emoji_index in range(len(self.emoji_list)):
  120.                     if re.sub(r'[?|$|.|!| |]',r'',builder_hero_iter[index]['name']) == self.emoji_list[emoji_index].name:
  121.                         if builder_hero_iter[index]['level'] == builder_hero_iter[index]['maxLevel']: builder_hero.append(f"{self.emoji_list[emoji_index]}***{builder_hero_iter[index]['level']}*** ")
  122.                         else: builder_hero.append(f"{self.emoji_list[emoji_index]}***{builder_hero_iter[index]['level']}*** ")
  123.             if not builder_hero:
  124.                 pass
  125.             else:
  126.                 embed.add_field(name='Builder Base Hero', value = ''.join(builder_hero), inline=True)
  127.  
  128.             main_troop_iter = []
  129.             main_msg = []
  130.             for index in range(len(resp['troops'])): # iterates through heroes list in resp and appends only main vilage troops
  131.                 if resp['troops'][index]['village'] == 'home':
  132.                     main_troop_iter.append(resp['troops'][index])
  133.             for index in range(len(main_troop_iter)):
  134.                 for emoji_index in range(len(self.emoji_list)):
  135.                     if re.sub(r'[?|$|.|!| |]',r'',main_troop_iter[index]['name']) == self.emoji_list[emoji_index].name:
  136.                         if main_troop_iter[index]['level'] == main_troop_iter[index]['maxLevel']: main_msg.append(f"{self.emoji_list[emoji_index]}***{main_troop_iter[index]['level']}*** ")
  137.                         else: main_msg.append(f"{self.emoji_list[emoji_index]}{main_troop_iter[index]['level']} ")
  138.             embed.add_field(name='Main Village Troops', value=''.join(main_msg), inline=False)
  139.  
  140.             builder_troop_iter = []
  141.             builder_msg = []
  142.             for index in range(len(resp['troops'])): # iterates through heroes list in resp and appends only builder vilage troops
  143.                 if resp['troops'][index]['village'] == 'builderBase':
  144.                     builder_troop_iter.append(resp['troops'][index])
  145.             for index in range(len(builder_troop_iter)):
  146.                 for emoji_index in range(len(self.emoji_list)):
  147.                     if re.sub(r'[?|$|.|!| |]',r'',builder_troop_iter[index]['name']) == self.emoji_list[emoji_index].name:
  148.                         if builder_troop_iter[index]['level'] == builder_troop_iter[index]['maxLevel']: builder_msg.append(f"{self.emoji_list[emoji_index]}***{builder_troop_iter[index]['level']}*** ")
  149.                         else: builder_msg.append(f"{self.emoji_list[emoji_index]}{builder_troop_iter[index]['level']} ")
  150.             embed.add_field(name='Builder Base Troops', value=''.join(builder_msg), inline=False)
  151.  
  152.             spells=[]
  153.             for index in range(len(resp['spells'])):
  154.                 for emoji_index in range(len(self.emoji_list)):
  155.                     if re.sub(r'[?|$|.|!| |]',r'',resp['spells'][index]['name']) == self.emoji_list[emoji_index].name:
  156.                         if resp['spells'][index]['level'] == resp['spells'][index]['maxLevel']: spells.append(f"{self.emoji_list[emoji_index]}***{resp['spells'][index]['level']}*** ")
  157.                         else: spells.append(f"{self.emoji_list[emoji_index]}{resp['spells'][index]['level']} ")
  158.             if len(spells) == 0:
  159.                 pass
  160.             elif len(spells) != 0:
  161.                 embed.add_field(name='Spells', value = ''.join(spells), inline=False)
  162.             embed_list.append(embed)
  163.  
  164.         index = 0
  165.         message = await ctx.message.channel.send(embed=embed_list[0])
  166.  
  167.         def check_user(reaction, user):
  168.             return ctx.message.author.id == user.id
  169.  
  170.         if len(embed_list) > 1:
  171.             await message.add_reaction('⏪')
  172.             await message.add_reaction('❌')
  173.             await message.add_reaction('⏩')
  174.             while True:
  175.                 try:
  176.                     rxn, user = await self.bot.wait_for('reaction_add', timeout=15, check=check_user)
  177.                
  178.                     if rxn.emoji == '⏩':
  179.                         if index >= len(embed_list) - 1: index = 0
  180.                         else: index = index + 1
  181.                         await message.remove_reaction('⏩', user)
  182.                         await message.edit(embed = embed_list[index])
  183.                     elif rxn.emoji == '❌':
  184.                         await message.clear_reactions()
  185.                         return
  186.                     elif rxn.emoji == '⏪':  
  187.                         if index <= 0: index = len(embed_list) - 1
  188.                         else: index = index - 1
  189.                         await message.remove_reaction('⏪', user)
  190.                         await message.edit(embed = embed_list[index])
  191.                 except asyncio.TimeoutError:
  192.                         await message.clear_reactions()
  193.                         return          
  194.  
  195.     @whois.error
  196.     async def whois_error(self, ctx, error):
  197.         await ctx.message.channel.send('Error in whois command. Check log for details.')
  198.         logger.exception("Fatal error in whois command")
  199.         print(traceback.format_exc())
  200.    
  201.     @commands.command()
  202.     async def link(self, ctx, player_tag:str, discord_user:discord.Member):
  203.         """Link a player to a discord user"""
  204.         await ctx.channel.trigger_typing()
  205.         if '#' not in player_tag: temp_tag = f'#{player_tag}'
  206.         else: temp_tag = player_tag
  207.         wiz_account = await COC.wizbot(temp_tag).get_info
  208.         document = await COC.swimbot(temp_tag).get_id
  209.         if document: #player account already exists in swim
  210.             await ctx.message.channel.send ('Player is already linked to account!')
  211.             return
  212.         elif not wiz_account and not document: #neither wiz nor swim has record of account
  213.             resp = await COC.Player(temp_tag).info
  214.             if not resp:
  215.                 await ctx.message.channel.send('That playertag doesn\'t exist, try again.')
  216.                 return
  217.             else:
  218.                 embed = discord.Embed(title=f"{resp['name']} - {resp['tag']}", description=f'[Go To Player Profile](https://link.clashofclans.com/?action=OpenPlayerProfile&tag={resp["tag"]})', color=discord.Colour(value=13846796))
  219.                 for index in range(len(self.th_list)):
  220.                     if resp['townHallLevel'] == (index+1):
  221.                         embed.set_thumbnail(url=self.th_list[index])
  222.                 embed.add_field(name='Confirm', value = f'Are you sure you want to link this clash account with <@{discord_user.id}>?', inline=False)
  223.                        
  224.                 message = await ctx.message.channel.send(embed=embed)
  225.                 await message.add_reaction ('✅')
  226.                 await message.add_reaction ('❌')
  227.                 def check_user(reaction, user):
  228.                     return ctx.message.author.id == user.id
  229.                 try:
  230.                     rxn, user = await self.bot.wait_for('reaction_add', timeout=20, check=check_user)
  231.                
  232.                     if rxn.emoji == '✅':
  233.                         await message.delete()
  234.                         stuff = {"_id": resp['tag'], "discord_id": str(discord_user.id), "player_info":resp, "last_update":datetime.datetime.strptime(str(time.strftime('%Y-%m-%dT%H:%M:%S%z')), '%Y-%m-%dT%H:%M:%S%z')}
  235.                         accounts.insert_one(stuff)
  236.                         await ctx.message.channel.send(f'Linked **{resp["name"]}** to <@{discord_user.id}>!')
  237.                     elif rxn.emoji == '❌':
  238.                         await message.delete()
  239.                         return
  240.                 except asyncio.TimeoutError:
  241.                     await message.delete()
  242.         elif wiz_account and not document: #account exists in wiz, but not swim
  243.             resp = await COC.Player(wiz_account["_id"]).info
  244.             stuff = {"_id": wiz_account["_id"], "discord_id": str(wiz_account["member_id"]), "player_info":resp, "last_update":datetime.datetime.strptime(str(time.strftime('%Y-%m-%dT%H:%M:%S%z')), '%Y-%m-%dT%H:%M:%S%z')}
  245.             accounts.insert_one(stuff)
  246.             await ctx.message.channel.send ('Player is already linked to account!')
  247.             return
  248.      
  249.  
  250.     @link.error
  251.     async def link_error(self, ctx, error):
  252.         await ctx.message.channel.send('Error in link command. Check log for details.')
  253.         logger.exception("Fatal error in link command")
  254.         print(traceback.format_exc())
  255. def setup(bot):
  256.     bot.add_cog(WhoIsCog(bot))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement