@@ -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')
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user