You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
fabula/app.py

159 lines
9.6 KiB

1 year ago
import asyncio
from discord_webhook import DiscordEmbed
from urwid import MainLoop, AsyncioEventLoop, set_encoding
from embedgen import WebhookExecutor, simple_character_field
from model import Character
from enums import CharacterType, Visibility, CombatSide
from ui import LogUI, CharactersUI, ClocksUI, FabulaUI, MainUI
class FabulaApp(object):
def __init__(self, wrapper: FabulaUI, clocks: ClocksUI, characters: CharactersUI,
log: LogUI, webhook: WebhookExecutor):
self.wrapper = wrapper
self.clocks = clocks
self.characters = characters
self.log = log
self.log.add_message("this is a log message")
self.log.add_message("this is a second log message with some **bolded** text")
self.log.move_divider()
self.log.add_message("this is the newest message, since the last log was sent")
prandia = Character(name="Prandia", hp=53, max_hp=65, mp=55, max_mp=55, ip=6, max_ip=6, max_turns=1,
turns_left=0, sp=3, statuses=frozenset(("Delicious", "Dazed")), affinities=tuple(),
access_key='1', visibility=Visibility.ShowEvenIfKO, mdf=7, df=11, dr=0,
character_type=CharacterType.PlayerCharacter, side=CombatSide.Heroes,
color="34eb89", player_discord_id="579932273558945792", player_name="Fak",
thumbnail="https://media.discordapp.net/attachments/989315969920929862/1058455278221271120/"
+ "342px-Bluhen_Epic_Quest_Square.png")
self.characters.add_character(prandia)
selia = Character(name="Sélia", hp=12, max_hp=50, mp=55, max_mp=55, ip=0, max_ip=0, max_turns=1,
turns_left=1, sp=None, statuses=frozenset(["Enraged"]), affinities=tuple(),
access_key='2', visibility=Visibility.ShowAll, mdf=7, df=11, dr=0,
character_type=CharacterType.NonPlayerCharacter, side=CombatSide.Heroes,
color=None, thumbnail=None, player_discord_id=None, player_name=None)
self.characters.add_character(selia)
prandia_voraphilia = Character(name="Prandia's Voraphilia Resistance", hp=0, max_hp=1, mp=1, max_mp=1, ip=0,
max_ip=0,
max_turns=1, turns_left=1, sp=None, statuses=frozenset(), affinities=tuple(),
access_key='',
character_type=CharacterType.NonPlayerCharacter, side=CombatSide.Heroes,
visibility=Visibility.Hide, mdf=7, df=11, dr=0, color="34eb89",
thumbnail=None, player_discord_id=None, player_name=None)
self.characters.add_character(prandia_voraphilia)
vacana = Character(name="Hungry Vacana", hp=53, max_hp=53, mp=55, max_mp=55, ip=6, max_ip=6, max_turns=2,
turns_left=1, sp=3, statuses=frozenset(["Transformed"]), affinities=tuple(), access_key='A',
visibility=Visibility.MaskStats, mdf=7, df=11, dr=0,
character_type=CharacterType.PlayerCharacter, side=CombatSide.Villains,
player_name="Nan", player_discord_id="158766486725328897", color="a50ecf",
thumbnail="https://images-ext-1.discordapp.net/external/"
+ "bMwLWSrrCyGiqgJ14icQjXXllStzsKbQ-htrANQdSJA/"
+ "https/cdn.picrew.me/shareImg/org/202211/1561797_pzHTS4JJ.png")
self.characters.add_character(vacana)
flow = Character(name="Hungry Flow", hp=69, max_hp=120, mp=55, max_mp=55, ip=0, max_ip=0, max_turns=2,
turns_left=2, sp=3, statuses=frozenset(), affinities=tuple(), access_key='B',
visibility=Visibility.MaskName, mdf=7, df=11, dr=0,
character_type=CharacterType.NonPlayerCharacter, side=CombatSide.Villains, player_name=None,
player_discord_id=None, color="0073ff", thumbnail=None)
self.characters.add_character(flow)
vacana_hunger = Character(name="Vacana's Hunger", hp=27, max_hp=60, mp=1, max_mp=1, ip=0, max_ip=0, max_turns=2,
turns_left=0, sp=None, statuses=frozenset(), affinities=tuple(), access_key='',
visibility=Visibility.Hide, mdf=7, df=11, dr=0,
character_type=CharacterType.NonPlayerCharacter, side=CombatSide.Villains,
color="a50ecf",
thumbnail=None, player_name=None, player_discord_id=None, )
self.characters.add_character(vacana_hunger)
self.clocks.update_session(1, 2, 7)
1 year ago
self.webhook = webhook
self.character_list = (prandia, selia, prandia_voraphilia, vacana, flow, vacana_hunger)
self.event_loop = None
self.loop = None
@classmethod
def new(cls, webhook_url: str):
clocks = ClocksUI()
characters = CharactersUI()
log = LogUI()
main = MainUI(clocks, characters, log)
wrapper = FabulaUI(main)
webhook = WebhookExecutor(url=webhook_url)
return cls(wrapper=wrapper, clocks=clocks, characters=characters,
log=log, webhook=webhook)
def keypress(self, key):
if key == "l":
self.log.add_message("Another log message, eh? Sure, I can hook you up with **one of those.** Here I go!")
def run(self):
set_encoding("UTF-8")
self.event_loop = asyncio.new_event_loop()
self.loop = MainLoop(
1 year ago
widget=self.wrapper,
unhandled_input=self.keypress,
event_loop=AsyncioEventLoop(loop=self.event_loop),
palette=[
(None, "light gray", "default", "default"),
("FrameTitle", "white,bold", "default", "bold"),
("LogBold", "white,bold", "default", "bold"),
("LogFocused", "white,bold", "default", "bold"),
("LogUnfocused", "light cyan", "default", "default"),
1 year ago
("ClockName", "white,bold", "default", "bold"),
("ClockFocused", "white,bold", "default", "bold"),
("ClockUnfocused", "light green", "default", "default"),
1 year ago
("ClockBarEdge", 'yellow,bold', 'default', 'bold'),
("ClockBarFilled", 'yellow', 'default', 'default'),
("ClockBarEmpty", 'light gray', 'default', 'default'),
("ClockCurrent", 'light green,bold', 'default', 'bold'),
("ClockDivider", 'white', 'default', 'default'),
("ClockMax", 'dark green', 'default', 'default'),
("RoundLabel", 'light gray', 'default', 'default'),
("RoundNumber", 'white,bold', 'default', 'bold'),
("FabulaLabel", 'light gray', 'default', 'default'),
("FabulaNumber", 'white,bold', 'default', 'bold'),
("UltimaLabel", 'light gray', 'default', 'default'),
("UltimaNumber", 'white,bold', 'default', 'bold'),
("CharacterUnfocused", 'light red', 'default', 'default'),
("CharacterFocused", 'white,bold', 'default', 'bold'),
1 year ago
("CharacterPlayer", 'light green,bold', 'default', 'bold'),
("CharacterAlly", 'light cyan,bold', 'default', 'bold'),
("CharacterEnemy", 'light red,bold', 'default', 'bold'),
("CharacterEnemyPlayer", 'yellow,bold', 'default', 'bold'),
1 year ago
("CharacterUnknown", 'light gray,bold', 'default', 'bold'),
("TurnDisabled", 'dark gray', 'default', 'default'),
("TurnAvailable", 'light green,bold', 'default', 'bold'),
("TurnActed", 'light gray', 'default', 'default'),
("HPFull", 'light green,bold', 'default', 'bold'),
("HPScratched", 'light green', 'default', 'default'),
("HPWounded", 'white', 'default', 'default'),
("HPCrisis", 'yellow', 'default', 'default'),
("HPPeril", 'light red', 'default', 'default'),
("HPDown", 'dark red,bold', 'default', 'bold'),
("HPLabel", 'light gray', 'default', 'default'),
("HPMax", 'light gray', 'default', 'default'),
("MPLabel", 'light gray', 'default', 'default'),
("MPValue", 'light cyan', 'default', 'default'),
1 year ago
("MPMax", 'light gray', 'default', 'default'),
("FPLabel", 'light gray', 'default', 'default'),
("UPLabel", 'light gray', 'default', 'default'),
("FPValue", 'yellow', 'default', 'default'),
("UPValue", 'yellow', 'default', 'default'),
("IPLabel", 'light gray', 'default', 'default'),
("IPValue", 'light magenta', 'default', 'default'),
1 year ago
("IPMax", 'light gray', 'default', 'default'),
("StatusKO", 'light red,bold', 'default', 'bold,standout'),
("StatusCrisis", 'yellow,bold', 'default', 'bold'),
("Statuses", 'white', 'default', 'default'),
])
self.loop.screen.set_terminal_properties(
1 year ago
colors=2 ** 24,
has_underline=True,
bright_is_bold=False,
)
embed = DiscordEmbed()
for header, field in [simple_character_field(character) for character in self.character_list]:
embed.add_embed_field(name=header, value=field, inline=False)
self.loop.run()
self.loop = None
self.event_loop = None