Skip to content

Commit 1c7bb04

Browse files
authored
Merge pull request #29 from halpworld/fix_radio_issue_24
feat(party): Terminal Party Line: P2P Mesh Synchronized Radio Rooms & ASCII Reactions (#24)
2 parents 17a8818 + 62d4d28 commit 1c7bb04

26 files changed

Lines changed: 5111 additions & 57 deletions

go.mod

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ require (
1919
github.com/ebitengine/purego v0.9.0 // indirect
2020
github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f // indirect
2121
github.com/godbus/dbus/v5 v5.2.2 // indirect
22+
github.com/google/uuid v1.6.0 // indirect
2223
github.com/hajimehoshi/go-mp3 v0.3.4 // indirect
2324
github.com/hajimehoshi/oto/v2 v2.4.2 // indirect
2425
github.com/lucasb-eyer/go-colorful v1.3.0 // indirect
@@ -28,10 +29,30 @@ require (
2829
github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 // indirect
2930
github.com/muesli/cancelreader v0.2.2 // indirect
3031
github.com/muesli/termenv v0.16.0 // indirect
32+
github.com/pion/datachannel v1.6.2 // indirect
33+
github.com/pion/dtls/v3 v3.1.8 // indirect
34+
github.com/pion/ice/v4 v4.4.2 // indirect
35+
github.com/pion/interceptor v0.1.48 // indirect
36+
github.com/pion/logging v0.2.4 // indirect
37+
github.com/pion/mdns/v2 v2.2.0 // indirect
38+
github.com/pion/randutil v0.1.0 // indirect
39+
github.com/pion/rtcp v1.2.17 // indirect
40+
github.com/pion/rtp v1.10.5 // indirect
41+
github.com/pion/sctp v1.11.1 // indirect
42+
github.com/pion/sdp/v3 v3.0.19 // indirect
43+
github.com/pion/srtp/v3 v3.0.13 // indirect
44+
github.com/pion/stun/v4 v4.0.0 // indirect
45+
github.com/pion/transport/v4 v4.1.0 // indirect
46+
github.com/pion/turn/v5 v5.1.0 // indirect
47+
github.com/pion/webrtc/v4 v4.2.20 // indirect
3148
github.com/rivo/uniseg v0.4.7 // indirect
3249
github.com/tetratelabs/wazero v1.8.2 // indirect
50+
github.com/wlynxg/anet v0.0.5 // indirect
3351
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect
34-
golang.org/x/sys v0.38.0 // indirect
35-
golang.org/x/text v0.3.8 // indirect
52+
golang.org/x/crypto v0.48.0 // indirect
53+
golang.org/x/net v0.50.0 // indirect
54+
golang.org/x/sys v0.41.0 // indirect
55+
golang.org/x/text v0.34.0 // indirect
56+
golang.org/x/time v0.14.0 // indirect
3657
gopkg.in/yaml.v3 v3.0.1 // indirect
3758
)

go.sum

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f h1:Y/CXytFA4m6
3232
github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f/go.mod h1:vw97MGsxSvLiUE2X8qFplwetxpGLQrlU1Q9AUEIzCaM=
3333
github.com/godbus/dbus/v5 v5.2.2 h1:TUR3TgtSVDmjiXOgAAyaZbYmIeP3DPkld3jgKGV8mXQ=
3434
github.com/godbus/dbus/v5 v5.2.2/go.mod h1:3AAv2+hPq5rdnr5txxxRwiGjPXamgoIHgz9FPBfOp3c=
35+
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
36+
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
3537
github.com/hajimehoshi/go-mp3 v0.3.4 h1:NUP7pBYH8OguP4diaTZ9wJbUbk3tC0KlfzsEpWmYj68=
3638
github.com/hajimehoshi/go-mp3 v0.3.4/go.mod h1:fRtZraRFcWb0pu7ok0LqyFhCUrPeMsGRSVop0eemFmo=
3739
github.com/hajimehoshi/oto/v2 v2.3.1/go.mod h1:seWLbgHH7AyUMYKfKYT9pg7PhUu9/SisyJvNTT+ASQo=
@@ -51,19 +53,62 @@ github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELU
5153
github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo=
5254
github.com/muesli/termenv v0.16.0 h1:S5AlUN9dENB57rsbnkPyfdGuWIlkmzJjbFf0Tf5FWUc=
5355
github.com/muesli/termenv v0.16.0/go.mod h1:ZRfOIKPFDYQoDFF4Olj7/QJbW60Ol/kL1pU3VfY/Cnk=
56+
github.com/pion/datachannel v1.6.2 h1:7EXQ8TH3vTouBUdRWYbcX2edSx9Yj6k5zl5P+qyxEPc=
57+
github.com/pion/datachannel v1.6.2/go.mod h1:pzbdAZvyGtXbcHM1hBbsFaOTf40lZizU/dNlvVOak6E=
58+
github.com/pion/dtls/v3 v3.1.8 h1:aLcgjZqzrYn5AbjSds4LvK2WI5VzJc1PencExyDjYis=
59+
github.com/pion/dtls/v3 v3.1.8/go.mod h1:gz1K4jg6c+fq86oQMH4pilpCEOEPwmEr2jY+VcF/mkU=
60+
github.com/pion/ice/v4 v4.4.2 h1:asS17nbHJrzlVQl8fiSJaipxrxSY3Dq6DWgmB+0VwpI=
61+
github.com/pion/ice/v4 v4.4.2/go.mod h1:YZgNFOyJWXpLpLj0mb4ccqNAWRo9C2RtqKwuVTEz0Sc=
62+
github.com/pion/interceptor v0.1.48 h1:FF4gZ6Yh+N75gKMYpC7rYR8DdkiMBFtA7V2OBUKo7XQ=
63+
github.com/pion/interceptor v0.1.48/go.mod h1:5mg/N5xXMAa4codCUdrJYY9I1y4tVQhlpd7rfwAJpvI=
64+
github.com/pion/logging v0.2.4 h1:tTew+7cmQ+Mc1pTBLKH2puKsOvhm32dROumOZ655zB8=
65+
github.com/pion/logging v0.2.4/go.mod h1:DffhXTKYdNZU+KtJ5pyQDjvOAh/GsNSyv1lbkFbe3so=
66+
github.com/pion/mdns/v2 v2.2.0 h1:AlAZ9MTUKtWgO+4itk35JdNak4sk5k7G/X4xnIBWHyA=
67+
github.com/pion/mdns/v2 v2.2.0/go.mod h1:IJddx58QMlojqhQYjHcOUmvuBQ5MnLNetkb80VMvk2Y=
68+
github.com/pion/randutil v0.1.0 h1:CFG1UdESneORglEsnimhUjf33Rwjubwj6xfiOXBa3mA=
69+
github.com/pion/randutil v0.1.0/go.mod h1:XcJrSMMbbMRhASFVOlj/5hQial/Y8oH/HVo7TBZq+j8=
70+
github.com/pion/rtcp v1.2.17 h1:PxiT6L79yPZKtXIsXdG1eakBl6dtBj4x+4oVEL0DlSw=
71+
github.com/pion/rtcp v1.2.17/go.mod h1:7kBpuBJaWwax4hzc/pgexY8vkOpvh8atgYDbaKZq0iU=
72+
github.com/pion/rtp v1.10.5 h1:ip0HhO/wYZqQ4bKS+R99KnZh/GRCmIT0jDXikub7vlE=
73+
github.com/pion/rtp v1.10.5/go.mod h1:Au8fc6cEByy8RLTwKTQTEeQqDB/SJDxwL4mZuxYA5Pk=
74+
github.com/pion/sctp v1.11.1 h1:O4dIFyURw1KTST7w+gtD4gLeYXkhPa0xXLHMMoe/OSA=
75+
github.com/pion/sctp v1.11.1/go.mod h1:7KFmTwLcoYgJs/Z+99nJvsWL0qDpuyloSI0RbAqlrz0=
76+
github.com/pion/sdp/v3 v3.0.19 h1:1VMKs3gIkTQV5M3hNKfTAPrDXSNrYtOlmOD8+mSZUGQ=
77+
github.com/pion/sdp/v3 v3.0.19/go.mod h1:dE5WOSlzXrtiE/iuZqe9n+AcEbOjtAd3k5m5NtlV/qU=
78+
github.com/pion/srtp/v3 v3.0.13 h1:FmQaqgNbN1vUtMhEsmj8trldc3lNZr1xmN7nl8CyX+Q=
79+
github.com/pion/srtp/v3 v3.0.13/go.mod h1:7qR3L69t8RX0EPVQwGNwCa1Gy9keKKNDpWwQzZbeXDY=
80+
github.com/pion/stun/v4 v4.0.0 h1:UuQy2q6iZR4EnMl/+G8kAtaWhf7jx/u8ZyN9oD4+YEQ=
81+
github.com/pion/stun/v4 v4.0.0/go.mod h1:JAojPsPtDH4iPeNQb7kvxBdzypmkWAROxy0coApKH2E=
82+
github.com/pion/transport/v4 v4.1.0 h1:8S+nF2reM2cJuqC6g78OVy2BBgmbdns+acx3jA97BvQ=
83+
github.com/pion/transport/v4 v4.1.0/go.mod h1:06hFI+jCFcok2X2MekVufNZ/uzNZXivGBPfviSVcjgM=
84+
github.com/pion/turn/v5 v5.1.0 h1:OSzLub7q4GssG1P4BEVrz39MnnJlxLy1LOvEkP9f46o=
85+
github.com/pion/turn/v5 v5.1.0/go.mod h1:6HJQO7UAe7pEPMrTtBrmj+tTfp+Ai8KAV2+GXHFi1nQ=
86+
github.com/pion/webrtc/v4 v4.2.20 h1:NYiNhBTFArA8aoP18a30y4LN0dyqSrF65HxU7KnhNOo=
87+
github.com/pion/webrtc/v4 v4.2.20/go.mod h1:aLGXbekuN0tHOu7IPX1o9Y/uN29Ovfjaaz4bL2P9ND8=
5488
github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
5589
github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
5690
github.com/tetratelabs/wazero v1.8.2 h1:yIgLR/b2bN31bjxwXHD8a3d+BogigR952csSDdLYEv4=
5791
github.com/tetratelabs/wazero v1.8.2/go.mod h1:yAI0XTsMBhREkM/YDAK/zNou3GoiAce1P6+rp/wQhjs=
92+
github.com/wlynxg/anet v0.0.5 h1:J3VJGi1gvo0JwZ/P1/Yc/8p63SoW98B5dHkYDmpgvvU=
93+
github.com/wlynxg/anet v0.0.5/go.mod h1:eay5PRQr7fIVAMbTbchTnO9gG65Hg/uYGdc7mguHxoA=
5894
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no=
5995
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM=
96+
golang.org/x/crypto v0.48.0 h1:/VRzVqiRSggnhY7gNRxPauEQ5Drw9haKdM0jqfcCFts=
97+
golang.org/x/crypto v0.48.0/go.mod h1:r0kV5h3qnFPlQnBSrULhlsRfryS2pmewsg+XfMgkVos=
98+
golang.org/x/net v0.50.0 h1:ucWh9eiCGyDR3vtzso0WMQinm2Dnt8cFMuQa9K33J60=
99+
golang.org/x/net v0.50.0/go.mod h1:UgoSli3F/pBgdJBHCTc+tp3gmrU4XswgGRgtnwWTfyM=
60100
golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
61101
golang.org/x/sys v0.0.0-20220712014510-0a85c31ab51e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
62102
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
63103
golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc=
64104
golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
105+
golang.org/x/sys v0.41.0 h1:Ivj+2Cp/ylzLiEU89QhWblYnOE9zerudt9Ftecq2C6k=
106+
golang.org/x/sys v0.41.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
65107
golang.org/x/text v0.3.8 h1:nAL+RVCQ9uMn3vJZbV+MRnydTJFPf8qqY42YiA6MrqY=
66108
golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
109+
golang.org/x/text v0.34.0/go.mod h1:homfLqTYRFyVYemLBFl5GgL/DWEiH5wcsQ5gSh1yziA=
110+
golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI=
111+
golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4=
67112
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
68113
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
69114
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

pkg/app/app.go

Lines changed: 44 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
tea "github.com/charmbracelet/bubbletea"
1414
"github.com/halpworld/halpradio/pkg/debuglog"
1515
"github.com/halpworld/halpradio/pkg/desktop"
16+
"github.com/halpworld/halpradio/pkg/party"
1617
"github.com/halpworld/halpradio/pkg/player"
1718
"github.com/halpworld/halpradio/pkg/plugin"
1819
"github.com/halpworld/halpradio/pkg/radio"
@@ -24,12 +25,13 @@ import (
2425
var Version = "0.4.0"
2526

2627
type AppInstance struct {
27-
Program *tea.Program
28-
Player *player.Manager
29-
Config util.Config
30-
Store *radio.Store
31-
Desktop *desktop.Manager
32-
PluginMgr *plugin.Manager
28+
Program *tea.Program
29+
Player *player.Manager
30+
Config util.Config
31+
Store *radio.Store
32+
Desktop *desktop.Manager
33+
PluginMgr *plugin.Manager
34+
PartySession *party.PartySession
3335

3436
// DebugLogPath is the diagnostic log file for this run, or "" when
3537
// diagnostic logging is off.
@@ -573,6 +575,8 @@ func SetupApp(args []string, embeddedCatalog []byte, out io.Writer) (*AppInstanc
573575
}
574576
_, err := RunRemote(args, out)
575577
return nil, true, err
578+
case args[0] == "party":
579+
return RunParty(args[1:], embeddedCatalog, out)
576580
case args[0] == "theme" || args[0] == "themes":
577581
_, err := RunThemeCLI(args[1:], out)
578582
return nil, true, err
@@ -804,6 +808,36 @@ func SetupApp(args []string, embeddedCatalog []byte, out io.Writer) (*AppInstanc
804808
}
805809
})
806810

811+
desktopMgr.SetPartyHandler(func(action desktop.MediaAction, payload string) error {
812+
if program == nil {
813+
return fmt.Errorf("halpradio program not ready")
814+
}
815+
switch action {
816+
case desktop.ActionPartyCreate:
817+
name := strings.TrimSpace(payload)
818+
if name == "" {
819+
name = "team-focus"
820+
}
821+
program.Send(ui.PartyCreateRoomMsg{RoomName: name})
822+
case desktop.ActionPartyJoin:
823+
code := strings.TrimSpace(payload)
824+
addr := ""
825+
if strings.Contains(code, " ") {
826+
parts := strings.SplitN(code, " ", 2)
827+
code = parts[0]
828+
addr = parts[1]
829+
}
830+
program.Send(ui.PartyJoinRoomMsg{RoomCode: code, Address: addr})
831+
case desktop.ActionPartyLeave:
832+
program.Send(ui.PartyLeaveRoomMsg{})
833+
case desktop.ActionPartyReact:
834+
program.Send(ui.PartySendReactionMsg(payload))
835+
case desktop.ActionPartyChat:
836+
program.Send(ui.PartySendChatMsg(payload))
837+
}
838+
return nil
839+
})
840+
807841
model.SetDesktop(desktopMgr)
808842

809843
program = tea.NewProgram(
@@ -840,14 +874,17 @@ func Run(embeddedCatalog []byte) {
840874
return err
841875
}()
842876

843-
// Clean up player, desktop, and plugin services on exit
877+
// Clean up player, desktop, party, and plugin services on exit
844878
_ = appInst.Player.Close()
845879
if appInst.Desktop != nil {
846880
_ = appInst.Desktop.Close()
847881
}
848882
if appInst.PluginMgr != nil {
849883
_ = appInst.PluginMgr.Close()
850884
}
885+
if appInst.PartySession != nil {
886+
_ = appInst.PartySession.Close()
887+
}
851888

852889
debuglog.Close()
853890
if appInst.DebugLogPath != "" {

0 commit comments

Comments
 (0)