Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import discord, aiohttp, asyncio, arrow, json, COC, datetime, sys, re, pymongo, time, traceback, logging
- from discord.ext import commands
- from motor.motor_asyncio import AsyncIOMotorClient
- logger = logging.getLogger('discord')
- logger.setLevel(logging.ERROR)
- handler = logging.FileHandler(filename='discord.log', encoding='utf-8', mode='w')
- handler.setFormatter(logging.Formatter('%(asctime)s:%(levelname)s:%(name)s: %(message)s'))
- logger.addHandler(handler)
- coc_token = "REDACTED"
- headers = {"Authorization": f"Bearer {coc_token}"}
- params = None
- async def is_me(ctx):
- return ctx.author.id == 148319665188372481
- class WhoIsCog(commands.Cog,name="whois"):
- async def cog_check(self, ctx):
- if ctx.message.author.bot == False: return True
- else: return False
- def __init__(self,bot):
- self.bot = bot
- self.emoji_list = bot.emojis
- self.th_list = [
- 'https://vignette.wikia.nocookie.net/clashofclans/images/f/fd/Town_Hall1.png/revision/latest/scale-to-width-down/100?cb=20170827034930',
- 'https://vignette.wikia.nocookie.net/clashofclans/images/7/7d/Town_Hall2.png/revision/latest/scale-to-width-down/100?cb=20170827050036',
- 'https://vignette.wikia.nocookie.net/clashofclans/images/d/dd/Town_Hall3.png/revision/latest/scale-to-width-down/100?cb=20170827050050',
- 'https://vignette.wikia.nocookie.net/clashofclans/images/e/e7/Town_Hall4.png/revision/latest/scale-to-width-down/100?cb=20170827050104',
- 'https://vignette.wikia.nocookie.net/clashofclans/images/a/a3/Town_Hall5.png/revision/latest/scale-to-width-down/100?cb=20170827050118',
- 'https://vignette.wikia.nocookie.net/clashofclans/images/5/52/Town_Hall6.png/revision/latest/scale-to-width-down/100?cb=20170827050220',
- 'https://vignette.wikia.nocookie.net/clashofclans/images/7/75/Town_Hall7.png/revision/latest/scale-to-width-down/100?cb=20170827051024',
- 'https://vignette.wikia.nocookie.net/clashofclans/images/f/fa/Town_Hall8.png/revision/latest/scale-to-width-down/100?cb=20170827051039',
- 'https://vignette.wikia.nocookie.net/clashofclans/images/e/e0/Town_Hall9.png/revision/latest/scale-to-width-down/100?cb=20170827045259',
- 'https://vignette.wikia.nocookie.net/clashofclans/images/5/5c/Town_Hall10.png/revision/latest/scale-to-width-down/100?cb=20170827040043',
- 'https://vignette.wikia.nocookie.net/clashofclans/images/9/96/Town_Hall11.png/revision/latest/scale-to-width-down/100?cb=20170110011314',
- 'https://vignette.wikia.nocookie.net/clashofclans/images/7/7c/Town_Hall12-5.png/revision/latest/scale-to-width-down/120?cb=20180603203336',
- 'https://vignette.wikia.nocookie.net/clashofclans/images/0/0f/Giga_Inferno5.png/revision/latest/scale-to-width-down/120?cb=20191212010936']
- @commands.command()
- async def whois(self, ctx, user_input):
- """Find information on a player given their player tag"""
- await ctx.channel.trigger_typing()
- if not ctx.message.raw_mentions: #search via playertag
- info = await COC.Player(user_input).info
- if not info:
- await ctx.message.channel.send('Enter a valid playertag.')
- return
- else: player_info_list = [info]
- else: #search via discord ID
- pid = str(ctx.message.raw_mentions[0])
- client = AsyncIOMotorClient("REDACTED")
- db = client.Database
- accounts = db.account_data
- player_info_list = []
- update_time_list = []
- async for document in accounts.find({'discord_id':str(pid)}):
- player_info_list.append(document['player_info'])
- update_time_list.append(document['last_update'])
- if player_info_list: pass
- else:
- await ctx.message.channel.send('No tags are linked to that user.')
- return
- embed_list = []
- pid = ctx.message.raw_mentions[0]
- guild = ctx.message.guild
- member = guild.get_member(pid)
- 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))
- embed.set_thumbnail(url=member.avatar_url)
- embed.add_field(name=f'__Overall Stats__: \n:star: **War Stars**:', value='test', inline=False)
- intro_string = ''
- for index in range(len(player_info_list)):
- print(player_info_list[index]["clan"]["name"])
- # temp_string = f'{index}. {player_info_list[index]["name"]}\n:beginner: Current Clan: {player_info_list[index]["clan"]["name"]}\n\n'
- # intro_string = intro_string + temp_string
- embed.add_field(name=f'__Accounts__: **{len(player_info_list)}**', value=intro_string, inline=False)
- embed_list.append(embed)
- footer_index = 0
- for resp in player_info_list:
- 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))
- try:
- embed.set_footer(text=f'Updated on: {update_time_list[footer_index]}')
- except: pass
- experience_emoji = discord.utils.get(self.emoji_list, name='experience')
- if 'clan' in resp:
- 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']}`"
- elif 'clan' not in resp:
- 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']}`"
- embed.add_field(name='Player Stats', value = trophy_exp, inline=False)
- for index in range(len(self.th_list)):
- if resp['townHallLevel'] == (index+1):
- embed.set_thumbnail(url=self.th_list[index])
- main_hero_iter = []
- for index in range(len(resp['heroes'])): # iterates through heroes list in resp and appends only home vilage heroes
- if resp['heroes'][index]['village'] == 'home':
- main_hero_iter.append(resp['heroes'][index])
- main_hero=[]
- for index in range(len(main_hero_iter)):
- for emoji_index in range(len(self.emoji_list)):
- if re.sub(r'[?|$|.|!| |]',r'',main_hero_iter[index]['name']) == self.emoji_list[emoji_index].name:
- if resp['heroes'][index]['level'] == main_hero_iter[index]['maxLevel']: main_hero.append(f"{self.emoji_list[emoji_index]}***{resp['heroes'][index]['level']}*** ")
- else: main_hero.append(f"{self.emoji_list[emoji_index]}***{main_hero_iter[index]['level']}*** ")
- if not main_hero: pass
- else:
- embed.add_field(name='Main Village Heroes', value = ''.join(main_hero), inline=True)
- builder_hero_iter = []
- builder_hero=[]
- for index in range(len(resp['heroes'])): # iterates through heroes list in resp and appends only builder vilage heroes
- if resp['heroes'][index]['village'] == 'builderBase':
- builder_hero_iter.append(resp['heroes'][index])
- for index in range(len(builder_hero_iter)):
- for emoji_index in range(len(self.emoji_list)):
- if re.sub(r'[?|$|.|!| |]',r'',builder_hero_iter[index]['name']) == self.emoji_list[emoji_index].name:
- 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']}*** ")
- else: builder_hero.append(f"{self.emoji_list[emoji_index]}***{builder_hero_iter[index]['level']}*** ")
- if not builder_hero:
- pass
- else:
- embed.add_field(name='Builder Base Hero', value = ''.join(builder_hero), inline=True)
- main_troop_iter = []
- main_msg = []
- for index in range(len(resp['troops'])): # iterates through heroes list in resp and appends only main vilage troops
- if resp['troops'][index]['village'] == 'home':
- main_troop_iter.append(resp['troops'][index])
- for index in range(len(main_troop_iter)):
- for emoji_index in range(len(self.emoji_list)):
- if re.sub(r'[?|$|.|!| |]',r'',main_troop_iter[index]['name']) == self.emoji_list[emoji_index].name:
- 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']}*** ")
- else: main_msg.append(f"{self.emoji_list[emoji_index]}{main_troop_iter[index]['level']} ")
- embed.add_field(name='Main Village Troops', value=''.join(main_msg), inline=False)
- builder_troop_iter = []
- builder_msg = []
- for index in range(len(resp['troops'])): # iterates through heroes list in resp and appends only builder vilage troops
- if resp['troops'][index]['village'] == 'builderBase':
- builder_troop_iter.append(resp['troops'][index])
- for index in range(len(builder_troop_iter)):
- for emoji_index in range(len(self.emoji_list)):
- if re.sub(r'[?|$|.|!| |]',r'',builder_troop_iter[index]['name']) == self.emoji_list[emoji_index].name:
- 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']}*** ")
- else: builder_msg.append(f"{self.emoji_list[emoji_index]}{builder_troop_iter[index]['level']} ")
- embed.add_field(name='Builder Base Troops', value=''.join(builder_msg), inline=False)
- spells=[]
- for index in range(len(resp['spells'])):
- for emoji_index in range(len(self.emoji_list)):
- if re.sub(r'[?|$|.|!| |]',r'',resp['spells'][index]['name']) == self.emoji_list[emoji_index].name:
- if resp['spells'][index]['level'] == resp['spells'][index]['maxLevel']: spells.append(f"{self.emoji_list[emoji_index]}***{resp['spells'][index]['level']}*** ")
- else: spells.append(f"{self.emoji_list[emoji_index]}{resp['spells'][index]['level']} ")
- if len(spells) == 0:
- pass
- elif len(spells) != 0:
- embed.add_field(name='Spells', value = ''.join(spells), inline=False)
- embed_list.append(embed)
- index = 0
- message = await ctx.message.channel.send(embed=embed_list[0])
- def check_user(reaction, user):
- return ctx.message.author.id == user.id
- if len(embed_list) > 1:
- await message.add_reaction('⏪')
- await message.add_reaction('❌')
- await message.add_reaction('⏩')
- while True:
- try:
- rxn, user = await self.bot.wait_for('reaction_add', timeout=15, check=check_user)
- if rxn.emoji == '⏩':
- if index >= len(embed_list) - 1: index = 0
- else: index = index + 1
- await message.remove_reaction('⏩', user)
- await message.edit(embed = embed_list[index])
- elif rxn.emoji == '❌':
- await message.clear_reactions()
- return
- elif rxn.emoji == '⏪':
- if index <= 0: index = len(embed_list) - 1
- else: index = index - 1
- await message.remove_reaction('⏪', user)
- await message.edit(embed = embed_list[index])
- except asyncio.TimeoutError:
- await message.clear_reactions()
- return
- @whois.error
- async def whois_error(self, ctx, error):
- await ctx.message.channel.send('Error in whois command. Check log for details.')
- logger.exception("Fatal error in whois command")
- print(traceback.format_exc())
- @commands.command()
- async def link(self, ctx, player_tag:str, discord_user:discord.Member):
- """Link a player to a discord user"""
- await ctx.channel.trigger_typing()
- if '#' not in player_tag: temp_tag = f'#{player_tag}'
- else: temp_tag = player_tag
- wiz_account = await COC.wizbot(temp_tag).get_info
- document = await COC.swimbot(temp_tag).get_id
- if document: #player account already exists in swim
- await ctx.message.channel.send ('Player is already linked to account!')
- return
- elif not wiz_account and not document: #neither wiz nor swim has record of account
- resp = await COC.Player(temp_tag).info
- if not resp:
- await ctx.message.channel.send('That playertag doesn\'t exist, try again.')
- return
- else:
- 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))
- for index in range(len(self.th_list)):
- if resp['townHallLevel'] == (index+1):
- embed.set_thumbnail(url=self.th_list[index])
- embed.add_field(name='Confirm', value = f'Are you sure you want to link this clash account with <@{discord_user.id}>?', inline=False)
- message = await ctx.message.channel.send(embed=embed)
- await message.add_reaction ('✅')
- await message.add_reaction ('❌')
- def check_user(reaction, user):
- return ctx.message.author.id == user.id
- try:
- rxn, user = await self.bot.wait_for('reaction_add', timeout=20, check=check_user)
- if rxn.emoji == '✅':
- await message.delete()
- 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')}
- accounts.insert_one(stuff)
- await ctx.message.channel.send(f'Linked **{resp["name"]}** to <@{discord_user.id}>!')
- elif rxn.emoji == '❌':
- await message.delete()
- return
- except asyncio.TimeoutError:
- await message.delete()
- elif wiz_account and not document: #account exists in wiz, but not swim
- resp = await COC.Player(wiz_account["_id"]).info
- 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')}
- accounts.insert_one(stuff)
- await ctx.message.channel.send ('Player is already linked to account!')
- return
- @link.error
- async def link_error(self, ctx, error):
- await ctx.message.channel.send('Error in link command. Check log for details.')
- logger.exception("Fatal error in link command")
- print(traceback.format_exc())
- def setup(bot):
- bot.add_cog(WhoIsCog(bot))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement