designed and implemented the One Big League
This commit is contained in:
parent
f22af2520a
commit
51215cba59
113
database.py
113
database.py
|
@ -1,6 +1,7 @@
|
|||
#handles the database interactions
|
||||
import os, json, datetime, re
|
||||
import sqlite3 as sql
|
||||
from random import sample
|
||||
|
||||
data_dir = "data"
|
||||
|
||||
|
@ -71,6 +72,14 @@ def initialcheck():
|
|||
owner_id integer
|
||||
); """
|
||||
|
||||
one_big_league_check_string = """ CREATE TABLE IF NOT EXISTS one_big_league (
|
||||
counter integer PRIMARY KEY,
|
||||
team_name text NOT NULL,
|
||||
teams_beaten_list text,
|
||||
current_opponent_pool text,
|
||||
obl_points int DEFAULT 0
|
||||
);"""
|
||||
|
||||
if conn is not None:
|
||||
c = conn.cursor()
|
||||
c.execute(soulscream_table_check_string)
|
||||
|
@ -78,6 +87,7 @@ def initialcheck():
|
|||
c.execute(player_table_check_string)
|
||||
c.execute(player_stats_table_check_string)
|
||||
c.execute(teams_table_check_string)
|
||||
c.execute(one_big_league_check_string)
|
||||
|
||||
conn.commit()
|
||||
conn.close()
|
||||
|
@ -297,6 +307,26 @@ def get_all_teams():
|
|||
conn.close()
|
||||
return None
|
||||
|
||||
def get_all_team_names():
|
||||
conn = create_connection()
|
||||
if conn is not None:
|
||||
c = conn.cursor()
|
||||
c.execute("SELECT name FROM teams")
|
||||
team_names = c.fetchall()
|
||||
team_names_out = [name for (name,) in team_names]
|
||||
conn.close()
|
||||
return team_names_out
|
||||
conn.close()
|
||||
return None
|
||||
|
||||
def get_filtered_teams(filter_list):
|
||||
teams_list = get_all_team_names()
|
||||
out_list = []
|
||||
for team in teams_list:
|
||||
if team not in filter_list:
|
||||
out_list.append(team)
|
||||
return out_list
|
||||
|
||||
def search_teams(search_string):
|
||||
conn = create_connection()
|
||||
if conn is not None:
|
||||
|
@ -327,3 +357,86 @@ def add_stats(player_game_stats_list):
|
|||
c.execute(f"UPDATE stats SET {stat} = ? WHERE name=?",(player_stats_dic[stat],name))
|
||||
conn.commit()
|
||||
conn.close()
|
||||
|
||||
|
||||
def add_team_obl(team):
|
||||
conn = create_connection()
|
||||
if conn is not None:
|
||||
c=conn.cursor()
|
||||
opponents = sample(get_filtered_teams([team.name]), 5)
|
||||
c.execute("INSERT INTO one_big_league(team_name, current_opponent_pool) VALUES (?, ?)", (team.name, list_to_newline_string(opponents)))
|
||||
|
||||
conn.commit()
|
||||
conn.close()
|
||||
|
||||
def save_obl_results(winning_team, losing_team):
|
||||
conn = create_connection()
|
||||
if conn is not None:
|
||||
c=conn.cursor()
|
||||
c.execute("SELECT teams_beaten_list, current_opponent_pool, obl_points FROM one_big_league WHERE team_name = ?", (winning_team.name,))
|
||||
try:
|
||||
beaten_string, opponents_string, obl_points = c.fetchone()
|
||||
except TypeError: #add team to OBL
|
||||
add_team_obl(winning_team)
|
||||
add_team_obl(losing_team)
|
||||
else:
|
||||
beaten_teams = newline_string_to_list(beaten_string)
|
||||
opponent_teams = newline_string_to_list(opponents_string)
|
||||
if losing_team.name in opponent_teams:
|
||||
beaten_teams.append(losing_team.name)
|
||||
opponent_teams = sample(get_filtered_teams([winning_team.name]), 5)
|
||||
obl_points += 1
|
||||
|
||||
c.execute("UPDATE one_big_league SET teams_beaten_list = ?, current_opponent_pool = ?, obl_points = ? WHERE team_name = ?", (list_to_newline_string(beaten_teams), list_to_newline_string(opponent_teams), obl_points, winning_team.name))
|
||||
|
||||
conn.commit()
|
||||
conn.close()
|
||||
return
|
||||
|
||||
def get_obl_stats(team):
|
||||
conn = create_connection()
|
||||
if conn is not None:
|
||||
c=conn.cursor()
|
||||
opponents_string = None
|
||||
while opponents_string is None:
|
||||
c.execute("SELECT teams_beaten_list, current_opponent_pool FROM one_big_league WHERE team_name = ?", (team.name,))
|
||||
try:
|
||||
beaten_string, opponents_string = c.fetchone()
|
||||
except TypeError: #add team to OBL
|
||||
add_team_obl(team)
|
||||
|
||||
beaten_teams = newline_string_to_list(beaten_string)
|
||||
opponent_teams = opponents_string
|
||||
obl_points = len(beaten_teams)
|
||||
|
||||
teams_list = [name for name, points in obl_leaderboards()]
|
||||
rank = teams_list.index(team.name) + 1
|
||||
|
||||
return (obl_points, opponent_teams, rank)
|
||||
conn.close()
|
||||
return (None, None)
|
||||
|
||||
def obl_leaderboards():
|
||||
conn = create_connection()
|
||||
if conn is not None:
|
||||
c=conn.cursor()
|
||||
c.execute("SELECT team_name, obl_points FROM one_big_league ORDER BY obl_points DESC")
|
||||
teams_list = c.fetchall()
|
||||
|
||||
return teams_list #element (team_name, obl_points)
|
||||
conn.close()
|
||||
return False
|
||||
|
||||
def list_to_newline_string(list):
|
||||
string = ""
|
||||
for element in list:
|
||||
if string != "":
|
||||
string += "\n"
|
||||
string += element
|
||||
return string
|
||||
|
||||
def newline_string_to_list(string):
|
||||
if string is not None and string != "":
|
||||
return string.split("\n")
|
||||
else:
|
||||
return []
|
10
games.py
10
games.py
|
@ -626,7 +626,7 @@ class game(object):
|
|||
self.inning += 1
|
||||
if self.inning > self.max_innings and self.teams["home"].score != self.teams["away"].score: #game over
|
||||
self.over = True
|
||||
#do the One Big League stuff here
|
||||
db.save_obl_results(self.teams["home"] if self.teams["home"].score > self.teams["away"].score else self.teams["away"], self.teams["home"] if self.teams["home"].score < self.teams["away"].score else self.teams["away"])
|
||||
|
||||
|
||||
def end_of_game_report(self):
|
||||
|
@ -791,3 +791,11 @@ def search_team(search_term):
|
|||
|
||||
teams.append(team_json)
|
||||
return teams
|
||||
|
||||
def get_filtered_teams(teams_to_remove):
|
||||
teams = []
|
||||
for team_pickle in db.get_all_teams():
|
||||
this_team = jsonpickle.decode(team_pickle[0], keys=True, classes=team)
|
||||
if this_team.name not in teams_to_remove:
|
||||
teams.append(this_team)
|
||||
return teams
|
|
@ -236,4 +236,4 @@ def update_loop():
|
|||
state["update_pause"] -= 1
|
||||
|
||||
socketio.emit("states_update", game_states)
|
||||
time.sleep(8)
|
||||
time.sleep(1)
|
||||
|
|
|
@ -29,6 +29,7 @@
|
|||
<Compile Include="debug storage.py">
|
||||
<SubType>Code</SubType>
|
||||
</Compile>
|
||||
<Compile Include="gametext.py" />
|
||||
<Compile Include="leagues.py">
|
||||
<SubType>Code</SubType>
|
||||
</Compile>
|
||||
|
@ -46,6 +47,7 @@
|
|||
</Compile>
|
||||
<Compile Include="roman.py" />
|
||||
<Compile Include="the_prestige.py" />
|
||||
<Compile Include="weather.py" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Interpreter Include="matteo_env\">
|
||||
|
|
|
@ -1233,6 +1233,60 @@ class LeagueRenameCommand(Command):
|
|||
else:
|
||||
await msg.channel.send("We can't find that league.")
|
||||
|
||||
class OBLExplainCommand(Command):
|
||||
name = "oblhelp"
|
||||
template = "m;oblhelp"
|
||||
description = "Explains the One Big League!"
|
||||
|
||||
async def execute(self, msg, command):
|
||||
await msg.channel.send("""The One Big League, or OBL, is an asynchronous league that includes every team in the simsim's database. To participate, just use the m;oblteam command with your team of choice. No signup is required! This will give a list of five opponents; playing against one of them and winning nets you a point, and will refresh the list with five new opponents. Each meta-season will last for a few weeks, after which the leaderboards are reset to start the race again!
|
||||
|
||||
Look out for the people wrestling emoji, which indicates the potential for a :people_wrestling:Wrassle Match:people_wrestling:, where both teams are on each others' lists and both have the opportunity to score a point. Team rankings and points can also be viewed in the oblteam command, and the overall OBL leaderboard can be checked with the m;oblstandings command. Best of luck!!
|
||||
""")
|
||||
|
||||
class OBLLeaderboardCommand(Command):
|
||||
name = "oblstandings"
|
||||
template = "m;oblstandings"
|
||||
description = "Displays the 15 teams with the most OBL points in this meta-season."
|
||||
|
||||
async def execute(self, msg, command):
|
||||
leaders_list = db.obl_leaderboards()[:15]
|
||||
leaders = {}
|
||||
rank = 1
|
||||
for team, points in leaders_list:
|
||||
leaders[team] = {"rank" : rank, "points" : points}
|
||||
rank += 1
|
||||
|
||||
embed = discord.Embed(color=discord.Color.red(), title="The One Big League")
|
||||
for team in leaders.keys():
|
||||
embed.add_field(name=f"{leaders[team]['rank']}. {team}", value=f"{leaders[team]['points']} points" , inline = False)
|
||||
await msg.channel.send(embed=embed)
|
||||
|
||||
class OBLTeamCommand(Command):
|
||||
name = "oblteam"
|
||||
template = "m;oblteam [team name]"
|
||||
description = "Displays a team's rank, current OBL points, and current opponent selection."
|
||||
|
||||
async def execute(self, msg, command):
|
||||
team = get_team_fuzzy_search(command.strip())
|
||||
if team is None:
|
||||
await msg.channel.send("Sorry boss, we can't find that team.")
|
||||
return
|
||||
|
||||
points, opponents_string, rank = db.get_obl_stats(team)
|
||||
opponents_list = db.newline_string_to_list(opponents_string)
|
||||
for index in range(0, len(opponents_list)):
|
||||
oppteam = get_team_fuzzy_search(opponents_list[index])
|
||||
opplist = db.get_obl_stats(oppteam)[1]
|
||||
if team.name in opplist:
|
||||
opponents_list[index] = opponents_list[index] + " 🤼"
|
||||
|
||||
embed = discord.Embed(color=discord.Color.red(), title=f"{team.name} in the One Big League")
|
||||
embed.add_field(name="OBL Points", value=points)
|
||||
embed.add_field(name="Rank", value=rank)
|
||||
embed.add_field(name="Opponent Pool", value=opponents_string, inline=False)
|
||||
await msg.channel.send(embed=embed)
|
||||
|
||||
|
||||
commands = [
|
||||
IntroduceCommand(),
|
||||
|
@ -1256,6 +1310,9 @@ commands = [
|
|||
StartGameCommand(),
|
||||
StartRandomGameCommand(),
|
||||
StartTournamentCommand(),
|
||||
OBLExplainCommand(),
|
||||
OBLTeamCommand(),
|
||||
OBLLeaderboardCommand(),
|
||||
LeagueClaimCommand(),
|
||||
LeagueAddOwnersCommand(),
|
||||
StartLeagueCommand(),
|
||||
|
|
Loading…
Reference in a new issue