352 lines
14 KiB
Python
352 lines
14 KiB
Python
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))
|