integrating music controller
This commit is contained in:
parent
5e4e39f30f
commit
33e6e319e5
|
@ -13,6 +13,10 @@ CONFIG = {
|
|||
|
||||
# campaign start date
|
||||
"campaign_start_date": "2.1125.5.25",
|
||||
|
||||
# croaker address
|
||||
"croaker_host": 'gumpas.local',
|
||||
"croaker_port": 8003,
|
||||
}
|
||||
|
||||
|
||||
|
|
39
dmsh/croaker.py
Normal file
39
dmsh/croaker.py
Normal file
|
@ -0,0 +1,39 @@
|
|||
import socket
|
||||
from functools import cached_property
|
||||
from dataclasses import dataclass
|
||||
|
||||
|
||||
@dataclass
|
||||
class CroakerClient():
|
||||
host: str
|
||||
port: int
|
||||
|
||||
@cached_property
|
||||
def playlists(self):
|
||||
return self.send("LIST").split("\n")
|
||||
|
||||
def list(self, *args):
|
||||
if not args:
|
||||
return self.playlists
|
||||
return self.send(f"LIST {args[0]}")
|
||||
|
||||
def play(self, *args):
|
||||
if not args:
|
||||
return "Error: Must specify the playlist to play."
|
||||
return self.send(f"PLAY {args[0]}")
|
||||
|
||||
def skip(self, *args):
|
||||
return self.send("FFWD")
|
||||
|
||||
def send(self, msg: str):
|
||||
BUFSIZE = 4096
|
||||
data = bytearray()
|
||||
with socket.create_connection((self.host, self.port)) as sock:
|
||||
sock.sendall(f"{msg}\n".encode())
|
||||
while True:
|
||||
buf = sock.recv(BUFSIZE)
|
||||
data.extend(buf)
|
||||
if len(buf) < BUFSIZE:
|
||||
break
|
||||
sock.sendall(b'KTHX\n')
|
||||
return data.decode()
|
|
@ -10,6 +10,7 @@ from dmsh import campaign
|
|||
from dmsh import jobs
|
||||
from dmsh import striders
|
||||
from dmsh import hoppers
|
||||
from dmsh import croaker
|
||||
|
||||
from reckoning.calendar import TelisaranCalendar
|
||||
from reckoning.telisaran import Day
|
||||
|
@ -30,6 +31,12 @@ class DMShell(BasePrompt):
|
|||
self._name = "DM Shell"
|
||||
self._prompt = ["dm"]
|
||||
self._toolbar = [("class:bold", " DMSH ")]
|
||||
|
||||
self._croaker = croaker.CroakerClient(
|
||||
host=self.cache['croaker_host'],
|
||||
port=self.cache['croaker_port']
|
||||
)
|
||||
|
||||
self._key_bindings = BINDINGS
|
||||
self._register_subshells()
|
||||
self._register_keybindings()
|
||||
|
@ -54,10 +61,48 @@ class DMShell(BasePrompt):
|
|||
("", " [F5] Date"),
|
||||
("", " [F6] Job"),
|
||||
("", " [F8] Save"),
|
||||
("", " [F9] Music Hotkeys"),
|
||||
("", " [^1-9] Music"),
|
||||
("", " [^Q] Quit "),
|
||||
]
|
||||
)
|
||||
|
||||
@self.key_bindings.add("m", "1")
|
||||
def music_session_start(event):
|
||||
self.music(["play", "session_start"])
|
||||
|
||||
@self.key_bindings.add("m", "2")
|
||||
def music_session_start(event):
|
||||
self.music(["play", "sahwat"])
|
||||
|
||||
@self.key_bindings.add("m", "3")
|
||||
def music_session_start(event):
|
||||
self.music(["play", "battle"])
|
||||
|
||||
@self.key_bindings.add("m", "4")
|
||||
def music_session_start(event):
|
||||
self.music(["play", "boss"])
|
||||
|
||||
@self.key_bindings.add("m", "5")
|
||||
def music_session_start(event):
|
||||
self.music(["play", "tense"])
|
||||
|
||||
@self.key_bindings.add("m", "6")
|
||||
def music_session_start(event):
|
||||
self.music(["play", "quiet"])
|
||||
|
||||
@self.key_bindings.add("m", "7")
|
||||
def music_session_start(event):
|
||||
self.music(["play", "adventure"])
|
||||
|
||||
@self.key_bindings.add("m", "8")
|
||||
def music_session_start(event):
|
||||
self.music(["play", "mystery"])
|
||||
|
||||
@self.key_bindings.add("m", "9")
|
||||
def music_session_start(event):
|
||||
self.music(["play", "ffxii_battle"])
|
||||
|
||||
@self.key_bindings.add("c-q")
|
||||
@self.key_bindings.add("c-d")
|
||||
@self.key_bindings.add("<sigint>")
|
||||
|
@ -92,6 +137,24 @@ class DMShell(BasePrompt):
|
|||
def save(event):
|
||||
self.save()
|
||||
|
||||
@self.key_bindings.add("f9")
|
||||
def music(event):
|
||||
self._music_hotkeys()
|
||||
|
||||
|
||||
def _music_hotkeys(self):
|
||||
self.console.print("To switch music streams, press [b]m[/b] followed a number 1-9:")
|
||||
self.console.print(" [b]1[/b] Session Start")
|
||||
self.console.print(" [b]2[/b] Sahwat Overland")
|
||||
self.console.print(" [b]3[/b] Overland Battle")
|
||||
self.console.print(" [b]4[/b] Boss Battle")
|
||||
self.console.print(" [b]5[/b] Tense")
|
||||
self.console.print(" [b]6[/b] Quiet")
|
||||
self.console.print(" [b]7[/b] Dungeon Adventure")
|
||||
self.console.print(" [b]8[/b] Dungeon Mystery")
|
||||
self.console.print(" [b]9[/b] Dungeon Battle")
|
||||
self.console.print("\nSee also the [link]music[/link] command.")
|
||||
|
||||
def _handler_date_season(self, *args):
|
||||
self.console.print(self.cache['calendar'].season)
|
||||
|
||||
|
@ -391,3 +454,38 @@ class DMShell(BasePrompt):
|
|||
"""
|
||||
freq = parts[0] if parts else 'nodesert'
|
||||
self.console.print(self._rolltable("locations.yaml", frequency=freq, die=4))
|
||||
|
||||
@command(usage="""
|
||||
[title]MUSIC[/title]
|
||||
|
||||
[b]music[/b] Croaker controller.
|
||||
|
||||
[title]USAGE[/title]
|
||||
|
||||
[link]> music [COMMAND[, ARGS]][/link]
|
||||
|
||||
COMMAND Description
|
||||
|
||||
list [NAME] List available playlists, or the contents of the NAME playlist
|
||||
play NAME Switch to the named playlist
|
||||
skip Skip the current track
|
||||
""", completer=WordCompleter([
|
||||
'list',
|
||||
'play',
|
||||
'skip',
|
||||
]))
|
||||
def music(self, parts=[]):
|
||||
"""
|
||||
Control the music player
|
||||
"""
|
||||
if parts:
|
||||
cmd, *args = parts
|
||||
else:
|
||||
cmd = 'list'
|
||||
args = []
|
||||
|
||||
handler = getattr(self._croaker, cmd, None)
|
||||
if not handler:
|
||||
self.console.error(f"Unsupported command: {cmd}. Try 'help music'.")
|
||||
return
|
||||
self.console.print(handler(*args))
|
||||
|
|
Loading…
Reference in New Issue
Block a user