86 lines
2.0 KiB
JavaScript
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 }
|
|
}
|