import copy import datetime import logging import re import discord import pygsheets import requests import gauntlets from helpers import * from db_calls import * from discord import Member from discord.ext import commands, tasks from discord import app_commands from difflib import get_close_matches # date = f'{datetime.datetime.now().year}-{datetime.datetime.now().month}-{datetime.datetime.now().day}' # logging.basicConfig( # filename=f'logs/{date}.log', # format='%(asctime)s - %(levelname)s - %(message)s', # level=logging.WARNING # ) class Admins(commands.Cog): def __init__(self, bot): self.bot = bot self.weekly_reset_done = False # async def cog_load(self): # await self.bot.change_presence(activity=discord.Game(name='strat | .help')) async def cog_command_error(self, ctx, error): await ctx.send(f'{error}') async def dev_startup(self): # Check for Paper Sluggers event e_query = db_get('events', params=[('name', 'Paper Sluggers')]) if e_query is None: this_event = db_post( 'events', payload={ "name": "Paper Sluggers", "short_desc": f'Draft a team to win you ten games as we celebrate the introduction of the ' f'Mario Super Sluggers cardset to Paper Dynasty!', "long_desc": "", "url": f'https://cdn.discordapp.com/attachments/603421569972305921/1087862987215347805/' f'PD-Mario-Full.png', "active": True } ) else: this_event = e_query['events'][0] # Check for Game Rewards gr_query = db_get('gamerewards', params=[('name', 'MVP Pack')]) if gr_query['count'] == 0: mv_pack = db_post( 'gamerewards', payload={ 'name': 'MVP', 'pack_type_id': 5 } ) else: mv_pack = gr_query['gamerewards'][0] gr_query = db_get('gamerewards', params=[('name', 'All-Star Pack')]) if gr_query['count'] == 0: as_pack = db_post( 'gamerewards', payload={ 'name': 'All-Star Pack', 'pack_type_id': 6 } ) else: as_pack = gr_query['gamerewards'][0] gr_query = db_get('gamerewards', params=[('name', 'Mario Pack')]) if gr_query['count'] == 0: m_pack = db_post( 'gamerewards', payload={ 'name': 'Mario Pack', 'pack_type_id': 7 } ) else: m_pack = gr_query['gamerewards'][0] # Check for Gauntlet rewards gr_query = db_get('gauntletrewards', params=[('gauntlet_id', this_event['id'])]) if gr_query['count'] == 0: db_post( 'gauntletrewards', payload={ 'rewards': [ { 'name': '3 Wins', 'gauntlet_id': this_event['id'], 'reward_id': m_pack['id'], 'win_num': 3 }, { 'name': '6 Wins', 'gauntlet_id': this_event['id'], 'reward_id': as_pack['id'], 'win_num': 6 }, { 'name': '8 Wins', 'gauntlet_id': this_event['id'], 'reward_id': m_pack['id'], 'win_num': 8 }, { 'name': '10 Wins', 'gauntlet_id': this_event['id'], 'reward_id': mv_pack['id'], 'win_num': 10 }, { 'name': '10-0', 'gauntlet_id': this_event['id'], 'reward_id': m_pack['id'], 'win_num': 10, 'loss_max': 0 } ] } ) @commands.command(name='dev_startup', help='Run startup function') async def dev_startup_command(self, ctx): await self.dev_startup() await ctx.send(random_conf_gif()) group_give = app_commands.Group(name='give', description='Mod: Distribute packs or tokens') @group_give.command(name='packs') async def give_packs_subcommand( self, interaction: discord.Interaction, num_packs: int, pack_type: Literal['Standard', 'Premium', 'MVP'], team_abbrevs: str): if not owner_only(interaction): await interaction.response.send_message(random_no_gif()) return current = db_get('current') await interaction.response.defer() p_query = db_get('packtypes', params=[('name', pack_type)]) response = '' for x in team_abbrevs.split(' '): team = db_get('teams', params=[('abbrev', x), ('season', current['season'])])['teams'][0] if team: total_packs = give_packs(team, num_packs, pack_type=p_query['packtypes'][0]) response += f'Just gave {num_packs} {pack_type} pack{"s" if num_packs > 1 else ""} to the ' \ f'{team["sname"]}. They now have {total_packs["count"]} ' \ f'pack{"s" if total_packs["count"] > 1 else ""}.\n' elif x.upper() == 'LEAGUE': all_teams = db_get('teams', params=[('season', current['season'])]) for y in all_teams['teams']: logging.warning(f'Giving {num_packs} pack(s) to team: {y["abbrev"]}') give_packs(team, num_packs) response = f'Just gave all {all_teams["count"]} teams {num_packs} ' \ f'standard pack{"s" if num_packs > 1 else ""}!' else: await interaction.edit_original_response(content=f'Hmm...I\'m not sure who **{x.upper()}** is.') return logging.info(f'give info: {response}') await interaction.edit_original_response(content=f'{response if len(response) > 0 else "All done!"}') @commands.hybrid_command(name='post-guide', help='Mod: Post the ratings guide to team sheet') @commands.is_owner() async def post_guide_command(self, ctx, gm: Member): team = get_team_by_owner(gm.id) db_patch('teams', object_id=team['id'], params=[('has_guide', True)]) post_ratings_guide(team, self.bot) await ctx.send(random_conf_gif()) @commands.hybrid_command(name='sync-sheets', help='Mod: Sync AI team sheets') @commands.is_owner() async def sync_sheets_command(self, ctx): t_query = db_get('teams', params=[('is_ai', True)]) response = await ctx.send(f'Alright, I\'m getting started...') sheets = get_sheets(self.bot) for count, team in enumerate(t_query['teams']): this_sheet = sheets.open_by_key(team['gsheet']) team_data = this_sheet.worksheet_by_title('Team Data') team_data.update_values( crange='B1:B2', values=[[f'{team["id"]}'], [f'\'{team_hash(team)}']] ) await response.edit(content=f'Just finished the {team["sname"]} ({count + 1}/{len(t_query["teams"])})...') await response.edit(content=f'All done!') @commands.hybrid_command(name='update-rarity', help='Mod: Pull current rarities and update players') @commands.is_owner() async def update_rarity_command(self, ctx, sheet_url: str): await ctx.send(f'Oh boy, here I go sheetsing again!') # Template: # https://docs.google.com/spreadsheets/d/14FpNo2JOmAKc7rdeiEGNUOud_gbLSrlcoic-OXlhsQc/edit#gid=1845561581 sheets = get_sheets(self.bot) this_sheet = sheets.open_by_url(sheet_url) logging.info(f'this_sheet: {this_sheet}') up_sheet = this_sheet.worksheet_by_title('Rarity Updates') logging.info(f'up_sheet: {up_sheet}') all_players = up_sheet.range('A2:E') # logging.info(f'all_players: {all_players}') rarities = { 'MVP': 1, 'All-Star': 2, 'Starter': 3, 'Reserve': 4, 'Replacement': 5, 'Hall of Fame': 99 } def new_cost(player, new_rarity, old_rarity): old_cost = player['cost'] old_rarity = old_rarity new_rarity = new_rarity logging.info(f'old_rarity: {old_rarity} / new_rarity: {new_rarity}') if old_rarity == 1: if new_rarity == 2: return max(old_cost - 540, 100) elif new_rarity == 3: return max(old_cost - 720, 50) elif new_rarity == 4: return max(old_cost - 780, 15) elif new_rarity == 5: return max(old_cost - 800, 5) elif old_rarity == 2: if new_rarity == 1: return old_cost + 540 elif new_rarity == 3: return max(old_cost - 180, 50) elif new_rarity == 4: return max(old_cost - 240, 15) elif new_rarity == 5: return max(old_cost - 260, 5) elif old_rarity == 3: if new_rarity == 1: return old_cost + 720 elif new_rarity == 2: return old_cost + 180 elif new_rarity == 4: return max(old_cost - 60, 15) elif new_rarity == 5: return max(old_cost - 80, 5) elif old_rarity == 4: if new_rarity == 1: return old_cost + 780 elif new_rarity == 2: return old_cost + 240 elif new_rarity == 3: return old_cost + 60 elif new_rarity == 5: return max(old_cost - 20, 5) elif old_rarity == 5: if new_rarity == 1: return old_cost + 800 elif new_rarity == 2: return old_cost + 260 elif new_rarity == 3: return old_cost + 80 elif new_rarity == 4: return old_cost + 20 raise KeyError(f'Could not find a cost update for {player["p_name"]} from {player["rarity"]["name"]} to ' f'{new_rarity}') player_id = 804 errors = [] new_players = [] done = 0 for line in all_players: # logging.info(f'line: {line}') if line[4].value == 'CHANGE': try: logging.info(f'Updating {line[1].value}') this_player = db_get('players', object_id=line[0].value) logging.info(f'this_player: {this_player["p_name"]}') new_player = copy.deepcopy(this_player) new_player['player_id'] = player_id + done logging.info(f'new_player: {new_player["player_id"]}') new_player['image'] = new_player['image'].replace("-launch", "-launch/update01") new_player['rarity_id'] = rarities[line[3].value] # new_player['cardset_id'] = 3 new_player['cost'] = new_cost(this_player, rarities[line[3].value], rarities[line[2].value]) logging.info(f'new_player cost: {new_player["cost"]}') this_player = db_patch('players', object_id=this_player['player_id'], params=[ ('cost', new_player['cost']) ]) logging.info(f'patched_player: {this_player["p_name"]} / cardset: {this_player["cardset"]["id"]}') # new_players.append(new_player) # new_player = db_patch('players', object_id=this_player['player_id'], params=[ # ('image', this_player['image'].replace("-launch", "-launch/update01")), # ('rarity_id', rarities[line[3].value]), ('cost', new_cost(this_player, rarities[line[3].value])) # ]) done += 1 except Exception as e: e_message = f'{line[1].value}: {e}' logging.error(e_message) errors.append(e_message) db_post('players', payload={'players': new_players}) await ctx.send(f'Updated {done} players!') if len(errors) > 0: e_string = "\n- ".join(errors) await ctx.send(f'I encountered the following errors:\n\n{e_string}') @commands.command(name='tc', help='Mod: Test command') @commands.is_owner() async def test_choices_command(self, ctx): await ctx.send(f'Posting packs now...') db_post('packs/one', payload={ 'team_id': 31, 'pack_type_id': 8 }) db_post('packs/one', payload={ 'team_id': 31, 'pack_type_id': 3 }) db_post('packs/one', payload={ 'team_id': 31, 'pack_type_id': 3, 'pack_team_id': 3 }) await ctx.send(f'Posted the team choice pack') async def setup(bot): await bot.add_cog(Admins(bot))