fix IRC user list
Release rolling / release (push) Successful in 13m2s

This commit is contained in:
Raven Scott
2026-08-13 01:10:39 -04:00
parent 3702c69b29
commit 3965c30352
11 changed files with 203 additions and 87 deletions
+52 -26
View File
@@ -1,5 +1,29 @@
/** TEA IRC TUI. Cell buffer; protocol lives in irc-client.js. */
function bareIrcPad(s, w) {
s = String(s == null ? '' : s)
if (w <= 0) return ''
if (s.length > w) return s.slice(0, w)
while (s.length < w) s += ' '
return s
}
function bareIrcNickColWidth(cols, buf, roomsOpen) {
if (roomsOpen || !buf || buf.kind !== 'channel') return 0
if (cols < 80) return 0
return cols >= 140 ? 20 : 16
}
function bareIrcMemberLabel(m, key) {
var pref =
m && m.modes && m.modes.indexOf('o') >= 0
? '@'
: m && m.modes && m.modes.indexOf('v') >= 0
? '+'
: ' '
return pref + (m && m.nick ? m.nick : key)
}
function bareIrcFmtClock(ms) {
var d = new Date(typeof ms === 'number' ? ms : Date.now())
function z(n) {
@@ -131,8 +155,8 @@ function bareIrcCreateTuiApp(ctx, client) {
buf.unread = 0
buf.highlight = false
var cols = Math.max(40, this.width || 80)
var nickW = !this.roomsOpen && cols >= 100 ? 16 : 0
this.viewport.width = Math.max(20, cols - nickW - 2)
var nickW = bareIrcNickColWidth(cols, buf, this.roomsOpen)
this.viewport.width = Math.max(20, cols - (nickW ? nickW + 1 : 0))
this.viewport.height = Math.max(4, (this.height || 24) - 6)
if (this.roomsOpen) {
var rows = this._roomRows()
@@ -464,33 +488,35 @@ function bareIrcCreateTuiApp(ctx, client) {
})
.join(' ')
var tabBar = st ? st().dim().width(cols).render(tabs) : tabs
var nickW = cols >= 100 ? 16 : 0
var nickW = bareIrcNickColWidth(cols, buf, this.roomsOpen)
var bodyH = this.viewport.height || Math.max(4, rows - 6)
var body = this.viewport.view()
if (nickW) {
var nicks = Object.keys(buf.members || {})
.map(function (k) {
var m = buf.members[k]
var pref =
m && m.modes && m.modes.indexOf('o') >= 0
? '@'
: m && m.modes && m.modes.indexOf('v') >= 0
? '+'
: ' '
return pref + (m && m.nick ? m.nick : k)
})
.slice(0, this.viewport.height || 10)
while (nicks.length < (this.viewport.height || 0)) nicks.push('')
if (nickW && buf.kind === 'channel') {
var keys = Object.keys(buf.members || {})
keys.sort(function (a, b) {
var ma = buf.members[a]
var mb = buf.members[b]
var pa = ma && ma.modes && ma.modes.indexOf('o') >= 0 ? 0 : 1
var pb = mb && mb.modes && mb.modes.indexOf('o') >= 0 ? 0 : 1
if (pa !== pb) return pa - pb
var na = ma && ma.nick ? ma.nick : a
var nb = mb && mb.nick ? mb.nick : b
return na < nb ? -1 : na > nb ? 1 : 0
})
var nicks = keys.map(function (k) {
return bareIrcMemberLabel(buf.members[k], k)
})
var left = String(body).split('\n')
var chatW = Math.max(8, cols - nickW - 1)
var joined = []
var h = Math.max(left.length, nicks.length)
for (var r = 0; r < h; r++) {
var L = st
? st.truncate(left[r] || '', cols - nickW - 1)
: (left[r] || '').slice(0, cols - nickW - 1)
var R = st
? st.truncate(nicks[r] || '', nickW)
: (nicks[r] || '').slice(0, nickW)
joined.push(L + ' ' + R)
var r
for (r = 0; r < bodyH; r++) {
var L = bareIrcPad(
st ? st.truncate(left[r] || '', chatW) : left[r] || '',
chatW
)
var R = bareIrcPad(nicks[r] || '', nickW)
joined.push(L + '\u2502' + R)
}
body = joined.join('\n')
}