implemented player modification on a per-team per-league basis
This commit is contained in:
		
							parent
							
								
									99dc2905a9
								
							
						
					
					
						commit
						f7164f207e
					
				| 
						 | 
				
			
			@ -333,7 +333,7 @@ def search_teams(search_string):
 | 
			
		|||
    conn = create_connection()
 | 
			
		||||
    if conn is not None:
 | 
			
		||||
        c = conn.cursor()
 | 
			
		||||
        c.execute("SELECT team_json_string FROM teams WHERE name LIKE ?",(re.sub('[^A-Za-z0-9 %]+', '', f"%{search_string}%"),))
 | 
			
		||||
        c.execute("SELECT team_json_string, counter FROM teams WHERE name LIKE ?",(re.sub('[^A-Za-z0-9 %]+', '', f"%{search_string}%"),))
 | 
			
		||||
        team_json_strings = c.fetchall()
 | 
			
		||||
        conn.close()
 | 
			
		||||
        return team_json_strings
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										13
									
								
								games.py
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								games.py
									
									
									
									
									
								
							| 
						 | 
				
			
			@ -1,5 +1,6 @@
 | 
			
		|||
import json, random, os, math, jsonpickle, weather
 | 
			
		||||
import database as db
 | 
			
		||||
from league_storage import get_mods, get_team_mods
 | 
			
		||||
from gametext import base_string, appearance_outcomes, game_strings_base
 | 
			
		||||
 | 
			
		||||
data_dir = "data"
 | 
			
		||||
| 
						 | 
				
			
			@ -79,6 +80,10 @@ class player(object):
 | 
			
		|||
                stars = half_star + 0.5
 | 
			
		||||
            self.stlats[key] = stars
 | 
			
		||||
 | 
			
		||||
    def apply_mods(self, mod_dic):
 | 
			
		||||
        for stat in iter(mod_dic.keys()):
 | 
			
		||||
            self.stlats[stat] = self.stlats[stat] + mod_dic[stat]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class team(object):
 | 
			
		||||
    def __init__(self):
 | 
			
		||||
| 
						 | 
				
			
			@ -190,6 +195,14 @@ class team(object):
 | 
			
		|||
            self.pitcher = None
 | 
			
		||||
            return (len(self.lineup) >= 1 and len(self.rotation) > 0)
 | 
			
		||||
 | 
			
		||||
    def apply_team_mods(self, league_name):
 | 
			
		||||
        mod_dic = get_team_mods(league_name, self.name)
 | 
			
		||||
        if mod_dic != {} and mod_dic != None:
 | 
			
		||||
            for player_name in iter(mod_dic.keys()):
 | 
			
		||||
                this_player = self.find_player(player_name)[0]
 | 
			
		||||
                if this_player is not None:
 | 
			
		||||
                    this_player.apply_mods(mod_dic[player_name])
 | 
			
		||||
 | 
			
		||||
    def prepare_for_save(self):
 | 
			
		||||
        self.lineup_position = 0
 | 
			
		||||
        self.score = 0
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -17,6 +17,14 @@ def create_connection(league_name):
 | 
			
		|||
        # enable write-ahead log for performance and resilience
 | 
			
		||||
        conn.execute('pragma journal_mode=wal')
 | 
			
		||||
 | 
			
		||||
        modifications_table_check_string = """ CREATE TABLE IF NOT EXISTS mods (
 | 
			
		||||
                                                counter integer PRIMARY KEY,
 | 
			
		||||
                                                name text NOT NULL,
 | 
			
		||||
                                                team_name text NOT NULL,
 | 
			
		||||
                                                modifications_json text
 | 
			
		||||
                                            );"""
 | 
			
		||||
        conn.execute(modifications_table_check_string)
 | 
			
		||||
 | 
			
		||||
        return conn
 | 
			
		||||
    except:
 | 
			
		||||
        print("oops, db connection no work")
 | 
			
		||||
| 
						 | 
				
			
			@ -124,10 +132,18 @@ def init_league_db(league):
 | 
			
		|||
                                            run_diff integer DEFAULT 0
 | 
			
		||||
                                        ); """
 | 
			
		||||
 | 
			
		||||
    modifications_table_check_string = """ CREATE TABLE IF NOT EXISTS mods (
 | 
			
		||||
                                                counter integer PRIMARY KEY,
 | 
			
		||||
                                                name text NOT NULL,
 | 
			
		||||
                                                team_name text NOT NULL,
 | 
			
		||||
                                                modifications_json text
 | 
			
		||||
                                            );"""
 | 
			
		||||
 | 
			
		||||
    if conn is not None:
 | 
			
		||||
        c = conn.cursor()
 | 
			
		||||
        c.execute(player_stats_table_check_string)
 | 
			
		||||
        c.execute(teams_table_check_string)
 | 
			
		||||
        c.execute(modifications_table_check_string)
 | 
			
		||||
 | 
			
		||||
        for team in league.teams_in_league():
 | 
			
		||||
            c.execute("INSERT INTO teams (name) VALUES (?)", (team.name,))
 | 
			
		||||
| 
						 | 
				
			
			@ -195,6 +211,63 @@ def get_stats(league_name, stat, is_batter=True, day = 10):
 | 
			
		|||
    conn.close()
 | 
			
		||||
    return stats
 | 
			
		||||
 | 
			
		||||
def get_mods(league_name, player:str, team:str):
 | 
			
		||||
    """returns a player's modifications dict"""
 | 
			
		||||
    conn = create_connection(league_name)
 | 
			
		||||
    if conn is not None:
 | 
			
		||||
        c = conn.cursor()
 | 
			
		||||
        c.execute("SELECT * FROM stats WHERE name=? AND team_name=?", (player, team)) #check stats table to make sure player actually exists in the league
 | 
			
		||||
        row = c.fetchone()
 | 
			
		||||
        if row is None:
 | 
			
		||||
            return False
 | 
			
		||||
        c.execute("SELECT modifications_json FROM mods WHERE name=? AND team_name=?", (player, team))
 | 
			
		||||
        mod_string = c.fetchone()
 | 
			
		||||
        if mod_string is None:
 | 
			
		||||
            return None
 | 
			
		||||
        mods = json.loads(mod_string[0])
 | 
			
		||||
        conn.close()
 | 
			
		||||
        return mods
 | 
			
		||||
    return False
 | 
			
		||||
 | 
			
		||||
def get_team_mods(league_name, team:str):
 | 
			
		||||
    """returns a dictionary of player modifications belonging to a team"""
 | 
			
		||||
    conn = create_connection(league_name)
 | 
			
		||||
    if conn is not None:
 | 
			
		||||
        c = conn.cursor()
 | 
			
		||||
        c.execute("SELECT * FROM stats WHERE team_name=?", (team,)) #check stats table to make sure team actually exists in the league
 | 
			
		||||
        row = c.fetchone()
 | 
			
		||||
        if row is None:
 | 
			
		||||
            return False
 | 
			
		||||
        c.execute("SELECT name, modifications_json FROM mods WHERE team_name=?",(team,))
 | 
			
		||||
        rows = c.fetchall()
 | 
			
		||||
        if len(rows) == 0:
 | 
			
		||||
            return None
 | 
			
		||||
        mods_dic = {}
 | 
			
		||||
        for row in rows:
 | 
			
		||||
            mods_dic[row[0]] = json.loads(row[1])
 | 
			
		||||
        return mods_dic
 | 
			
		||||
 | 
			
		||||
def set_mods(league_name, player:str, team:str, modifications:dict):
 | 
			
		||||
    """Overwrites a player's modifications with an entirely new set"""
 | 
			
		||||
    conn = create_connection(league_name)
 | 
			
		||||
    if conn is not None:
 | 
			
		||||
        c = conn.cursor()
 | 
			
		||||
        c.execute("SELECT * FROM stats WHERE name=? AND team_name=?", (player, team)) #check stats table to make sure player actually exists in the league
 | 
			
		||||
        row = c.fetchone()
 | 
			
		||||
        if row is None:
 | 
			
		||||
            return False
 | 
			
		||||
        mod_string = json.dumps(modifications)
 | 
			
		||||
        c.execute("SELECT counter FROM mods WHERE name=? AND team_name=?", (player, team)) #check stats table to make sure player actually exists in the league
 | 
			
		||||
        counter = c.fetchone()
 | 
			
		||||
        if counter is None:
 | 
			
		||||
            c.execute("INSERT INTO mods(name, team_name, modifications_json) VALUES (?,?,?)", (player, team, mod_string))
 | 
			
		||||
        else:
 | 
			
		||||
            c.execute("UPDATE mods SET modifications_json = ? WHERE counter=?", (mod_string, counter))
 | 
			
		||||
        conn.commit()
 | 
			
		||||
        conn.close
 | 
			
		||||
        return True
 | 
			
		||||
    return False
 | 
			
		||||
 | 
			
		||||
def update_standings(league_name, update_dic):
 | 
			
		||||
    if league_exists(league_name):
 | 
			
		||||
        conn = create_connection(league_name)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,7 +1,7 @@
 | 
			
		|||
import discord, json, math, os, roman, games, asyncio, random, main_controller, threading, time, urllib, leagues, datetime, gametext, real_players
 | 
			
		||||
import database as db
 | 
			
		||||
import onomancer as ono
 | 
			
		||||
from league_storage import league_exists, season_save, season_restart
 | 
			
		||||
from league_storage import league_exists, season_save, season_restart, get_mods, get_team_mods, set_mods
 | 
			
		||||
from the_draft import Draft
 | 
			
		||||
from flask import Flask
 | 
			
		||||
from uuid import uuid4
 | 
			
		||||
| 
						 | 
				
			
			@ -643,6 +643,7 @@ class DraftFlagsCommand(Command):
 | 
			
		|||
--wait or -w: Sets the timeout, in seconds, to wait for draftees to pick a player.
 | 
			
		||||
--chaos or -c: The percentage of onomancer names in the pool. Higher numbers mean less real names, but faster pool generation. Accepts any number between 0 and 1.
 | 
			
		||||
"""
 | 
			
		||||
        await msg.channel.send(text)
 | 
			
		||||
 | 
			
		||||
class StartDraftCommand(Command):
 | 
			
		||||
    name = "startdraft"
 | 
			
		||||
| 
						 | 
				
			
			@ -896,6 +897,36 @@ Not every team will play every series, due to how the scheduling algorithm is co
 | 
			
		|||
        else:
 | 
			
		||||
            raise CommandError("Couldn't find that league, boss. Did you save it on the website?")
 | 
			
		||||
 | 
			
		||||
class LeagueSetPlayerModifiersCommand(Command):
 | 
			
		||||
    name = "setplayermods"
 | 
			
		||||
    template = "m;setplayermods [league name]\n[team name]\n[player name]\n4 numbers, seperated by a space, for batting pitching baserunning defense"
 | 
			
		||||
    description = "Set a pack of modifiers to a specific player in your league. Commissioners only."
 | 
			
		||||
 | 
			
		||||
    async def execute(self, msg, command, flags):
 | 
			
		||||
        if league_exists(command.split("\n")[0].strip()):
 | 
			
		||||
            try:
 | 
			
		||||
                league = leagues.load_league_file(command.split("\n")[0].strip())
 | 
			
		||||
            except IndexError:
 | 
			
		||||
                raise CommandError("League name goes on the second line now, boss.")
 | 
			
		||||
        else:
 | 
			
		||||
            raise CommandError("Can't find that league, boss.")
 | 
			
		||||
 | 
			
		||||
        try:
 | 
			
		||||
            team_name = command.split("\n")[1].strip()
 | 
			
		||||
            player_name = command.split("\n")[2].strip()
 | 
			
		||||
            mods_text_list = command.split("\n")[3].strip().split(" ")
 | 
			
		||||
            keys = ["batting_stars", "pitching_stars", "baserunning_stars", "defense_stars"]
 | 
			
		||||
            mod_dic = {}
 | 
			
		||||
            for i in range(0,4):
 | 
			
		||||
                mod_dic[keys[i]] = float(mods_text_list[i])
 | 
			
		||||
            set_mods(league.name, player_name, team_name, mod_dic)
 | 
			
		||||
            await msg.channel.send("You got it, boss. Divine intervention, served by yours truly.")
 | 
			
		||||
        except IndexError:
 | 
			
		||||
            raise CommandError("You didn't give us enough info, chief. Check the help text.")
 | 
			
		||||
        #except ValueError:
 | 
			
		||||
            #raise CommandError("Those modifiers didn't make a lick of sense. Try again with sensible numbers this time.")
 | 
			
		||||
                
 | 
			
		||||
 | 
			
		||||
class LeagueSubscribeCommand(Command):
 | 
			
		||||
    name = "leaguesub"
 | 
			
		||||
    template = "m;leaguesub [league name]"
 | 
			
		||||
| 
						 | 
				
			
			@ -1542,6 +1573,7 @@ commands = [
 | 
			
		|||
    OBLResetCommand(),
 | 
			
		||||
    LeagueClaimCommand(),
 | 
			
		||||
    LeagueAddOwnersCommand(),
 | 
			
		||||
    LeagueSetPlayerModifiersCommand(),
 | 
			
		||||
    StartLeagueCommand(),
 | 
			
		||||
    LeagueSubscribeCommand(),
 | 
			
		||||
    LeaguePauseCommand(),
 | 
			
		||||
| 
						 | 
				
			
			@ -1841,6 +1873,9 @@ def prepare_game(newgame, league = None, weather_name = None):
 | 
			
		|||
        state_init["is_league"] = False
 | 
			
		||||
    else:
 | 
			
		||||
        state_init["is_league"] = True
 | 
			
		||||
        newgame.teams['away'].apply_team_mods(league.name)
 | 
			
		||||
        newgame.teams['home'].apply_team_mods(league.name)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    return newgame, state_init
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -2345,9 +2380,8 @@ async def start_league_day(channel, league, partial = False):
 | 
			
		|||
 | 
			
		||||
            this_game = games.game(away.finalize(), home.finalize(), length = game_length)
 | 
			
		||||
            this_game.weather = league.get_weather_now(home.name)(this_game)
 | 
			
		||||
            this_game, state_init = prepare_game(this_game)
 | 
			
		||||
            this_game, state_init = prepare_game(this_game, league=league)
 | 
			
		||||
 | 
			
		||||
            state_init["is_league"] = True
 | 
			
		||||
            if not partial:
 | 
			
		||||
                series_string = "Series score:"
 | 
			
		||||
                state_init["title"] = f"{series_string} 0 - 0"
 | 
			
		||||
| 
						 | 
				
			
			@ -2562,9 +2596,8 @@ async def continue_league_series(league, queue, games_list, series_results, miss
 | 
			
		|||
        home_team.set_pitcher(rotation_slot=league.day)
 | 
			
		||||
        this_game = games.game(away_team.finalize(), home_team.finalize(), length = league.game_length)
 | 
			
		||||
        this_game.weather = league.get_weather_now(home_team.name)(this_game)
 | 
			
		||||
        this_game, state_init = prepare_game(this_game)
 | 
			
		||||
        this_game, state_init = prepare_game(this_game, league=league)
 | 
			
		||||
 | 
			
		||||
        state_init["is_league"] = True
 | 
			
		||||
        series_string = f"Series score:"
 | 
			
		||||
 | 
			
		||||
        if missed <= 0:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue