Files
bare-operating-system/packages/bare-os-coreutils/lib/irc/irc-state.js
T
2026-08-18 18:11:28 -04:00

86 lines
2.0 KiB
JavaScript

/** IRC session buffers and members. */
var BARE_IRC_MAX_TRANSCRIPT = 2000
function bareIrcCreateState(opts) {
opts = opts || {}
var max =
opts.maxTranscript > 0 ? opts.maxTranscript : BARE_IRC_MAX_TRANSCRIPT
return {
connection: 'idle',
nick: opts.nick || '',
requestedNick: opts.nick || '',
account: '',
away: false,
network: opts.network || '',
isupport: bareIrcIsupportDefaults(),
capsOffered: {},
capsEnabled: {},
buffers: {},
currentId: 'server',
maxTranscript: max,
registered: false,
tls: opts.tls !== false,
saslOk: false,
channelList: [],
listBusy: false,
ignore: {}
}
}
function bareIrcBufferId(kind, name, mapping) {
if (kind === 'server') return 'server'
return kind + ':' + bareIrcCasemap(name, mapping)
}
function bareIrcEnsureBuffer(state, kind, name) {
var mapping = bareIrcCasemapping(state.isupport)
var id = bareIrcBufferId(kind, name, mapping)
if (!state.buffers[id]) {
state.buffers[id] = {
id: id,
kind: kind,
name: name || '*server',
topic: '',
members: {},
lines: [],
unread: 0,
highlight: false
}
}
return state.buffers[id]
}
function bareIrcPushLine(state, buf, rec) {
if (!buf) return
buf.lines.push(rec)
while (buf.lines.length > state.maxTranscript) buf.lines.shift()
if (buf.id !== state.currentId) {
buf.unread++
if (rec && rec.highlight) buf.highlight = true
}
}
function bareIrcListBuffers(state) {
var ids = Object.keys(state.buffers)
ids.sort(function (a, b) {
if (a === 'server') return -1
if (b === 'server') return 1
return a < b ? -1 : a > b ? 1 : 0
})
return ids.map(function (id) {
return state.buffers[id]
})
}
function bareIrcMemberPrefixes(state, nickRaw) {
var pref = bareIrcPrefixMap(state.isupport)
var nick = String(nickRaw || '')
var modes = ''
while (nick && pref.byPref[nick.charAt(0)]) {
modes += pref.byPref[nick.charAt(0)]
nick = nick.slice(1)
}
return { nick: nick, modes: modes }
}