added stat collection, fixed a database bug, fixed a typo, added showallteams and searchteams
This commit is contained in:
parent
6b4c73227b
commit
00fbbf71a5
54
database.py
54
database.py
|
@ -1,5 +1,5 @@
|
||||||
#handles the database interactions
|
#handles the database interactions
|
||||||
import os, json, datetime
|
import os, json, datetime, re
|
||||||
import sqlite3 as sql
|
import sqlite3 as sql
|
||||||
|
|
||||||
|
|
||||||
|
@ -197,7 +197,7 @@ def save_team(name, team_json_string):
|
||||||
c = conn.cursor()
|
c = conn.cursor()
|
||||||
store_string = """ INSERT INTO teams(name, team_json_string, timestamp)
|
store_string = """ INSERT INTO teams(name, team_json_string, timestamp)
|
||||||
VALUES (?,?, ?) """
|
VALUES (?,?, ?) """
|
||||||
c.execute(store_string, (name, team_json_string, datetime.datetime.now(datetime.timezone.utc)))
|
c.execute(store_string, (re.sub('[^A-Za-z0-9 ]+', '', name), team_json_string, datetime.datetime.now(datetime.timezone.utc))) #this regex removes all non-standard characters
|
||||||
conn.commit()
|
conn.commit()
|
||||||
conn.close()
|
conn.close()
|
||||||
return True
|
return True
|
||||||
|
@ -210,11 +210,57 @@ def get_team(name):
|
||||||
conn = create_connection()
|
conn = create_connection()
|
||||||
if conn is not None:
|
if conn is not None:
|
||||||
c = conn.cursor()
|
c = conn.cursor()
|
||||||
c.execute("SELECT * FROM teams WHERE name=?", (name,))
|
c.execute("SELECT team_json_string FROM teams WHERE name=?", (re.sub('[^A-Za-z0-9 ]+', '', name),)) #see above note re: regex
|
||||||
team = c.fetchone()
|
team = c.fetchone()
|
||||||
|
|
||||||
conn.close()
|
conn.close()
|
||||||
return team[2] #returns a json string
|
|
||||||
|
return team #returns a json string
|
||||||
|
|
||||||
|
|
||||||
conn.close()
|
conn.close()
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
def get_all_teams():
|
||||||
|
conn = create_connection()
|
||||||
|
if conn is not None:
|
||||||
|
c = conn.cursor()
|
||||||
|
c.execute("SELECT team_json_string FROM teams")
|
||||||
|
team_strings = c.fetchall()
|
||||||
|
conn.close()
|
||||||
|
return team_strings
|
||||||
|
|
||||||
|
conn.close()
|
||||||
|
return None
|
||||||
|
|
||||||
|
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 ?",(f"%{search_string}%",))
|
||||||
|
team_json_strings = c.fetchall()
|
||||||
|
conn.close()
|
||||||
|
return team_json_strings
|
||||||
|
|
||||||
|
conn.close()
|
||||||
|
return None
|
||||||
|
|
||||||
|
def add_stats(player_game_stats_list):
|
||||||
|
conn = create_connection()
|
||||||
|
if conn is not None:
|
||||||
|
c=conn.cursor()
|
||||||
|
for (name, player_stats_dic) in player_game_stats_list:
|
||||||
|
c.execute("SELECT * FROM stats WHERE name=?",(name,))
|
||||||
|
this_player = c.fetchone()
|
||||||
|
print(this_player)
|
||||||
|
if this_player is not None:
|
||||||
|
for stat in player_stats_dic.keys():
|
||||||
|
c.execute(f"SELECT {stat} FROM stats WHERE name=?",(name,))
|
||||||
|
old_value = int(c.fetchone()[0])
|
||||||
|
c.execute(f"UPDATE stats SET {stat} = ? WHERE name=?",(player_stats_dic[stat]+old_value,name))
|
||||||
|
else:
|
||||||
|
c.execute("INSERT INTO stats(name) VALUES (?)",(name,))
|
||||||
|
for stat in player_stats_dic.keys():
|
||||||
|
c.execute(f"UPDATE stats SET {stat} = ? WHERE name=?",(player_stats_dic[stat],name))
|
||||||
|
conn.commit()
|
||||||
|
conn.close()
|
26
games.py
26
games.py
|
@ -439,6 +439,16 @@ class game(object):
|
||||||
except TypeError:
|
except TypeError:
|
||||||
return "Game not started."
|
return "Game not started."
|
||||||
|
|
||||||
|
def add_stats(self):
|
||||||
|
players = []
|
||||||
|
for this_player in self.teams["away"].lineup:
|
||||||
|
players.append((this_player.name, this_player.game_stats))
|
||||||
|
for this_player in self.teams["home"].lineup:
|
||||||
|
players.append((this_player.name, this_player.game_stats))
|
||||||
|
players.append((self.teams["home"].pitcher.name, self.teams["home"].pitcher.game_stats))
|
||||||
|
players.append((self.teams["away"].pitcher.name, self.teams["away"].pitcher.game_stats))
|
||||||
|
db.add_stats(players)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def random_star_gen(key, player):
|
def random_star_gen(key, player):
|
||||||
|
@ -458,7 +468,7 @@ def random_star_gen(key, player):
|
||||||
|
|
||||||
def get_team(name):
|
def get_team(name):
|
||||||
#try:
|
#try:
|
||||||
team_json = jsonpickle.decode(db.get_team(name), keys=True, classes=team)
|
team_json = jsonpickle.decode(db.get_team(name)[0], keys=True, classes=team)
|
||||||
if team_json is not None:
|
if team_json is not None:
|
||||||
return team_json
|
return team_json
|
||||||
return None
|
return None
|
||||||
|
@ -473,3 +483,17 @@ def save_team(this_team):
|
||||||
return True
|
return True
|
||||||
except:
|
except:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
def get_all_teams():
|
||||||
|
teams = []
|
||||||
|
for team_pickle in db.get_all_teams():
|
||||||
|
this_team = jsonpickle.decode(team_pickle[0], keys=True, classes=team)
|
||||||
|
teams.append(this_team)
|
||||||
|
return teams
|
||||||
|
|
||||||
|
def search_team(search_term):
|
||||||
|
teams = []
|
||||||
|
for team_pickle in db.search_teams(search_term):
|
||||||
|
this_team = jsonpickle.decode(team_pickle[0], keys=True, classes=team)
|
||||||
|
teams.append(this_team)
|
||||||
|
return teams
|
|
@ -1,4 +1,4 @@
|
||||||
import discord, json, os, roman, games, asyncio
|
import discord, json, math, os, roman, games, asyncio
|
||||||
import database as db
|
import database as db
|
||||||
import onomancer as ono
|
import onomancer as ono
|
||||||
|
|
||||||
|
@ -156,8 +156,12 @@ async def on_message(msg):
|
||||||
await game_task
|
await game_task
|
||||||
|
|
||||||
elif command.startswith("saveteam\n"):
|
elif command.startswith("saveteam\n"):
|
||||||
save_task = asyncio.create_task(save_team_batch(msg, command))
|
if db.get_team(command.split("\n",1)[1].split("\n")[0]) == None:
|
||||||
await save_task
|
save_task = asyncio.create_task(save_team_batch(msg, command))
|
||||||
|
await save_task
|
||||||
|
else:
|
||||||
|
name = command.split('\n',1)[1].split('\n')[0]
|
||||||
|
await msg.channel.send(f"{name} already exists. Try a new name, maybe?")
|
||||||
|
|
||||||
elif command.startswith("showteam "):
|
elif command.startswith("showteam "):
|
||||||
team = games.get_team(command.split(" ",1)[1])
|
team = games.get_team(command.split(" ",1)[1])
|
||||||
|
@ -166,6 +170,15 @@ async def on_message(msg):
|
||||||
else:
|
else:
|
||||||
await msg.channel.send("Can't find that team, boss. Typo?")
|
await msg.channel.send("Can't find that team, boss. Typo?")
|
||||||
|
|
||||||
|
elif command == ("showallteams"):
|
||||||
|
list_task = asyncio.create_task(team_pages(msg, games.get_all_teams()))
|
||||||
|
await list_task
|
||||||
|
|
||||||
|
elif command.startswith("searchteams "):
|
||||||
|
search_term = command.split("searchteams ",1)[1]
|
||||||
|
list_task = asyncio.create_task(team_pages(msg, games.search_team(search_term)))
|
||||||
|
await list_task
|
||||||
|
|
||||||
elif command == "credit":
|
elif command == "credit":
|
||||||
await msg.channel.send("Our avatar was graciously provided to us, with permission, by @HetreaSky on Twitter.")
|
await msg.channel.send("Our avatar was graciously provided to us, with permission, by @HetreaSky on Twitter.")
|
||||||
|
|
||||||
|
@ -336,6 +349,7 @@ async def watch_game(channel, game):
|
||||||
state = newgame.gamestate_display_full()
|
state = newgame.gamestate_display_full()
|
||||||
|
|
||||||
new_embed = discord.Embed(color=discord.Color.purple(), title=f"{newgame.teams['away'].name} at {newgame.teams['home'].name}")
|
new_embed = discord.Embed(color=discord.Color.purple(), title=f"{newgame.teams['away'].name} at {newgame.teams['home'].name}")
|
||||||
|
new_embed.set_footer(text="🌟 Supernova")
|
||||||
new_embed.add_field(name=newgame.teams['away'].name, value=newgame.teams['away'].score, inline=True)
|
new_embed.add_field(name=newgame.teams['away'].name, value=newgame.teams['away'].score, inline=True)
|
||||||
new_embed.add_field(name=newgame.teams['home'].name, value=newgame.teams['home'].score, inline=True)
|
new_embed.add_field(name=newgame.teams['home'].name, value=newgame.teams['home'].score, inline=True)
|
||||||
if top_of_inning:
|
if top_of_inning:
|
||||||
|
@ -365,7 +379,7 @@ async def watch_game(channel, game):
|
||||||
if pause != 1 and state != "Game not started.":
|
if pause != 1 and state != "Game not started.":
|
||||||
punc = ""
|
punc = ""
|
||||||
if newgame.last_update[0]["defender"] != "":
|
if newgame.last_update[0]["defender"] != "":
|
||||||
punc = "."
|
punc = ". "
|
||||||
|
|
||||||
updatestring = f"{newgame.last_update[0]['batter']} {newgame.last_update[0]['text'].value} {newgame.last_update[0]['defender']}{punc}"
|
updatestring = f"{newgame.last_update[0]['batter']} {newgame.last_update[0]['text'].value} {newgame.last_update[0]['defender']}{punc}"
|
||||||
if newgame.last_update[1] > 0:
|
if newgame.last_update[1] > 0:
|
||||||
|
@ -414,6 +428,7 @@ async def watch_game(channel, game):
|
||||||
|
|
||||||
await embed.unpin()
|
await embed.unpin()
|
||||||
gamesarray.pop(gamesarray.index((newgame,use_emoji_names))) #cleanup is important!
|
gamesarray.pop(gamesarray.index((newgame,use_emoji_names))) #cleanup is important!
|
||||||
|
newgame.add_stats()
|
||||||
del newgame
|
del newgame
|
||||||
|
|
||||||
def build_team_embed(team):
|
def build_team_embed(team):
|
||||||
|
@ -493,4 +508,44 @@ async def save_team_batch(message, command):
|
||||||
return
|
return
|
||||||
#except:
|
#except:
|
||||||
#await message.channel.send("uh.")
|
#await message.channel.send("uh.")
|
||||||
|
|
||||||
|
|
||||||
|
async def team_pages(msg, all_teams):
|
||||||
|
pages = []
|
||||||
|
page_max = math.ceil(len(all_teams)/25)
|
||||||
|
|
||||||
|
for page in range(0,page_max):
|
||||||
|
embed = discord.Embed(color=discord.Color.purple(), title="All Teams")
|
||||||
|
embed.set_footer(text = f"Page {page+1} of {page_max}")
|
||||||
|
for i in range(0,25):
|
||||||
|
try:
|
||||||
|
embed.add_field(name=all_teams[i+25*page].name, value=all_teams[i+25*page].slogan)
|
||||||
|
except:
|
||||||
|
break
|
||||||
|
pages.append(embed)
|
||||||
|
|
||||||
|
teams_list = await msg.channel.send(embed=pages[0])
|
||||||
|
current_page = 0
|
||||||
|
|
||||||
|
if page_max > 1:
|
||||||
|
await teams_list.add_reaction("◀")
|
||||||
|
await teams_list.add_reaction("▶")
|
||||||
|
|
||||||
|
def react_check(react, user):
|
||||||
|
return user == msg.author and react.message == teams_list
|
||||||
|
|
||||||
|
while True:
|
||||||
|
try:
|
||||||
|
react, user = await client.wait_for('reaction_add', timeout=20.0, check=react_check)
|
||||||
|
if react.emoji == "◀" and current_page > 0:
|
||||||
|
current_page -= 1
|
||||||
|
elif react.emoji == "▶" and current_page < page_max:
|
||||||
|
current_page += 1
|
||||||
|
await teams_list.edit(embed=pages[current_page])
|
||||||
|
except asyncio.TimeoutError:
|
||||||
|
await message.channel.send("We hope you found what you were looking for. If not, you can always look again.")
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
client.run(config()["token"])
|
client.run(config()["token"])
|
Loading…
Reference in New Issue
Block a user