nx_cli_meet.nx source
↩ module page · 112 lines · 3781 B
1// nx_cli_meet.nx -- terminal-only conferencing consumer.
2//
3// Audio + chat composed into a CLI-friendly bundle. No video.
4// Designed to run from `ssh elderwesto@nishifamily.com` and let the
5// operator drop into an audio + text channel without a browser.
6//
7// Same OOP pattern as nx_call but simpler -- no per-call peer
8// tracking, just a session pair the caller can poll.
9
10// nx_safety_envelope:
11// intended_use: headless / terminal conferencing consumer
12// sil_target: SIL2
13// evidence: composes nx_audio_session + nx_chat_session
14// verdict: NOT_YET_EVALUATED -- pending smoke
15
16import "nx_syscalls_x86_64.nx"
17import "nx_media_session.nx"
18import "nx_audio_session.nx"
19import "nx_chat_ring.nx"
20import "nx_chat_session.nx"
21
22struct nx_cli_meet {
23 audio: *nx_audio_session,
24 chat: *nx_chat_session,
25}
26
27const NX_CLI_MEET_BYTES: i64 = 16
28
29func nx_cli_meet_new(out: *nx_cli_meet,
30 audio: *nx_audio_session,
31 chat: *nx_chat_session) -> i64 {
32 if audio as i64 == 0 { return -1 }
33 if chat as i64 == 0 { return -1 }
34 out.audio = audio
35 out.chat = chat
36 return 0
37}
38
39func nx_cli_meet_open(m: *nx_cli_meet) -> i64 {
40 let amss: *nx_media_session = m.audio as *nx_media_session
41 let arc: i64 = nx_media_session_open(amss)
42 if arc != 0 { return arc }
43 let cmss: *nx_media_session = m.chat as *nx_media_session
44 return nx_media_session_open(cmss)
45}
46
47func nx_cli_meet_close(m: *nx_cli_meet) -> i64 {
48 let amss: *nx_media_session = m.audio as *nx_media_session
49 nx_media_session_close(amss)
50 let cmss: *nx_media_session = m.chat as *nx_media_session
51 nx_media_session_close(cmss)
52 return 0
53}
54
55// Render the chat log to fd (typically stdout) one message per line:
56// "<seq> <peer_id>: <text>\n"
57// Returns number of messages rendered.
58func nx_cli_meet_render_chat(m: *nx_cli_meet, fd: i64) -> i64 {
59 let count: i64 = nx_chat_session_count(m.chat)
60 let line: *u8 = sys_mmap(512)
61 var i: i64 = 0
62 while i < count {
63 let s: *ChatSlot = nx_chat_session_get_at(m.chat, i)
64 if s as i64 != 0 {
65 // Format: "<seq> <peer>: " followed by text.
66 var off: i64 = 0
67 // seq as decimal (up to 6 digits)
68 var nv: i64 = s.seq
69 var digits: i64 = 0
70 let tmp: *u8 = sys_mmap(8)
71 if nv == 0 { tmp[0]=48; digits=1 }
72 while nv > 0 {
73 tmp[digits] = ((nv % 10) + 48) as u8
74 nv = nv / 10
75 digits = digits + 1
76 }
77 var d: i64 = digits
78 while d > 0 {
79 line[off] = tmp[d - 1]
80 off = off + 1
81 d = d - 1
82 }
83 line[off] = 32; off = off + 1 // ' '
84 // peer as decimal
85 nv = s.peer_id
86 digits = 0
87 if nv == 0 { tmp[0]=48; digits=1 }
88 while nv > 0 {
89 tmp[digits] = ((nv % 10) + 48) as u8
90 nv = nv / 10
91 digits = digits + 1
92 }
93 d = digits
94 while d > 0 {
95 line[off] = tmp[d - 1]
96 off = off + 1
97 d = d - 1
98 }
99 line[off] = 58; off = off + 1 // ':'
100 line[off] = 32; off = off + 1 // ' '
101 // text body
102 let n_txt: i64 = nx_chat_session_copy_text(m.chat, s,
103 (line as i64 + off) as *u8,
104 512 - off)
105 if n_txt > 0 { off = off + n_txt }
106 line[off] = 10; off = off + 1 // '\n'
107 sys_write(fd, line, off)
108 }
109 i = i + 1
110 }
111 return count
112}