diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/.DS_Store differ diff --git a/main_controller.py b/main_controller.py index 65892a4..d6ae7ff 100644 --- a/main_controller.py +++ b/main_controller.py @@ -1,4 +1,4 @@ -import asyncio, time, datetime, games, json, threading, jinja2, leagues +import asyncio, time, datetime, games, json, threading, jinja2 from flask import Flask, url_for, Response, render_template, request, jsonify from flask_socketio import SocketIO, emit diff --git a/static/css/common.css b/static/css/common.css index e0cd0a0..df22339 100644 --- a/static/css/common.css +++ b/static/css/common.css @@ -1,7 +1,7 @@ @import url('https://fonts.googleapis.com/css2?family=Alegreya&display=swap'); @import url('https://fonts.googleapis.com/css2?family=Goldman:wght@700&display=swap'); body { - background-image: url("prism.png"); + background-image: url("naturalblack.png"); } /* Background pattern from Toptal Subtle Patterns */ @@ -28,6 +28,7 @@ h2 { .page_header { color: white; font-family: 'Goldman', cursive; + text-decoration: none; } #header { @@ -39,8 +40,8 @@ h2 { align-items: center; } -#header > .page_header { - margin: auto +#header .page_header { + margin: auto; } #link_div { diff --git a/static/css/game.css b/static/css/game.css index 2a3d921..01624c2 100644 --- a/static/css/game.css +++ b/static/css/game.css @@ -27,33 +27,23 @@ background-color: var(--background-secondary); border-top-right-radius: 4px; height: max-content; - + display: flex; + justify-content: space-between } -.inning { - float: left; - margin: 5px; - margin-left: 8px; -} - -.weather { - float: right; - margin: 5px; - margin-right: 8px; +.header > div { + margin: 0.3rem 0.5rem; } .body { - margin: 10px; + margin: 0.5rem; display: grid; - grid-template-columns: 66% 33%; + grid-template-columns: repeat(3, minmax(0, 1fr)); grid-template-areas: - "teams info" - "players info" - "update update"; - grid-template-rows: 90px 85px; - grid-row-gap: 4px; - grid-column-gap: 14px; - flex: 1; + "teams teams info" "players players info" "update update update"; + grid-template-rows: 5.5rem auto auto; + grid-row-gap: 0.5rem; + grid-column-gap: 0.75rem; } .teams { @@ -61,14 +51,16 @@ display: flex; flex-direction: column; justify-content: space-around; - margin-right: 12px; + min-width: 95%; + max-width: 100%; + width: min-content; } .team { display: flex; justify-content: space-between; width: 100%; - margin: 5px 0px; + margin: 0.25rem 0rem; } .team_name { @@ -84,8 +76,7 @@ align-items: center; justify-content: space-around; background: #4f545c; - padding: 25px 0px; - margin-right: 10px; + padding: 0.75rem 0rem; border-radius: 4px; } @@ -93,14 +84,14 @@ font-size: 10pt; text-align: left; height: max-content; - padding: 5px; + margin: 0.3rem 0.5rem; } .leagueoruser { font-size: 10pt; text-align: right; height: max-content; - padding: 5px; + margin: 0.3rem 0.5rem; } .footer { @@ -142,17 +133,22 @@ .players { grid-area: players; - display: flex; - flex-direction: column; - justify-content: space-around; - align-items: start; + display: grid; + grid-template-columns: auto minmax(0, 1fr); + grid-template-rows: auto auto; + grid-column-gap: 0.5rem; + margin-left: 0.3rem; } -.player { - display: flex; - align-items: end; - width: 100%; - flex-direction: column; +.players > div { + margin: 0.25rem 0rem; +} + +.player_type { + text-align: end; + font-weight: bolder; + display: inline-block; + vertical-align: middle; } .player_name { @@ -160,16 +156,13 @@ text-overflow: ellipsis; text-align: start; white-space: nowrap; - width: 95%; - margin-top: -4px; + width: 100%; } .update { grid-area: update; - margin-right: 10px; - margin-top: 5px; - min-height: 50px; - padding: 0px 10px; + min-height: 3.5rem; + padding: 0rem 0.75rem; height: 100%; background: var(--background-secondary); border-radius: 4px; @@ -178,14 +171,8 @@ justify-content: start; } -.player_type { - width: 100%; - text-align: start; - font-weight: bolder; -} - .update_emoji { - margin-right: 10px; + margin-right: 0.75rem; margin-left: 2px; } diff --git a/static/css/games_page.css b/static/css/games_page.css index d86bfdc..f95f077 100644 --- a/static/css/games_page.css +++ b/static/css/games_page.css @@ -8,7 +8,7 @@ } .container > div { - min-height: 325px; + min-height: 298px; } #filters { @@ -21,15 +21,15 @@ } #filters > * { - padding: 4px 8px; - margin: 0px 8px; + padding: 0.25rem 0.5rem; + margin: 0rem 0.5rem; font-size: 16pt; background: rgba(0,0,0,0); } #filters > .filter { - border-radius: 8px; - min-width: 100px; + border-radius: 0.5rem; + min-width: 6.25rem; text-align: center; border: none; color: white; @@ -45,14 +45,14 @@ flex-direction: column; justify-content: center; width: 100%; - height: 75px; + height: 4.5rem; } #footer > div { text-align: center; - font-size: 20px; + font-size: 16pt; position: relative; - top: 5px; + top: 0.25rem; } .emptyslot { diff --git a/static/css/naturalblack.png b/static/css/naturalblack.png new file mode 100644 index 0000000..e600af5 Binary files /dev/null and b/static/css/naturalblack.png differ diff --git a/static/js/.DS_Store b/static/js/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/static/js/.DS_Store differ diff --git a/static/repeated-square-dark.png b/static/repeated-square-dark.png deleted file mode 100644 index 31f2735..0000000 Binary files a/static/repeated-square-dark.png and /dev/null differ diff --git a/templates/base.html b/templates/base.html index 9c8373a..da90c9e 100644 --- a/templates/base.html +++ b/templates/base.html @@ -23,7 +23,7 @@ Github
Twitter - + {% block body %}{% endblock %} diff --git a/templates/game_box.html b/templates/game_box.html index 39e18b9..c4d1d1d 100644 --- a/templates/game_box.html +++ b/templates/game_box.html @@ -6,6 +6,7 @@ src={% if state.bases[number] %}"/static/img/base_filled.png" alt="{{state.bases {%- endmacro %}
Inning: {% if state.display_top_of_inning == true %}🔼{% else %}🔽{% endif %} {{ state.display_inning }}/{{ state.max_innings }}
+
{{ state.title }}
{{ state.weather_emoji }} {{ state.weather_text }}
@@ -36,14 +37,10 @@ src={% if state.bases[number] %}"/static/img/base_filled.png" alt="{{state.bases
-
-
PITCHER
-
{{ state.pitcher }}
-
-
-
BATTER
-
{{ state.batter }}
-
+
PITCHER
+
{{ state.pitcher }}
+
BATTER
+
{{ state.batter }}
{{ state.update_emoji }}
diff --git a/the_prestige.py b/the_prestige.py index 8ab698d..8bd079a 100644 --- a/the_prestige.py +++ b/the_prestige.py @@ -1,4 +1,4 @@ -import discord, json, math, os, roman, games, asyncio, random, main_controller, threading, time, leagues, urllib +import discord, json, math, os, roman, games, asyncio, random, main_controller, threading, time, urllib import database as db import onomancer as ono from flask import Flask @@ -278,50 +278,56 @@ class SwapPlayerCommand(Command): description = "Swaps a player from lineup to rotation, or from rotation to lineup. Requires team ownership." async def execute(self, msg, command): - team_name = command.split("\n")[1].strip() - player_name = command.split("\n")[2].strip() - team, owner_id = games.get_team_and_owner(team_name) - if team is None: - await msg.channel.send("Can't find that team, boss. Typo?") - return - elif owner_id != msg.author.id and msg.author.id not in config()["owners"]: - await msg.channel.send("You're not authorized to mess with this team. Sorry, boss.") - return - elif not team.swap_player(player_name): - await msg.channel.send("Either we can't find that player, you've got no space on the other side, or they're your last member of that side of the roster. Can't field an empty lineup, and we *do* have rules, chief.") - return - else: - await msg.channel.send(embed=build_team_embed(team)) - games.update_team(team) - await msg.channel.send("Paperwork signed, stamped, copied, and faxed up to the goddess. Xie's pretty quick with this stuff.") + try: + team_name = command.split("\n")[1].strip() + player_name = command.split("\n")[2].strip() + team, owner_id = games.get_team_and_owner(team_name) + if team is None: + await msg.channel.send("Can't find that team, boss. Typo?") + return + elif owner_id != msg.author.id and msg.author.id not in config()["owners"]: + await msg.channel.send("You're not authorized to mess with this team. Sorry, boss.") + return + elif not team.swap_player(player_name): + await msg.channel.send("Either we can't find that player, you've got no space on the other side, or they're your last member of that side of the roster. Can't field an empty lineup, and we *do* have rules, chief.") + return + else: + await msg.channel.send(embed=build_team_embed(team)) + games.update_team(team) + await msg.channel.send("Paperwork signed, stamped, copied, and faxed up to the goddess. Xie's pretty quick with this stuff.") + except IndexError: + await msg.channel.send("Three lines, remember? Command, then team, then name.") class MovePlayerCommand(Command): - name = "move" - template = """m;move + name = "moveplayer" + template = """m;moveplayer [team name] [player name] [new lineup/rotation position number] (indexed with 1 being the top)""" description = "Moves a player in your lineup or rotation. Requires team ownership." async def execute(self, msg, command): - team_name = command.split("\n")[1].strip() - player_name = command.split("\n")[2].strip() - team, owner_id = games.get_team_and_owner(team_name) try: - new_pos = int(command.split("\n")[3].strip()) - except ValueError: - await msg.channel.send("Hey, quit being cheeky. We're just trying to help. Third line has to be a natural number, boss.") - return - if owner_id != msg.author.id and msg.author.id not in config()["owners"]: - await msg.channel.send("You're not authorized to mess with this team. Sorry, boss.") - return - elif not team.slide_player(player_name, new_pos): - await msg.channel.send("You either gave us a number that was bigger than your current roster, or we couldn't find the player on the team. Try again.") - return - else: - await msg.channel.send(embed=build_team_embed(team)) - games.update_team(team) - await msg.channel.send("Paperwork signed, stamped, copied, and faxed up to the goddess. Xie's pretty quick with this stuff.") + team_name = command.split("\n")[1].strip() + player_name = command.split("\n")[2].strip() + team, owner_id = games.get_team_and_owner(team_name) + try: + new_pos = int(command.split("\n")[3].strip()) + except ValueError: + await msg.channel.send("Hey, quit being cheeky. We're just trying to help. Third line has to be a natural number, boss.") + return + if owner_id != msg.author.id and msg.author.id not in config()["owners"]: + await msg.channel.send("You're not authorized to mess with this team. Sorry, boss.") + return + elif not team.slide_player(player_name, new_pos): + await msg.channel.send("You either gave us a number that was bigger than your current roster, or we couldn't find the player on the team. Try again.") + return + else: + await msg.channel.send(embed=build_team_embed(team)) + games.update_team(team) + await msg.channel.send("Paperwork signed, stamped, copied, and faxed up to the goddess. Xie's pretty quick with this stuff.") + except IndexError: + await msg.channel.send("Four lines, remember? Command, then team, then name, and finally, new spot on the lineup or rotation.") class AddPlayerCommand(Command): name = "addplayer" @@ -331,50 +337,56 @@ class AddPlayerCommand(Command): description = "Recruits a new player to your team, as either a pitcher or a batter. Requires team ownership." async def execute(self, msg, command): - team_name = command.split("\n")[1].strip() - player_name = command.split("\n")[2].strip() - team, owner_id = games.get_team_and_owner(team_name) - if owner_id != msg.author.id and msg.author.id not in config()["owners"]: - await msg.channel.send("You're not authorized to mess with this team. Sorry, boss.") - return - - new_player = games.player(ono.get_stats(player_name)) - - if "batter" in command.split("\n")[0]: - if not team.add_lineup(new_player)[0]: - await msg.channel.send("Too many batters 🎶") - return - elif "pitcher" in command.split("\n")[0]: - if not team.add_pitcher(new_player): - await msg.channel.send("8 pitchers is quite enough, we think.") + try: + team_name = command.split("\n")[1].strip() + player_name = command.split("\n")[2].strip() + team, owner_id = games.get_team_and_owner(team_name) + if owner_id != msg.author.id and msg.author.id not in config()["owners"]: + await msg.channel.send("You're not authorized to mess with this team. Sorry, boss.") return - await msg.channel.send(embed=build_team_embed(team)) - games.update_team(team) - await msg.channel.send("Paperwork signed, stamped, copied, and faxed up to the goddess. Xie's pretty quick with this stuff.") + new_player = games.player(ono.get_stats(player_name)) -class DeletePlayerCommand(Command): + if "batter" in command.split("\n")[0]: + if not team.add_lineup(new_player)[0]: + await msg.channel.send("Too many batters 🎶") + return + elif "pitcher" in command.split("\n")[0]: + if not team.add_pitcher(new_player): + await msg.channel.send("8 pitchers is quite enough, we think.") + return + + await msg.channel.send(embed=build_team_embed(team)) + games.update_team(team) + await msg.channel.send("Paperwork signed, stamped, copied, and faxed up to the goddess. Xie's pretty quick with this stuff.") + except IndexError: + await msg.channel.send("Three lines, remember? Command, then team, then name.") + +class RemovePlayerCommand(Command): name = "removeplayer" template = """m;removeplayer [team name] [player name]""" async def execute(self, msg, command): - team_name = command.split("\n")[1].strip() - player_name = command.split("\n")[2].strip() - team, owner_id = games.get_team_and_owner(team_name) - if owner_id != msg.author.id and msg.author.id not in config()["owners"]: - await msg.channel.send("You're not authorized to mess with this team. Sorry, boss.") - return + try: + team_name = command.split("\n")[1].strip() + player_name = command.split("\n")[2].strip() + team, owner_id = games.get_team_and_owner(team_name) + if owner_id != msg.author.id and msg.author.id not in config()["owners"]: + await msg.channel.send("You're not authorized to mess with this team. Sorry, boss.") + return - if not team.delete_player(player_name): - await msg.channel.send("We've got bad news: that player isn't on your team. The good news is that... that player isn't on your team?") - return + if not team.delete_player(player_name): + await msg.channel.send("We've got bad news: that player isn't on your team. The good news is that... that player isn't on your team?") + return - else: - await msg.channel.send(embed=build_team_embed(team)) - games.update_team(team) - await msg.channel.send("Paperwork signed, stamped, copied, and faxed up to the goddess. Xie's pretty quick with this stuff.") + else: + await msg.channel.send(embed=build_team_embed(team)) + games.update_team(team) + await msg.channel.send("Paperwork signed, stamped, copied, and faxed up to the goddess. Xie's pretty quick with this stuff.") + except IndexError: + await msg.channel.send("Three lines, remember? Command, then team, then name.") class HelpCommand(Command): @@ -467,7 +479,7 @@ commands = [ SwapPlayerCommand(), MovePlayerCommand(), AddPlayerCommand(), - DeletePlayerCommand(), + RemovePlayerCommand(), DeleteTeamCommand(), ShowTeamCommand(), ShowAllTeamsCommand(),